From 7f8282e0461595d69be94cbf1f588ee8f91f445a Mon Sep 17 00:00:00 2001 From: Rohan Jacob-Rao Date: Wed, 26 Aug 2015 11:52:45 -0700 Subject: [PATCH] Simplify generation of source file locations and attach to more SIL objects. --- infer/lib/clang/clang_general_wrapper | 2 +- infer/src/llvm/lMain.ml | 11 +++++------ infer/src/llvm/lTrans.ml | 23 ++++++++++------------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/infer/lib/clang/clang_general_wrapper b/infer/lib/clang/clang_general_wrapper index 953a686c7..b3a9c3e26 100755 --- a/infer/lib/clang/clang_general_wrapper +++ b/infer/lib/clang/clang_general_wrapper @@ -158,7 +158,7 @@ if [ -n "$ATTACH_PLUGIN" ] || [ -n "$LLVM_MODE" ]; then [[ "$SOURCE_FILE" = /* ]] || { SOURCE_FILE="${CWD}/$SOURCE_FILE"; } if [ -n "$LLVM_MODE" ]; then - INFER_FRONTEND_CMD=("${BIN_DIR}/InferLLVM") + INFER_FRONTEND_CMD=("${BIN_DIR}/InferLLVM" "$SOURCE_FILE") INFER_FRONTEND_LOG_FILE="/dev/stdout" else INFER_FRONTEND_CMD=( diff --git a/infer/src/llvm/lMain.ml b/infer/src/llvm/lMain.ml index c7f5cfa61..84411fefb 100644 --- a/infer/src/llvm/lMain.ml +++ b/infer/src/llvm/lMain.ml @@ -41,16 +41,15 @@ let store_tenv tenv = Sil.store_tenv_to_file tenv_filename tenv let () = try - let (input, filename) = + let filename = if Array.length Sys.argv < 2 then - (stdin, "stdin") (* need a file name for output files *) + raise (UsageError "First argument should be C/C++ source file.") else - let fname = Sys.argv.(1) in - (open_in fname, fname) - in + Sys.argv.(1) + in let source_file = DB.abs_source_file_from_path filename in let () = init_global_state source_file in - let lexbuf = Lexing.from_channel input in + let lexbuf = Lexing.from_channel stdin in let prog = LParser.program LLexer.token lexbuf in let (cfg, cg, tenv) = LTrans.trans_program prog in store_icfg tenv cg cfg source_file; store_tenv tenv diff --git a/infer/src/llvm/lTrans.ml b/infer/src/llvm/lTrans.ml index 7caa6fab8..17258e8b0 100644 --- a/infer/src/llvm/lTrans.ml +++ b/infer/src/llvm/lTrans.ml @@ -14,6 +14,9 @@ exception ImproperTypeError of string exception MalformedMetadata of string exception Unimplemented of string +let source_only_location () : Sil.location = + let open Sil in { line = -1; col = -1; file = !DB.current_source; nLOC = !Config.nLOC } + let ident_of_variable (var : LAst.variable) : Ident.t = (* TODO: use unique stamps *) Ident.create_normal (Ident.string_to_name (LAst.string_of_variable var)) 0 @@ -37,23 +40,17 @@ let rec trans_typ : LAst.typ -> Sil.typ = function | Tlabel -> raise (ImproperTypeError "Tried to generate Sil type from LLVM label type.") | Tmetadata -> raise (ImproperTypeError "Tried to generate Sil type from LLVM metadata type.") -let get_source_filename (metadata : LAst.metadata_map) : DB.source_file = - match MetadataMap.find 1 metadata with - | Components (MetadataVal (MetadataString file_str) :: _) -> - DB.source_file_from_string file_str - | _ -> raise (MalformedMetadata "Source file name was expected in first component of metadata variable !1.") - let location_of_annotation_option (metadata : LAst.metadata_map) : LAst.annotation option -> Sil.location = function - | None -> Sil.dummy_location (* no annotation means no source location *) + | None -> source_only_location () (* no source line/column numbers *) | Some (Annotation i) -> begin match MetadataMap.find i metadata with | Components (TypOperand (_, Const (Cint line_num)) :: _) -> let open Sil in - { line = line_num; col = -1; file = get_source_filename metadata; nLOC = -1 } + { line = line_num; col = -1; file = !DB.current_source; nLOC = !Config.nLOC } | Location loc -> let open Sil in - { line = loc.line; col = loc.col; file = get_source_filename metadata; nLOC = -1 } + { line = loc.line; col = loc.col; file = !DB.current_source; nLOC = !Config.nLOC } | _ -> raise (MalformedMetadata ("Instruction annotation refers to metadata node " ^ "without line number as first component.")) end @@ -142,15 +139,15 @@ let trans_function_def (cfg : Cfg.cfg) (cg: Cg.t) (metadata : LAst.metadata_map) formals = list_map (fun (tp, name) -> (name, trans_typ tp)) params; locals = []; (* TODO *) captured = []; - loc = Sil.dummy_location + loc = source_only_location () } in let procdesc = Cfg.Procdesc.create procdesc_builder in let start_kind = Cfg.Node.Start_node procdesc in - let start_node = Cfg.Node.create cfg Sil.dummy_location start_kind [] procdesc [] in + let start_node = Cfg.Node.create cfg (source_only_location ()) start_kind [] procdesc [] in let exit_kind = Cfg.Node.Exit_node procdesc in - let exit_node = Cfg.Node.create cfg Sil.dummy_location exit_kind [] procdesc [] in + let exit_node = Cfg.Node.create cfg (source_only_location ()) exit_kind [] procdesc [] in let node_of_sil_instr cfg procdesc sil_instr = - Cfg.Node.create cfg Sil.dummy_location (Cfg.Node.Stmt_node "method_body") + Cfg.Node.create cfg (Sil.instr_get_loc sil_instr) (Cfg.Node.Stmt_node "method_body") [sil_instr] procdesc [] in let rec link_nodes (start_node : Cfg.Node.t) : Cfg.Node.t list -> unit = function (* link all nodes in a chain for now *)