let process_global_init wenv obj =
let do_asgn lv e obj =
Wp_parameters.debug ~level:3 "global init : %a <- %a@."
!Ast_printer.d_lval lv !Ast_printer.d_exp e;
W.assign wenv lv e obj
in
let rec do_init obj lv init = match init with
| SingleInit e -> do_asgn lv e obj
| CompoundInit (_, l) ->
let doit obj (off, init) =
do_init obj (Cil.addOffsetLval off lv) init
in List.fold_left doit obj l
in
let do_glob_var var init obj = match init.init with None -> obj
| Some init -> do_init obj (Var var, NoOffset) init
in
let do_glob glob obj = match glob with
| GVar (var, initinfo, loc) ->
let old_loc = Cil.CurrentLoc.get () in
Cil.CurrentLoc.set loc;
let obj = do_glob_var var initinfo obj in
Cil.CurrentLoc.set old_loc;
obj
| _ -> obj
in
let ast = Ast.get () in
List.fold_right do_glob ast.globals obj