[llvm] r192018 - Debug Info: In DIBuilder, the derived-from field of a DW_TAG_pointer_type

Eric Christopher echristo at gmail.com
Fri Oct 4 18:51:26 PDT 2013


Can you please write a simple test case that tests this functionality?
There seems to be no need to test it via a linked module. I'll review the
rest later.
On Oct 4, 2013 6:48 PM, "Manman Ren" <manman.ren at gmail.com> wrote:

> Author: mren
> Date: Fri Oct  4 20:43:03 2013
> New Revision: 192018
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192018&view=rev
> Log:
> Debug Info: In DIBuilder, the derived-from field of a DW_TAG_pointer_type
> is updated to use DITypeRef.
>
> Move isUnsignedDIType and getOriginalTypeSize from DebugInfo.h to be static
> helper functions in DwarfCompileUnit. We already have a static helper
> function
> "isTypeSigned" in DwarfCompileUnit, and a pointer to DwarfDebug is added to
> resolve the derived-from field. All three functions need to go across link
> for derived-from fields, so we need to get hold of a type identifier map.
>
> A pointer to DwarfDebug is also added to DbgVariable in order to resolve
> the
> derived-from field.
>
> Debug info verifier is updated to check a derived-from field is a TypeRef.
> Verifier will not go across link for derived-from fields, in debug info
> finder,
> we go across the link to add derived-from fields to types.
>
> Function getDICompositeType is only used by dragonegg and since dragonegg
> does
> not generate identifier for types, we use an empty map to resolve the
> derived-from field.
>
> When printing a derived-from field, we use DITypeRef::getName to either
> return
> the type identifier or getName of the DIType.
>
> A paired commit at clang is required due to changes to DIBuilder.
>
> Added:
>     llvm/trunk/test/Linker/Inputs/type-unique-simple2-a.ll
>     llvm/trunk/test/Linker/Inputs/type-unique-simple2-b.ll
>     llvm/trunk/test/Linker/type-unique-simple2.ll
> Modified:
>     llvm/trunk/include/llvm/DebugInfo.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>     llvm/trunk/lib/IR/DIBuilder.cpp
>     llvm/trunk/lib/IR/DebugInfo.cpp
>     llvm/trunk/test/Transforms/LICM/debug-value.ll
>
> Modified: llvm/trunk/include/llvm/DebugInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo.h?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo.h Fri Oct  4 20:43:03 2013
> @@ -22,6 +22,7 @@
>  #include "llvm/ADT/SmallPtrSet.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/StringRef.h"
> +#include "llvm/IR/Metadata.h"
>  #include "llvm/Support/Dwarf.h"
>
>  namespace llvm {
> @@ -204,6 +205,8 @@ public:
>    /// Gets the parent scope for this scope node or returns a
>    /// default constructed scope.
>    DIScopeRef getContext() const;
> +  /// If the scope node has a name, return that, else return an empty
> string.
> +  StringRef getName() const;
>    StringRef getFilename() const;
>    StringRef getDirectory() const;
>
> @@ -227,6 +230,16 @@ template <typename T> class DIRef {
>
>  public:
>    T resolve(const DITypeIdentifierMap &Map) const;
> +  StringRef getName() const {
> +    if (!Val)
> +      return StringRef();
> +
> +    if (const MDNode *MD = dyn_cast<MDNode>(Val))
> +      return T(MD).getName();
> +
> +    const MDString *MS = cast<MDString>(Val);
> +    return MS->getString();
> +  }
>    operator Value *() const { return const_cast<Value *>(Val); }
>  };
>
> @@ -300,9 +313,6 @@ public:
>    bool isStaticMember() const { return (getFlags() & FlagStaticMember) !=
> 0; }
>    bool isValid() const { return DbgNode && isType(); }
>
> -  /// isUnsignedDIType - Return true if type encoding is unsigned.
> -  bool isUnsignedDIType();
> -
>    /// replaceAllUsesWith - Replace all uses of debug info referenced by
>    /// this descriptor.
>    void replaceAllUsesWith(DIDescriptor &D);
> @@ -330,11 +340,7 @@ class DIDerivedType : public DIType {
>  public:
>    explicit DIDerivedType(const MDNode *N = 0) : DIType(N) {}
>
> -  DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
> -
> -  /// getOriginalTypeSize - If this type is derived from a base type then
> -  /// return base type size.
> -  uint64_t getOriginalTypeSize() const;
> +  DITypeRef getTypeDerivedFrom() const { return getFieldAs<DITypeRef>(9);
> }
>
>    /// getObjCProperty - Return property node, if this ivar is
>    /// associated with one.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Fri Oct  4
> 20:43:03 2013
> @@ -520,7 +520,7 @@ void CompileUnit::addBlockByrefAddress(c
>
>    if (Tag == dwarf::DW_TAG_pointer_type) {
>      DIDerivedType DTy = DIDerivedType(Ty);
> -    TmpTy = DTy.getTypeDerivedFrom();
> +    TmpTy = DD->resolve(DTy.getTypeDerivedFrom());
>      isPointer = true;
>    }
>
> @@ -587,9 +587,10 @@ void CompileUnit::addBlockByrefAddress(c
>  }
>
>  /// isTypeSigned - Return true if the type is signed.
> -static bool isTypeSigned(DIType Ty, int *SizeInBits) {
> +static bool isTypeSigned(DwarfDebug *DD, DIType Ty, int *SizeInBits) {
>    if (Ty.isDerivedType())
> -    return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(),
> SizeInBits);
> +    return isTypeSigned(DD,
> DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom()),
> +                        SizeInBits);
>    if (Ty.isBasicType())
>      if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed
>          || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) {
> @@ -599,6 +600,51 @@ static bool isTypeSigned(DIType Ty, int
>    return false;
>  }
>
> +/// Return true if type encoding is unsigned.
> +static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
> +  DIDerivedType DTy(Ty);
> +  if (DTy.isDerivedType())
> +    return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
> +
> +  DIBasicType BTy(Ty);
> +  if (BTy.isBasicType()) {
> +    unsigned Encoding = BTy.getEncoding();
> +    if (Encoding == dwarf::DW_ATE_unsigned ||
> +        Encoding == dwarf::DW_ATE_unsigned_char ||
> +        Encoding == dwarf::DW_ATE_boolean)
> +      return true;
> +  }
> +  return false;
> +}
> +
> +/// If this type is derived from a base type then return base type size.
> +static uint64_t getOriginalTypeSize(DwarfDebug *DD, DIDerivedType Ty) {
> +  unsigned Tag = Ty.getTag();
> +
> +  if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
> +      Tag != dwarf::DW_TAG_const_type && Tag !=
> dwarf::DW_TAG_volatile_type &&
> +      Tag != dwarf::DW_TAG_restrict_type)
> +    return Ty.getSizeInBits();
> +
> +  DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom());
> +
> +  // If this type is not derived from any type then take conservative
> approach.
> +  if (!BaseType.isValid())
> +    return Ty.getSizeInBits();
> +
> +  // If this is a derived type, go ahead and get the base type, unless
> it's a
> +  // reference then it's just the size of the field. Pointer types have
> no need
> +  // of this since they're a different type of qualification on the type.
> +  if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
> +      BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
> +    return Ty.getSizeInBits();
> +
> +  if (BaseType.isDerivedType())
> +    return getOriginalTypeSize(DD, DIDerivedType(BaseType));
> +
> +  return BaseType.getSizeInBits();
> +}
> +
>  /// addConstantValue - Add constant value entry in variable DIE.
>  void CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO,
>                                     DIType Ty) {
> @@ -607,7 +653,7 @@ void CompileUnit::addConstantValue(DIE *
>    // udata/sdata over dataN as suggested by the DWARF spec)
>    assert(MO.isImm() && "Invalid machine operand!");
>    int SizeInBits = -1;
> -  bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
> +  bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
>    uint16_t Form;
>
>    // If we're a signed constant definitely use sdata.
> @@ -923,7 +969,7 @@ void CompileUnit::constructTypeDIE(DIE &
>    uint16_t Tag = Buffer.getTag();
>
>    // Map to main type, void will not have a type.
> -  DIType FromTy = DTy.getTypeDerivedFrom();
> +  DIType FromTy = DD->resolve(DTy.getTypeDerivedFrom());
>    if (FromTy)
>      addType(&Buffer, FromTy);
>
> @@ -998,7 +1044,7 @@ void CompileUnit::constructTypeDIE(DIE &
>          Buffer.addChild(ElemDie);
>        }
>      }
> -    DIType DTy = CTy.getTypeDerivedFrom();
> +    DIType DTy = DD->resolve(CTy.getTypeDerivedFrom());
>      if (DTy) {
>        addType(&Buffer, DTy);
>        addFlag(&Buffer, dwarf::DW_AT_enum_class);
> @@ -1064,7 +1110,8 @@ void CompileUnit::constructTypeDIE(DIE &
>          DIDerivedType DDTy(Element);
>          if (DDTy.getTag() == dwarf::DW_TAG_friend) {
>            ElemDie = new DIE(dwarf::DW_TAG_friend);
> -          addType(ElemDie, DDTy.getTypeDerivedFrom(),
> dwarf::DW_AT_friend);
> +          addType(ElemDie, DD->resolve(DDTy.getTypeDerivedFrom()),
> +                  dwarf::DW_AT_friend);
>          } else if (DDTy.isStaticMember())
>            ElemDie = createStaticMemberDIE(DDTy);
>          else
> @@ -1205,7 +1252,7 @@ CompileUnit::getOrCreateTemplateValuePar
>      addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
>    if (Value *Val = VP.getValue()) {
>      if (ConstantInt *CI = dyn_cast<ConstantInt>(Val))
> -      addConstantValue(ParamDIE, CI, VP.getType().isUnsignedDIType());
> +      addConstantValue(ParamDIE, CI, isUnsignedDIType(DD, VP.getType()));
>      else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) {
>        // For declaration non-type template parameters (such as global
> values and
>        // functions)
> @@ -1499,7 +1546,7 @@ void CompileUnit::createGlobalVariableDI
>      // emitting AT_const_value multiple times, we only add AT_const_value
> when
>      // it is not a static member.
>      if (!IsStaticMember)
> -      addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType());
> +      addConstantValue(VariableDIE, CI, isUnsignedDIType(DD, GTy));
>    } else if (const ConstantExpr *CE =
> getMergedGlobalExpr(N->getOperand(11))) {
>      addToAccelTable = true;
>      // GV is a merged global.
> @@ -1559,7 +1606,7 @@ void CompileUnit::constructArrayTypeDIE(
>      addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
>
>    // Emit the element type.
> -  addType(&Buffer, CTy->getTypeDerivedFrom());
> +  addType(&Buffer, DD->resolve(CTy->getTypeDerivedFrom()));
>
>    // Get an anonymous type for index type.
>    // FIXME: This type should be passed down from the front end
> @@ -1663,7 +1710,7 @@ DIE *CompileUnit::constructVariableDIE(D
>        addConstantFPValue(VariableDie, DVInsn->getOperand(0));
>      else if (DVInsn->getOperand(0).isCImm())
>        addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(),
> -                       DV->getType().isUnsignedDIType());
> +                       isUnsignedDIType(DD, DV->getType()));
>
>      DV->setDIE(VariableDie);
>      return VariableDie;
> @@ -1691,7 +1738,7 @@ DIE *CompileUnit::createMemberDIE(DIDeri
>    if (!Name.empty())
>      addString(MemberDie, dwarf::DW_AT_name, Name);
>
> -  addType(MemberDie, DT.getTypeDerivedFrom());
> +  addType(MemberDie, DD->resolve(DT.getTypeDerivedFrom()));
>
>    addSourceLine(MemberDie, DT);
>
> @@ -1699,11 +1746,12 @@ DIE *CompileUnit::createMemberDIE(DIDeri
>    addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1,
> dwarf::DW_OP_plus_uconst);
>
>    uint64_t Size = DT.getSizeInBits();
> -  uint64_t FieldSize = DT.getOriginalTypeSize();
> +  uint64_t FieldSize = getOriginalTypeSize(DD, DT);
>
>    if (Size != FieldSize) {
>      // Handle bitfield.
> -    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
> DT.getOriginalTypeSize()>>3);
> +    addUInt(MemberDie, dwarf::DW_AT_byte_size, 0,
> +            getOriginalTypeSize(DD, DT)>>3);
>      addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits());
>
>      uint64_t Offset = DT.getOffsetInBits();
> @@ -1778,7 +1826,7 @@ DIE *CompileUnit::createStaticMemberDIE(
>      return NULL;
>
>    DIE *StaticMemberDIE = new DIE(DT.getTag());
> -  DIType Ty = DT.getTypeDerivedFrom();
> +  DIType Ty = DD->resolve(DT.getTypeDerivedFrom());
>
>    addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName());
>    addType(StaticMemberDIE, Ty);
> @@ -1799,7 +1847,7 @@ DIE *CompileUnit::createStaticMemberDIE(
>              dwarf::DW_ACCESS_public);
>
>    if (const ConstantInt *CI =
> dyn_cast_or_null<ConstantInt>(DT.getConstant()))
> -    addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType());
> +    addConstantValue(StaticMemberDIE, CI, isUnsignedDIType(DD, Ty));
>    if (const ConstantFP *CFP =
> dyn_cast_or_null<ConstantFP>(DT.getConstant()))
>      addConstantFPValue(StaticMemberDIE, CFP);
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Fri Oct  4 20:43:03
> 2013
> @@ -149,13 +149,13 @@ DIType DbgVariable::getType() const {
>      uint16_t tag = Ty.getTag();
>
>      if (tag == dwarf::DW_TAG_pointer_type)
> -      subType = DIDerivedType(Ty).getTypeDerivedFrom();
> +      subType = DD->resolve(DIDerivedType(Ty).getTypeDerivedFrom());
>
>      DIArray Elements = DICompositeType(subType).getTypeArray();
>      for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
>        DIDerivedType DT = DIDerivedType(Elements.getElement(i));
>        if (getName() == DT.getName())
> -        return (DT.getTypeDerivedFrom());
> +        return (DD->resolve(DT.getTypeDerivedFrom()));
>      }
>    }
>    return Ty;
> @@ -992,7 +992,7 @@ void DwarfDebug::collectDeadVariables()
>          for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve;
> ++vi) {
>            DIVariable DV(Variables.getElement(vi));
>            if (!DV.isVariable()) continue;
> -          DbgVariable NewVar(DV, NULL);
> +          DbgVariable NewVar(DV, NULL, this);
>            if (DIE *VariableDIE =
>                SPCU->constructVariableDIE(&NewVar,
> Scope->isAbstractScope()))
>              ScopeDIE->addChild(VariableDIE);
> @@ -1251,7 +1251,7 @@ DbgVariable *DwarfDebug::findAbstractVar
>    if (!Scope)
>      return NULL;
>
> -  AbsDbgVariable = new DbgVariable(Var, NULL);
> +  AbsDbgVariable = new DbgVariable(Var, NULL, this);
>    addScopeVariable(Scope, AbsDbgVariable);
>    AbstractVariables[Var] = AbsDbgVariable;
>    return AbsDbgVariable;
> @@ -1300,7 +1300,7 @@ DwarfDebug::collectVariableInfoFromMMITa
>        continue;
>
>      DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
> -    DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable);
> +    DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
>      RegVar->setFrameIndex(VP.first);
>      if (!addCurrentFnArgument(MF, RegVar, Scope))
>        addScopeVariable(Scope, RegVar);
> @@ -1385,7 +1385,7 @@ DwarfDebug::collectVariableInfo(const Ma
>      Processed.insert(DV);
>      assert(MInsn->isDebugValue() && "History must begin with debug
> value");
>      DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
> -    DbgVariable *RegVar = new DbgVariable(DV, AbsVar);
> +    DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
>      if (!addCurrentFnArgument(MF, RegVar, Scope))
>        addScopeVariable(Scope, RegVar);
>      if (AbsVar)
> @@ -1448,7 +1448,7 @@ DwarfDebug::collectVariableInfo(const Ma
>      if (!DV || !DV.isVariable() || !Processed.insert(DV))
>        continue;
>      if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext()))
> -      addScopeVariable(Scope, new DbgVariable(DV, NULL));
> +      addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
>    }
>  }
>
> @@ -1844,7 +1844,7 @@ void DwarfDebug::endFunction(const Machi
>          if (AbstractVariables.lookup(CleanDV))
>            continue;
>          if (LexicalScope *Scope =
> LScopes.findAbstractScope(DV.getContext()))
> -          addScopeVariable(Scope, new DbgVariable(DV, NULL));
> +          addScopeVariable(Scope, new DbgVariable(DV, NULL, this));
>        }
>      }
>      if (ProcessedSPNodes.count(AScope->getScopeNode()) == 0)
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Fri Oct  4 20:43:03 2013
> @@ -150,11 +150,12 @@ class DbgVariable {
>    DbgVariable *AbsVar;               // Corresponding Abstract variable,
> if any.
>    const MachineInstr *MInsn;         // DBG_VALUE instruction of the
> variable.
>    int FrameIndex;
> +  DwarfDebug *DD;
>  public:
>    // AbsVar may be NULL.
> -  DbgVariable(DIVariable V, DbgVariable *AV)
> +  DbgVariable(DIVariable V, DbgVariable *AV, DwarfDebug *DD)
>      : Var(V), TheDIE(0), DotDebugLocOffset(~0U), AbsVar(AV), MInsn(0),
> -      FrameIndex(~0) {}
> +      FrameIndex(~0), DD(DD) {}
>
>    // Accessors.
>    DIVariable getVariable()           const { return Var; }
>
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Fri Oct  4 20:43:03 2013
> @@ -303,7 +303,7 @@ DIBuilder::createPointerType(DIType Poin
>      ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
>      ConstantInt::get(Type::getInt64Ty(VMContext), 0), // Offset
>      ConstantInt::get(Type::getInt32Ty(VMContext), 0), // Flags
> -    PointeeTy
> +    PointeeTy.getRef()
>    };
>    return DIDerivedType(MDNode::get(VMContext, Elts));
>  }
>
> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
> +++ llvm/trunk/lib/IR/DebugInfo.cpp Fri Oct  4 20:43:03 2013
> @@ -368,23 +368,6 @@ void DIType::replaceAllUsesWith(MDNode *
>    }
>  }
>
> -/// isUnsignedDIType - Return true if type encoding is unsigned.
> -bool DIType::isUnsignedDIType() {
> -  DIDerivedType DTy(DbgNode);
> -  if (DTy.Verify())
> -    return DTy.getTypeDerivedFrom().isUnsignedDIType();
> -
> -  DIBasicType BTy(DbgNode);
> -  if (BTy.Verify()) {
> -    unsigned Encoding = BTy.getEncoding();
> -    if (Encoding == dwarf::DW_ATE_unsigned ||
> -        Encoding == dwarf::DW_ATE_unsigned_char ||
> -        Encoding == dwarf::DW_ATE_boolean)
> -      return true;
> -  }
> -  return false;
> -}
> -
>  /// Verify - Verify that a compile unit is well formed.
>  bool DICompileUnit::Verify() const {
>    if (!isCompileUnit())
> @@ -493,8 +476,8 @@ bool DIBasicType::Verify() const {
>
>  /// Verify - Verify that a derived type descriptor is well formed.
>  bool DIDerivedType::Verify() const {
> -  // Make sure DerivedFrom @ field 9 is MDNode.
> -  if (!fieldIsMDNode(DbgNode, 9))
> +  // Make sure DerivedFrom @ field 9 is TypeRef.
> +  if (!fieldIsTypeRef(DbgNode, 9))
>      return false;
>    if (getTag() == dwarf::DW_TAG_ptr_to_member_type)
>      // Make sure ClassType @ field 10 is a TypeRef.
> @@ -510,8 +493,8 @@ bool DICompositeType::Verify() const {
>    if (!isCompositeType())
>      return false;
>
> -  // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are
> MDNodes.
> -  if (!fieldIsMDNode(DbgNode, 9))
> +  // Make sure DerivedFrom @ field 9 and ContainingType @ field 12 are
> TypeRef.
> +  if (!fieldIsTypeRef(DbgNode, 9))
>      return false;
>    if (!fieldIsTypeRef(DbgNode, 12))
>      return false;
> @@ -520,12 +503,6 @@ bool DICompositeType::Verify() const {
>    if (!fieldIsMDString(DbgNode, 14))
>      return false;
>
> -  // If this is an array type verify that we have a DIType in the derived
> type
> -  // field as that's the type of our element.
> -  if (getTag() == dwarf::DW_TAG_array_type)
> -    if (!DIType(getTypeDerivedFrom()))
> -      return false;
> -
>    return DbgNode->getNumOperands() == 15;
>  }
>
> @@ -638,35 +615,6 @@ bool DIImportedEntity::Verify() const {
>           (DbgNode->getNumOperands() == 4 || DbgNode->getNumOperands() ==
> 5);
>  }
>
> -/// getOriginalTypeSize - If this type is derived from a base type then
> -/// return base type size.
> -uint64_t DIDerivedType::getOriginalTypeSize() const {
> -  uint16_t Tag = getTag();
> -
> -  if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef &&
> -      Tag != dwarf::DW_TAG_const_type && Tag !=
> dwarf::DW_TAG_volatile_type &&
> -      Tag != dwarf::DW_TAG_restrict_type)
> -    return getSizeInBits();
> -
> -  DIType BaseType = getTypeDerivedFrom();
> -
> -  // If this type is not derived from any type then take conservative
> approach.
> -  if (!BaseType.isValid())
> -    return getSizeInBits();
> -
> -  // If this is a derived type, go ahead and get the base type, unless
> it's a
> -  // reference then it's just the size of the field. Pointer types have
> no need
> -  // of this since they're a different type of qualification on the type.
> -  if (BaseType.getTag() == dwarf::DW_TAG_reference_type ||
> -      BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type)
> -    return getSizeInBits();
> -
> -  if (BaseType.isDerivedType())
> -    return DIDerivedType(BaseType).getOriginalTypeSize();
> -
> -  return BaseType.getSizeInBits();
> -}
> -
>  /// getObjCProperty - Return property node, if this ivar is associated
> with one.
>  MDNode *DIDerivedType::getObjCProperty() const {
>    return getNodeField(DbgNode, 10);
> @@ -808,6 +756,19 @@ DIScopeRef DIScope::getContext() const {
>    return DIScopeRef(NULL);
>  }
>
> +// If the scope node has a name, return that, else return an empty string.
> +StringRef DIScope::getName() const {
> +  if (isType())
> +    return DIType(DbgNode).getName();
> +  if (isSubprogram())
> +    return DISubprogram(DbgNode).getName();
> +  if (isNameSpace())
> +    return DINameSpace(DbgNode).getName();
> +  assert((isLexicalBlock() || isLexicalBlockFile() || isFile() ||
> +          isCompileUnit()) && "Unhandled type of scope.");
> +  return StringRef();
> +}
> +
>  StringRef DIScope::getFilename() const {
>    if (!DbgNode)
>      return StringRef();
> @@ -942,8 +903,14 @@ DICompositeType llvm::getDICompositeType
>    if (T.isCompositeType())
>      return DICompositeType(T);
>
> -  if (T.isDerivedType())
> -    return getDICompositeType(DIDerivedType(T).getTypeDerivedFrom());
> +  if (T.isDerivedType()) {
> +    // This function is currently used by dragonegg and dragonegg does
> +    // not generate identifier for types, so using an empty map to resolve
> +    // DerivedFrom should be fine.
> +    DITypeIdentifierMap EmptyMap;
> +    return getDICompositeType(DIDerivedType(T).getTypeDerivedFrom()
> +                                              .resolve(EmptyMap));
> +  }
>
>    return DICompositeType();
>  }
> @@ -1044,7 +1011,7 @@ void DebugInfoFinder::processType(DIType
>    processScope(DT.getContext().resolve(TypeIdentifierMap));
>    if (DT.isCompositeType()) {
>      DICompositeType DCT(DT);
> -    processType(DCT.getTypeDerivedFrom());
> +    processType(DCT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
>      DIArray DA = DCT.getTypeArray();
>      for (unsigned i = 0, e = DA.getNumElements(); i != e; ++i) {
>        DIDescriptor D = DA.getElement(i);
> @@ -1055,7 +1022,7 @@ void DebugInfoFinder::processType(DIType
>      }
>    } else if (DT.isDerivedType()) {
>      DIDerivedType DDT(DT);
> -    processType(DDT.getTypeDerivedFrom());
> +    processType(DDT.getTypeDerivedFrom().resolve(TypeIdentifierMap));
>    }
>  }
>
>
> Added: llvm/trunk/test/Linker/Inputs/type-unique-simple2-a.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/type-unique-simple2-a.ll?rev=192018&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/Inputs/type-unique-simple2-a.ll (added)
> +++ llvm/trunk/test/Linker/Inputs/type-unique-simple2-a.ll Fri Oct  4
> 20:43:03 2013
> @@ -0,0 +1,83 @@
> +; CHECK: 0x[[INT:.*]]: DW_TAG_base_type
> +; CHECK-NEXT: DW_AT_name {{.*}} = "int"
> +; CHECK-NOT: DW_TAG_base_type
> +; CHECK: 0x[[BASE:.*]]: DW_TAG_structure_type
> +; CHECK-NEXT: DW_AT_name {{.*}} = "Base"
> +; CHECK-NOT: DW_TAG_structure_type
> +; CHECK: DW_TAG_formal_parameter
> +; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[INT]])
> +; CHECK: DW_TAG_variable
> +; CHECK: DW_AT_type [DW_FORM_ref_addr] {{.*}}[[BASE]])
> +
> +; LINK: DW_TAG_structure_type
> +; LINK-NOT: DW_TAG_structure_type
> +
> +; Content of header files:
> +; struct Base {
> +;   int a;
> +;   Base *b;
> +; };
> +; Content of foo.cpp:
> +;
> +; #include "a.hpp"
> +; void f(int a) {
> +;   Base t;
> +; }
> +; Content of bar.cpp:
> +;
> +; #include "a.hpp"
> +; void f(int);
> +; void g(int a) {
> +;   Base t;
> +; }
> +; int main() {
> +;   f(0);
> +;   g(1);
> +;   return 0;
> +; }
> +; ModuleID = 'foo.cpp'
> +
> +%struct.Base = type { i32, %struct.Base* }
> +
> +; Function Attrs: nounwind ssp uwtable
> +define void @_Z1fi(i32 %a) #0 {
> +entry:
> +  %a.addr = alloca i32, align 4
> +  %t = alloca %struct.Base, align 8
> +  store i32 %a, i32* %a.addr, align 4
> +  call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !17),
> !dbg !18
> +  call void @llvm.dbg.declare(metadata !{%struct.Base* %t}, metadata
> !19), !dbg !20
> +  ret void, !dbg !21
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata) #1
> +
> +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone }
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!16}
> +
> +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version
> 3.4 (http://llvm.org/git/clang.git8a3f9e46cb988d2c664395b21910091e3730ae82) (
> http://llvm.org/git/llvm.git 4699e9549358bc77824a59114548eecc3f7c523c)",
> i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !11,
> metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [foo.cpp]
> [DW_LANG_C_plus_plus]
> +!1 = metadata !{metadata !"foo.cpp", metadata !"."}
> +!2 = metadata !{i32 0}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{i32 786451, metadata !5, null, metadata !"Base", i32 1,
> i64 128, i64 64, i32 0, i32 0, null, metadata !6, i32 0, null, null,
> metadata !"_ZTS4Base"} ; [ DW_TAG_structure_type ] [Base] [line 1, size
> 128, align 64, offset 0] [def] [from ]
> +!5 = metadata !{metadata !"./a.hpp", metadata !"."}
> +!6 = metadata !{metadata !7, metadata !9}
> +!7 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base", metadata
> !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ]
> [a] [line 2, size 32, align 32, offset 0] [from int]
> +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
> align 32, offset 0, enc DW_ATE_signed]
> +!9 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base", metadata
> !"b", i32 3, i64 64, i64 64, i64 64, i32 0, metadata !10} ; [ DW_TAG_member
> ] [b] [line 3, size 64, align 64, offset 64] [from ]
> +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64
> 64, i64 0, i32 0, metadata !"_ZTS4Base"}
> +!11 = metadata !{metadata !12}
> +!12 = metadata !{i32 786478, metadata !1, metadata !13, metadata !"f",
> metadata !"f", metadata !"_Z1fi", i32 3, metadata !14, i1 false, i1 true,
> i32 0, i32 0, null, i32 256, i1 false, void (i32)* @_Z1fi, null, null,
> metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [f]
> +!13 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type ]
> [foo.cpp]
> +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64
> 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!15 = metadata !{null, metadata !8}
> +!16 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
> +!17 = metadata !{i32 786689, metadata !12, metadata !"a", metadata !13,
> i32 16777219, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a]
> [line 3]
> +!18 = metadata !{i32 3, i32 0, metadata !12, null}
> +!19 = metadata !{i32 786688, metadata !12, metadata !"t", metadata !13,
> i32 4, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [t] [line 4]
> +!20 = metadata !{i32 4, i32 0, metadata !12, null}
> +!21 = metadata !{i32 5, i32 0, metadata !12, null}
>
> Added: llvm/trunk/test/Linker/Inputs/type-unique-simple2-b.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/type-unique-simple2-b.ll?rev=192018&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/Inputs/type-unique-simple2-b.ll (added)
> +++ llvm/trunk/test/Linker/Inputs/type-unique-simple2-b.ll Fri Oct  4
> 20:43:03 2013
> @@ -0,0 +1,66 @@
> +; ModuleID = 'bar.cpp'
> +
> +%struct.Base = type { i32, %struct.Base* }
> +
> +; Function Attrs: nounwind ssp uwtable
> +define void @_Z1gi(i32 %a) #0 {
> +entry:
> +  %a.addr = alloca i32, align 4
> +  %t = alloca %struct.Base, align 8
> +  store i32 %a, i32* %a.addr, align 4
> +  call void @llvm.dbg.declare(metadata !{i32* %a.addr}, metadata !20),
> !dbg !21
> +  call void @llvm.dbg.declare(metadata !{%struct.Base* %t}, metadata
> !22), !dbg !23
> +  ret void, !dbg !24
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata) #1
> +
> +; Function Attrs: ssp uwtable
> +define i32 @main() #2 {
> +entry:
> +  %retval = alloca i32, align 4
> +  store i32 0, i32* %retval
> +  call void @_Z1fi(i32 0), !dbg !25
> +  call void @_Z1gi(i32 1), !dbg !26
> +  ret i32 0, !dbg !27
> +}
> +
> +declare void @_Z1fi(i32) #3
> +
> +attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone }
> +attributes #2 = { ssp uwtable "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> +attributes #3 = { "less-precise-fpmad"="false"
> "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"
> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
> "stack-protector-buffer-size"="8" "unsafe-fp-math"="false"
> "use-soft-float"="false" }
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!19}
> +
> +!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version
> 3.4 (http://llvm.org/git/clang.git8a3f9e46cb988d2c664395b21910091e3730ae82) (
> http://llvm.org/git/llvm.git 4699e9549358bc77824a59114548eecc3f7c523c)",
> i1 false, metadata !"", i32 0, metadata !2, metadata !3, metadata !11,
> metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [bar.cpp]
> [DW_LANG_C_plus_plus]
> +!1 = metadata !{metadata !"bar.cpp", metadata !"."}
> +!2 = metadata !{i32 0}
> +!3 = metadata !{metadata !4}
> +!4 = metadata !{i32 786451, metadata !5, null, metadata !"Base", i32 1,
> i64 128, i64 64, i32 0, i32 0, null, metadata !6, i32 0, null, null,
> metadata !"_ZTS4Base"} ; [ DW_TAG_structure_type ] [Base] [line 1, size
> 128, align 64, offset 0] [def] [from ]
> +!5 = metadata !{metadata !"./a.hpp", metadata !"."}
> +!6 = metadata !{metadata !7, metadata !9}
> +!7 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base", metadata
> !"a", i32 2, i64 32, i64 32, i64 0, i32 0, metadata !8} ; [ DW_TAG_member ]
> [a] [line 2, size 32, align 32, offset 0] [from int]
> +!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32,
> i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32,
> align 32, offset 0, enc DW_ATE_signed]
> +!9 = metadata !{i32 786445, metadata !5, metadata !"_ZTS4Base", metadata
> !"b", i32 3, i64 64, i64 64, i64 64, i32 0, metadata !10} ; [ DW_TAG_member
> ] [b] [line 3, size 64, align 64, offset 64] [from ]
> +!10 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64
> 64, i64 0, i32 0, metadata !"_ZTS4Base"}
> +!11 = metadata !{metadata !12, metadata !16}
> +!12 = metadata !{i32 786478, metadata !1, metadata !13, metadata !"g",
> metadata !"g", metadata !"_Z1gi", i32 4, metadata !14, i1 false, i1 true,
> i32 0, i32 0, null, i32 256, i1 false, void (i32)* @_Z1gi, null, null,
> metadata !2, i32 4} ; [ DW_TAG_subprogram ] [line 4] [def] [g]
> +!13 = metadata !{i32 786473, metadata !1}         ; [ DW_TAG_file_type ]
> [bar.cpp]
> +!14 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64
> 0, i64 0, i32 0, null, metadata !15, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!15 = metadata !{null, metadata !8}
> +!16 = metadata !{i32 786478, metadata !1, metadata !13, metadata !"main",
> metadata !"main", metadata !"", i32 7, metadata !17, i1 false, i1 true, i32
> 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2,
> i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [main]
> +!17 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64
> 0, i64 0, i32 0, null, metadata !18, i32 0, null, null, null} ; [
> DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
> +!18 = metadata !{metadata !8}
> +!19 = metadata !{i32 2, metadata !"Dwarf Version", i32 2}
> +!20 = metadata !{i32 786689, metadata !12, metadata !"a", metadata !13,
> i32 16777220, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [a]
> [line 4]
> +!21 = metadata !{i32 4, i32 0, metadata !12, null}
> +!22 = metadata !{i32 786688, metadata !12, metadata !"t", metadata !13,
> i32 5, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [t] [line 5]
> +!23 = metadata !{i32 5, i32 0, metadata !12, null}
> +!24 = metadata !{i32 6, i32 0, metadata !12, null}
> +!25 = metadata !{i32 8, i32 0, metadata !16, null} ; [
> DW_TAG_imported_declaration ]
> +!26 = metadata !{i32 9, i32 0, metadata !16, null}
> +!27 = metadata !{i32 10, i32 0, metadata !16, null}
>
> Added: llvm/trunk/test/Linker/type-unique-simple2.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/type-unique-simple2.ll?rev=192018&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/type-unique-simple2.ll (added)
> +++ llvm/trunk/test/Linker/type-unique-simple2.ll Fri Oct  4 20:43:03 2013
> @@ -0,0 +1,4 @@
> +; REQUIRES: object-emission
> +
> +; RUN: llvm-link %S/Inputs/type-unique-simple2-a.ll
> %S/Inputs/type-unique-simple2-b.ll -S -o %t
> +; RUN: cat %t | FileCheck %S/Inputs/type-unique-simple2-a.ll
> -check-prefix=LINK
>
> Modified: llvm/trunk/test/Transforms/LICM/debug-value.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/debug-value.ll?rev=192018&r1=192017&r2=192018&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/LICM/debug-value.ll (original)
> +++ llvm/trunk/test/Transforms/LICM/debug-value.ll Fri Oct  4 20:43:03 2013
> @@ -38,7 +38,7 @@ declare void @llvm.dbg.value(metadata, i
>  !0 = metadata !{i32 589870, metadata !25, metadata !1, metadata
> !"idamax", metadata !"idamax", metadata !"", i32 112, metadata !3, i1
> false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, null, null, null,
> null, i32 0} ; [ DW_TAG_subprogram ]
>  !1 = metadata !{i32 589865, metadata !25} ; [ DW_TAG_file_type ]
>  !2 = metadata !{i32 589841, metadata !25, i32 12, metadata !"clang
> version 2.9 (trunk 127169)", i1 true, metadata !"", i32 0, metadata !8,
> metadata !8, metadata !8, null, null, metadata !""} ; [ DW_TAG_compile_unit
> ]
> -!3 = metadata !{i32 589845, metadata !25, metadata !1, metadata !"", i32
> 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [
> DW_TAG_subroutine_type ]
> +!3 = metadata !{i32 589845, metadata !25, metadata !1, metadata !"", i32
> 0, i64 0, i64 0, i32 0, i32 0, null, metadata !4, i32 0, i32 0} ; [
> DW_TAG_subroutine_type ]
>  !4 = metadata !{metadata !5}
>  !5 = metadata !{i32 589860, null, metadata !2, metadata !"int", i32 0,
> i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
>  !6 = metadata !{i32 589870, metadata !25, metadata !1, metadata !"dscal",
> metadata !"dscal", metadata !"", i32 206, metadata !7, i1 false, i1 true,
> i32 0, i32 0, i32 0, i32 256, i1 false, null, null, null, null, i32 0} ; [
> DW_TAG_subprogram ]
>
>
> _______________________________________________
> 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/20131004/98de9822/attachment.html>


More information about the llvm-commits mailing list