summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorPaul Robinson <paul_robinson@playstation.sony.com>2016-04-18 22:41:41 +0000
committerPaul Robinson <paul_robinson@playstation.sony.com>2016-04-18 22:41:41 +0000
commit43d1e453479fe60046c06c83c7020a2a52ce9748 (patch)
tree05003b91e4747f596893e59d1c9ce9da7499b386 /llvm
parent83162abb07dedaddbe0e126d612a859e5d264d24 (diff)
downloadbcm5719-llvm-43d1e453479fe60046c06c83c7020a2a52ce9748.tar.gz
bcm5719-llvm-43d1e453479fe60046c06c83c7020a2a52ce9748.zip
[DWARF] Force a linkage_name on an inlined subprogram's abstract origin.
When we suppress linkage names, for a non-inlined subprogram the name can still be found in the object-file symbol table, because we have the code address of the subprogram. This is not necessarily the case for an inlined subprogram, so we still want to emit the linkage name in the DWARF. Put this on the abstract-origin DIE because it's common to all inlined instances. Differential Revision: http://reviews.llvm.org/D18706 llvm-svn: 266692
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp3
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp30
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h9
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp6
-rw-r--r--llvm/test/DebugInfo/Generic/PR20038.ll2
-rw-r--r--llvm/test/DebugInfo/Generic/cross-cu-inlining.ll4
-rw-r--r--llvm/test/DebugInfo/Generic/enum-types.ll2
-rw-r--r--llvm/test/DebugInfo/Generic/linkage-name-abstract.ll73
-rw-r--r--llvm/test/DebugInfo/Generic/namespace.ll2
-rw-r--r--llvm/test/DebugInfo/Generic/namespace_function_definition.ll2
-rw-r--r--llvm/test/DebugInfo/Generic/namespace_inline_function_definition.ll2
-rw-r--r--llvm/test/Linker/type-unique-odr-a.ll4
12 files changed, 112 insertions, 27 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index 0daca72b30d..ff70f6ca044 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -185,7 +185,8 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
}
addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);
- addLinkageName(*VariableDIE, GV->getLinkageName());
+ if (DD->useAllLinkageNames())
+ addLinkageName(*VariableDIE, GV->getLinkageName());
} else if (const ConstantInt *CI =
dyn_cast_or_null<ConstantInt>(GV->getVariable())) {
addConstantValue(*VariableDIE, CI, GTy);
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 36b87657ae7..373b7e7daa3 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -105,13 +105,21 @@ DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
clEnumVal(Disable, "Disabled"), clEnumValEnd),
cl::init(Default));
-static cl::opt<DefaultOnOff>
-DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
- cl::desc("Emit DWARF linkage-name attributes."),
- cl::values(clEnumVal(Default, "Default for platform"),
- clEnumVal(Enable, "Enabled"),
- clEnumVal(Disable, "Disabled"), clEnumValEnd),
- cl::init(Default));
+enum LinkageNameOption {
+ DefaultLinkageNames,
+ AllLinkageNames,
+ AbstractLinkageNames
+};
+static cl::opt<LinkageNameOption>
+ DwarfLinkageNames("dwarf-linkage-names", cl::Hidden,
+ cl::desc("Which DWARF linkage-name attributes to emit."),
+ cl::values(clEnumValN(DefaultLinkageNames, "Default",
+ "Default for platform"),
+ clEnumValN(AllLinkageNames, "All", "All"),
+ clEnumValN(AbstractLinkageNames, "Abstract",
+ "Abstract subprograms"),
+ clEnumValEnd),
+ cl::init(DefaultLinkageNames));
static const char *const DWARFGroupName = "DWARF Emission";
static const char *const DbgTimerName = "DWARF Debug Writer";
@@ -245,11 +253,11 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
else
HasDwarfPubSections = DwarfPubSections == Enable;
- // SCE does not use linkage names.
- if (DwarfLinkageNames == Default)
- UseLinkageNames = !tuneForSCE();
+ // SCE defaults to linkage names only for abstract subprograms.
+ if (DwarfLinkageNames == DefaultLinkageNames)
+ UseAllLinkageNames = !tuneForSCE();
else
- UseLinkageNames = DwarfLinkageNames == Enable;
+ UseAllLinkageNames = DwarfLinkageNames == AllLinkageNames;
unsigned DwarfVersionNumber = Asm->TM.Options.MCOptions.DwarfVersion;
DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index c5861497f64..ad0241cb99b 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -249,8 +249,8 @@ class DwarfDebug : public DebugHandlerBase {
/// Whether to use the GNU TLS opcode (instead of the standard opcode).
bool UseGNUTLSOpcode;
- /// Whether to emit DW_AT_[MIPS_]linkage_name.
- bool UseLinkageNames;
+ /// Whether to emit all linkage names, or just abstract subprograms.
+ bool UseAllLinkageNames;
/// Version of dwarf we're emitting.
unsigned DwarfVersion;
@@ -478,8 +478,9 @@ public:
SymSize[Sym] = Size;
}
- /// Returns whether to emit DW_AT_[MIPS_]linkage_name.
- bool useLinkageNames() const { return UseLinkageNames; }
+ /// Returns whether we should emit all DW_AT_[MIPS_]linkage_name.
+ /// If not, we still might emit certain cases.
+ bool useAllLinkageNames() const { return UseAllLinkageNames; }
/// Returns whether to use DW_OP_GNU_push_tls_address, instead of the
/// standard DW_OP_form_tls_address opcode
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
index 387921cb46f..9003af528d0 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
@@ -665,7 +665,7 @@ void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
}
void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
- if (!LinkageName.empty() && DD->useLinkageNames())
+ if (!LinkageName.empty())
addString(Die,
DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name
: dwarf::DW_AT_MIPS_linkage_name,
@@ -1169,7 +1169,9 @@ bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram *SP,
assert(((LinkageName.empty() || DeclLinkageName.empty()) ||
LinkageName == DeclLinkageName) &&
"decl has a linkage name and it is different");
- if (DeclLinkageName.empty())
+ if (DeclLinkageName.empty() &&
+ // Always emit it for abstract subprograms.
+ (DD->useAllLinkageNames() || DU->getAbstractSPDies().lookup(SP)))
addLinkageName(SPDie, LinkageName);
if (!DeclDie)
diff --git a/llvm/test/DebugInfo/Generic/PR20038.ll b/llvm/test/DebugInfo/Generic/PR20038.ll
index aebcc708caf..f9e0940aa47 100644
--- a/llvm/test/DebugInfo/Generic/PR20038.ll
+++ b/llvm/test/DebugInfo/Generic/PR20038.ll
@@ -3,7 +3,7 @@
; For some reason, the output when targetting sparc is not quite as expected.
; XFAIL: sparc
-; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Enable < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=All < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
; IR generated from clang -O0 with:
; struct C {
diff --git a/llvm/test/DebugInfo/Generic/cross-cu-inlining.ll b/llvm/test/DebugInfo/Generic/cross-cu-inlining.ll
index 748f86fdd58..5dea31f7705 100644
--- a/llvm/test/DebugInfo/Generic/cross-cu-inlining.ll
+++ b/llvm/test/DebugInfo/Generic/cross-cu-inlining.ll
@@ -1,7 +1,7 @@
; REQUIRES: object-emission
-; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Enable < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s
-; RUN: %llc_dwarf -dwarf-accel-tables=Enable -dwarf-linkage-names=Enable -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=CHECK-ACCEL --check-prefix=CHECK %s
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=All < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s
+; RUN: %llc_dwarf -dwarf-accel-tables=Enable -dwarf-linkage-names=All -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=CHECK-ACCEL --check-prefix=CHECK %s
; Build from source:
; $ clang++ a.cpp b.cpp -g -c -emit-llvm
diff --git a/llvm/test/DebugInfo/Generic/enum-types.ll b/llvm/test/DebugInfo/Generic/enum-types.ll
index e63ac3bc5f6..4e49dc37522 100644
--- a/llvm/test/DebugInfo/Generic/enum-types.ll
+++ b/llvm/test/DebugInfo/Generic/enum-types.ll
@@ -1,6 +1,6 @@
; REQUIRES: object-emission
;
-; RUN: %llc_dwarf -filetype=obj -O0 -dwarf-linkage-names=Enable < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+; RUN: %llc_dwarf -filetype=obj -O0 -dwarf-linkage-names=All < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
; Make sure we can handle enums with the same identifier but in enum types of
; different compile units.
diff --git a/llvm/test/DebugInfo/Generic/linkage-name-abstract.ll b/llvm/test/DebugInfo/Generic/linkage-name-abstract.ll
new file mode 100644
index 00000000000..c2e6a28e388
--- /dev/null
+++ b/llvm/test/DebugInfo/Generic/linkage-name-abstract.ll
@@ -0,0 +1,73 @@
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Abstract < %s | llvm-dwarfdump -debug-dump=info - > %t
+; RUN: FileCheck %s -check-prefix=ONENAME < %t
+; RUN: FileCheck %s -check-prefix=REF < %t
+; Verify tuning for SCE gets us Abstract only.
+; RUN: %llc_dwarf -O0 -filetype=obj -debugger-tune=sce < %s | llvm-dwarfdump -debug-dump=info - > %t
+; RUN: FileCheck %s -check-prefix=ONENAME < %t
+; RUN: FileCheck %s -check-prefix=REF < %t
+; REQUIRES: object-emission
+
+; Verify that the only linkage-name present is the abstract origin of the
+; inlined subprogram.
+
+; IR generated from clang -O0 with:
+; void f1();
+; __attribute__((always_inline)) void f2() {
+; f1();
+; }
+; void f3() {
+; f2();
+; }
+
+; Show that there's only one linkage_name.
+; ONENAME: {{DW_AT(_MIPS)?_linkage_name}}
+; ONENAME-NOT: {{DW_AT(_MIPS)?_linkage_name}}
+
+; Locate the subprogram DIE with the linkage name.
+; Show that the inlined_subroutine refers to it.
+; REF: DW_TAG_subprogram
+; REF: [[FOO:0x.*]]: DW_TAG_subprogram
+; REF-NOT: {{DW_TAG|NULL}}
+; REF: {{DW_AT(_MIPS)?_linkage_name}}
+; REF: DW_TAG_inlined_subroutine
+; REF-NOT: {{DW_TAG|NULL}}
+; REF: DW_AT_abstract_origin {{.*}} {[[FOO]]}
+
+; Function Attrs: alwaysinline uwtable
+define void @_Z2f2v() #0 !dbg !4 {
+entry:
+ call void @_Z2f1v(), !dbg !11
+ ret void, !dbg !12
+}
+
+declare void @_Z2f1v()
+
+; Function Attrs: uwtable
+define void @_Z2f3v() #2 !dbg !7 {
+entry:
+ call void @_Z2f1v(), !dbg !13
+ ret void, !dbg !15
+}
+
+attributes #0 = { alwaysinline uwtable }
+attributes #2 = { uwtable }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!8, !9}
+!llvm.ident = !{!10}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 (trunk 265282)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "linkage-name-abstract.cpp", directory: "/home/probinson/projects/scratch")
+!2 = !{}
+!4 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", 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 = !{null}
+!7 = distinct !DISubprogram(name: "f3", linkageName: "_Z2f3v", scope: !1, file: !1, line: 5, type: !5, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!8 = !{i32 2, !"Dwarf Version", i32 4}
+!9 = !{i32 2, !"Debug Info Version", i32 3}
+!10 = !{!"clang version 3.9.0 (trunk 265282)"}
+!11 = !DILocation(line: 3, column: 3, scope: !4)
+!12 = !DILocation(line: 4, column: 1, scope: !4)
+!13 = !DILocation(line: 3, column: 3, scope: !4, inlinedAt: !14)
+!14 = distinct !DILocation(line: 6, column: 3, scope: !7)
+!15 = !DILocation(line: 7, column: 1, scope: !7)
diff --git a/llvm/test/DebugInfo/Generic/namespace.ll b/llvm/test/DebugInfo/Generic/namespace.ll
index a76191d2f4a..bf45144a54b 100644
--- a/llvm/test/DebugInfo/Generic/namespace.ll
+++ b/llvm/test/DebugInfo/Generic/namespace.ll
@@ -1,6 +1,6 @@
; REQUIRES: object-emission
-; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Enable < %s | llvm-dwarfdump - | FileCheck %s
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=All < %s | llvm-dwarfdump - | FileCheck %s
; CHECK: debug_info contents
; CHECK: [[NS1:0x[0-9a-f]*]]:{{ *}}DW_TAG_namespace
; CHECK-NEXT: DW_AT_name{{.*}} = "A"
diff --git a/llvm/test/DebugInfo/Generic/namespace_function_definition.ll b/llvm/test/DebugInfo/Generic/namespace_function_definition.ll
index 283761314a4..04fcc3bfb90 100644
--- a/llvm/test/DebugInfo/Generic/namespace_function_definition.ll
+++ b/llvm/test/DebugInfo/Generic/namespace_function_definition.ll
@@ -1,6 +1,6 @@
; REQUIRES: object-emission
-; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Enable < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=All < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
; Generated from clang with the following source:
; namespace ns {
diff --git a/llvm/test/DebugInfo/Generic/namespace_inline_function_definition.ll b/llvm/test/DebugInfo/Generic/namespace_inline_function_definition.ll
index 7b60a6bdb79..72502e5f759 100644
--- a/llvm/test/DebugInfo/Generic/namespace_inline_function_definition.ll
+++ b/llvm/test/DebugInfo/Generic/namespace_inline_function_definition.ll
@@ -1,6 +1,6 @@
; REQUIRES: object-emission
-; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=Enable < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
+; RUN: %llc_dwarf -O0 -filetype=obj -dwarf-linkage-names=All < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
; Generate from clang with the following source. Note that the definition of
; the inline function follows its use to workaround another bug that should be
diff --git a/llvm/test/Linker/type-unique-odr-a.ll b/llvm/test/Linker/type-unique-odr-a.ll
index d7640ea761c..ed6c17c81c6 100644
--- a/llvm/test/Linker/type-unique-odr-a.ll
+++ b/llvm/test/Linker/type-unique-odr-a.ll
@@ -1,11 +1,11 @@
; REQUIRES: default_triple, object-emission
;
; RUN: llvm-link %s %p/type-unique-odr-b.ll -S -o - \
-; RUN: | %llc_dwarf -dwarf-linkage-names=Enable -filetype=obj -O0 \
+; RUN: | %llc_dwarf -dwarf-linkage-names=All -filetype=obj -O0 \
; RUN: | llvm-dwarfdump -debug-dump=info - \
; RUN: | FileCheck %s
; RUN: llvm-link %p/type-unique-odr-b.ll %s -S -o - \
-; RUN: | %llc_dwarf -dwarf-linkage-names=Enable -filetype=obj -O0 \
+; RUN: | %llc_dwarf -dwarf-linkage-names=All -filetype=obj -O0 \
; RUN: | llvm-dwarfdump -debug-dump=info - \
; RUN: | FileCheck %s
;
OpenPOWER on IntegriCloud