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

Manman Ren manman.ren at gmail.com
Mon Oct 7 12:23:48 PDT 2013


On Fri, Oct 4, 2013 at 6:51 PM, Eric Christopher <echristo at gmail.com> wrote:

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

A simpler testing case can check that the backend can handle the case where
a derived-from field is a type identifier.
The added testing case can verify the same thing plus it can verify that we
can unique struct types containing a pointer type which points back to the
struct.

If the additional coverage is not needed, I can replace the added testing
cases with a single testing case.

Thanks,
Manman


>  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/20131007/b53ffcdc/attachment.html>


More information about the llvm-commits mailing list