[llvm] r192018 - Debug Info: In DIBuilder, the derived-from field of a DW_TAG_pointer_type
Eric Christopher
echristo at gmail.com
Mon Oct 7 12:33:45 PDT 2013
On Mon, Oct 7, 2013 at 12:23 PM, Manman Ren <manman.ren at gmail.com> wrote:
>
>
>
>
> 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.
>
Both are fine, but the linker test case doesn't actually test just the
functionality in the patch.
-eric
> 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.git 8a3f9e46cb988d2c664395b21910091e3730ae82)
>>> (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.git 8a3f9e46cb988d2c664395b21910091e3730ae82)
>>> (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
>
>
More information about the llvm-commits
mailing list