[llvm] r192018 - Debug Info: In DIBuilder, the derived-from field of a DW_TAG_pointer_type
Manman Ren
manman.ren at gmail.com
Tue Oct 8 12:10:55 PDT 2013
On Mon, Oct 7, 2013 at 2:43 PM, Eric Christopher <echristo at gmail.com> wrote:
> > + /// 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();
> > + }
>
> Please take this out of line.
>
Done.
>
> > 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());
>
> Please use the accessor I added.
>
Done
>
> > 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);
>
> Again.
>
Done
>
> > 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()));
> > +
>
> Again, and everywhere else, please make sure you get them all.
>
Done
>
> > + 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) {
>
> Since we're moving and changing this one, how about getBaseTypeSize?
>
Done
>
> Also we might want to just make this a method on DwarfDebug since it
> has the information to connect the various references.
>
We have a few static helper functions: isTypeSigned, getBaseTypeSize, and
isUnsignedDIType.
isTypeUnitScoped traces along the context chain while the above three
traces along the derived-from chain.
Should we make all four member functions then? DwarfDebug or CompileUnit?
I will rename isUnsignedDIType to isTypeUnsigned.
> > - bool SignedConstant = isTypeSigned(Ty, &SizeInBits);
> > + bool SignedConstant = isTypeSigned(DD, Ty, &SizeInBits);
>
> Same with isTypeSigned.
>
See above.
>
>
> > 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()));
>
> Please add a resolve function to DbgVariable so that the interface is
> the same here as well.
>
Done.
>
> This part of the change could have been done separately and would have
> made reviewing cleaner and easier.
>
> > +// 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();
> > +}
> > +
>
> This could have been broken out separately as well.
>
> Please also construct the small testcase that accurately tests the
> changes you made without relying the linking of two modules.
>
Incoming.
Manman
>
> Thanks.
>
> -eric
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131008/72698485/attachment.html>
More information about the llvm-commits
mailing list