[llvm] r195166 - DebugInfo: Partial implementation of DWARF type units.

David Blaikie dblaikie at gmail.com
Wed Nov 20 10:57:43 PST 2013


On Wed, Nov 20, 2013 at 10:27 AM, Manman Ren <manman.ren at gmail.com> wrote:

>
>
>
> On Tue, Nov 19, 2013 at 3:08 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> Author: dblaikie
>> Date: Tue Nov 19 17:08:21 2013
>> New Revision: 195166
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=195166&view=rev
>> Log:
>> DebugInfo: Partial implementation of DWARF type units.
>>
>> Emit DW_TAG_type_units into the debug_info section using compile unit
>> headers. This is bogus/unusable by debuggers, but testable and provides
>> more isolated review.
>>
>> Subsequent patches will include support for type unit headers and
>> emission into the debug_types section, as well as comdat grouping the
>> types based on their hash. Also the CompileUnit type will be renamed
>> 'Unit' and relevant portions pulled out into respective CompileUnit and
>> TypeUnit types.
>>
>> Modified:
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>     llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Tue Nov 19 17:08:21 2013
>> @@ -114,18 +114,19 @@ DIE::~DIE() {
>>
>>  /// Climb up the parent chain to get the compile unit DIE to which this
>> DIE
>>  /// belongs.
>> -const DIE *DIE::getCompileUnit() const {
>> -  const DIE *Cu = getCompileUnitOrNull();
>> +const DIE *DIE::getUnit() const {
>> +  const DIE *Cu = getUnitOrNull();
>>
>
> Hi David,
>
> To help reviewing the changes, it is better to separate changes to
> getCompileUnit and getCompileUnitOrNull to a separate patch.
>

I've tried to separate out as many pure-refactoring changes as possible,
but I try to avoid committing untested code where possible as would be the
case here (since no code would be creating DW_TAG_type_unit DIEs, so the
change to getCompileUnitOrNull would be 'dead' until my second commit) and
the name would be wrong if I made the semantic change in this commit
without the naming change.

This was small enough and the commit in total isn't so large, that I
decided to include it rather than end up in a "wrong name" or "dead code"
intermediate state. But it's a fine tradeoff that could've gone the other
way as well, yes.


>
>
>>    assert(Cu && "We should not have orphaned DIEs.");
>>    return Cu;
>>  }
>>
>>  /// Climb up the parent chain to get the compile unit DIE this DIE
>> belongs
>>  /// to. Return NULL if DIE is not added to an owner yet.
>> -const DIE *DIE::getCompileUnitOrNull() const {
>> +const DIE *DIE::getUnitOrNull() const {
>>    const DIE *p = this;
>>    while (p) {
>> -    if (p->getTag() == dwarf::DW_TAG_compile_unit)
>> +    if (p->getTag() == dwarf::DW_TAG_compile_unit ||
>> +        p->getTag() == dwarf::DW_TAG_type_unit)
>>
>
> Same here.
>
>
>>        return p;
>>      p = p->getParent();
>>    }
>> @@ -227,6 +228,7 @@ void DIEInteger::EmitValue(AsmPrinter *A
>>    case dwarf::DW_FORM_ref4:  // Fall thru
>>    case dwarf::DW_FORM_data4: Size = 4; break;
>>    case dwarf::DW_FORM_ref8:  // Fall thru
>> +  case dwarf::DW_FORM_ref_sig8:  // Fall thru
>>    case dwarf::DW_FORM_data8: Size = 8; break;
>>    case dwarf::DW_FORM_GNU_str_index: Asm->EmitULEB128(Integer); return;
>>    case dwarf::DW_FORM_GNU_addr_index: Asm->EmitULEB128(Integer); return;
>> @@ -253,6 +255,7 @@ unsigned DIEInteger::SizeOf(AsmPrinter *
>>    case dwarf::DW_FORM_ref4:  // Fall thru
>>    case dwarf::DW_FORM_data4: return sizeof(int32_t);
>>    case dwarf::DW_FORM_ref8:  // Fall thru
>> +  case dwarf::DW_FORM_ref_sig8:  // Fall thru
>>    case dwarf::DW_FORM_data8: return sizeof(int64_t);
>>    case dwarf::DW_FORM_GNU_str_index: return
>> MCAsmInfo::getULEB128Size(Integer);
>>    case dwarf::DW_FORM_GNU_addr_index: return
>> MCAsmInfo::getULEB128Size(Integer);
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h Tue Nov 19 17:08:21 2013
>> @@ -146,12 +146,12 @@ namespace llvm {
>>      const std::vector<DIE *> &getChildren() const { return Children; }
>>      const SmallVectorImpl<DIEValue*> &getValues() const { return Values;
>> }
>>      DIE *getParent() const { return Parent; }
>> -    /// Climb up the parent chain to get the compile unit DIE this DIE
>> belongs
>> -    /// to.
>> -    const DIE *getCompileUnit() const;
>> -    /// Similar to getCompileUnit, returns null when DIE is not added to
>> an
>> +    /// Climb up the parent chain to get the compile or type unit DIE
>> this DIE
>> +    /// belongs to.
>> +    const DIE *getUnit() const;
>> +    /// Similar to getUnit, returns null when DIE is not added to an
>>      /// owner yet.
>> -    const DIE *getCompileUnitOrNull() const;
>> +    const DIE *getUnitOrNull() const;
>>
> Same here.
>
>
>>      void setOffset(unsigned O) { Offset = O; }
>>      void setSize(unsigned S) { Size = S; }
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIEHash.cpp Tue Nov 19 17:08:21 2013
>> @@ -92,10 +92,12 @@ void DIEHash::addParentContext(const DIE
>>    // outermost such construct...
>>    SmallVector<const DIE *, 1> Parents;
>>    const DIE *Cur = &Parent;
>> -  while (Cur->getTag() != dwarf::DW_TAG_compile_unit) {
>> +  while (Cur->getParent()) {
>>      Parents.push_back(Cur);
>>      Cur = Cur->getParent();
>>    }
>> +  assert(Cur->getTag() == dwarf::DW_TAG_compile_unit ||
>> +         Cur->getTag() == dwarf::DW_TAG_type_unit);
>>
>>    // Reverse iterate over our list to go from the outermost construct to
>> the
>>    // innermost.
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Tue Nov 19
>> 17:08:21 2013
>> @@ -29,18 +29,30 @@
>>  #include "llvm/Target/TargetMachine.h"
>>  #include "llvm/Target/TargetLoweringObjectFile.h"
>>  #include "llvm/Target/TargetRegisterInfo.h"
>> +#include "llvm/Support/CommandLine.h"
>>
>>  using namespace llvm;
>>
>> +static cl::opt<bool> GenerateTypeUnits("generate-type-units", cl::Hidden,
>> +                                       cl::desc("Generate DWARF4 type
>> units."),
>> +                                       cl::init(false));
>> +
>>  /// CompileUnit - Compile unit constructor.
>>  CompileUnit::CompileUnit(unsigned UID, DIE *D, DICompileUnit Node,
>>                           AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
>>      : UniqueID(UID), Node(Node), CUDie(D), Asm(A), DD(DW), DU(DWU),
>> -      IndexTyDie(0), DebugInfoOffset(0) {
>> +      IndexTyDie(0), Language(Node.getLanguage()) {
>>
> Is removing initialization to DebugInfoOffset intentional?
>

No - thanks for the catch. Bad merge into my working tree after you
committed the cross-CU sharing, it seems. Fixed in r195263

On reflection, as I mentioned in the commit, this initialization isn't
actually necessary and we could choose to leave it uninitialized and allow
tools like MSan or static analyzers to help us catch bugs, but I'll leave
that for another time/discussion.


>
>
>>    DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
>>    insertDIE(Node, D);
>>  }
>>
>> +CompileUnit::CompileUnit(unsigned UID, DIE *D, uint16_t Language,
>> AsmPrinter *A,
>> +                         DwarfDebug *DD, DwarfUnits *DU)
>> +    : UniqueID(UID), Node(NULL), CUDie(D), Asm(A), DD(DD), DU(DU),
>> +      IndexTyDie(0), Language(Language) {
>>
> Should we initialize DebugInfoOffset here?
>

Since we're not currently using cross-CU DIE sharing along with type units,
this isn't immediately an issue I don't think, but it's cheap and better to
initialize it now than to have someone track down a use-of-uninitialized
later on.


>
>
>> +  DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
>> +}
>> +
>>  /// ~CompileUnit - Destructor for compile unit.
>>  CompileUnit::~CompileUnit() {
>>    for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
>> @@ -102,7 +114,9 @@ int64_t CompileUnit::getDefaultLowerBoun
>>  static bool isShareableAcrossCUs(DIDescriptor D) {
>>    // When the MDNode can be part of the type system, the DIE can be
>>    // shared across CUs.
>> -  return D.isType() || (D.isSubprogram() &&
>> !DISubprogram(D).isDefinition());
>> +  return (D.isType() ||
>> +          (D.isSubprogram() && !DISubprogram(D).isDefinition())) &&
>> +         !GenerateTypeUnits;
>>
>
> It is nice if we can have a comment explaining why when generating type
> units, we don't share MDNodes.
>

Comment added in r195262


>
>
>>  }
>>
>>  /// getDIE - Returns the debug information entry map slot for the
>> @@ -281,8 +295,8 @@ void CompileUnit::addDIEEntry(DIE *Die,
>>
>>  void CompileUnit::addDIEEntry(DIE *Die, dwarf::Attribute Attribute,
>>                                DIEEntry *Entry) {
>> -  const DIE *DieCU = Die->getCompileUnitOrNull();
>> -  const DIE *EntryCU = Entry->getEntry()->getCompileUnitOrNull();
>> +  const DIE *DieCU = Die->getUnitOrNull();
>> +  const DIE *EntryCU = Entry->getEntry()->getUnitOrNull();
>>    if (!DieCU)
>>      // We assume that Die belongs to this CU, if it is not linked to any
>> CU yet.
>>      DieCU = getCUDie();
>> @@ -871,6 +885,22 @@ DIE *CompileUnit::getOrCreateContextDIE(
>>    return getDIE(Context);
>>  }
>>
>> +DIE *CompileUnit::createTypeDIE(DICompositeType Ty) {
>> +  DIE *ContextDIE = getOrCreateContextDIE(resolve(Ty.getContext()));
>> +
>> +  DIE *TyDIE = getDIE(Ty);
>> +  if (TyDIE)
>> +    return TyDIE;
>> +
>> +  // Create new type.
>> +  TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty);
>> +
>> +  constructTypeDIEImpl(*TyDIE, Ty);
>> +
>> +  updateAcceleratorTables(Ty, TyDIE);
>> +  return TyDIE;
>> +}
>> +
>>  /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
>>  /// given DIType.
>>  DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
>> @@ -1112,6 +1142,9 @@ static bool isTypeUnitScoped(DIType Ty,
>>
>>  /// Return true if the type should be split out into a type unit.
>>  static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug
>> *DD) {
>> +  if (!GenerateTypeUnits)
>> +    return false;
>> +
>>    uint16_t Tag = CTy.getTag();
>>
>>    switch (Tag) {
>> @@ -1130,7 +1163,16 @@ static bool shouldCreateTypeUnit(DICompo
>>
>>  /// constructTypeDIE - Construct type DIE from DICompositeType.
>>  void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
>> -  // Get core information.
>> +  // If this is a type applicable to a type unit it then add it to the
>> +  // list of types we'll compute a hash for later.
>> +  if (shouldCreateTypeUnit(CTy, DD))
>> +    DD->addTypeUnitType(&Buffer, CTy);
>> +  else
>> +    constructTypeDIEImpl(Buffer, CTy);
>> +}
>> +
>> +void CompileUnit::constructTypeDIEImpl(DIE &Buffer, DICompositeType CTy)
>> {
>> +  // Add name if not anonymous or intermediate type.
>>    StringRef Name = CTy.getName();
>>
>>    uint64_t Size = CTy.getSizeInBits() >> 3;
>> @@ -1296,10 +1338,6 @@ void CompileUnit::constructTypeDIE(DIE &
>>        addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class,
>> dwarf::DW_FORM_data1,
>>                RLang);
>>    }
>> -  // If this is a type applicable to a type unit it then add it to the
>> -  // list of types we'll compute a hash for later.
>> -  if (shouldCreateTypeUnit(CTy, DD))
>> -    DD->addTypeUnitType(&Buffer);
>>  }
>>
>>  /// constructTemplateTypeParameterDIE - Construct new DIE for the given
>> @@ -1510,7 +1548,6 @@ static const ConstantExpr *getMergedGlob
>>
>>  /// createGlobalVariableDIE - create global variable DIE.
>>  void CompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) {
>> -
>>    // Check for pre-existence.
>>    if (getDIE(GV))
>>      return;
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Tue Nov 19
>> 17:08:21 2013
>> @@ -93,14 +93,18 @@ class CompileUnit {
>>    // DIEIntegerOne - A preallocated DIEValue because 1 is used
>> frequently.
>>    DIEInteger *DIEIntegerOne;
>>
>> +  uint16_t Language;
>> +
>>  public:
>>    CompileUnit(unsigned UID, DIE *D, DICompileUnit CU, AsmPrinter *A,
>>                DwarfDebug *DW, DwarfUnits *DWU);
>> +  CompileUnit(unsigned UID, DIE *D, uint16_t Language, AsmPrinter *A,
>> +              DwarfDebug *DW, DwarfUnits *DWU);
>>    ~CompileUnit();
>>
>>    // Accessors.
>>    unsigned getUniqueID() const { return UniqueID; }
>> -  uint16_t getLanguage() const { return Node.getLanguage(); }
>> +  uint16_t getLanguage() const { return Language; }
>>    DICompileUnit getNode() const { return Node; }
>>    DIE *getCUDie() const { return CUDie.get(); }
>>    const StringMap<DIE *> &getGlobalNames() const { return GlobalNames; }
>> @@ -311,6 +315,9 @@ public:
>>    DIE *getOrCreateTypeDIE(const MDNode *N);
>>
>>    /// getOrCreateContextDIE - Get context owner's DIE.
>> +  DIE *createTypeDIE(DICompositeType Ty);
>> +
>> +  /// getOrCreateContextDIE - Get context owner's DIE.
>>    DIE *getOrCreateContextDIE(DIScope Context);
>>
>>    /// createGlobalVariableDIE - create global variable DIE.
>> @@ -328,6 +335,10 @@ public:
>>    DIE *createAndAddDIE(unsigned Tag, DIE &Parent,
>>                         DIDescriptor N = DIDescriptor());
>>
>> +  /// constructTypeDIEImpl - Construct type DIE that is not a type unit
>> +  /// reference from a DICompositeType.
>> +  void constructTypeDIEImpl(DIE &Buffer, DICompositeType CTy);
>> +
>>    /// Compute the size of a header for this unit, not including the
>> initial
>>    /// length field.
>>    unsigned getHeaderSize() const {
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Nov 19 17:08:21
>> 2013
>> @@ -1051,22 +1051,6 @@ void DwarfDebug::finalizeModuleInfo() {
>>    // Attach DW_AT_inline attribute with inlined subprogram DIEs.
>>    computeInlinedDIEs();
>>
>> -  // Split out type units and conditionally add an ODR tag to the split
>> -  // out type.
>> -  // FIXME: Do type splitting.
>> -  for (unsigned i = 0, e = TypeUnits.size(); i != e; ++i) {
>> -    DIE *Die = TypeUnits[i];
>> -    DIEHash Hash;
>> -    // If we've requested ODR hashes and it's applicable for an ODR hash
>> then
>> -    // add the ODR signature now.
>> -    // FIXME: This should be added onto the type unit, not the type, but
>> this
>> -    // works as an intermediate stage.
>> -    if (GenerateODRHash && shouldAddODRHash(CUMap.begin()->second, Die))
>> -      CUMap.begin()->second->addUInt(Die, dwarf::DW_AT_GNU_odr_signature,
>> -                                     dwarf::DW_FORM_data8,
>> -                                     Hash.computeDIEODRSignature(*Die));
>> -  }
>> -
>>    // Handle anything that needs to be done on a per-cu basis.
>>    for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI =
>> CUMap.begin(),
>>                                                           CUE =
>> CUMap.end();
>> @@ -2071,7 +2055,7 @@ void DwarfDebug::emitDIE(DIE *Die, Array
>>          // For DW_FORM_ref_addr, output the offset from beginning of
>> debug info
>>          // section. Origin->getOffset() returns the offset from start of
>> the
>>          // compile unit.
>> -        CompileUnit *CU = CUDieMap.lookup(Origin->getCompileUnit());
>> +        CompileUnit *CU = CUDieMap.lookup(Origin->getUnit());
>>          assert(CU && "CUDie should belong to a CU.");
>>          Addr += CU->getDebugInfoOffset();
>>          if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
>> @@ -2083,7 +2067,7 @@ void DwarfDebug::emitDIE(DIE *Die, Array
>>                                           DIEEntry::getRefAddrSize(Asm));
>>        } else {
>>          // Make sure Origin belong to the same CU.
>> -        assert(Die->getCompileUnit() == Origin->getCompileUnit() &&
>> +        assert(Die->getUnit() == Origin->getUnit() &&
>>                 "The referenced DIE should belong to the same CU in
>> ref4");
>>          Asm->EmitInt32(Addr);
>>        }
>> @@ -3063,3 +3047,57 @@ void DwarfDebug::emitDebugStrDWO() {
>>
>>  InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection(),
>>                           OffSec, StrSym);
>>  }
>> +
>> +void DwarfDebug::addTypeUnitType(DIE *RefDie, DICompositeType CTy) {
>> +  DenseMap<const MDNode*, std::pair<uint64_t, SmallVectorImpl<DIE*>* >
>> >::iterator I = TypeUnits.find(CTy);
>> +  SmallVector<DIE *, 8> References;
>> +  References.push_back(RefDie);
>> +  if (I != TypeUnits.end()) {
>> +    if (I->second.second) {
>> +      I->second.second->push_back(RefDie);
>> +      return;
>> +    }
>> +  } else {
>> +    DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit);
>> +    CompileUnit *NewCU =
>> +        new CompileUnit(GlobalCUIndexCount++, UnitDie,
>> +                        dwarf::DW_LANG_C_plus_plus, Asm, this,
>> &InfoHolder);
>> +    CUDieMap.insert(std::make_pair(UnitDie, NewCU));
>> +    NewCU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2,
>> +                   dwarf::DW_LANG_C_plus_plus);
>> +
>> +    // Register the type in the TypeUnits map with a vector of
>> references to be
>> +    // populated whenever a reference is required.
>> +    I = TypeUnits.insert(std::make_pair(CTy, std::make_pair(0,
>> &References)))
>> +            .first;
>> +
>> +    // Construct the type, this may, recursively, require more type
>> units that
>> +    // may in turn require this type again - in which case they will add
>> DIEs to
>> +    // the References vector.
>> +    DIE *Die = NewCU->createTypeDIE(CTy);
>> +
>> +    if (GenerateODRHash && shouldAddODRHash(NewCU, Die))
>> +      NewCU->addUInt(UnitDie, dwarf::DW_AT_GNU_odr_signature,
>> +                     dwarf::DW_FORM_data8,
>> +                     DIEHash().computeDIEODRSignature(*Die));
>> +    // FIXME: This won't handle circularly referential structures, as
>> the DIE
>> +    // may have references to other DIEs still under construction and
>> missing
>> +    // their signature. Hashing should walk through the signatures to
>> their
>> +    // referenced type, or possibly walk the precomputed hashes of
>> related types
>> +    // at the end.
>> +    uint64_t Signature = DIEHash().computeTypeSignature(*Die);
>> +
>> +    // Remove the References vector and add the type hash.
>> +    I->second.first = Signature;
>> +    I->second.second = NULL;
>> +
>> +
>> +    InfoHolder.addUnit(NewCU);
>> +  }
>> +
>> +  // Populate all the signatures.
>> +  for (unsigned i = 0, e = References.size(); i != e; ++i) {
>> +    CUMap.begin()->second->addUInt(References[i], dwarf::DW_AT_signature,
>> +                                   dwarf::DW_FORM_ref_sig8,
>> I->second.first);
>> +  }
>> +}
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Nov 19 17:08:21
>> 2013
>> @@ -37,6 +37,7 @@ class MachineFrameInfo;
>>  class MachineModuleInfo;
>>  class MachineOperand;
>>  class MCAsmInfo;
>> +class MCObjectFileInfo;
>>  class DIEAbbrev;
>>  class DIE;
>>  class DIEBlock;
>> @@ -443,7 +444,7 @@ class DwarfDebug {
>>    ImportedEntityMap ScopesWithImportedEntities;
>>
>>    // Holder for types that are going to be extracted out into a type
>> unit.
>> -  std::vector<DIE *> TypeUnits;
>> +  DenseMap<const MDNode *, std::pair<uint64_t, SmallVectorImpl<DIE*>* >
>> > TypeUnits;
>>
>
> Can you add a comment here explaining the pair?
>

Comment added in r195262.

Thanks for the help,
- David


>
> Thanks,
> Manman
>
>
>>
>>    // Whether to emit the pubnames/pubtypes sections.
>>    bool HasDwarfPubSections;
>> @@ -695,7 +696,7 @@ public:
>>
>>    /// \brief Add a DIE to the set of types that we're going to pull into
>>    /// type units.
>> -  void addTypeUnitType(DIE *Die) { TypeUnits.push_back(Die); }
>> +  void addTypeUnitType(DIE *Die, DICompositeType CTy);
>>
>>    /// \brief Add a label so that arange data can be generated for it.
>>    void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); }
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll?rev=195166&r1=195165&r2=195166&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll Tue Nov 19
>> 17:08:21 2013
>> @@ -1,6 +1,6 @@
>>  ; REQUIRES: object-emission
>>
>> -; RUN: llc %s -o %t -filetype=obj -O0 -generate-odr-hash
>> -mtriple=x86_64-unknown-linux-gnu
>> +; RUN: llc %s -o %t -filetype=obj -O0 -generate-type-units
>> -generate-odr-hash -mtriple=x86_64-unknown-linux-gnu
>>  ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
>>  ;
>>  ; Generated from:
>> @@ -44,9 +44,12 @@
>>  ; wombat wom;
>>
>>  ; Check that we generate a hash for bar and the value.
>> +; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8]
>> (0x200520c0d5b90eff)
>>  ; CHECK: DW_TAG_structure_type
>>  ; CHECK-NEXT: debug_str{{.*}}"bar"
>> -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x200520c0d5b90eff)
>> +
>> +; Check that we generate a hash for fluffy and the value.
>> +; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8]
>> (0x9a0124d5a0c21c52)
>>  ; CHECK: DW_TAG_namespace
>>  ; CHECK-NEXT: debug_str{{.*}}"echidna"
>>  ; CHECK: DW_TAG_namespace
>> @@ -55,34 +58,36 @@
>>  ; CHECK-NEXT: debug_str{{.*}}"mongoose"
>>  ; CHECK: DW_TAG_class_type
>>  ; CHECK-NEXT: debug_str{{.*}}"fluffy"
>> -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8]   (0x9a0124d5a0c21c52)
>>
>>  ; We emit no hash for walrus since the type is contained in an anonymous
>>  ; namespace and won't violate any ODR-ness.
>> +; CHECK: DW_TAG_type_unit
>> +; CHECK-NOT: NULL
>> +; CHECK-NOT: DW_AT_GNU_odr_signature
>>  ; CHECK: DW_TAG_structure_type
>>  ; CHECK-NEXT: debug_str{{.*}}"walrus"
>>  ; CHECK-NEXT: DW_AT_byte_size
>>  ; CHECK-NEXT: DW_AT_decl_file
>>  ; CHECK-NEXT: DW_AT_decl_line
>> -; CHECK-NOT: DW_AT_GNU_odr_signature
>>  ; CHECK: DW_TAG_subprogram
>>
>> +
>>  ; Check that we generate a hash for wombat and the value, but not for the
>>  ; anonymous type contained within.
>> +; CHECK: DW_TAG_type_unit
>>  ; CHECK: DW_TAG_structure_type
>> -; CHECK-NEXT: debug_str{{.*}}wombat
>> -; CHECK: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
>> +; The signature for the outer 'wombat' type - this can be FileChecked
>> once the
>> +; type units are moved to their own section with the full type unit
>> header
>> +; including the signature
>> +; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0x73776f130648b986)
>>  ; CHECK: DW_TAG_structure_type
>> -; CHECK-NEXT: DW_AT_byte_size
>> -; CHECK-NEXT: DW_AT_decl_file
>> -; CHECK-NEXT: DW_AT_decl_line
>> +; CHECK-NOT: DW_AT_name
>> +; CHECK-NOT: DW_AT_GNU_odr_signature
>>  ; CHECK: DW_TAG_member
>>  ; CHECK-NEXT: debug_str{{.*}}"a"
>> -
>> -; Check that we don't generate a hash for baz.
>> +; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8]
>> (0x685bcc220141e9d7)
>>  ; CHECK: DW_TAG_structure_type
>> -; CHECK-NEXT: debug_str{{.*}}"baz"
>> -; CHECK-NOT: DW_AT_GNU_odr_signature
>> +; CHECK-NEXT: debug_str{{.*}}"wombat"
>>
>>  %struct.bar = type { i8 }
>>  %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131120/3241b021/attachment.html>


More information about the llvm-commits mailing list