summaryrefslogtreecommitdiff
path: root/test/DebugInfo
diff options
context:
space:
mode:
authorAmjad Aboud <amjad.aboud@intel.com>2016-04-21 16:58:49 +0000
committerAmjad Aboud <amjad.aboud@intel.com>2016-04-21 16:58:49 +0000
commit1268621b54324511ca2c86da709696594e785db9 (patch)
tree510a435c56d33be01d027c75dff0088aa2707a3e /test/DebugInfo
parent6159d86c304df8e9be2d547254f8b9528e2ed4dd (diff)
Fixed Dwarf debug info emission to skip DILexicalBlockFile entries.
Before this fix, DILexicalBlockFile entries were skipped only in some cases and were not in other cases. Differential Revision: http://reviews.llvm.org/D18724 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267004 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/DebugInfo')
-rw-r--r--test/DebugInfo/X86/lexical-block-file-inline.ll161
1 files changed, 161 insertions, 0 deletions
diff --git a/test/DebugInfo/X86/lexical-block-file-inline.ll b/test/DebugInfo/X86/lexical-block-file-inline.ll
new file mode 100644
index 00000000000..d956efee1ee
--- /dev/null
+++ b/test/DebugInfo/X86/lexical-block-file-inline.ll
@@ -0,0 +1,161 @@
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu -filetype=obj -O0 < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+
+;; This test checks that Inlined DILexicalBlockFile with local decl entry
+;; is skipped and only one DW_TAG_lexical_block is generated.
+;; This test is special because it contains DILexicalBlockFile that has a
+;; DILexicalBlockFile as a parent scope.
+;;
+;; This test was generated by running following command:
+;; clang -cc1 -O0 -debug-info-kind=limited -dwarf-version=4 -emit-llvm test.cpp
+;; Where test.cpp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;namespace N {}
+;; __attribute__((always_inline)) int bar() {
+;; {
+;; int y;
+;;#line 1 "test.h"
+;; using namespace N;
+;; while (y < 0) return 2;
+;; return 0;
+;; }
+;;}
+;;int foo() {
+;; return bar();
+;;}
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Concrete "bar" function
+; CHECK: DW_TAG_subprogram
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_AT_abstract_origin {{.*}} {[[Offset_bar:0x[0-9abcdef]+]]}
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_lexical_block
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_variable
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_imported_module
+
+;; Abstract "bar" function
+; CHECK: [[Offset_bar]]: DW_TAG_subprogram
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_AT_name {{.*}} "bar"
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_AT_inline
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_lexical_block
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_variable
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_imported_module
+
+; CHECK: DW_TAG_subprogram
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_AT_name {{.*}} "foo"
+; CHECK-NOT: {{NULL}}
+
+;; Inlined "bar" function
+; CHECK: DW_TAG_inlined_subroutine
+; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[Offset_bar]]}
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_lexical_block
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_variable
+; CHECK-NOT: {{DW_TAG|NULL}}
+; CHECK: DW_TAG_imported_module
+
+
+; Function Attrs: alwaysinline nounwind
+define i32 @_Z3barv() #0 !dbg !4 {
+entry:
+ %retval = alloca i32, align 4
+ %y = alloca i32, align 4
+ call void @llvm.dbg.declare(metadata i32* %y, metadata !18, metadata !19), !dbg !20
+ br label %while.cond, !dbg !21
+
+while.cond: ; preds = %entry
+ %0 = load i32, i32* %y, align 4, !dbg !22
+ %cmp = icmp slt i32 %0, 0, !dbg !22
+ br i1 %cmp, label %while.body, label %while.end, !dbg !22
+
+while.body: ; preds = %while.cond
+ store i32 2, i32* %retval, align 4, !dbg !24
+ br label %return, !dbg !24
+
+while.end: ; preds = %while.cond
+ store i32 0, i32* %retval, align 4, !dbg !26
+ br label %return, !dbg !26
+
+return: ; preds = %while.end, %while.body
+ %1 = load i32, i32* %retval, align 4, !dbg !27
+ ret i32 %1, !dbg !27
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+; Function Attrs: nounwind
+define i32 @_Z3foov() #2 !dbg !8 {
+entry:
+ %retval.i = alloca i32, align 4
+ %y.i = alloca i32, align 4
+ call void @llvm.dbg.declare(metadata i32* %y.i, metadata !18, metadata !19), !dbg !29
+ %0 = load i32, i32* %y.i, align 4, !dbg !31
+ %cmp.i = icmp slt i32 %0, 0, !dbg !31
+ br i1 %cmp.i, label %while.body.i, label %while.end.i, !dbg !31
+
+while.body.i: ; preds = %entry
+ store i32 2, i32* %retval.i, align 4, !dbg !32
+ br label %_Z3barv.exit, !dbg !32
+
+while.end.i: ; preds = %entry
+ store i32 0, i32* %retval.i, align 4, !dbg !33
+ br label %_Z3barv.exit, !dbg !33
+
+_Z3barv.exit: ; preds = %while.end.i, %while.body.i
+ %1 = load i32, i32* %retval.i, align 4, !dbg !34
+ ret i32 %1, !dbg !35
+}
+
+attributes #0 = { alwaysinline nounwind }
+attributes #1 = { nounwind readnone }
+attributes #2 = { nounwind }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!15, !16}
+!llvm.ident = !{!17}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 (trunk 264349)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, imports: !10)
+!1 = !DIFile(filename: "test.cpp", directory: "/")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "bar", linkageName: "_Z3barv", scope: !1, file: !1, line: 2, type: !5, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!5 = !DISubroutineType(types: !6)
+!6 = !{!7}
+!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!8 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !9, file: !9, line: 6, type: !5, isLocal: false, isDefinition: true, scopeLine: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!9 = !DIFile(filename: "test.h", directory: "/")
+!10 = !{!11}
+!11 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !14, line: 1)
+!12 = !DILexicalBlockFile(scope: !13, file: !9, discriminator: 0)
+!13 = distinct !DILexicalBlock(scope: !4, file: !1, line: 3)
+!14 = !DINamespace(name: "N", scope: null, file: !1, line: 1)
+!15 = !{i32 2, !"Dwarf Version", i32 4}
+!16 = !{i32 2, !"Debug Info Version", i32 3}
+!17 = !{!"clang version 3.9.0 (trunk 264349)"}
+!18 = !DILocalVariable(name: "y", scope: !13, file: !1, line: 4, type: !7)
+!19 = !DIExpression()
+!20 = !DILocation(line: 4, scope: !13)
+!21 = !DILocation(line: 2, scope: !12)
+!22 = !DILocation(line: 2, scope: !23)
+!23 = !DILexicalBlockFile(scope: !12, file: !9, discriminator: 1)
+!24 = !DILocation(line: 2, scope: !25)
+!25 = !DILexicalBlockFile(scope: !12, file: !9, discriminator: 2)
+!26 = !DILocation(line: 3, scope: !12)
+!27 = !DILocation(line: 5, scope: !28)
+!28 = !DILexicalBlockFile(scope: !4, file: !9, discriminator: 0)
+!29 = !DILocation(line: 4, scope: !13, inlinedAt: !30)
+!30 = distinct !DILocation(line: 7, scope: !8)
+!31 = !DILocation(line: 2, scope: !23, inlinedAt: !30)
+!32 = !DILocation(line: 2, scope: !25, inlinedAt: !30)
+!33 = !DILocation(line: 3, scope: !12, inlinedAt: !30)
+!34 = !DILocation(line: 5, scope: !28, inlinedAt: !30)
+!35 = !DILocation(line: 7, scope: !8)