2017-01-30 1 views

답변

0

llvm.var.annotationllvm.dbg.declare 내장 프로그램을 읽어야합니다.

은보다 구체적으로, 여기있는 LLVM-IR 위의 코드에 의해 생성 :

@.str = private unnamed_addr constant [4 x i8] c"bar\00", section "llvm.metadata" 
@.str.1 = private unnamed_addr constant [75 x i8] c"/tmp/compiler-explorer-compiler117030-12962-1rhu4lb.ojfaiz4cxr/example.cpp\00", section "llvm.metadata" 

; Function Attrs: nounwind uwtable 
define i32 @foo(char*)(i8*) #0 !dbg !6 { 
    %2 = alloca i8*, align 8 
    store i8* %0, i8** %2, align 8 
    call void @llvm.dbg.declare(metadata i8** %2, metadata !12, metadata !13), !dbg !14 
    %3 = bitcast i8** %2 to i8* 
    call void @llvm.var.annotation(i8* %3, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([75 x i8], [75 x i8]* @.str.1, i32 0, i32 0), i32 1) 
    ret i32 0, !dbg !15 
} 

!6 = distinct !DISubprogram(name: "foo", linkageName: "foo(char*)", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) 
!7 = !DISubroutineType(types: !8) 
!8 = !{!9, !10} 
!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 
!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64, align: 64) 
!11 = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char) 
!12 = !DILocalVariable(name: "s", arg: 1, scope: !6, file: !1, line: 1, type: !10) 

dbg.declare 명령 % 2가 실제로 기능 (이름들)의 첫 번째 매개 변수 있음을 알려줍니다.

% 3은 기본적으로 별칭이므로 % 2의 비트 전송입니다.

그리고 llvm.var.annotation 명령은 % 2에 "bar"라는 상수 문자열 @str을 주석으로다는 것을 알려줍니다.

관련 문제