Declaration of static variables in Cfundef
This commit is contained in:
parent
1ba3284031
commit
58e6a951e4
|
@ -68,12 +68,12 @@ struct
|
||||||
(fun (_, ack) -> match ack with Timer_ms ms -> ms)
|
(fun (_, ack) -> match ack with Timer_ms ms -> ms)
|
||||||
trans
|
trans
|
||||||
in
|
in
|
||||||
|
let tick = "mod_ticks" in
|
||||||
let body = match timers with
|
let body = match timers with
|
||||||
| [] -> []
|
| [] -> []
|
||||||
| _ ->
|
| _ ->
|
||||||
let base_timer = fold_gcd timers in
|
let base_timer = fold_gcd timers in
|
||||||
let max_timer = fold_lcm timers in
|
let max_timer = fold_lcm timers in
|
||||||
let tick = "mod_ticks" in
|
|
||||||
List.map (call_step_async base_timer (Cvar tick)) trans
|
List.map (call_step_async base_timer (Cvar tick)) trans
|
||||||
in
|
in
|
||||||
(* run_timers is declared in avr.h (because of the ISR macro which
|
(* run_timers is declared in avr.h (because of the ISR macro which
|
||||||
|
@ -84,7 +84,9 @@ struct
|
||||||
f_retty = Cty_void;
|
f_retty = Cty_void;
|
||||||
f_args = [];
|
f_args = [];
|
||||||
f_body = {
|
f_body = {
|
||||||
var_decls = [];
|
var_decls = [
|
||||||
|
mk_vardecl_val ~static:true tick Cty_int (Cconst (Ccint 0))
|
||||||
|
];
|
||||||
block_body = body
|
block_body = body
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,11 +69,18 @@ type cty =
|
||||||
| Cty_arr of int * cty (** A static array of the specified size. *)
|
| Cty_arr of int * cty (** A static array of the specified size. *)
|
||||||
| Cty_void (** Well, [void] is not really a C type. *)
|
| Cty_void (** Well, [void] is not really a C type. *)
|
||||||
|
|
||||||
|
type cvardecl = {
|
||||||
|
vd_name : string;
|
||||||
|
vd_ty : cty;
|
||||||
|
vd_static : bool;
|
||||||
|
vd_value : cexpr option
|
||||||
|
}
|
||||||
|
|
||||||
(** A C block: declarations and statements. In source code form, it begins with
|
(** A C block: declarations and statements. In source code form, it begins with
|
||||||
variable declarations before a list of semicolon-separated statements, the
|
variable declarations before a list of semicolon-separated statements, the
|
||||||
whole thing being enclosed in curly braces. *)
|
whole thing being enclosed in curly braces. *)
|
||||||
type cblock = {
|
and cblock = {
|
||||||
var_decls : (string * cty) list;
|
var_decls : cvardecl list;
|
||||||
(** Variable declarations, where each declaration consists of a variable
|
(** Variable declarations, where each declaration consists of a variable
|
||||||
name and the associated C type. *)
|
name and the associated C type. *)
|
||||||
block_body : cstm list;
|
block_body : cstm list;
|
||||||
|
@ -169,6 +176,15 @@ and cfile_desc =
|
||||||
|
|
||||||
(******************************)
|
(******************************)
|
||||||
|
|
||||||
|
let mk_vardecl ?(static = false) ?(value = None) name ty =
|
||||||
|
{ vd_name = name; vd_ty = ty; vd_static = static; vd_value = value }
|
||||||
|
|
||||||
|
let mk_vardecl_val ?(static = false) name ty value =
|
||||||
|
mk_vardecl ~static:static ~value:(Some value) name ty
|
||||||
|
|
||||||
|
let vardecl_of_cvars cvars =
|
||||||
|
List.map (fun (name, ty) -> mk_vardecl name ty) cvars
|
||||||
|
|
||||||
(** {3 Pretty-printing of the C ast.} *)
|
(** {3 Pretty-printing of the C ast.} *)
|
||||||
|
|
||||||
(** [pp_list1 f sep fmt l] pretty-prints into the Format.formatter [fmt]
|
(** [pp_list1 f sep fmt l] pretty-prints into the Format.formatter [fmt]
|
||||||
|
@ -235,7 +251,7 @@ and pp_param_list fmt l = pp_list1 pp_vardecl "," fmt l
|
||||||
and pp_var_list fmt l = pp_list pp_vardecl ";" fmt l
|
and pp_var_list fmt l = pp_list pp_vardecl ";" fmt l
|
||||||
|
|
||||||
let rec pp_cblock fmt cb =
|
let rec pp_cblock fmt cb =
|
||||||
let pp_varlist = pp_list pp_vardecl ";" in
|
let pp_varlist = pp_list pp_cvardecl ";" in
|
||||||
fprintf fmt "%a%a" pp_varlist cb.var_decls pp_cstm_list cb.block_body
|
fprintf fmt "%a%a" pp_varlist cb.var_decls pp_cstm_list cb.block_body
|
||||||
and pp_cstm_list fmt stml = pp_list pp_cstm ";" fmt stml
|
and pp_cstm_list fmt stml = pp_list pp_cstm ";" fmt stml
|
||||||
and pp_cstm fmt stm = match stm with
|
and pp_cstm fmt stm = match stm with
|
||||||
|
@ -308,6 +324,16 @@ and pp_cconst fmt cconst = match cconst with
|
||||||
| Ctag t -> pp_string fmt t
|
| Ctag t -> pp_string fmt t
|
||||||
| Cstrlit t -> fprintf fmt "\"%s\"" (String.escaped t)
|
| Cstrlit t -> fprintf fmt "\"%s\"" (String.escaped t)
|
||||||
|
|
||||||
|
and pp_cvardecl fmt vd =
|
||||||
|
if vd.vd_static then
|
||||||
|
fprintf fmt "static ";
|
||||||
|
fprintf fmt "%a" pp_vardecl (vd.vd_name, vd.vd_ty);
|
||||||
|
match vd.vd_value with
|
||||||
|
| Some e -> fprintf fmt " = %a" pp_cexpr e
|
||||||
|
| None -> ()
|
||||||
|
|
||||||
|
and pp_cvardecl_list fmt l = pp_list1 pp_vardecl "," fmt l
|
||||||
|
|
||||||
let pp_cdecl fmt cdecl = match cdecl with
|
let pp_cdecl fmt cdecl = match cdecl with
|
||||||
| Cdecl_enum (s, sl) ->
|
| Cdecl_enum (s, sl) ->
|
||||||
fprintf fmt "@[<v>@[<v 2>typedef enum {@ %a@]@ } %a;@ @]@\n"
|
fprintf fmt "@[<v>@[<v 2>typedef enum {@ %a@]@ } %a;@ @]@\n"
|
||||||
|
|
|
@ -693,8 +693,8 @@ and cstm_of_act_list vr var_env obj_env b =
|
||||||
in
|
in
|
||||||
match l with
|
match l with
|
||||||
| [] -> cstm
|
| [] -> cstm
|
||||||
| _ ->
|
| _ -> [Csblock { var_decls = vardecl_of_cvars l;
|
||||||
[Csblock { var_decls = l; block_body = cstm }]
|
block_body = cstm }]
|
||||||
|
|
||||||
(* TODO needed only because of renaming phase *)
|
(* TODO needed only because of renaming phase *)
|
||||||
let global_name = ref "";;
|
let global_name = ref "";;
|
||||||
|
@ -753,7 +753,7 @@ let fun_def_of_step_fun n obj_env mem objs md =
|
||||||
f_retty = Cty_void;
|
f_retty = Cty_void;
|
||||||
f_args = args;
|
f_args = args;
|
||||||
f_body = {
|
f_body = {
|
||||||
var_decls = out_vars;
|
var_decls = vardecl_of_cvars out_vars;
|
||||||
block_body = body
|
block_body = body
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -786,7 +786,7 @@ let fun_stub_def_of_step_fun n md copy_in copy_out =
|
||||||
f_retty = Cty_void;
|
f_retty = Cty_void;
|
||||||
f_args = args;
|
f_args = args;
|
||||||
f_body = {
|
f_body = {
|
||||||
var_decls = out_vars;
|
var_decls = vardecl_of_cvars out_vars;
|
||||||
block_body = prologue @ body
|
block_body = prologue @ body
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -854,7 +854,7 @@ let async_fun_def_of_step_fun n obj_env mem objs md copy_in copy_out =
|
||||||
f_retty = Cty_void;
|
f_retty = Cty_void;
|
||||||
f_args = args;
|
f_args = args;
|
||||||
f_body = {
|
f_body = {
|
||||||
var_decls = out_vars;
|
var_decls = vardecl_of_cvars out_vars;
|
||||||
block_body = prologue @ body @ epilogue
|
block_body = prologue @ body @ epilogue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,8 +317,8 @@ let main_skel var_list prologue body =
|
||||||
f_retty = Cty_int;
|
f_retty = Cty_int;
|
||||||
f_args = [("argc", Cty_int); ("argv", Cty_ptr (Cty_ptr Cty_char))];
|
f_args = [("argc", Cty_int); ("argv", Cty_ptr (Cty_ptr Cty_char))];
|
||||||
f_body = {
|
f_body = {
|
||||||
var_decls =
|
var_decls = vardecl_of_cvars
|
||||||
(step_counter, Cty_int) :: (max_step, Cty_int) :: var_list;
|
((step_counter, Cty_int) :: (max_step, Cty_int) :: var_list);
|
||||||
block_body =
|
block_body =
|
||||||
[
|
[
|
||||||
(*
|
(*
|
||||||
|
|
Loading…
Reference in New Issue