diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 52 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 22 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/fission-cu.ll | 4 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/stringpool.ll | 4 | 
4 files changed, 57 insertions, 25 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4867bb81771..74a81a51306 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -157,15 +157,18 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)      AbbreviationsSet(InitAbbreviationsSetSize),      SourceIdMap(DIEValueAllocator), InfoStringPool(DIEValueAllocator),      PrevLabel(NULL), GlobalCUIndexCount(0), -    InfoHolder(A, &AbbreviationsSet, &Abbreviations, &InfoStringPool), +    InfoHolder(A, &AbbreviationsSet, &Abbreviations, +               &InfoStringPool, "info_string"),      SkeletonCU(0),      SkeletonAbbrevSet(InitAbbreviationsSetSize), -    SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, &InfoStringPool) { +    SkeletonStringPool(DIEValueAllocator), +    SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, +                   &SkeletonStringPool, "skel_string") {    DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;    DwarfStrSectionSym = TextSectionSym = 0;    DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; -  DwarfAbbrevDWOSectionSym = 0; +  DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;    FunctionBeginSym = FunctionEndSym = 0;    // Turn on accelerator tables and older gdb compatibility @@ -213,7 +216,7 @@ static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section,  }  MCSymbol *DwarfUnits::getStringPoolSym() { -  return Asm->GetTempSymbol("section_str"); +  return Asm->GetTempSymbol(StringPref);  }  MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) { @@ -222,7 +225,7 @@ MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) {    if (Entry.first) return Entry.first;    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. @@ -987,6 +990,8 @@ void DwarfDebug::endModule() {    // Finally emit string information into a string table.    emitDebugStr(); +  if (useSplitDwarf()) +    emitDebugStrDWO();    // clean up.    SPMap.clear(); @@ -1724,7 +1729,10 @@ void DwarfDebug::emitSectionLabels() {    emitSectionSym(Asm, TLOF.getDwarfLocSection());    emitSectionSym(Asm, TLOF.getDwarfPubTypesSection());    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(),                                               "debug_range"); @@ -2107,23 +2115,21 @@ void DwarfDebug::emitDebugPubTypes() {    }  } -// Emit visible names into a debug str section. -void DwarfDebug::emitDebugStr() { -  // Check to see if it is worth the effort. -  if (InfoHolder.getStringPool()->empty()) return; +// Emit strings into a string section. +void DwarfUnits::emitStrings(const MCSection *Section) { + +  if (StringPool->empty()) return;    // Start the dwarf str section. -  Asm->OutStreamer.SwitchSection( -                                Asm->getObjFileLowering().getDwarfStrSection()); +  Asm->OutStreamer.SwitchSection(Section);    // Get all of the string pool entries and put them in an array by their ID so    // we can sort them.    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 -       I = InfoHolder.getStringPool()->begin(), -         E = InfoHolder.getStringPool()->end(); +         I = StringPool->begin(), E = StringPool->end();         I != E; ++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.  void DwarfDebug::emitDebugLoc() {    if (DotDebugLocEntries.empty()) @@ -2363,7 +2375,7 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) {    DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);    CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++,                                         DIUnit.getLanguage(), Die, Asm, -                                       this, &InfoHolder); +                                       this, &SkeletonHolder);    // FIXME: This should be the .dwo file.    NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN); @@ -2440,3 +2452,11 @@ void DwarfDebug::emitDebugAbbrevDWO() {    emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),                &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()); +} diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 870b588cf7c..59e4890dec4 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -210,15 +210,17 @@ class DwarfUnits {    // A pointer to all units in the section.    SmallVector<CompileUnit *, 1> CUs; -  // Collection of strings for this unit. +  // Collection of strings for this unit and assorted symbols.    StrPool *StringPool;    unsigned NextStringPoolNumber; +  std::string StringPref;  public:    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), -    StringPool(SP), NextStringPoolNumber(0) {} +    StringPool(SP), NextStringPoolNumber(0), StringPref(Pref) {}    /// \brief Compute the size and offset of a DIE given an incoming Offset.    unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); @@ -237,6 +239,9 @@ public:    void emitUnits(DwarfDebug *, const MCSection *, const MCSection *,                   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.    MCSymbol *getStringPoolSym(); @@ -364,7 +369,7 @@ class DwarfDebug {    MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;    MCSymbol *DwarfDebugLocSectionSym;    MCSymbol *FunctionBeginSym, *FunctionEndSym; -  MCSymbol *DwarfAbbrevDWOSectionSym; +  MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym;    // As an optimization, there is no need to emit an entry in the directory    // 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.    CompileUnit *SkeletonCU; -    // Used to uniquely define abbreviations for the skeleton emission. +  // Used to uniquely define abbreviations for the skeleton emission.    FoldingSet<DIEAbbrev> SkeletonAbbrevSet;    // A list of all the unique abbreviations in use.    std::vector<DIEAbbrev *> SkeletonAbbrevs; +  // List of strings used in the skeleton. +  StrPool SkeletonStringPool; + +  // Holder for the skeleton information.    DwarfUnits SkeletonHolder;  private: @@ -514,6 +523,9 @@ private:    /// \brief Emit the debug abbrev dwo section.    void emitDebugAbbrevDWO(); +  /// \brief Emit the debug str dwo section. +  void emitDebugStrDWO(); +    /// \brief Create new CompileUnit for the given metadata node with tag    /// DW_TAG_compile_unit.    CompileUnit *constructCompileUnit(const MDNode *N); diff --git a/llvm/test/DebugInfo/X86/fission-cu.ll b/llvm/test/DebugInfo/X86/fission-cu.ll index f22874fe9c6..28d4fb04976 100644 --- a/llvm/test/DebugInfo/X86/fission-cu.ll +++ b/llvm/test/DebugInfo/X86/fission-cu.ll @@ -20,10 +20,10 @@  ; DW_AT_ranges_base, DW_AT_addr_base.  ; 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_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.  ; CHECK-NOT: DW_TAG_compile_unit diff --git a/llvm/test/DebugInfo/X86/stringpool.ll b/llvm/test/DebugInfo/X86/stringpool.ll index caf12c2756e..21b0d09a867 100644 --- a/llvm/test/DebugInfo/X86/stringpool.ll +++ b/llvm/test/DebugInfo/X86/stringpool.ll @@ -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 ]  ; 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:                                 # DW_AT_external  ; LINUX-NEXT: .byte   1                       # DW_AT_decl_file @@ -25,7 +25,7 @@  ; LINUX-NEXT: .quad   yyyy  ; 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   39                      ## DW_AT_type  ; DARWIN-NEXT:        .byte   1                       ## DW_AT_external  | 

