For the dwarf5 split debug info code split out the string section

per compile unit/skeleton compile unit. Update tests accordingly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171133 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2012-12-27 02:14:01 +00:00
parent d84aa00c7c
commit 64f824c9d1
4 changed files with 57 additions and 25 deletions

View File

@ -157,15 +157,18 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
AbbreviationsSet(InitAbbreviationsSetSize), AbbreviationsSet(InitAbbreviationsSetSize),
SourceIdMap(DIEValueAllocator), InfoStringPool(DIEValueAllocator), SourceIdMap(DIEValueAllocator), InfoStringPool(DIEValueAllocator),
PrevLabel(NULL), GlobalCUIndexCount(0), PrevLabel(NULL), GlobalCUIndexCount(0),
InfoHolder(A, &AbbreviationsSet, &Abbreviations, &InfoStringPool), InfoHolder(A, &AbbreviationsSet, &Abbreviations,
&InfoStringPool, "info_string"),
SkeletonCU(0), SkeletonCU(0),
SkeletonAbbrevSet(InitAbbreviationsSetSize), SkeletonAbbrevSet(InitAbbreviationsSetSize),
SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, &InfoStringPool) { SkeletonStringPool(DIEValueAllocator),
SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs,
&SkeletonStringPool, "skel_string") {
DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0; DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
DwarfStrSectionSym = TextSectionSym = 0; DwarfStrSectionSym = TextSectionSym = 0;
DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0;
DwarfAbbrevDWOSectionSym = 0; DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
FunctionBeginSym = FunctionEndSym = 0; FunctionBeginSym = FunctionEndSym = 0;
// Turn on accelerator tables and older gdb compatibility // Turn on accelerator tables and older gdb compatibility
@ -213,7 +216,7 @@ static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,
} }
MCSymbol *DwarfUnits::getStringPoolSym() { MCSymbol *DwarfUnits::getStringPoolSym() {
return Asm->GetTempSymbol("section_str"); return Asm->GetTempSymbol(StringPref);
} }
MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) { MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
@ -222,7 +225,7 @@ MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {
if (Entry.first) return Entry.first; if (Entry.first) return Entry.first;
Entry.second = NextStringPoolNumber++; Entry.second = NextStringPoolNumber++;
return Entry.first = Asm->GetTempSymbol("string", Entry.second); return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second);
} }
// Define a unique number for the abbreviation. // Define a unique number for the abbreviation.
@ -987,6 +990,8 @@ void DwarfDebug::endModule() {
// Finally emit string information into a string table. // Finally emit string information into a string table.
emitDebugStr(); emitDebugStr();
if (useSplitDwarf())
emitDebugStrDWO();
// clean up. // clean up.
SPMap.clear(); SPMap.clear();
@ -1724,7 +1729,10 @@ void DwarfDebug::emitSectionLabels() {
emitSectionSym(Asm, TLOF.getDwarfLocSection()); emitSectionSym(Asm, TLOF.getDwarfLocSection());
emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());
DwarfStrSectionSym = DwarfStrSectionSym =
emitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string");
if (useSplitDwarf())
DwarfStrDWOSectionSym =
emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string");
DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(), DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(),
"debug_range"); "debug_range");
@ -2107,23 +2115,21 @@ void DwarfDebug::emitDebugPubTypes() {
} }
} }
// Emit visible names into a debug str section. // Emit strings into a string section.
void DwarfDebug::emitDebugStr() { void DwarfUnits::emitStrings(const MCSection *Section) {
// Check to see if it is worth the effort.
if (InfoHolder.getStringPool()->empty()) return; if (StringPool->empty()) return;
// Start the dwarf str section. // Start the dwarf str section.
Asm->OutStreamer.SwitchSection( Asm->OutStreamer.SwitchSection(Section);
Asm->getObjFileLowering().getDwarfStrSection());
// Get all of the string pool entries and put them in an array by their ID so // Get all of the string pool entries and put them in an array by their ID so
// we can sort them. // we can sort them.
SmallVector<std::pair<unsigned, SmallVector<std::pair<unsigned,
StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries;
for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator
I = InfoHolder.getStringPool()->begin(), I = StringPool->begin(), E = StringPool->end();
E = InfoHolder.getStringPool()->end();
I != E; ++I) I != E; ++I)
Entries.push_back(std::make_pair(I->second.second, &*I)); Entries.push_back(std::make_pair(I->second.second, &*I));
@ -2140,6 +2146,12 @@ void DwarfDebug::emitDebugStr() {
} }
} }
// Emit visible names into a debug str section.
void DwarfDebug::emitDebugStr() {
DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection());
}
// Emit visible names into a debug loc section. // Emit visible names into a debug loc section.
void DwarfDebug::emitDebugLoc() { void DwarfDebug::emitDebugLoc() {
if (DotDebugLocEntries.empty()) if (DotDebugLocEntries.empty())
@ -2363,7 +2375,7 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {
DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);
CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++, CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,
DIUnit.getLanguage(), Die, Asm, DIUnit.getLanguage(), Die, Asm,
this, &InfoHolder); this, &SkeletonHolder);
// FIXME: This should be the .dwo file. // FIXME: This should be the .dwo file.
NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN); NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN);
@ -2440,3 +2452,11 @@ void DwarfDebug::emitDebugAbbrevDWO() {
emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(), emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
&Abbreviations); &Abbreviations);
} }
// Emit the .debug_str.dwo section for separated dwarf. This contains the
// string section and is identical in format to traditional .debug_str
// sections.
void DwarfDebug::emitDebugStrDWO() {
assert(useSplitDwarf() && "No split dwarf?");
InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection());
}

View File

@ -210,15 +210,17 @@ class DwarfUnits {
// A pointer to all units in the section. // A pointer to all units in the section.
SmallVector<CompileUnit *, 1> CUs; SmallVector<CompileUnit *, 1> CUs;
// Collection of strings for this unit. // Collection of strings for this unit and assorted symbols.
StrPool *StringPool; StrPool *StringPool;
unsigned NextStringPoolNumber; unsigned NextStringPoolNumber;
std::string StringPref;
public: public:
DwarfUnits(AsmPrinter *AP, FoldingSet<DIEAbbrev> *AS, DwarfUnits(AsmPrinter *AP, FoldingSet<DIEAbbrev> *AS,
std::vector<DIEAbbrev *> *A, StrPool *SP) : std::vector<DIEAbbrev *> *A,
StrPool *SP, const char *Pref) :
Asm(AP), AbbreviationsSet(AS), Abbreviations(A), Asm(AP), AbbreviationsSet(AS), Abbreviations(A),
StringPool(SP), NextStringPoolNumber(0) {} StringPool(SP), NextStringPoolNumber(0), StringPref(Pref) {}
/// \brief Compute the size and offset of a DIE given an incoming Offset. /// \brief Compute the size and offset of a DIE given an incoming Offset.
unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); unsigned computeSizeAndOffset(DIE *Die, unsigned Offset);
@ -237,6 +239,9 @@ public:
void emitUnits(DwarfDebug *, const MCSection *, const MCSection *, void emitUnits(DwarfDebug *, const MCSection *, const MCSection *,
const MCSymbol *); const MCSymbol *);
/// \brief Emit all of the strings to the section given.
void emitStrings(const MCSection *);
/// \brief Returns the entry into the start of the pool. /// \brief Returns the entry into the start of the pool.
MCSymbol *getStringPoolSym(); MCSymbol *getStringPoolSym();
@ -364,7 +369,7 @@ class DwarfDebug {
MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;
MCSymbol *DwarfDebugLocSectionSym; MCSymbol *DwarfDebugLocSectionSym;
MCSymbol *FunctionBeginSym, *FunctionEndSym; MCSymbol *FunctionBeginSym, *FunctionEndSym;
MCSymbol *DwarfAbbrevDWOSectionSym; MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym;
// As an optimization, there is no need to emit an entry in the directory // As an optimization, there is no need to emit an entry in the directory
// table for the same directory as DW_at_comp_dir. // table for the same directory as DW_at_comp_dir.
@ -394,12 +399,16 @@ class DwarfDebug {
// The CU left in the original object file for separated debug info. // The CU left in the original object file for separated debug info.
CompileUnit *SkeletonCU; CompileUnit *SkeletonCU;
// Used to uniquely define abbreviations for the skeleton emission. // Used to uniquely define abbreviations for the skeleton emission.
FoldingSet<DIEAbbrev> SkeletonAbbrevSet; FoldingSet<DIEAbbrev> SkeletonAbbrevSet;
// A list of all the unique abbreviations in use. // A list of all the unique abbreviations in use.
std::vector<DIEAbbrev *> SkeletonAbbrevs; std::vector<DIEAbbrev *> SkeletonAbbrevs;
// List of strings used in the skeleton.
StrPool SkeletonStringPool;
// Holder for the skeleton information.
DwarfUnits SkeletonHolder; DwarfUnits SkeletonHolder;
private: private:
@ -514,6 +523,9 @@ private:
/// \brief Emit the debug abbrev dwo section. /// \brief Emit the debug abbrev dwo section.
void emitDebugAbbrevDWO(); void emitDebugAbbrevDWO();
/// \brief Emit the debug str dwo section.
void emitDebugStrDWO();
/// \brief Create new CompileUnit for the given metadata node with tag /// \brief Create new CompileUnit for the given metadata node with tag
/// DW_TAG_compile_unit. /// DW_TAG_compile_unit.
CompileUnit *constructCompileUnit(const MDNode *N); CompileUnit *constructCompileUnit(const MDNode *N);

View File

@ -20,10 +20,10 @@
; DW_AT_ranges_base, DW_AT_addr_base. ; DW_AT_ranges_base, DW_AT_addr_base.
; CHECK: DW_TAG_compile_unit ; CHECK: DW_TAG_compile_unit
; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000035] = "baz.c") ; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.c")
; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) ; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000)
; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x0000003b] = "/usr/local/google/home/echristo/tmp") ; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000006] = "/usr/local/google/home/echristo/tmp")
; Make sure there's only one compile unit for now. ; Make sure there's only one compile unit for now.
; CHECK-NOT: DW_TAG_compile_unit ; CHECK-NOT: DW_TAG_compile_unit

View File

@ -15,7 +15,7 @@
!7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
; Verify that we refer to 'yyyy' with a relocation. ; Verify that we refer to 'yyyy' with a relocation.
; LINUX: .long .Lstring3 # DW_AT_name ; LINUX: .long .Linfo_string3 # DW_AT_name
; LINUX-NEXT: .long 38 # DW_AT_type ; LINUX-NEXT: .long 38 # DW_AT_type
; LINUX-NEXT: # DW_AT_external ; LINUX-NEXT: # DW_AT_external
; LINUX-NEXT: .byte 1 # DW_AT_decl_file ; LINUX-NEXT: .byte 1 # DW_AT_decl_file
@ -25,7 +25,7 @@
; LINUX-NEXT: .quad yyyy ; LINUX-NEXT: .quad yyyy
; Verify that we refer to 'yyyy' without a relocation. ; Verify that we refer to 'yyyy' without a relocation.
; DARWIN: Lset5 = Lstring3-Lsection_str ## DW_AT_name ; DARWIN: Lset5 = Linfo_string3-Linfo_string ## DW_AT_name
; DARWIN-NEXT: .long Lset5 ; DARWIN-NEXT: .long Lset5
; DARWIN-NEXT: .long 39 ## DW_AT_type ; DARWIN-NEXT: .long 39 ## DW_AT_type
; DARWIN-NEXT: .byte 1 ## DW_AT_external ; DARWIN-NEXT: .byte 1 ## DW_AT_external