Handle source location metadata generated by clang wrapper.

master
Rohan Jacob-Rao 9 years ago
parent d6379fb7be
commit 6f51b8c54b

@ -46,6 +46,12 @@ and metadata_component =
| TypOperand of typ option * operand | TypOperand of typ option * operand
| MetadataVal of metadata_value | MetadataVal of metadata_value
type metadata_location = { line : int; col : int; scope : metadata_value }
type metadata_aggregate =
| Components of metadata_component list
| Location of metadata_location
type instruction = type instruction =
| Ret of (typ * operand) option | Ret of (typ * operand) option
| UncondBranch of variable | UncondBranch of variable
@ -62,7 +68,7 @@ type annotated_instruction = instruction * annotation option
type function_def = FunctionDef of variable * typ option * (typ * string) list * annotated_instruction list type function_def = FunctionDef of variable * typ option * (typ * string) list * annotated_instruction list
type metadata_map = metadata_component list MetadataMap.t type metadata_map = metadata_aggregate MetadataMap.t
type program = Program of function_def list * metadata_map type program = Program of function_def list * metadata_map

@ -55,6 +55,7 @@ rule token = parse
| '>' { RANGLE } | '>' { RANGLE }
| '[' { LSQBRACK } | '[' { LSQBRACK }
| ']' { RSQBRACK } | ']' { RSQBRACK }
| ':' { COLON }
(* symbols *) (* symbols *)
| '=' { EQUALS } | '=' { EQUALS }
| '*' { STAR } | '*' { STAR }
@ -171,6 +172,7 @@ rule token = parse
(* METADATA *) (* METADATA *)
| "!dbg" { DEBUG_ANNOTATION } | "!dbg" { DEBUG_ANNOTATION }
| "!MDLocation" { METADATA_LOCATION }
| '!' (id as str) { NAMED_METADATA str } | '!' (id as str) { NAMED_METADATA str }
| '!' (nonneg_int as i) { NUMBERED_METADATA (int_of_string i) } | '!' (nonneg_int as i) { NUMBERED_METADATA (int_of_string i) }
| '!' '"' ([^ '"']* as str) '"' { METADATA_STRING str } | '!' '"' ([^ '"']* as str) '"' { METADATA_STRING str }

@ -27,6 +27,7 @@
%token RANGLE %token RANGLE
%token LSQBRACK %token LSQBRACK
%token RSQBRACK %token RSQBRACK
%token COLON
(* symbols *) (* symbols *)
%token EQUALS %token EQUALS
%token STAR %token STAR
@ -141,6 +142,7 @@
%token <int> NUMBERED_METADATA %token <int> NUMBERED_METADATA
%token <string> METADATA_STRING %token <string> METADATA_STRING
%token METADATA_NODE_BEGIN %token METADATA_NODE_BEGIN
%token METADATA_LOCATION
%token <int> ATTRIBUTE_GROUP %token <int> ATTRIBUTE_GROUP
@ -157,7 +159,7 @@
program: program:
| targets func_defs = function_def* opt_mappings = metadata_def* EOF { | targets func_defs = function_def* opt_mappings = metadata_def* EOF {
let mappings = list_flatten_options opt_mappings in let mappings = list_flatten_options opt_mappings in
let add_mapping map (metadata_id, components) = MetadataMap.add metadata_id components map in let add_mapping map (metadata_id, aggregate) = MetadataMap.add metadata_id aggregate map in
let metadata_map = list_fold_left add_mapping MetadataMap.empty mappings in let metadata_map = list_fold_left add_mapping MetadataMap.empty mappings in
Program (func_defs, metadata_map) } Program (func_defs, metadata_map) }
@ -176,16 +178,27 @@ target_triple:
metadata_def: metadata_def:
| NAMED_METADATA EQUALS numbered_metadata_node { None } | NAMED_METADATA EQUALS numbered_metadata_node { None }
| metadata_id = NUMBERED_METADATA EQUALS components = metadata_node { Some (metadata_id, components) } | metadata_id = NUMBERED_METADATA EQUALS aggregate = metadata_aggregate { Some
(metadata_id, aggregate) }
numbered_metadata_node: numbered_metadata_node:
| METADATA_NODE_BEGIN metadata_ids = separated_list(COMMA, NUMBERED_METADATA) RBRACE { metadata_ids } | METADATA_NODE_BEGIN metadata_ids = separated_list(COMMA, NUMBERED_METADATA) RBRACE { metadata_ids }
metadata_aggregate:
| components = metadata_node { Components components }
| location = metadata_location { Location location }
metadata_location:
| METADATA_LOCATION LPAREN IDENT COLON line_num = CONSTANT_INT COMMA
IDENT COLON col_num = CONSTANT_INT COMMA
IDENT COLON i = NUMBERED_METADATA RPAREN
{ { line = line_num; col = col_num; scope = MetadataVar i} }
metadata_node: metadata_node:
| METADATA? METADATA_NODE_BEGIN components = separated_list(COMMA, metadata_component) RBRACE { components } | METADATA? METADATA_NODE_BEGIN components = separated_list(COMMA, metadata_component) RBRACE { components }
metadata_component: metadata_component:
| tp = typ? op = operand { TypOperand (tp, op) } | METADATA? tp = typ? op = operand { TypOperand (tp, op) }
| METADATA? value = metadata_value { MetadataVal value } | METADATA? value = metadata_value { MetadataVal value }
metadata_value: metadata_value:

@ -39,17 +39,21 @@ let rec trans_typ : LAst.typ -> Sil.typ = function
let get_source_filename (metadata : LAst.metadata_map) : DB.source_file = let get_source_filename (metadata : LAst.metadata_map) : DB.source_file =
match MetadataMap.find 1 metadata with match MetadataMap.find 1 metadata with
| MetadataVal (MetadataString file_str) :: _ -> DB.source_file_from_string file_str | Components (MetadataVal (MetadataString file_str) :: _) ->
| _ -> raise (MalformedMetadata "Source file name was expected at head of metadata variable !1.") 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) let location_of_annotation_option (metadata : LAst.metadata_map)
: LAst.annotation option -> Sil.location = function : LAst.annotation option -> Sil.location = function
| None -> Sil.dummy_location (* no annotation means no source location *) | None -> Sil.dummy_location (* no annotation means no source location *)
| Some (Annotation i) -> | Some (Annotation i) ->
begin match MetadataMap.find i metadata with begin match MetadataMap.find i metadata with
| TypOperand (_, Const (Cint line_num)) :: _ -> let open Sil in | 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 = get_source_filename metadata; nLOC = -1 }
| [] -> raise (MalformedMetadata "Instruction annotation refers to empty metadata node.") | Location loc ->
let open Sil in
{ line = loc.line; col = loc.col; file = get_source_filename metadata; nLOC = -1 }
| _ -> raise (MalformedMetadata ("Instruction annotation refers to metadata node " ^ | _ -> raise (MalformedMetadata ("Instruction annotation refers to metadata node " ^
"without line number as first component.")) "without line number as first component."))
end end

@ -12,38 +12,40 @@ target triple = "x86_64-apple-macosx10.10.0"
; Function Attrs: nounwind ssp uwtable ; Function Attrs: nounwind ssp uwtable
define void @foo() #0 { define void @foo() #0 {
%p = alloca i32*, align 8 %p = alloca i32*, align 8
call void @llvm.dbg.declare(metadata !{i32** %p}, metadata !11), !dbg !14 call void @llvm.dbg.declare(metadata i32** %p, metadata !12, metadata !15), !dbg !16
store i32* null, i32** %p, align 8, !dbg !15 store i32* null, i32** %p, align 8, !dbg !16
%1 = load i32** %p, align 8, !dbg !16 %1 = load i32** %p, align 8, !dbg !17
store i32 42, i32* %1, align 4, !dbg !16 store i32 42, i32* %1, align 4, !dbg !18
ret void, !dbg !17 ret void, !dbg !19
} }
; Function Attrs: nounwind readnone ; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare(metadata, metadata) #1 declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone } attributes #1 = { nounwind readnone }
!llvm.dbg.cu = !{!0} !llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!8, !9} !llvm.module.flags = !{!8, !9, !10}
!llvm.ident = !{!10} !llvm.ident = !{!11}
!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm/null_deref.c] [DW_LANG_C99] !0 = !{!"0x11\0012\00clang version 3.6.1 (tags/RELEASE_361/final)\000\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm/null_deref.c] [DW_LANG_C99]
!1 = metadata !{metadata !"null_deref.c", metadata !"/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm"} !1 = !{!"null_deref.c", !"/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm"}
!2 = metadata !{} !2 = !{}
!3 = metadata !{metadata !4} !3 = !{!4}
!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"foo", metadata !"foo", metadata !"", i32 10, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void ()* @foo, null, null, metadata !2, i32 10} ; [ DW_TAG_subprogram ] [line 10] [def] [foo] !4 = !{!"0x2e\00foo\00foo\00\0010\000\001\000\000\00256\000\0010", !1, !5, !6, null, void ()* @foo, null, null, !2} ; [ DW_TAG_subprogram ] [line 10] [def] [foo]
!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm/null_deref.c] !5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [/Users/rohanjr/infer/infer/tests/codetoanalyze/llvm/null_deref.c]
!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] !6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
!7 = metadata !{null} !7 = !{null}
!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 2} !8 = !{i32 2, !"Dwarf Version", i32 2}
!9 = metadata !{i32 2, metadata !"Debug Info Version", i32 602053001} !9 = !{i32 2, !"Debug Info Version", i32 2}
!10 = metadata !{metadata !"Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)"} !10 = !{i32 1, !"PIC Level", i32 2}
!11 = metadata !{i32 786688, metadata !4, metadata !"p", metadata !5, i32 11, metadata !12, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [p] [line 11] !11 = !{!"clang version 3.6.1 (tags/RELEASE_361/final)"}
!12 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !13} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] !12 = !{!"0x100\00p\0011\000", !4, !5, !13} ; [ DW_TAG_auto_variable ] [p] [line 11]
!13 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] !13 = !{!"0xf\00\000\0064\0064\000\000", null, null, !14} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int]
!14 = metadata !{i32 11, i32 9, metadata !4, null} ; [ DW_TAG_lexical_block ] [/] !14 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
!15 = metadata !{i32 11, i32 4, metadata !4, null} ; [ DW_TAG_lexical_block ] [/] !15 = !{!"0x102"} ; [ DW_TAG_expression ]
!16 = metadata !{i32 12, i32 4, metadata !4, null} !16 = !MDLocation(line: 11, column: 9, scope: !4)
!17 = metadata !{i32 13, i32 1, metadata !4, null} !17 = !MDLocation(line: 12, column: 5, scope: !4)
!18 = !MDLocation(line: 12, column: 4, scope: !4)
!19 = !MDLocation(line: 13, column: 1, scope: !4)

Loading…
Cancel
Save