[llvm] r196479 - DwarfDebug/DwarfUnit: Push abbreviation structures down into DwarfUnits to reduce duplication

David Blaikie dblaikie at gmail.com
Thu Dec 5 09:13:26 PST 2013


On Thu, Dec 5, 2013 at 9:05 AM, Eric Christopher <echristo at gmail.com> wrote:
> Hmm? We only want one FoldingSet per final .o/.dwo

One each for the .o and for the .dwo, or are you expecting/claiming
there's one shared between both?

As the code was written before, and as it is written now, there's a
separate set for the .o and the .dwo - which makes sense to me. We
need the abbreviations for the skeletons to be in the .o, so they
can't be stored away in the .dwo. But we don't want to put all the
non-skeletal abbrevations for the .dwo in the .o (because we want to
keep as much stuff in the dwo as possible - and it's not like there
are any abbreviations that are likely to appear in both the .o and the
.dwo)

Previous code had these 4 members in DwarfDebug:

FoldingSet<DIEAbbrev> AbbreviationsSet;
std::vector<DIEAbbrev *> Abbreviations;
FoldingSet<DIEAbbrev> SkeletonAbbrevSet;
std::vector<DIEAbbrev *> SkeletonAbbrevs;

Now we have two members in DwarfUnit:

FoldingSet<DIEAbbrev> AbbreviationsSet;
std::vector<DIEAbbrev *> Abbreviations;

And two instances of DwarfUnit. So we have the same 4 objects and we
emit the same abbreviations in the same files, so far as I can tell.

> because
> abbreviations are uniqued across all compile/partial compile/type
> units. Am I missing something here in this patch?
>
> -eric
>
> On Wed, Dec 4, 2013 at 11:43 PM, David Blaikie <dblaikie at gmail.com> wrote:
>> Author: dblaikie
>> Date: Thu Dec  5 01:43:55 2013
>> New Revision: 196479
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=196479&view=rev
>> Log:
>> DwarfDebug/DwarfUnit: Push abbreviation structures down into DwarfUnits to reduce duplication
>>
>> Modified:
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=196479&r1=196478&r2=196479&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Dec  5 01:43:55 2013
>> @@ -114,10 +114,6 @@ static const char *const DbgTimerName =
>>
>>  //===----------------------------------------------------------------------===//
>>
>> -// Configuration values for initial hash set sizes (log2).
>> -//
>> -static const unsigned InitAbbreviationsSetSize = 9; // log2(512)
>> -
>>  namespace llvm {
>>
>>  /// resolve - Look in the DwarfDebug map for the MDNode that
>> @@ -182,14 +178,10 @@ static unsigned getDwarfVersionFromModul
>>  }
>>
>>  DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
>> -    : Asm(A), MMI(Asm->MMI), FirstCU(0),
>> -      AbbreviationsSet(InitAbbreviationsSetSize),
>> -      SourceIdMap(DIEValueAllocator), PrevLabel(NULL), GlobalCUIndexCount(0),
>> -      GlobalRangeCount(0), InfoHolder(A, &AbbreviationsSet, Abbreviations,
>> -                                      "info_string", DIEValueAllocator),
>> -      SkeletonAbbrevSet(InitAbbreviationsSetSize),
>> -      SkeletonHolder(A, &SkeletonAbbrevSet, SkeletonAbbrevs, "skel_string",
>> -                     DIEValueAllocator) {
>> +    : Asm(A), MMI(Asm->MMI), FirstCU(0), SourceIdMap(DIEValueAllocator),
>> +      PrevLabel(NULL), GlobalCUIndexCount(0), GlobalRangeCount(0),
>> +      InfoHolder(A, "info_string", DIEValueAllocator),
>> +      SkeletonHolder(A, "skel_string", DIEValueAllocator) {
>>
>>    DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0;
>>    DwarfStrSectionSym = TextSectionSym = 0;
>> @@ -288,7 +280,7 @@ unsigned DwarfUnits::getAddrPoolIndex(co
>>  //
>>  void DwarfUnits::assignAbbrevNumber(DIEAbbrev &Abbrev) {
>>    // Check the set for priors.
>> -  DIEAbbrev *InSet = AbbreviationsSet->GetOrInsertNode(&Abbrev);
>> +  DIEAbbrev *InSet = AbbreviationsSet.GetOrInsertNode(&Abbrev);
>>
>>    // If it's newly added.
>>    if (InSet == &Abbrev) {
>> @@ -2162,25 +2154,21 @@ void DwarfDebug::emitDebugInfo() {
>>
>>  // Emit the abbreviation section.
>>  void DwarfDebug::emitAbbreviations() {
>> -  if (!useSplitDwarf())
>> -    emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
>> -                &Abbreviations);
>> -  else
>> -    emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection(),
>> -                &SkeletonAbbrevs);
>> +  DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder;
>> +
>> +  Holder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevSection());
>>  }
>>
>> -void DwarfDebug::emitAbbrevs(const MCSection *Section,
>> -                             std::vector<DIEAbbrev *> *Abbrevs) {
>> +void DwarfUnits::emitAbbrevs(const MCSection *Section) {
>>    // Check to see if it is worth the effort.
>> -  if (!Abbrevs->empty()) {
>> +  if (!Abbreviations.empty()) {
>>      // Start the debug abbrev section.
>>      Asm->OutStreamer.SwitchSection(Section);
>>
>>      // For each abbrevation.
>> -    for (unsigned i = 0, N = Abbrevs->size(); i < N; ++i) {
>> +    for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
>>        // Get abbreviation data
>> -      const DIEAbbrev *Abbrev = Abbrevs->at(i);
>> +      const DIEAbbrev *Abbrev = Abbreviations[i];
>>
>>        // Emit the abbrevations code (base 1 index.)
>>        Asm->EmitULEB128(Abbrev->getNumber(), "Abbreviation Code");
>> @@ -3031,8 +3019,7 @@ void DwarfDebug::emitDebugInfoDWO() {
>>  // abbreviations for the .debug_info.dwo section.
>>  void DwarfDebug::emitDebugAbbrevDWO() {
>>    assert(useSplitDwarf() && "No split dwarf?");
>> -  emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(),
>> -              &Abbreviations);
>> +  InfoHolder.emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection());
>>  }
>>
>>  // Emit the .debug_str.dwo section for separated dwarf. This contains the
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=196479&r1=196478&r2=196479&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Thu Dec  5 01:43:55 2013
>> @@ -226,10 +226,10 @@ class DwarfUnits {
>>    AsmPrinter *Asm;
>>
>>    // Used to uniquely define abbreviations.
>> -  FoldingSet<DIEAbbrev> *AbbreviationsSet;
>> +  FoldingSet<DIEAbbrev> AbbreviationsSet;
>>
>>    // A list of all the unique abbreviations in use.
>> -  std::vector<DIEAbbrev *> &Abbreviations;
>> +  std::vector<DIEAbbrev *> Abbreviations;
>>
>>    // A pointer to all units in the section.
>>    SmallVector<Unit *, 1> CUs;
>> @@ -251,12 +251,9 @@ class DwarfUnits {
>>    unsigned NextAddrPoolNumber;
>>
>>  public:
>> -  DwarfUnits(AsmPrinter *AP, FoldingSet<DIEAbbrev> *AS,
>> -             std::vector<DIEAbbrev *> &A, const char *Pref,
>> -             BumpPtrAllocator &DA)
>> -      : Asm(AP), AbbreviationsSet(AS), Abbreviations(A), StringPool(DA),
>> -        NextStringPoolNumber(0), StringPref(Pref), AddressPool(),
>> -        NextAddrPoolNumber(0) {}
>> +  DwarfUnits(AsmPrinter *AP, const char *Pref, BumpPtrAllocator &DA)
>> +      : Asm(AP), StringPool(DA), NextStringPoolNumber(0), StringPref(Pref),
>> +        AddressPool(), NextAddrPoolNumber(0) {}
>>
>>    ~DwarfUnits();
>>
>> @@ -279,6 +276,9 @@ public:
>>    void emitUnits(DwarfDebug *DD, const MCSection *USection,
>>                   const MCSection *ASection, const MCSymbol *ASectionSym);
>>
>> +  /// \brief Emit a set of abbreviations to the specific section.
>> +  void emitAbbrevs(const MCSection *);
>> +
>>    /// \brief Emit all of the strings to the section given.
>>    void emitStrings(const MCSection *StrSection, const MCSection *OffsetSection,
>>                     const MCSymbol *StrSecSym);
>> @@ -347,12 +347,6 @@ class DwarfDebug : public AsmPrinterHand
>>    /// of in CompileUnit.
>>    DenseMap<const MDNode *, DIE *> MDTypeNodeToDieMap;
>>
>> -  // Used to uniquely define abbreviations.
>> -  FoldingSet<DIEAbbrev> AbbreviationsSet;
>> -
>> -  // A list of all the unique abbreviations in use.
>> -  std::vector<DIEAbbrev *> Abbreviations;
>> -
>>    // Stores the current file ID for a given compile unit.
>>    DenseMap <unsigned, unsigned> FileIDCUMap;
>>    // Source id map, i.e. CUID, source filename and directory,
>> @@ -485,12 +479,6 @@ class DwarfDebug : public AsmPrinterHand
>>    // original object file, rather than things that are meant
>>    // to be in the .dwo sections.
>>
>> -  // 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;
>> -
>>    // Holder for the skeleton information.
>>    DwarfUnits SkeletonHolder;
>>
>> @@ -553,9 +541,6 @@ class DwarfDebug : public AsmPrinterHand
>>    /// open.
>>    void endSections();
>>
>> -  /// \brief Emit a set of abbreviations to the specific section.
>> -  void emitAbbrevs(const MCSection *, std::vector<DIEAbbrev*> *);
>> -
>>    /// \brief Emit the debug info section.
>>    void emitDebugInfo();
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list