aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2013-09-30 23:14:16 +0000
committerEric Christopher <echristo@gmail.com>2013-09-30 23:14:16 +0000
commita6d841561b1b7e3f32e1f77e35982d8cfd0f515e (patch)
tree66842c03771c9c275c9f732480c18919ccf9068f
parent188f96c1116a8cb45e8d33222ce06e99ca848854 (diff)
downloadexternal_llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.zip
external_llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.tar.gz
external_llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.tar.bz2
The DW_AT_GNU_pubnames/pubtypes attributes are actually form
SEC_OFFSET from the beginning of the section so go ahead and emit a label at the beginning of each one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191710 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp63
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.h1
-rw-r--r--test/DebugInfo/X86/gnu-public-names.ll46
3 files changed, 82 insertions, 28 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index b4e0055..bb4f8af 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -777,8 +777,29 @@ CompileUnit *DwarfDebug::constructCompileUnit(const MDNode *N) {
// Flag to let the linker know we have emitted new style pubnames. Only
// emit it here if we don't have a skeleton CU for split dwarf.
- if (GenerateGnuPubSections)
- NewCU->addFlag(Die, dwarf::DW_AT_GNU_pubnames);
+ if (GenerateGnuPubSections) {
+ if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
+ NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames,
+ dwarf::DW_FORM_sec_offset,
+ Asm->GetTempSymbol("gnu_pubnames",
+ NewCU->getUniqueID()));
+ else
+ NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
+ Asm->GetTempSymbol("gnu_pubnames",
+ NewCU->getUniqueID()),
+ DwarfGnuPubNamesSectionSym);
+
+ if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
+ NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes,
+ dwarf::DW_FORM_sec_offset,
+ Asm->GetTempSymbol("gnu_pubtypes",
+ NewCU->getUniqueID()));
+ else
+ NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
+ Asm->GetTempSymbol("gnu_pubnames",
+ NewCU->getUniqueID()),
+ DwarfGnuPubTypesSectionSym);
+ }
}
if (DIUnit.isOptimized())
@@ -1967,8 +1988,10 @@ void DwarfDebug::emitSectionLabels() {
emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line");
emitSectionSym(Asm, TLOF.getDwarfLocSection());
if (GenerateGnuPubSections) {
- emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
- emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
+ DwarfGnuPubNamesSectionSym =
+ emitSectionSym(Asm, TLOF.getDwarfGnuPubNamesSection());
+ DwarfGnuPubTypesSectionSym =
+ emitSectionSym(Asm, TLOF.getDwarfGnuPubTypesSection());
} else if (HasDwarfPubSections) {
emitSectionSym(Asm, TLOF.getDwarfPubNamesSection());
emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
@@ -2400,6 +2423,11 @@ void DwarfDebug::emitDebugPubNames(bool GnuStyle) {
// Start the dwarf pubnames section.
Asm->OutStreamer.SwitchSection(PSec);
+ // Emit a label so we can reference the beginning of this pubname section.
+ if (GnuStyle)
+ Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("gnu_pubnames",
+ TheCU->getUniqueID()));
+
// Emit the header.
Asm->OutStreamer.AddComment("Length of Public Names Info");
Asm->EmitLabelDifference(Asm->GetTempSymbol("pubnames_end", ID),
@@ -2460,6 +2488,13 @@ void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
CompileUnit *TheCU = I->second;
// Start the dwarf pubtypes section.
Asm->OutStreamer.SwitchSection(PSec);
+
+ // Emit a label so we can reference the beginning of this pubtype section.
+ if (GnuStyle)
+ Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("gnu_pubtypes",
+ TheCU->getUniqueID()));
+
+ // Emit the header.
Asm->OutStreamer.AddComment("Length of Public Types Info");
Asm->EmitLabelDifference(
Asm->GetTempSymbol("pubtypes_end", TheCU->getUniqueID()),
@@ -2482,6 +2517,7 @@ void DwarfDebug::emitDebugPubTypes(bool GnuStyle) {
Asm->GetTempSymbol(ISec->getLabelEndName(), TheCU->getUniqueID()),
Asm->GetTempSymbol(ISec->getLabelBeginName(), TheCU->getUniqueID()), 4);
+ // Emit the pubtypes.
const StringMap<DIE *> &Globals = TheCU->getGlobalTypes();
for (StringMap<DIE *>::const_iterator GI = Globals.begin(),
GE = Globals.end();
@@ -2929,8 +2965,23 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
// Flag to let the linker know we have emitted new style pubnames.
- if (GenerateGnuPubSections)
- NewCU->addFlag(Die, dwarf::DW_AT_GNU_pubnames);
+ if (GenerateGnuPubSections) {
+ if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
+ NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_sec_offset,
+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
+ else
+ NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
+ DwarfGnuPubNamesSectionSym);
+
+ if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
+ NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_sec_offset,
+ Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
+ else
+ NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
+ DwarfGnuPubTypesSectionSym);
+ }
SkeletonHolder.addUnit(NewCU);
SkeletonCUs.push_back(NewCU);
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
index e774c65..144635e 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -411,6 +411,7 @@ class DwarfDebug {
MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym;
MCSymbol *FunctionBeginSym, *FunctionEndSym;
MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym;
+ MCSymbol *DwarfGnuPubNamesSectionSym, *DwarfGnuPubTypesSectionSym;
// As an optimization, there is no need to emit an entry in the directory
// table for the same directory as DW_AT_comp_dir.
diff --git a/test/DebugInfo/X86/gnu-public-names.ll b/test/DebugInfo/X86/gnu-public-names.ll
index 7a19fee..2989dfe 100644
--- a/test/DebugInfo/X86/gnu-public-names.ll
+++ b/test/DebugInfo/X86/gnu-public-names.ll
@@ -42,28 +42,30 @@
; ASM-NEXT: .asciz "C" # External Name
; CHECK: .debug_info contents:
-; CHECK: 0x00000026: DW_TAG_base_type
+; CHECK: DW_AT_GNU_pubnames [DW_FORM_sec_offset] (0x00000000)
+; CHECK: DW_AT_GNU_pubtypes [DW_FORM_sec_offset] (0x00000000)
+; CHECK: 0x0000002e: DW_TAG_base_type
; CHECK-NEXT: DW_AT_name {{.*}} "int"
-; CHECK: 0x00000032: DW_TAG_structure_type
+; CHECK: 0x0000003a: DW_TAG_structure_type
; CHECK-NEXT: DW_AT_name {{.*}} "C"
-; CHECK: 0x00000046: DW_TAG_subprogram
+; CHECK: 0x0000004e: DW_TAG_subprogram
; CHECK-NEXT: DW_AT_MIPS_linkage_name
; CHECK-NEXT: DW_AT_name {{.*}} "member_function"
-; CHECK: 0x00000058: DW_TAG_subprogram
+; CHECK: 0x00000060: DW_TAG_subprogram
; CHECK-NEXT: DW_AT_MIPS_linkage_name
; CHECK-NEXT: DW_AT_name {{.*}} "static_member_function"
-; CHECK: 0x0000007c: DW_TAG_variable
+; CHECK: 0x00000084: DW_TAG_variable
; CHECK-NEXT: DW_AT_name {{.*}} "global_variable"
-; CHECK: 0x00000098: DW_TAG_variable
+; CHECK: 0x000000a0: DW_TAG_variable
; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_variable"
-; CHECK: 0x000000a7: DW_TAG_subprogram
+; CHECK: 0x000000af: DW_TAG_subprogram
; CHECK-NEXT: DW_AT_MIPS_linkage_name
; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_function"
-; CHECK: 0x000000c2: DW_TAG_subprogram
-; CHECK-NEXT: DW_AT_specification {{.*}}0x00000046}
-; CHECK: 0x000000ea: DW_TAG_subprogram
-; CHECK-NEXT: DW_AT_specification {{.*}}0x00000058}
-; CHECK: 0x00000101: DW_TAG_subprogram
+; CHECK: 0x000000ca: DW_TAG_subprogram
+; CHECK-NEXT: DW_AT_specification {{.*}}0x0000004e}
+; CHECK: 0x000000f2: DW_TAG_subprogram
+; CHECK-NEXT: DW_AT_specification {{.*}}0x00000060}
+; CHECK: 0x00000109: DW_TAG_subprogram
; CHECK-NEXT: DW_AT_MIPS_linkage_name
; CHECK-NEXT: DW_AT_name {{.*}} "global_function"
@@ -71,15 +73,15 @@
; CHECK-NEXT: Length: 175
; CHECK-NEXT: Version: 2
; CHECK-NEXT: Offset in .debug_info: 0
-; CHECK-NEXT: Size: 319
+; CHECK-NEXT: Size: 327
; CHECK-NEXT: Offset Linkage Kind Name
-; CHECK-DAG: 0x00000091 EXTERNAL TYPE "ns"
-; CHECK-DAG: 0x00000098 EXTERNAL VARIABLE "global_namespace_variable"
-; CHECK-DAG: 0x000000a7 EXTERNAL FUNCTION "global_namespace_function"
-; CHECK-DAG: 0x000000ea STATIC FUNCTION "static_member_function"
-; CHECK-DAG: 0x0000007c EXTERNAL VARIABLE "global_variable"
-; CHECK-DAG: 0x00000101 EXTERNAL FUNCTION "global_function"
-; CHECK-DAG: 0x000000c2 STATIC FUNCTION "member_function"
+; CHECK-DAG: 0x00000099 EXTERNAL TYPE "ns"
+; CHECK-DAG: 0x000000a0 EXTERNAL VARIABLE "global_namespace_variable"
+; CHECK-DAG: 0x000000af EXTERNAL FUNCTION "global_namespace_function"
+; CHECK-DAG: 0x000000f2 STATIC FUNCTION "static_member_function"
+; CHECK-DAG: 0x00000084 EXTERNAL VARIABLE "global_variable"
+; CHECK-DAG: 0x00000109 EXTERNAL FUNCTION "global_function"
+; CHECK-DAG: 0x000000ca STATIC FUNCTION "member_function"
; CHECK-LABEL: debug_gnu_pubtypes contents:
; CHECK-NEXT: Length:
@@ -87,8 +89,8 @@
; CHECK-NEXT: Offset in .debug_info:
; CHECK-NEXT: Size:
; CHECK-NEXT: Offset Linkage Kind Name
-; CHECK-DAG: 0x00000032 EXTERNAL TYPE "C"
-; CHECK-DAG: 0x00000026 STATIC TYPE "int"
+; CHECK-DAG: 0x0000003a EXTERNAL TYPE "C"
+; CHECK-DAG: 0x0000002e STATIC TYPE "int"
%struct.C = type { i8 }