[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