Remove parent_line_number information from cfg translation

Summary:
public
Remove trans_state.parent_line_number because it's not used anymore.
This slightly cleans up codebase

Reviewed By: ddino

Differential Revision: D2755050

fb-gh-sync-id: b1b7e8e
master
Andrzej Kotulski 9 years ago committed by facebook-github-bot-7
parent 0def5c4111
commit 0bf6333708

@ -63,10 +63,10 @@ let update_curr_file di =
| Some f -> curr_file := source_file_from_path f | Some f -> curr_file := source_file_from_path f
| None -> ()) | None -> ())
let clang_to_sil_location clang_loc parent_line_number procdesc_opt = let clang_to_sil_location clang_loc procdesc_opt =
let line = match clang_loc.Clang_ast_t.sl_line with let line = match clang_loc.Clang_ast_t.sl_line with
| Some l -> l | Some l -> l
| None -> parent_line_number in | None -> -1 in
let col = match clang_loc.Clang_ast_t.sl_column with let col = match clang_loc.Clang_ast_t.sl_column with
| Some c -> c | Some c -> c
| None -> -1 in | None -> -1 in
@ -93,7 +93,7 @@ let should_translate_lib source_range =
if !CFrontend_config.no_translate_libs then if !CFrontend_config.no_translate_libs then
match source_range with (loc_start, loc_end) -> match source_range with (loc_start, loc_end) ->
let loc_start = choose_sloc_to_update_curr_file loc_start loc_end in let loc_start = choose_sloc_to_update_curr_file loc_start loc_end in
let loc = clang_to_sil_location loc_start (-1) None in let loc = clang_to_sil_location loc_start None in
DB.source_file_equal loc.Location.file !DB.current_source DB.source_file_equal loc.Location.file !DB.current_source
else true else true
@ -101,27 +101,19 @@ let should_translate_enum source_range =
if !CFrontend_config.testing_mode then if !CFrontend_config.testing_mode then
match source_range with (loc_start, loc_end) -> match source_range with (loc_start, loc_end) ->
let loc_start = choose_sloc_to_update_curr_file loc_start loc_end in let loc_start = choose_sloc_to_update_curr_file loc_start loc_end in
let loc = clang_to_sil_location loc_start (-1) None in let loc = clang_to_sil_location loc_start None in
DB.source_file_equal loc.Location.file !DB.current_source DB.source_file_equal loc.Location.file !DB.current_source
else true else true
let get_sil_location_from_range source_range prefer_first = let get_sil_location_from_range source_range prefer_first =
match source_range with (sloc1, sloc2) -> match source_range with (sloc1, sloc2) ->
let sloc = choose_sloc sloc1 sloc2 prefer_first in let sloc = choose_sloc sloc1 sloc2 prefer_first in
clang_to_sil_location sloc (-1) None clang_to_sil_location sloc None
let get_sil_location stmt_info parent_line_number context = let get_sil_location stmt_info context =
match stmt_info.Clang_ast_t.si_source_range with (sloc1, sloc2) -> match stmt_info.Clang_ast_t.si_source_range with (sloc1, sloc2) ->
let sloc = choose_sloc sloc1 sloc2 true in let sloc = choose_sloc sloc1 sloc2 true in
clang_to_sil_location sloc (-1) (Some (CContext.get_procdesc context)) clang_to_sil_location sloc (Some (CContext.get_procdesc context))
let get_line stmt_info line_number =
match stmt_info.Clang_ast_t.si_source_range with
| (sloc1, sloc2) ->
let sloc = choose_sloc sloc1 sloc2 true in
(match sloc.Clang_ast_t.sl_line with
| Some l -> l
| None -> line_number)
let check_source_file source_file = let check_source_file source_file =
let extensions_allowed = [".m"; ".mm"; ".c"; ".cc"; ".cpp"; ".h"] in let extensions_allowed = [".m"; ".mm"; ".c"; ".cc"; ".cpp"; ".h"] in

@ -17,12 +17,10 @@ val current_source_file : DB.source_file ref
(* in this variable. *) (* in this variable. *)
val curr_file : DB.source_file ref val curr_file : DB.source_file ref
val clang_to_sil_location : Clang_ast_t.source_location -> int -> Cfg.Procdesc.t option -> val clang_to_sil_location : Clang_ast_t.source_location -> Cfg.Procdesc.t option ->
Location.t Location.t
val get_sil_location : Clang_ast_t.stmt_info -> int -> CContext.t -> Location.t val get_sil_location : Clang_ast_t.stmt_info -> CContext.t -> Location.t
val get_line : Clang_ast_t.stmt_info -> int -> int
val should_translate_lib : Clang_ast_t.source_range -> bool val should_translate_lib : Clang_ast_t.source_range -> bool

@ -316,7 +316,7 @@ struct
(* search the label into the hashtbl - create a fake node eventually *) (* search the label into the hashtbl - create a fake node eventually *)
(* connect that node with this stmt *) (* connect that node with this stmt *)
let gotoStmt_trans trans_state stmt_info label_name = let gotoStmt_trans trans_state stmt_info label_name =
let sil_loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in let sil_loc = CLocation.get_sil_location stmt_info trans_state.context in
let root_node' = GotoLabel.find_goto_label trans_state.context label_name sil_loc in let root_node' = GotoLabel.find_goto_label trans_state.context label_name sil_loc in
{ empty_res_trans with root_nodes = [root_node']; leaf_nodes = trans_state.succ_nodes } { empty_res_trans with root_nodes = [root_node']; leaf_nodes = trans_state.succ_nodes }
@ -355,8 +355,7 @@ struct
let _, _, type_ptr = get_info_from_decl_ref decl_ref in let _, _, type_ptr = get_info_from_decl_ref decl_ref in
let typ = CTypes_decl.type_ptr_to_sil_type context.tenv type_ptr in let typ = CTypes_decl.type_ptr_to_sil_type context.tenv type_ptr in
let procname = Cfg.Procdesc.get_proc_name context.procdesc in let procname = Cfg.Procdesc.get_proc_name context.procdesc in
let pln = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location stmt_info context in
let sil_loc = CLocation.get_sil_location stmt_info pln context in
let pvar = CVar_decl.sil_var_of_decl_ref context decl_ref procname in let pvar = CVar_decl.sil_var_of_decl_ref context decl_ref procname in
CContext.add_block_static_var context procname (pvar, typ); CContext.add_block_static_var context procname (pvar, typ);
let e = Sil.Lvar pvar in let e = Sil.Lvar pvar in
@ -424,8 +423,7 @@ struct
let cxxThisExpr_trans trans_state stmt_info expr_info = let cxxThisExpr_trans trans_state stmt_info expr_info =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location stmt_info context in
let sil_loc = CLocation.get_sil_location stmt_info pln context in
let tp = expr_info.Clang_ast_t.ei_type_ptr in let tp = expr_info.Clang_ast_t.ei_type_ptr in
let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in
let name = CFrontend_config.this in let name = CFrontend_config.this in
@ -443,8 +441,7 @@ struct
instruction trans_state stmt instruction trans_state stmt
| _ -> assert false (* expected a stmt or at most a compoundstmt *) in | _ -> assert false (* expected a stmt or at most a compoundstmt *) in
(* create the label root node into the hashtbl *) (* create the label root node into the hashtbl *)
let sil_loc = let sil_loc = CLocation.get_sil_location stmt_info trans_state.context in
CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in
let root_node' = GotoLabel.find_goto_label trans_state.context label_name sil_loc in let root_node' = GotoLabel.find_goto_label trans_state.context label_name sil_loc in
Cfg.Node.set_succs_exn root_node' res_trans.root_nodes []; Cfg.Node.set_succs_exn root_node' res_trans.root_nodes [];
{ empty_res_trans with root_nodes = [root_node']; leaf_nodes = trans_state.succ_nodes } { empty_res_trans with root_nodes = [root_node']; leaf_nodes = trans_state.succ_nodes }
@ -520,10 +517,8 @@ struct
| [a; i] -> a, i (* Assumption: the statement list contains 2 elements, | [a; i] -> a, i (* Assumption: the statement list contains 2 elements,
the first is the array expr and the second the index *) the first is the array expr and the second the index *)
| _ -> assert false) in (* Let's get notified if the assumption is wrong...*) | _ -> assert false) in (* Let's get notified if the assumption is wrong...*)
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in let res_trans_a = instruction trans_state array_stmt in
let trans_state'= { trans_state with parent_line_number = line_number } in let res_trans_idx = instruction trans_state idx_stmt in
let res_trans_a = instruction trans_state' array_stmt in
let res_trans_idx = instruction trans_state' idx_stmt in
let (a_exp, a_typ) = extract_exp_from_list res_trans_a.exps let (a_exp, a_typ) = extract_exp_from_list res_trans_a.exps
"WARNING: In ArraySubscriptExpr there was a problem in translating array exp.\n" in "WARNING: In ArraySubscriptExpr there was a problem in translating array exp.\n" in
let (i_exp, i_typ) = extract_exp_from_list res_trans_idx.exps let (i_exp, i_typ) = extract_exp_from_list res_trans_idx.exps
@ -562,17 +557,15 @@ struct
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)); (string_of_bool (PriorityNode.is_priority_free trans_state));
let context = trans_state.context in let context = trans_state.context in
let parent_line_number = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location stmt_info context in
let sil_loc = CLocation.get_sil_location stmt_info parent_line_number context in
let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in
(match stmt_list with (match stmt_list with
| [s1; ImplicitCastExpr (stmt, [CompoundLiteralExpr (cle_stmt_info, stmts, expr_info)], _, cast_expr_info)] -> | [s1; ImplicitCastExpr (stmt, [CompoundLiteralExpr (cle_stmt_info, stmts, expr_info)], _, cast_expr_info)] ->
let decl_ref, line_number = get_decl_ref_info s1 parent_line_number in let decl_ref = get_decl_ref_info s1 in
let line_number = CLocation.get_line cle_stmt_info line_number in
let trans_state' = { trans_state with parent_line_number = line_number } in
let pvar = CVar_decl.sil_var_of_decl_ref context decl_ref procname in let pvar = CVar_decl.sil_var_of_decl_ref context decl_ref procname in
let var_res_trans = { empty_res_trans with exps = [(Sil.Lvar pvar, typ)] } in let var_res_trans = { empty_res_trans with exps = [(Sil.Lvar pvar, typ)] } in
let res_trans_tmp = initListExpr_trans trans_state' var_res_trans stmt_info expr_info stmts in let res_trans_tmp =
initListExpr_trans trans_state var_res_trans stmt_info expr_info stmts in
{ res_trans_tmp with leaf_nodes =[]} { res_trans_tmp with leaf_nodes =[]}
| [s1; s2] -> (* Assumption: We expect precisely 2 stmt corresponding to the 2 operands*) | [s1; s2] -> (* Assumption: We expect precisely 2 stmt corresponding to the 2 operands*)
let rhs_owning_method = CTrans_utils.is_owning_method s2 in let rhs_owning_method = CTrans_utils.is_owning_method s2 in
@ -580,12 +573,11 @@ struct
(* becomes the successor of the nodes that may be created when *) (* becomes the successor of the nodes that may be created when *)
(* translating the operands. *) (* translating the operands. *)
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in
let line_number = CLocation.get_line stmt_info parent_line_number in let trans_state' = { trans_state_pri with succ_nodes = [] } in
let trans_state'' = { trans_state_pri with parent_line_number = line_number; succ_nodes =[]} in let res_trans_e1 = exec_with_self_exception instruction trans_state' s1 in
let res_trans_e1 = exec_with_self_exception instruction trans_state'' s1 in
let res_trans_e2 = let res_trans_e2 =
(* translation of s2 is done taking care of block special case *) (* translation of s2 is done taking care of block special case *)
exec_with_block_priority_exception (exec_with_self_exception instruction) trans_state'' s2 stmt_info in exec_with_block_priority_exception (exec_with_self_exception instruction) trans_state' s2 stmt_info in
let (sil_e1, sil_typ1) = extract_exp_from_list res_trans_e1.exps "\nWARNING: Missing LHS operand in BinOp. Returning -1. Fix needed...\n" in let (sil_e1, sil_typ1) = extract_exp_from_list res_trans_e1.exps "\nWARNING: Missing LHS operand in BinOp. Returning -1. Fix needed...\n" in
let (sil_e2, sil_typ2) = extract_exp_from_list res_trans_e2.exps "\nWARNING: Missing RHS operand in BinOp. Returning -1. Fix needed...\n" in let (sil_e2, sil_typ2) = extract_exp_from_list res_trans_e2.exps "\nWARNING: Missing RHS operand in BinOp. Returning -1. Fix needed...\n" in
let exp_op, instr_bin, ids_bin = let exp_op, instr_bin, ids_bin =
@ -623,27 +615,25 @@ struct
| _ -> assert false) (* Binary operator should have two operands*) | _ -> assert false) (* Binary operator should have two operands*)
and callExpr_trans trans_state si stmt_list expr_info = and callExpr_trans trans_state si stmt_list expr_info =
let pln = trans_state.parent_line_number in
let context = trans_state.context in let context = trans_state.context in
let function_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in let function_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in
let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in
let sil_loc = CLocation.get_sil_location si pln context in let sil_loc = CLocation.get_sil_location si context in
(* First stmt is the function expr and the rest are params *) (* First stmt is the function expr and the rest are params *)
let fun_exp_stmt, params_stmt = (match stmt_list with let fun_exp_stmt, params_stmt = (match stmt_list with
| fe :: params -> fe, params | fe :: params -> fe, params
| _ -> assert false) in | _ -> assert false) in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in
(* claim priority if no ancestors has claimed priority before *) (* claim priority if no ancestors has claimed priority before *)
let line_number = CLocation.get_line si pln in
let context_callee = { context with CContext.is_callee_expression = true } in let context_callee = { context with CContext.is_callee_expression = true } in
let trans_state_callee = { trans_state_pri with context = context_callee; parent_line_number = line_number; succ_nodes = []} in let trans_state_callee = { trans_state_pri with context = context_callee; succ_nodes = [] } in
let is_call_to_block = objc_exp_of_type_block fun_exp_stmt in let is_call_to_block = objc_exp_of_type_block fun_exp_stmt in
let res_trans_callee = instruction trans_state_callee fun_exp_stmt in let res_trans_callee = instruction trans_state_callee fun_exp_stmt in
(* As we may have nodes coming from different parameters we need to *) (* As we may have nodes coming from different parameters we need to *)
(* call instruction for each parameter and collect the results *) (* call instruction for each parameter and collect the results *)
(* afterwards. The 'instructions' function does not do that *) (* afterwards. The 'instructions' function does not do that *)
let trans_state_param = let trans_state_param =
{ trans_state_pri with parent_line_number = line_number; succ_nodes = [] } in { trans_state_pri with succ_nodes = [] } in
let (sil_fe, typ_fe) = extract_exp_from_list res_trans_callee.exps let (sil_fe, typ_fe) = extract_exp_from_list res_trans_callee.exps
"WARNING: The translation of fun_exp did not return an expression. Returning -1. NEED TO BE FIXED" in "WARNING: The translation of fun_exp did not return an expression. Returning -1. NEED TO BE FIXED" in
let callee_pname_opt = let callee_pname_opt =
@ -716,11 +706,9 @@ struct
and cxx_method_construct_call_trans trans_state_pri result_trans_callee fun_stmt params_stmt and cxx_method_construct_call_trans trans_state_pri result_trans_callee fun_stmt params_stmt
si function_type = si function_type =
let open CContext in let open CContext in
let pln = trans_state_pri.parent_line_number in
let line_number = CLocation.get_line si pln in
let context = trans_state_pri.context in let context = trans_state_pri.context in
let procname = Cfg.Procdesc.get_proc_name context.procdesc in let procname = Cfg.Procdesc.get_proc_name context.procdesc in
let sil_loc = CLocation.get_sil_location si pln context in let sil_loc = CLocation.get_sil_location si context in
(* first for method address, second for 'this' expression *) (* first for method address, second for 'this' expression *)
assert ((IList.length result_trans_callee.exps) = 2); assert ((IList.length result_trans_callee.exps) = 2);
let (sil_method, typ_method) = IList.hd result_trans_callee.exps in let (sil_method, typ_method) = IList.hd result_trans_callee.exps in
@ -732,7 +720,7 @@ struct
(* call instruction for each parameter and collect the results *) (* call instruction for each parameter and collect the results *)
(* afterwards. The 'instructions' function does not do that *) (* afterwards. The 'instructions' function does not do that *)
let trans_state_param = let trans_state_param =
{ trans_state_pri with parent_line_number = line_number; succ_nodes = [] } in { trans_state_pri with succ_nodes = [] } in
let result_trans_subexprs = let result_trans_subexprs =
let instruction' = exec_with_self_exception (exec_with_lvalue_as_reference instruction) in let instruction' = exec_with_self_exception (exec_with_lvalue_as_reference instruction) in
let res_trans_p = IList.map (instruction' trans_state_param) params_stmt in let res_trans_p = IList.map (instruction' trans_state_param) params_stmt in
@ -760,7 +748,6 @@ struct
| _ -> assert false (* by construction of red_id, we cannot be in this case *) | _ -> assert false (* by construction of red_id, we cannot be in this case *)
and cxxMemberCallExpr_trans trans_state si stmt_list expr_info = and cxxMemberCallExpr_trans trans_state si stmt_list expr_info =
let pln = trans_state.parent_line_number in
let context = trans_state.context in let context = trans_state.context in
(* Structure is the following: *) (* Structure is the following: *)
(* CXXMemberCallExpr: first stmt is method+this expr and the rest are normal params *) (* CXXMemberCallExpr: first stmt is method+this expr and the rest are normal params *)
@ -771,10 +758,7 @@ struct
| _ -> assert false) in | _ -> assert false) in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in
(* claim priority if no ancestors has claimed priority before *) (* claim priority if no ancestors has claimed priority before *)
let line_number = CLocation.get_line si pln in let trans_state_callee = { trans_state_pri with succ_nodes = [] } in
let trans_state_callee = { trans_state_pri with
parent_line_number = line_number;
succ_nodes = [] } in
let result_trans_callee = instruction trans_state_callee fun_exp_stmt in let result_trans_callee = instruction trans_state_callee fun_exp_stmt in
let function_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in let function_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in
cxx_method_construct_call_trans trans_state_pri result_trans_callee fun_exp_stmt params_stmt cxx_method_construct_call_trans trans_state_pri result_trans_callee fun_exp_stmt params_stmt
@ -841,13 +825,10 @@ struct
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)); (string_of_bool (PriorityNode.is_priority_free trans_state));
let context = trans_state.context in let context = trans_state.context in
let parent_line_number = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location si context in
let line_number = CLocation.get_line si parent_line_number in
let sil_loc = CLocation.get_sil_location si parent_line_number context in
let method_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in let method_type = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state si in
let trans_state_param = let trans_state_param = { trans_state_pri with succ_nodes = [] } in
{ trans_state_pri with parent_line_number = line_number; succ_nodes = [] } in
let obj_c_message_expr_info, res_trans_subexpr_list = let obj_c_message_expr_info, res_trans_subexpr_list =
objCMessageExpr_deal_with_static_self trans_state_param stmt_list obj_c_message_expr_info in objCMessageExpr_deal_with_static_self trans_state_param stmt_list obj_c_message_expr_info in
let subexpr_exprs = collect_exprs res_trans_subexpr_list in let subexpr_exprs = collect_exprs res_trans_subexpr_list in
@ -910,31 +891,25 @@ struct
let pvar = Sil.mk_pvar (Mangled.from_string v) procname in let pvar = Sil.mk_pvar (Mangled.from_string v) procname in
let typ = CTypes_decl.type_ptr_to_sil_type trans_state.context.CContext.tenv tp in let typ = CTypes_decl.type_ptr_to_sil_type trans_state.context.CContext.tenv tp in
(pvar, typ)) vars_to_register in (pvar, typ)) vars_to_register in
let loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in let loc = CLocation.get_sil_location stmt_info trans_state.context in
let res_state = instruction trans_state transformed_stmt in let res_state = instruction trans_state transformed_stmt in
let preds = IList.flatten (IList.map (fun n -> Cfg.Node.get_preds n) trans_state.succ_nodes) in let preds = IList.flatten (IList.map (fun n -> Cfg.Node.get_preds n) trans_state.succ_nodes) in
IList.iter (declare_nullify_vars loc res_state res_state.root_nodes preds) pvars_types; IList.iter (declare_nullify_vars loc res_state res_state.root_nodes preds) pvars_types;
res_state res_state
and compoundStmt_trans trans_state stmt_info stmt_list = and compoundStmt_trans trans_state stmt_info stmt_list =
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in instructions trans_state (IList.rev stmt_list)
let trans_state' = { trans_state with parent_line_number = line_number } in
instructions trans_state' (IList.rev stmt_list)
and conditionalOperator_trans trans_state stmt_info stmt_list expr_info = and conditionalOperator_trans trans_state stmt_info stmt_list expr_info =
let context = trans_state.context in let context = trans_state.context in
let parent_line_number = trans_state.parent_line_number in
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in
let mk_temp_var id = let mk_temp_var id =
Sil.mk_pvar (Mangled.from_string ("SIL_temp_conditional___"^(string_of_int id))) procname in Sil.mk_pvar (Mangled.from_string ("SIL_temp_conditional___"^(string_of_int id))) procname in
let sil_loc = CLocation.get_sil_location stmt_info parent_line_number context in let sil_loc = CLocation.get_sil_location stmt_info context in
let line_number = CLocation.get_line stmt_info parent_line_number in
let do_branch branch stmt var_typ prune_nodes join_node pvar = let do_branch branch stmt var_typ prune_nodes join_node pvar =
let trans_state_pri = PriorityNode.force_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.force_claim_priority_node trans_state stmt_info in
let trans_state' = { trans_state_pri with let trans_state' = { trans_state_pri with succ_nodes = [] } in
succ_nodes = [];
parent_line_number = line_number } in
let res_trans_b = instruction trans_state' stmt in let res_trans_b = instruction trans_state' stmt in
let (e', e'_typ) = extract_exp_from_list res_trans_b.exps let (e', e'_typ) = extract_exp_from_list res_trans_b.exps
"\nWARNING: Missing branch expression for Conditional operator. Need to be fixed\n" in "\nWARNING: Missing branch expression for Conditional operator. Need to be fixed\n" in
@ -959,7 +934,7 @@ struct
Cfg.Node.set_succs_exn join_node succ_nodes []; Cfg.Node.set_succs_exn join_node succ_nodes [];
let pvar = mk_temp_var (Cfg.Node.get_id join_node) in let pvar = mk_temp_var (Cfg.Node.get_id join_node) in
let continuation' = mk_cond_continuation trans_state.continuation in let continuation' = mk_cond_continuation trans_state.continuation in
let trans_state' = { trans_state with continuation = continuation'; parent_line_number = line_number; succ_nodes =[]} in let trans_state' = { trans_state with continuation = continuation'; succ_nodes = [] } in
let res_trans_cond = exec_with_priority_exception trans_state' cond cond_trans in let res_trans_cond = exec_with_priority_exception trans_state' cond cond_trans in
(* Note: by contruction prune nodes are leafs_nodes_cond *) (* Note: by contruction prune nodes are leafs_nodes_cond *)
do_branch true exp1 var_typ res_trans_cond.leaf_nodes join_node pvar; do_branch true exp1 var_typ res_trans_cond.leaf_nodes join_node pvar;
@ -982,9 +957,8 @@ struct
(* the prune nodes. Moreover these are always the leaf nodes of the translation. *) (* the prune nodes. Moreover these are always the leaf nodes of the translation. *)
and cond_trans trans_state cond = and cond_trans trans_state cond =
let context = trans_state.context in let context = trans_state.context in
let parent_line_number = trans_state.parent_line_number in
let si, _ = Clang_ast_proj.get_stmt_tuple cond in let si, _ = Clang_ast_proj.get_stmt_tuple cond in
let sil_loc = CLocation.get_sil_location si parent_line_number context in let sil_loc = CLocation.get_sil_location si context in
let mk_prune_node b e ids ins = let mk_prune_node b e ids ins =
create_prune_node b e ids ins sil_loc (Sil.Ik_if) context in create_prune_node b e ids ins sil_loc (Sil.Ik_if) context in
let extract_exp el = let extract_exp el =
@ -1062,13 +1036,11 @@ struct
and ifStmt_trans trans_state stmt_info stmt_list = and ifStmt_trans trans_state stmt_info stmt_list =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let line_number = CLocation.get_line stmt_info pln in
let join_node = create_node (Cfg.Node.Join_node) [] [] sil_loc context in let join_node = create_node (Cfg.Node.Join_node) [] [] sil_loc context in
Cfg.Node.set_succs_exn join_node succ_nodes []; Cfg.Node.set_succs_exn join_node succ_nodes [];
let trans_state' = { trans_state with parent_line_number = line_number; succ_nodes = [join_node]} in let trans_state' = { trans_state with succ_nodes = [join_node] } in
let do_branch branch stmt_branch prune_nodes = let do_branch branch stmt_branch prune_nodes =
(* leaf nodes are ignored here as they will be already attached to join_node *) (* leaf nodes are ignored here as they will be already attached to join_node *)
let res_trans_b = instruction trans_state' stmt_branch in let res_trans_b = instruction trans_state' stmt_branch in
@ -1085,8 +1057,7 @@ struct
let continuation' = mk_cond_continuation trans_state.continuation in let continuation' = mk_cond_continuation trans_state.continuation in
let trans_state'' = { trans_state with let trans_state'' = { trans_state with
continuation = continuation'; continuation = continuation';
succ_nodes = []; succ_nodes = []
parent_line_number = line_number
} in } in
let res_trans_cond = cond_trans trans_state'' cond in let res_trans_cond = cond_trans trans_state'' cond in
let res_trans_decl = declStmt_in_condition_trans trans_state decl_stmt res_trans_cond in let res_trans_decl = declStmt_in_condition_trans trans_state decl_stmt res_trans_cond in
@ -1105,10 +1076,9 @@ struct
(* Assumption: the CompoundStmt can be made of different stmts, not just CaseStmts *) (* Assumption: the CompoundStmt can be made of different stmts, not just CaseStmts *)
and switchStmt_trans trans_state stmt_info switch_stmt_list = and switchStmt_trans trans_state stmt_info switch_stmt_list =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let continuation = trans_state.continuation in let continuation = trans_state.continuation in
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let open Clang_ast_t in let open Clang_ast_t in
match switch_stmt_list with match switch_stmt_list with
| [decl_stmt; cond; CompoundStmt(stmt_info, stmt_list)] -> | [decl_stmt; cond; CompoundStmt(stmt_info, stmt_list)] ->
@ -1190,7 +1160,7 @@ struct
| [(head, typ)] -> head | [(head, typ)] -> head
| _ -> assert false in | _ -> assert false in
let sil_eq_cond = Sil.BinOp (Sil.Eq, switch_e_cond', e_const') in let sil_eq_cond = Sil.BinOp (Sil.Eq, switch_e_cond', e_const') in
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let true_prune_node = let true_prune_node =
create_prune_node true [(sil_eq_cond, switch_e_cond'_typ)] create_prune_node true [(sil_eq_cond, switch_e_cond'_typ)]
res_trans_case_const.ids res_trans_case_const.instrs res_trans_case_const.ids res_trans_case_const.instrs
@ -1212,7 +1182,7 @@ struct
Cfg.Node.set_succs_exn prune_node_f last_prune_nodes []; Cfg.Node.set_succs_exn prune_node_f last_prune_nodes [];
case_entry_point, [prune_node_t; prune_node_f] case_entry_point, [prune_node_t; prune_node_f]
| DefaultStmt(stmt_info, default_content) :: rest -> | DefaultStmt(stmt_info, default_content) :: rest ->
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let placeholder_entry_point = let placeholder_entry_point =
create_node (Cfg.Node.Stmt_node "DefaultStmt_placeholder") [] [] sil_loc context in create_node (Cfg.Node.Stmt_node "DefaultStmt_placeholder") [] [] sil_loc context in
let last_nodes, last_prune_nodes = translate_and_connect_cases rest next_nodes [placeholder_entry_point] in let last_nodes, last_prune_nodes = translate_and_connect_cases rest next_nodes [placeholder_entry_point] in
@ -1240,7 +1210,7 @@ struct
(* takes the value of the last subexpression.*) (* takes the value of the last subexpression.*)
(* Exp returned by StmtExpr is always a RValue. So we need to assign to a temp and return the temp.*) (* Exp returned by StmtExpr is always a RValue. So we need to assign to a temp and return the temp.*)
let id = Ident.create_fresh Ident.knormal in let id = Ident.create_fresh Ident.knormal in
let loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number context in let loc = CLocation.get_sil_location stmt_info context in
let instr' = Sil.Letderef (id, last, typ, loc) in let instr' = Sil.Letderef (id, last, typ, loc) in
{ root_nodes = res_trans_stmt.root_nodes; { root_nodes = res_trans_stmt.root_nodes;
leaf_nodes = res_trans_stmt.leaf_nodes; leaf_nodes = res_trans_stmt.leaf_nodes;
@ -1252,10 +1222,8 @@ struct
and loop_instruction trans_state loop_kind stmt_info = and loop_instruction trans_state loop_kind stmt_info =
let outer_continuation = trans_state.continuation in let outer_continuation = trans_state.continuation in
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let line_number = CLocation.get_line stmt_info pln in
let join_node = create_node Cfg.Node.Join_node [] [] sil_loc context in let join_node = create_node Cfg.Node.Join_node [] [] sil_loc context in
let continuation = Some { break = succ_nodes; continue = [join_node]; return_temp = false } in let continuation = Some { break = succ_nodes; continue = [join_node]; return_temp = false } in
(* set the flat to inform that we are translating a condition of a if *) (* set the flat to inform that we are translating a condition of a if *)
@ -1267,18 +1235,15 @@ struct
trans_state with trans_state with
succ_nodes = [join_node]; succ_nodes = [join_node];
continuation = continuation; continuation = continuation;
parent_line_number = line_number;
} in } in
let res_trans_init = instruction trans_state' init in let res_trans_init = instruction trans_state' init in
let res_trans_incr = instruction trans_state' incr in let res_trans_incr = instruction trans_state' incr in
Some (res_trans_init.root_nodes, res_trans_incr.root_nodes) Some (res_trans_init.root_nodes, res_trans_incr.root_nodes)
| _ -> None in | _ -> None in
let cond_stmt = Loops.get_cond loop_kind in let cond_stmt = Loops.get_cond loop_kind in
let cond_line_number = CLocation.get_line (fst (Clang_ast_proj.get_stmt_tuple cond_stmt)) line_number in
let trans_state_cond = { let trans_state_cond = {
trans_state with trans_state with
continuation = continuation_cond; continuation = continuation_cond;
parent_line_number = cond_line_number;
succ_nodes = []; succ_nodes = [];
} in } in
let res_trans_cond = cond_trans trans_state_cond cond_stmt in let res_trans_cond = cond_trans trans_state_cond cond_stmt in
@ -1304,8 +1269,7 @@ struct
let trans_state_body = let trans_state_body =
{ trans_state with { trans_state with
succ_nodes = body_succ_nodes; succ_nodes = body_succ_nodes;
continuation = body_continuation; continuation = body_continuation } in
parent_line_number = line_number } in
instruction trans_state_body (Loops.get_body loop_kind) in instruction trans_state_body (Loops.get_body loop_kind) in
let join_succ_nodes = let join_succ_nodes =
match loop_kind with match loop_kind with
@ -1411,7 +1375,7 @@ struct
{ empty_res_trans with root_nodes = succ_nodes } { empty_res_trans with root_nodes = succ_nodes }
) else ( ) else (
(* Creating new instructions by assigning right hand side to left hand side expressions *) (* Creating new instructions by assigning right hand side to left hand side expressions *)
let sil_loc = CLocation.get_sil_location stmt_info trans_state_pri.parent_line_number context in let sil_loc = CLocation.get_sil_location stmt_info context in
let big_zip = IList.map let big_zip = IList.map
(fun ( (lh_exp, lh_t), (_, _, rh_exp, is_method_call, rhs_owning_method, rh_t) ) -> (fun ( (lh_exp, lh_t), (_, _, rh_exp, is_method_call, rhs_owning_method, rh_t) ) ->
let is_pointer_object = ObjcInterface_decl.is_pointer_to_objc_class context.CContext.tenv rh_t in let is_pointer_object = ObjcInterface_decl.is_pointer_to_objc_class context.CContext.tenv rh_t in
@ -1469,17 +1433,13 @@ struct
| Some ie -> (*For init expr, translate how to compute it and assign to the var*) | Some ie -> (*For init expr, translate how to compute it and assign to the var*)
let stmt_info, _ = Clang_ast_proj.get_stmt_tuple ie in let stmt_info, _ = Clang_ast_proj.get_stmt_tuple ie in
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location stmt_info context in
let sil_loc = CLocation.get_sil_location stmt_info pln context in
let var_exp, var_typ = extract_exp_from_list var_res_trans.exps let var_exp, var_typ = extract_exp_from_list var_res_trans.exps
"WARNING: init_expr_trans expects one variable expression" in "WARNING: init_expr_trans expects one variable expression" in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state var_stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state var_stmt_info in
let line_number = CLocation.get_line stmt_info pln in
(* if ie is a block the translation need to be done with the block special cases by exec_with_block_priority*) (* if ie is a block the translation need to be done with the block special cases by exec_with_block_priority*)
let res_trans_ie = let res_trans_ie =
let trans_state' = { trans_state_pri with let trans_state' = { trans_state_pri with succ_nodes = [] } in
succ_nodes = [];
parent_line_number = line_number } in
let instruction' = let instruction' =
exec_with_self_exception (exec_with_lvalue_as_reference instruction) in exec_with_self_exception (exec_with_lvalue_as_reference instruction) in
exec_with_block_priority_exception instruction' trans_state' ie var_stmt_info in exec_with_block_priority_exception instruction' trans_state' ie var_stmt_info in
@ -1538,16 +1498,14 @@ struct
(* the init expression. We use the latter info. *) (* the init expression. We use the latter info. *)
and declStmt_trans trans_state decl_list stmt_info = and declStmt_trans trans_state decl_list stmt_info =
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in
let trans_state' = { trans_state with parent_line_number = line_number } in
let res_trans = let res_trans =
let open Clang_ast_t in let open Clang_ast_t in
match decl_list with match decl_list with
| VarDecl _ :: _ -> (* Case for simple variable declarations*) | VarDecl _ :: _ -> (* Case for simple variable declarations*)
collect_all_decl trans_state' decl_list succ_nodes stmt_info collect_all_decl trans_state decl_list succ_nodes stmt_info
| CXXRecordDecl _ :: _ (*C++/C record decl treated in the same way *) | CXXRecordDecl _ :: _ (*C++/C record decl treated in the same way *)
| RecordDecl _ :: _ -> (* Case for struct *) | RecordDecl _ :: _ -> (* Case for struct *)
collect_all_decl trans_state' decl_list succ_nodes stmt_info collect_all_decl trans_state decl_list succ_nodes stmt_info
| _ -> | _ ->
Printing.log_stats Printing.log_stats
"WARNING: In DeclStmt found an unknown declaration type. RETURNING empty list of declaration. NEED TO BE FIXED"; "WARNING: In DeclStmt found an unknown declaration type. RETURNING empty list of declaration. NEED TO BE FIXED";
@ -1583,15 +1541,13 @@ struct
(* to translate the CallToSetter which is how x.f = a is actually implemented by the runtime.*) (* to translate the CallToSetter which is how x.f = a is actually implemented by the runtime.*)
and pseudoObjectExpr_trans trans_state stmt_info stmt_list = and pseudoObjectExpr_trans trans_state stmt_info stmt_list =
let open Clang_ast_t in let open Clang_ast_t in
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in
let trans_state' = { trans_state with parent_line_number = line_number } in
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)); (string_of_bool (PriorityNode.is_priority_free trans_state));
let rec do_semantic_elements el = let rec do_semantic_elements el =
let open Clang_ast_t in let open Clang_ast_t in
match el with match el with
| OpaqueValueExpr _ :: el' -> do_semantic_elements el' | OpaqueValueExpr _ :: el' -> do_semantic_elements el'
| stmt :: _ -> instruction trans_state' stmt | stmt :: _ -> instruction trans_state stmt
| _ -> assert false in | _ -> assert false in
match stmt_list with match stmt_list with
| syntactic_form :: semantic_form -> | syntactic_form :: semantic_form ->
@ -1601,15 +1557,12 @@ struct
(* Cast expression are treated the same apart from the cast operation kind*) (* Cast expression are treated the same apart from the cast operation kind*)
and cast_exprs_trans trans_state stmt_info stmt_list expr_info cast_expr_info is_objc_bridged = and cast_exprs_trans trans_state stmt_info stmt_list expr_info cast_expr_info is_objc_bridged =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
Printing.log_out " priority node free = '%s'\n@." Printing.log_out " priority node free = '%s'\n@."
(string_of_bool (PriorityNode.is_priority_free trans_state)); (string_of_bool (PriorityNode.is_priority_free trans_state));
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let stmt = extract_stmt_from_singleton stmt_list let stmt = extract_stmt_from_singleton stmt_list
"WARNING: In CastExpr There must be only one stmt defining the expression to be cast.\n" in "WARNING: In CastExpr There must be only one stmt defining the expression to be cast.\n" in
let line_number = CLocation.get_line stmt_info pln in let res_trans_stmt = instruction trans_state stmt in
let trans_state' = { trans_state with parent_line_number = line_number } in
let res_trans_stmt = instruction trans_state' stmt in
let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in let typ = CTypes_decl.type_ptr_to_sil_type context.CContext.tenv expr_info.Clang_ast_t.ei_type_ptr in
let cast_kind = cast_expr_info.Clang_ast_t.cei_cast_kind in let cast_kind = cast_expr_info.Clang_ast_t.cei_cast_kind in
(* This gives the differnece among cast operations kind*) (* This gives the differnece among cast operations kind*)
@ -1638,13 +1591,11 @@ struct
and unaryOperator_trans trans_state stmt_info expr_info stmt_list unary_operator_info = and unaryOperator_trans trans_state stmt_info expr_info stmt_list unary_operator_info =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in let sil_loc = CLocation.get_sil_location stmt_info context in
let sil_loc = CLocation.get_sil_location stmt_info pln context in
let line_number = CLocation.get_line stmt_info pln in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in
let stmt = extract_stmt_from_singleton stmt_list let stmt = extract_stmt_from_singleton stmt_list
"WARNING: We expect only one element in stmt list defining the operand in UnaryOperator. NEED FIXING\n" in "WARNING: We expect only one element in stmt list defining the operand in UnaryOperator. NEED FIXING\n" in
let trans_state' = { trans_state_pri with succ_nodes =[]; parent_line_number = line_number } in let trans_state' = { trans_state_pri with succ_nodes = [] } in
let res_trans_stmt = instruction trans_state' stmt in let res_trans_stmt = instruction trans_state' stmt in
(* Assumption: the operand does not create a cfg node*) (* Assumption: the operand does not create a cfg node*)
let (sil_e', _) = extract_exp_from_list res_trans_stmt.exps "\nWARNING: Missing operand in unary operator. NEED FIXING.\n" in let (sil_e', _) = extract_exp_from_list res_trans_stmt.exps "\nWARNING: Missing operand in unary operator. NEED FIXING.\n" in
@ -1660,10 +1611,8 @@ struct
and returnStmt_trans trans_state stmt_info stmt_list = and returnStmt_trans trans_state stmt_info stmt_list =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
let succ_nodes = trans_state.succ_nodes in let succ_nodes = trans_state.succ_nodes in
let sil_loc = CLocation.get_sil_location stmt_info pln context in let sil_loc = CLocation.get_sil_location stmt_info context in
let line_number = CLocation.get_line stmt_info pln in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in
let mk_ret_node ids instrs = let mk_ret_node ids instrs =
let ret_node = create_node (Cfg.Node.Stmt_node "Return Stmt") ids instrs sil_loc context in let ret_node = create_node (Cfg.Node.Stmt_node "Return Stmt") ids instrs sil_loc context in
@ -1671,9 +1620,7 @@ struct
ret_node in ret_node in
let trans_result = (match stmt_list with let trans_result = (match stmt_list with
| [stmt] -> (* return exp; *) | [stmt] -> (* return exp; *)
let trans_state' = { trans_state_pri with let trans_state' = { trans_state_pri with succ_nodes = [] } in
succ_nodes = [];
parent_line_number = line_number } in
let res_trans_stmt = exec_with_self_exception instruction trans_state' stmt in let res_trans_stmt = exec_with_self_exception instruction trans_state' stmt in
let (sil_expr, sil_typ) = extract_exp_from_list res_trans_stmt.exps let (sil_expr, sil_typ) = extract_exp_from_list res_trans_stmt.exps
"WARNING: There should be only one return expression.\n" in "WARNING: There should be only one return expression.\n" in
@ -1701,11 +1648,9 @@ struct
(* For ParenExpression we translate its body composed by the stmt_list. *) (* For ParenExpression we translate its body composed by the stmt_list. *)
(* In paren expression there should be only one stmt that defines the expression *) (* In paren expression there should be only one stmt that defines the expression *)
and parenExpr_trans trans_state stmt_info stmt_list = and parenExpr_trans trans_state stmt_info stmt_list =
let line_number = CLocation.get_line stmt_info trans_state.parent_line_number in
let trans_state'= { trans_state with parent_line_number = line_number } in
let stmt = extract_stmt_from_singleton stmt_list let stmt = extract_stmt_from_singleton stmt_list
"WARNING: In ParenExpression there should be only one stmt.\n" in "WARNING: In ParenExpression there should be only one stmt.\n" in
instruction trans_state' stmt instruction trans_state stmt
and objCBoxedExpr_trans trans_state info sel stmt_info stmts = and objCBoxedExpr_trans trans_state info sel stmt_info stmts =
let typ = CTypes_decl.class_from_pointer_type trans_state.context.CContext.tenv info.Clang_ast_t.ei_type_ptr in let typ = CTypes_decl.class_from_pointer_type trans_state.context.CContext.tenv info.Clang_ast_t.ei_type_ptr in
@ -1745,7 +1690,7 @@ struct
ignored when checking for memory leaks. When the end of the block autoreleasepool is reached, ignored when checking for memory leaks. When the end of the block autoreleasepool is reached,
then those objects are released and the autorelease flag is removed. *) then those objects are released and the autorelease flag is removed. *)
and objcAutoreleasePool_trans trans_state stmt_info stmts = and objcAutoreleasePool_trans trans_state stmt_info stmts =
let sil_loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number trans_state.context in let sil_loc = CLocation.get_sil_location stmt_info trans_state.context in
let fname = SymExec.ModelBuiltins.__objc_release_autorelease_pool in let fname = SymExec.ModelBuiltins.__objc_release_autorelease_pool in
let ret_id = Ident.create_fresh Ident.knormal in let ret_id = Ident.create_fresh Ident.knormal in
let autorelease_pool_vars = CVar_decl.compute_autorelease_pool_vars trans_state.context stmts in let autorelease_pool_vars = CVar_decl.compute_autorelease_pool_vars trans_state.context stmts in
@ -1767,11 +1712,10 @@ struct
and blockExpr_trans trans_state stmt_info expr_info decl = and blockExpr_trans trans_state stmt_info expr_info decl =
let context = trans_state.context in let context = trans_state.context in
let pln = trans_state.parent_line_number in
let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in let procname = Cfg.Procdesc.get_proc_name context.CContext.procdesc in
let loc = let loc =
(match stmt_info.Clang_ast_t.si_source_range with (l1, l2) -> (match stmt_info.Clang_ast_t.si_source_range with (l1, l2) ->
CLocation.clang_to_sil_location l1 pln (Some context.CContext.procdesc)) in CLocation.clang_to_sil_location l1 (Some context.CContext.procdesc)) in
(* Given a captured var, return the instruction to assign it to a temp *) (* Given a captured var, return the instruction to assign it to a temp *)
let assign_captured_var (cvar, typ) = let assign_captured_var (cvar, typ) =
let id = Ident.create_fresh Ident.knormal in let id = Ident.create_fresh Ident.knormal in
@ -1806,7 +1750,7 @@ struct
and cxxNewExpr_trans trans_state stmt_info expr_info = and cxxNewExpr_trans trans_state stmt_info expr_info =
let context = trans_state.context in let context = trans_state.context in
let typ = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in let typ = CTypes_decl.get_type_from_expr_info expr_info context.CContext.tenv in
let sil_loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number context in let sil_loc = CLocation.get_sil_location stmt_info context in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in
cpp_new_trans trans_state_pri sil_loc stmt_info typ cpp_new_trans trans_state_pri sil_loc stmt_info typ
(* TODOs 7912220 - no usable information in json as of right now *) (* TODOs 7912220 - no usable information in json as of right now *)
@ -1815,7 +1759,7 @@ struct
and cxxDeleteExpr_trans trans_state stmt_info stmt_list expr_info = and cxxDeleteExpr_trans trans_state stmt_info stmt_list expr_info =
let context = trans_state.context in let context = trans_state.context in
let sil_loc = CLocation.get_sil_location stmt_info trans_state.parent_line_number context in let sil_loc = CLocation.get_sil_location stmt_info context in
let fname = SymExec.ModelBuiltins.__delete in let fname = SymExec.ModelBuiltins.__delete in
let param = match stmt_list with [p] -> p | _ -> assert false in let param = match stmt_list with [p] -> p | _ -> assert false in
let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in let trans_state_pri = PriorityNode.try_claim_priority_node trans_state stmt_info in
@ -2105,7 +2049,6 @@ struct
context = context; context = context;
succ_nodes = []; succ_nodes = [];
continuation = None; continuation = None;
parent_line_number = -1;
priority = Free; priority = Free;
} in } in
let res_trans_stmt = instruction trans_state stmt in let res_trans_stmt = instruction trans_state stmt in
@ -2116,7 +2059,6 @@ struct
context = context; context = context;
succ_nodes = [exit_node]; succ_nodes = [exit_node];
continuation = None; continuation = None;
parent_line_number = -1;
priority = Free; priority = Free;
} in } in
let clang_ast_trans = get_clang_stmt_trans clang_stmt_list in let clang_ast_trans = get_clang_stmt_trans clang_stmt_list in

@ -135,7 +135,6 @@ type trans_state = {
context: CContext.t; (* current context of the translation *) context: CContext.t; (* current context of the translation *)
succ_nodes: Cfg.Node.t list; (* successor nodes in the cfg *) succ_nodes: Cfg.Node.t list; (* successor nodes in the cfg *)
continuation: continuation option; (* current continuation *) continuation: continuation option; (* current continuation *)
parent_line_number: int; (* line numbeer of the parent element in the AST *)
priority: priority_node; priority: priority_node;
} }
@ -594,19 +593,17 @@ let get_info_from_decl_ref decl_ref =
let type_ptr = match decl_ref.Clang_ast_t.dr_type_ptr with Some tp -> tp | _ -> assert false in let type_ptr = match decl_ref.Clang_ast_t.dr_type_ptr with Some tp -> tp | _ -> assert false in
name_info, decl_ptr, type_ptr name_info, decl_ptr, type_ptr
let rec get_decl_ref_info s parent_line_number = let rec get_decl_ref_info s =
match s with match s with
| Clang_ast_t.DeclRefExpr (stmt_info, stmt_list, expr_info, decl_ref_expr_info) -> | Clang_ast_t.DeclRefExpr (stmt_info, stmt_list, expr_info, decl_ref_expr_info) ->
(let line_number = CLocation.get_line stmt_info parent_line_number in (match decl_ref_expr_info.Clang_ast_t.drti_decl_ref with
match decl_ref_expr_info.Clang_ast_t.drti_decl_ref with | Some decl_ref -> decl_ref
| Some decl_ref -> decl_ref, line_number
| None -> assert false) | None -> assert false)
| _ -> | _ ->
match Clang_ast_proj.get_stmt_tuple s with match Clang_ast_proj.get_stmt_tuple s with
| stmt_info, [] -> assert false | stmt_info, [] -> assert false
| stmt_info, s'':: _ -> | stmt_info, s'':: _ ->
let line_number = CLocation.get_line stmt_info parent_line_number in get_decl_ref_info s''
get_decl_ref_info s'' line_number
let rec contains_opaque_value_expr s = let rec contains_opaque_value_expr s =
match s with match s with

@ -23,7 +23,6 @@ type trans_state = {
context: CContext.t; context: CContext.t;
succ_nodes: Cfg.Node.t list; succ_nodes: Cfg.Node.t list;
continuation: continuation option; continuation: continuation option;
parent_line_number: int;
priority: priority_node; priority: priority_node;
} }
@ -90,7 +89,7 @@ val contains_opaque_value_expr : Clang_ast_t.stmt -> bool
val get_info_from_decl_ref : Clang_ast_t.decl_ref -> val get_info_from_decl_ref : Clang_ast_t.decl_ref ->
Clang_ast_t.named_decl_info * Clang_ast_t.pointer * Clang_ast_t.type_ptr Clang_ast_t.named_decl_info * Clang_ast_t.pointer * Clang_ast_t.type_ptr
val get_decl_ref_info : Clang_ast_t.stmt -> int -> Clang_ast_t.decl_ref * int val get_decl_ref_info : Clang_ast_t.stmt -> Clang_ast_t.decl_ref
val builtin_trans : trans_state -> Location.t -> Clang_ast_t.stmt_info -> val builtin_trans : trans_state -> Location.t -> Clang_ast_t.stmt_info ->
Sil.typ -> Procname.t option -> trans_result option Sil.typ -> Procname.t option -> trans_result option

Loading…
Cancel
Save