Revision 80f93e0a
Added by Xavier Thirioux over 6 years ago
include/arrow.c | ||
---|---|---|
2 | 2 |
#include <assert.h> |
3 | 3 |
#include "arrow.h" |
4 | 4 |
|
5 |
struct _arrow_mem *_arrow_alloc() {
|
|
5 |
struct _arrow_mem * _arrow_alloc () {
|
|
6 | 6 |
struct _arrow_mem *_alloc; |
7 | 7 |
_alloc = (struct _arrow_mem *) malloc(sizeof(struct _arrow_mem *)); |
8 | 8 |
assert (_alloc); |
9 | 9 |
return _alloc; |
10 | 10 |
} |
11 |
|
|
12 |
void _arrow_dealloc (struct _arrow_mem * _alloc) { |
|
13 |
free (_alloc); |
|
14 |
} |
include/arrow.h | ||
---|---|---|
6 | 6 |
|
7 | 7 |
extern struct _arrow_mem *_arrow_alloc (); |
8 | 8 |
|
9 |
extern void _arrow_dealloc (struct _arrow_mem *); |
|
10 |
|
|
9 | 11 |
#define _arrow_DECLARE(attr, inst)\ |
10 | 12 |
attr struct _arrow_mem inst; |
11 | 13 |
|
src/backends/C/c_backend_common.ml | ||
---|---|---|
94 | 94 |
let pp_machine_memtype_name fmt id = fprintf fmt "struct %s_mem" id |
95 | 95 |
let pp_machine_regtype_name fmt id = fprintf fmt "struct %s_reg" id |
96 | 96 |
let pp_machine_alloc_name fmt id = fprintf fmt "%s_alloc" id |
97 |
let pp_machine_dealloc_name fmt id = fprintf fmt "%s_dealloc" id |
|
97 | 98 |
let pp_machine_static_declare_name fmt id = fprintf fmt "%s_DECLARE" id |
98 | 99 |
let pp_machine_static_link_name fmt id = fprintf fmt "%s_LINK" id |
99 | 100 |
let pp_machine_static_alloc_name fmt id = fprintf fmt "%s_ALLOC" id |
... | ... | |
348 | 349 |
pp_machine_alloc_name name |
349 | 350 |
(Utils.fprintf_list ~sep:",@ " pp_c_decl_input_var) static |
350 | 351 |
|
352 |
let print_dealloc_prototype fmt name = |
|
353 |
fprintf fmt "void %a (%a * _alloc)" |
|
354 |
pp_machine_dealloc_name name |
|
355 |
pp_machine_memtype_name name |
|
356 |
|
|
351 | 357 |
let print_reset_prototype self fmt (name, static) = |
352 | 358 |
fprintf fmt "void %a (@[<v>%a%t%a *%s@])" |
353 | 359 |
pp_machine_reset_name name |
... | ... | |
422 | 428 |
let print_extern_alloc_prototypes fmt (Dep (_,_, header,_)) = |
423 | 429 |
List.iter (fun decl -> match decl.top_decl_desc with |
424 | 430 |
| ImportedNode ind when not ind.nodei_stateless -> |
425 |
let static = List.filter (fun v -> v.var_dec_const) ind.nodei_inputs |
|
426 |
in fprintf fmt "extern %a;@." print_alloc_prototype (ind.nodei_id, static) |
|
431 |
let static = List.filter (fun v -> v.var_dec_const) ind.nodei_inputs in |
|
432 |
begin |
|
433 |
fprintf fmt "extern %a;@.@." print_alloc_prototype (ind.nodei_id, static); |
|
434 |
fprintf fmt "extern %a;@.@." print_dealloc_prototype ind.nodei_id; |
|
435 |
end |
|
427 | 436 |
| _ -> () |
428 | 437 |
) header |
429 | 438 |
|
src/backends/C/c_backend_header.ml | ||
---|---|---|
177 | 177 |
begin |
178 | 178 |
(* Dynamic allocation *) |
179 | 179 |
fprintf fmt "extern %a;@.@." |
180 |
print_alloc_prototype (m.mname.node_id, m.mstatic) |
|
180 |
print_alloc_prototype (m.mname.node_id, m.mstatic); |
|
181 |
|
|
182 |
fprintf fmt "extern %a;@.@." |
|
183 |
print_dealloc_prototype m.mname.node_id; |
|
181 | 184 |
end; |
182 | 185 |
let self = mk_self m in |
183 | 186 |
fprintf fmt "extern %a;@.@." |
... | ... | |
219 | 222 |
else |
220 | 223 |
begin |
221 | 224 |
(* Dynamic allocation *) |
222 |
fprintf fmt "extern %a;@." |
|
223 |
print_alloc_prototype (m.mname.node_id, m.mstatic) |
|
225 |
fprintf fmt "extern %a;@.@." |
|
226 |
print_alloc_prototype (m.mname.node_id, m.mstatic); |
|
227 |
|
|
228 |
fprintf fmt "extern %a;@.@." |
|
229 |
print_dealloc_prototype m.mname.node_id |
|
224 | 230 |
end |
225 | 231 |
end |
226 | 232 |
|
src/backends/C/c_backend_src.ml | ||
---|---|---|
392 | 392 |
pp_machine_alloc_name (node_name m) |
393 | 393 |
(Utils.fprintf_list ~sep:", " Dimension.pp_dimension) static |
394 | 394 |
|
395 |
let print_dealloc_instance fmt (i, (m, _)) = |
|
396 |
fprintf fmt "%a (_alloc->%s);@," |
|
397 |
pp_machine_dealloc_name (node_name m) |
|
398 |
i |
|
399 |
|
|
395 | 400 |
let print_alloc_const fmt m = |
396 | 401 |
let const_locals = List.filter (fun vdecl -> vdecl.var_dec_const) m.mstep.step_locals in |
397 | 402 |
fprintf fmt "%a%t" |
... | ... | |
409 | 414 |
(pp_c_type "") base_type |
410 | 415 |
vdecl.var_id |
411 | 416 |
|
417 |
let print_dealloc_array fmt vdecl = |
|
418 |
fprintf fmt "free (_alloc->_reg.%s);@," |
|
419 |
vdecl.var_id |
|
420 |
|
|
412 | 421 |
let print_alloc_code fmt m = |
413 | 422 |
let array_mem = List.filter (fun v -> Types.is_array_type v.var_type) m.mmemory in |
414 | 423 |
fprintf fmt "%a *_alloc;@,_alloc = (%a *) malloc(sizeof(%a));@,assert(_alloc);@,%a%areturn _alloc;" |
... | ... | |
418 | 427 |
(Utils.fprintf_list ~sep:"" print_alloc_array) array_mem |
419 | 428 |
(Utils.fprintf_list ~sep:"" print_alloc_instance) m.minstances |
420 | 429 |
|
430 |
let print_dealloc_code fmt m = |
|
431 |
let array_mem = List.filter (fun v -> Types.is_array_type v.var_type) m.mmemory in |
|
432 |
fprintf fmt "%a%afree (_alloc);@,return;" |
|
433 |
(Utils.fprintf_list ~sep:"" print_dealloc_array) array_mem |
|
434 |
(Utils.fprintf_list ~sep:"" print_dealloc_instance) m.minstances |
|
435 |
|
|
421 | 436 |
let print_stateless_init_code dependencies fmt m self = |
422 | 437 |
let minit = List.map (function MReset i -> i | _ -> assert false) m.minit in |
423 | 438 |
let array_mems = List.filter (fun v -> Types.is_array_type v.var_type) m.mmemory in |
... | ... | |
615 | 630 |
end |
616 | 631 |
else |
617 | 632 |
begin |
618 |
(* Alloc function, only if non static mode *) |
|
633 |
(* Alloc functions, only if non static mode *)
|
|
619 | 634 |
if (not !Options.static_mem) then |
620 | 635 |
begin |
621 | 636 |
fprintf fmt "@[<v 2>%a {@,%a%a@]@,}@.@." |
622 | 637 |
print_alloc_prototype (m.mname.node_id, m.mstatic) |
623 | 638 |
print_alloc_const m |
624 | 639 |
print_alloc_code m; |
640 |
|
|
641 |
fprintf fmt "@[<v 2>%a {@,%a%a@]@,}@.@." |
|
642 |
print_dealloc_prototype m.mname.node_id |
|
643 |
print_alloc_const m |
|
644 |
print_dealloc_code m; |
|
625 | 645 |
end; |
626 | 646 |
let self = mk_self m in |
627 | 647 |
(* Reset function *) |
... | ... | |
682 | 702 |
fprintf source_fmt "@]@."; |
683 | 703 |
fprintf source_fmt "/* Node allocation function prototypes */@."; |
684 | 704 |
fprintf source_fmt "@[<v>"; |
685 |
List.iter (fun m -> fprintf source_fmt "%a;@." print_alloc_prototype (m.mname.node_id, m.mstatic)) machines; |
|
705 |
List.iter |
|
706 |
(fun m -> fprintf source_fmt "%a;@.@.%a;@.@." |
|
707 |
print_alloc_prototype (m.mname.node_id, m.mstatic) |
|
708 |
print_dealloc_prototype m.mname.node_id |
|
709 |
) |
|
710 |
machines; |
|
686 | 711 |
fprintf source_fmt "@]@."; |
687 | 712 |
end; |
688 | 713 |
|
Also available in: Unified diff
added deallocation for dynamic memory allocation scheme