2019-02-27 22:46:59 +08:00
; Checks that DW_AT_decl_file attribute is correctly set for
; template function declaration. When using full LTO we likely
; end up having multiple CUs in a single DWARF file, and it is
; possible that we add template function declaration DIE from
; CU#1 to structure type DIE from CU#2. In such case we should
; add source line attributes on behalf of CU#2, not CU#1
; Example source code used to generate this sample (C++)
; // File inc1.h
; struct S {
; template <typename T> static void tmpfn() {}
; };
;
; // File: inc2.h
; extern int x;
; int x;
;
; // File: foo.cpp
; #include "inc1.h"
; S s;
;
; // File: bar.cpp
; #include "inc1.h"
; #include "inc2.h"
; void f3() { S::tmpfn<int>(); }
; RUN: llc -filetype=obj %s -o %t
; RUN: llvm-dwarfdump %t -o - | FileCheck %s
; CHECK: DW_AT_linkage_name ("_ZN1S5tmpfnIiEEvv")
; CHECK-NEXT: DW_AT_name ("tmpfn<int>")
; CHECK-NEXT: DW_AT_decl_file ("{{.*}}inc1.h")
; CHECK-NEXT: DW_AT_decl_line (2)
source_filename = "ld-temp.o"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.S = type { i8 }
$ _ Z N 1 S 5 t m p f n I i E E v v = comdat any
@s = d s o _ l o c a l global %struct.S zeroinitializer , align 1 , !dbg !0
@x = d s o _ l o c a l global i32 0 , align 4 , !dbg !8
; Function Attrs: noinline optnone uwtable
define d s o _ l o c a l void @_Z2f3v ( ) !dbg !21 {
call void @_ZN1S5tmpfnIiEEvv ( ) , !dbg !24
ret void , !dbg !25
}
; Function Attrs: noinline nounwind optnone uwtable
define weak_odr d s o _ l o c a l void @_ZN1S5tmpfnIiEEvv ( ) comdat align 2 !dbg !26 {
ret void , !dbg !30
}
!llvm.dbg.cu = ! { !2 , !10 }
!llvm.ident = ! { !15 , !15 }
!llvm.module.flags = ! { !16 , !17 , !18 , !19 , !20 }
!0 = !DIGlobalVariableExpression ( var: !1 , expr: !DIExpression ( ) )
!1 = distinct !DIGlobalVariable ( name: "s" , scope: !2 , file: !3 , line: 2 , type: !6 , isLocal: false , isDefinition: true )
!2 = distinct !DICompileUnit ( language: D W _ L A N G _ C _ p l u s _ p l u s , file: !3 , producer: "clang version 9.0.0 (trunk 354767)" , isOptimized: true , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !4 , globals: !5 , nameTableKind: N one )
!3 = !DIFile ( filename: "foo.cpp" , directory: "/home/evgeny/work/cpp_lexer/sample2" )
!4 = ! { }
!5 = ! { !0 }
2019-04-12 04:25:10 +08:00
!6 = distinct !DICompositeType ( tag: D W _ T A G _ s t r u c t u r e _ type , name: "S" , file: !7 , line: 1 , size: 8 , flags: D I F l a g T y p e P a s s B y V a l u e , elements: !4 , identifier: "_ZTS1S" )
2019-02-27 22:46:59 +08:00
!7 = !DIFile ( filename: "./inc1.h" , directory: "/home/evgeny/work/cpp_lexer/sample2" )
!8 = !DIGlobalVariableExpression ( var: !9 , expr: !DIExpression ( ) )
!9 = distinct !DIGlobalVariable ( name: "x" , scope: !10 , file: !13 , line: 2 , type: !14 , isLocal: false , isDefinition: true )
!10 = distinct !DICompileUnit ( language: D W _ L A N G _ C _ p l u s _ p l u s , file: !11 , producer: "clang version 9.0.0 (trunk 354767)" , isOptimized: true , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !4 , globals: !12 , nameTableKind: N one )
!11 = !DIFile ( filename: "bar.cpp" , directory: "/home/evgeny/work/cpp_lexer/sample2" )
!12 = ! { !8 }
!13 = !DIFile ( filename: "./inc2.h" , directory: "/home/evgeny/work/cpp_lexer/sample2" )
!14 = !DIBasicType ( name: "int" , size: 32 , encoding: D W _ A T E _ s i g n e d )
!15 = ! { !"clang version 9.0.0 (trunk 354767)" }
!16 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!17 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!18 = ! { i32 1 , !"wchar_size" , i32 4 }
!19 = ! { i32 1 , !"ThinLTO" , i32 0 }
!20 = ! { i32 1 , !"EnableSplitLTOUnit" , i32 0 }
!21 = distinct !DISubprogram ( name: "f3" , linkageName: "_Z2f3v" , scope: !11 , file: !11 , line: 3 , type: !22 , scopeLine: 3 , flags: D I F l a g P r o t o t y p e d , spFlags: D I S P F l a g D e f i n i t i o n , unit: !10 , retainedNodes: !4 )
!22 = !DISubroutineType ( types: !23 )
!23 = ! { null }
!24 = !DILocation ( line: 3 , column: 13 , scope: !21 )
!25 = !DILocation ( line: 3 , column: 30 , scope: !21 )
!26 = distinct !DISubprogram ( name: "tmpfn<int>" , linkageName: "_ZN1S5tmpfnIiEEvv" , scope: !6 , file: !7 , line: 2 , type: !22 , scopeLine: 2 , flags: D I F l a g P r o t o t y p e d , spFlags: D I S P F l a g D e f i n i t i o n , unit: !10 , templateParams: !28 , declaration: !27 , retainedNodes: !4 )
!27 = !DISubprogram ( name: "tmpfn<int>" , linkageName: "_ZN1S5tmpfnIiEEvv" , scope: !6 , file: !7 , line: 2 , type: !22 , scopeLine: 2 , flags: D I F l a g P r o t o t y p e d | D I F l a g S t a t i c M e m b e r , spFlags: 0 , templateParams: !28 )
!28 = ! { !29 }
!29 = !DITemplateTypeParameter ( name: "T" , type: !14 )
!30 = !DILocation ( line: 2 , column: 46 , scope: !26 )