diff options
author | Eric Christopher <echristo@gmail.com> | 2013-09-30 23:14:16 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2013-09-30 23:14:16 +0000 |
commit | a6d841561b1b7e3f32e1f77e35982d8cfd0f515e (patch) | |
tree | 66842c03771c9c275c9f732480c18919ccf9068f /lib/CodeGen | |
parent | 188f96c1116a8cb45e8d33222ce06e99ca848854 (diff) | |
download | llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.tar.gz llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.tar.bz2 llvm-a6d841561b1b7e3f32e1f77e35982d8cfd0f515e.tar.xz |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 63 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.h | 1 |
2 files changed, 58 insertions, 6 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index b4e0055fbc..bb4f8afe1c 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 e774c65394..144635ef6a 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. |