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

Manman Ren manman.ren at gmail.com
Wed Nov 20 10:27:11 PST 2013


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.


>    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?


>    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?


> +  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.


>  }
>
>  /// 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?

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/57fe7723/attachment.html>


More information about the llvm-commits mailing list