[llvm] r214111 - [Debug Info] replace DIUnspecifiedParameter with DITrivialType.

Eric Christopher echristo at gmail.com
Mon Jul 28 16:08:47 PDT 2014


On Mon, Jul 28, 2014 at 1:01 PM, Manman Ren <manman.ren at gmail.com> wrote:
>
>
>
> On Mon, Jul 28, 2014 at 12:40 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> On Mon, Jul 28, 2014 at 11:52 AM, Manman Ren <manman.ren at gmail.com> wrote:
>> > Author: mren
>> > Date: Mon Jul 28 13:52:30 2014
>> > New Revision: 214111
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=214111&view=rev
>> > Log:
>> > [Debug Info] replace DIUnspecifiedParameter with DITrivialType.
>> >
>> > This is the first of a series of patches to handle type uniqueing of the
>> > type array for a subroutine type.
>> >
>> > This commit makes sure unspecified_parameter is a DIType to enable
>> > converting
>> > the type array for a subroutine type to an array of DITypes.
>>
>> Can you remind me (& it'll be helpful to have it in this thread for
>> later reference) why unspecified type couldn't be just a plain DIType
>> (or DIBasicType, etc) and needed it's own derived class?
>
>
> Yes, it is mainly for size reasons. But you are right, we will only have one
> unspecified_type and one unspecified_parameter for each module.
> The other reason is for clarity so we know these two are trivial types
> without size, offset etc.
>
> I am okay with removing DITrivialType if it is a burden to have one more
> class in our DIType hierarchy.
>

Does seem to be unnecessary...

-eric

> Thanks,
> Manman
>
>>
>>
>> I'm guessing it's for size reasons, though I don't think it's too
>> important to make unspecified_type particularly compact - we'll only
>> ever need one of them anyway, so we just pay the cost once per module.
>> We could still have the same assertions in DIType for usability,
>> though (but they're probably not necessary either - many of DIType's
>> members aren't valid/meaningful for various types).
>>
>> >
>> > This commit should have no functionality change. With this commit, we
>> > may
>> > change unspecified type to be a DITrivialType instead of a DIType.
>> >
>> > Modified:
>> >     llvm/trunk/include/llvm/IR/DIBuilder.h
>> >     llvm/trunk/include/llvm/IR/DebugInfo.h
>> >     llvm/trunk/lib/IR/DIBuilder.cpp
>> >     llvm/trunk/lib/IR/DebugInfo.cpp
>> >
>> > Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=214111&r1=214110&r2=214111&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
>> > +++ llvm/trunk/include/llvm/IR/DIBuilder.h Mon Jul 28 13:52:30 2014
>> > @@ -463,9 +463,9 @@ namespace llvm {
>> >      /// through debug info anchors.
>> >      void retainType(DIType T);
>> >
>> > -    /// createUnspecifiedParameter - Create unspecified type descriptor
>> > +    /// createUnspecifiedParameter - Create unspecified parameter type
>> >      /// for a subroutine type.
>> > -    DIDescriptor createUnspecifiedParameter();
>> > +    DITrivialType createUnspecifiedParameter();
>> >
>> >      /// getOrCreateArray - Get a DIArray, create one if required.
>> >      DIArray getOrCreateArray(ArrayRef<Value *> Elements);
>> >
>> > Modified: llvm/trunk/include/llvm/IR/DebugInfo.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=214111&r1=214110&r2=214111&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/IR/DebugInfo.h (original)
>> > +++ llvm/trunk/include/llvm/IR/DebugInfo.h Mon Jul 28 13:52:30 2014
>> > @@ -128,6 +128,7 @@ public:
>> >    bool isDerivedType() const;
>> >    bool isCompositeType() const;
>> >    bool isBasicType() const;
>> > +  bool isTrivialType() const;
>> >    bool isVariable() const;
>> >    bool isSubprogram() const;
>> >    bool isGlobalVariable() const;
>> > @@ -302,15 +303,36 @@ public:
>> >    /// Verify - Verify that a type descriptor is well formed.
>> >    bool Verify() const;
>> >
>> > -  DIScopeRef getContext() const { return getFieldAs<DIScopeRef>(2); }
>> > -  StringRef getName() const { return getStringField(3); }
>> > -  unsigned getLineNumber() const { return getUnsignedField(4); }
>> > -  uint64_t getSizeInBits() const { return getUInt64Field(5); }
>> > -  uint64_t getAlignInBits() const { return getUInt64Field(6); }
>> > +  DIScopeRef getContext() const {
>> > +    assert(!isTrivialType() && "no context for DITrivialType");
>> > +    return getFieldAs<DIScopeRef>(2);
>> > +  }
>> > +  StringRef getName() const {
>> > +    assert(!isTrivialType() && "no name for DITrivialType");
>> > +    return getStringField(3);
>> > +  }
>> > +  unsigned getLineNumber() const {
>> > +    assert(!isTrivialType() && "no line number for DITrivialType");
>> > +    return getUnsignedField(4);
>> > +  }
>> > +  uint64_t getSizeInBits() const {
>> > +    assert(!isTrivialType() && "no SizeInBits for DITrivialType");
>> > +    return getUInt64Field(5);
>> > +  }
>> > +  uint64_t getAlignInBits() const {
>> > +    assert(!isTrivialType() && "no AlignInBits for DITrivialType");
>> > +    return getUInt64Field(6);
>> > +  }
>> >    // FIXME: Offset is only used for DW_TAG_member nodes.  Making every
>> > type
>> >    // carry this is just plain insane.
>> > -  uint64_t getOffsetInBits() const { return getUInt64Field(7); }
>> > -  unsigned getFlags() const { return getUnsignedField(8); }
>> > +  uint64_t getOffsetInBits() const {
>> > +    assert(!isTrivialType() && "no OffsetInBits for DITrivialType");
>> > +    return getUInt64Field(7);
>> > +  }
>> > +  unsigned getFlags() const {
>> > +    assert(!isTrivialType() && "no flag for DITrivialType");
>> > +    return getUnsignedField(8);
>> > +  }
>> >    bool isPrivate() const { return (getFlags() & FlagPrivate) != 0; }
>> >    bool isProtected() const { return (getFlags() & FlagProtected) != 0;
>> > }
>> >    bool isForwardDecl() const { return (getFlags() & FlagFwdDecl) != 0;
>> > }
>> > @@ -343,6 +365,12 @@ public:
>> >    void replaceAllUsesWith(MDNode *D);
>> >  };
>> >
>> > +class DITrivialType : public DIType {
>> > +public:
>> > +  explicit DITrivialType(const MDNode *N = nullptr) : DIType(N) {}
>> > +  bool Verify() const;
>> > +};
>> > +
>> >  /// DIBasicType - A basic type, like 'int' or 'float'.
>> >  class DIBasicType : public DIType {
>> >  public:
>> > @@ -571,14 +599,6 @@ public:
>> >    bool Verify() const;
>> >  };
>> >
>> > -/// DIUnspecifiedParameter - This is a wrapper for unspecified
>> > parameters.
>> > -class DIUnspecifiedParameter : public DIDescriptor {
>> > -public:
>> > -  explicit DIUnspecifiedParameter(const MDNode *N = nullptr)
>> > -    : DIDescriptor(N) {}
>> > -  bool Verify() const;
>> > -};
>> > -
>> >  /// DITemplateTypeParameter - This is a wrapper for template type
>> > parameter.
>> >  class DITemplateTypeParameter : public DIDescriptor {
>> >  public:
>> >
>> > Modified: llvm/trunk/lib/IR/DIBuilder.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=214111&r1=214110&r2=214111&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
>> > +++ llvm/trunk/lib/IR/DIBuilder.cpp Mon Jul 28 13:52:30 2014
>> > @@ -875,11 +875,11 @@ void DIBuilder::retainType(DIType T) {
>> >
>> >  /// createUnspecifiedParameter - Create unspeicified type descriptor
>> >  /// for the subroutine type.
>> > -DIDescriptor DIBuilder::createUnspecifiedParameter() {
>> > +DITrivialType DIBuilder::createUnspecifiedParameter() {
>> >    Value *Elts[] = {
>> >      GetTagConstant(VMContext, dwarf::DW_TAG_unspecified_parameters)
>> >    };
>> > -  return DIDescriptor(MDNode::get(VMContext, Elts));
>> > +  return DITrivialType(MDNode::get(VMContext, Elts));
>> >  }
>> >
>> >  /// createForwardDecl - Create a temporary forward-declared type that
>> >
>> > Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=214111&r1=214110&r2=214111&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> > +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Jul 28 13:52:30 2014
>> > @@ -39,6 +39,7 @@ bool DIDescriptor::Verify() const {
>> >    return DbgNode &&
>> >           (DIDerivedType(DbgNode).Verify() ||
>> >            DICompositeType(DbgNode).Verify() ||
>> > DIBasicType(DbgNode).Verify() ||
>> > +          DITrivialType(DbgNode).Verify() ||
>> >            DIVariable(DbgNode).Verify() ||
>> > DISubprogram(DbgNode).Verify() ||
>> >            DIGlobalVariable(DbgNode).Verify() ||
>> > DIFile(DbgNode).Verify() ||
>> >            DICompileUnit(DbgNode).Verify() ||
>> > DINameSpace(DbgNode).Verify() ||
>> > @@ -46,7 +47,6 @@ bool DIDescriptor::Verify() const {
>> >            DILexicalBlockFile(DbgNode).Verify() ||
>> >            DISubrange(DbgNode).Verify() ||
>> > DIEnumerator(DbgNode).Verify() ||
>> >            DIObjCProperty(DbgNode).Verify() ||
>> > -          DIUnspecifiedParameter(DbgNode).Verify() ||
>> >            DITemplateTypeParameter(DbgNode).Verify() ||
>> >            DITemplateValueParameter(DbgNode).Verify() ||
>> >            DIImportedEntity(DbgNode).Verify());
>> > @@ -155,6 +155,10 @@ MDNode *DIVariable::getInlinedAt() const
>> >  // Predicates
>> >
>> > //===----------------------------------------------------------------------===//
>> >
>> > +bool DIDescriptor::isTrivialType() const {
>> > +  return DbgNode && getTag() == dwarf::DW_TAG_unspecified_parameters;
>> > +}
>> > +
>> >  /// isBasicType - Return true if the specified tag is legal for
>> >  /// DIBasicType.
>> >  bool DIDescriptor::isBasicType() const {
>> > @@ -225,7 +229,8 @@ bool DIDescriptor::isVariable() const {
>> >
>> >  /// isType - Return true if the specified tag is legal for DIType.
>> >  bool DIDescriptor::isType() const {
>> > -  return isBasicType() || isCompositeType() || isDerivedType();
>> > +  return isBasicType() || isCompositeType() || isDerivedType() ||
>> > +         isTrivialType();
>> >  }
>> >
>> >  /// isSubprogram - Return true if the specified tag is legal for
>> > @@ -456,7 +461,7 @@ bool DIType::Verify() const {
>> >
>> >    // FIXME: Sink this into the various subclass verifies.
>> >    uint16_t Tag = getTag();
>> > -  if (!isBasicType() && Tag != dwarf::DW_TAG_const_type &&
>> > +  if (!isBasicType() && !isTrivialType() && Tag !=
>> > dwarf::DW_TAG_const_type &&
>> >        Tag != dwarf::DW_TAG_volatile_type && Tag !=
>> > dwarf::DW_TAG_pointer_type &&
>> >        Tag != dwarf::DW_TAG_ptr_to_member_type &&
>> >        Tag != dwarf::DW_TAG_reference_type &&
>> > @@ -471,6 +476,8 @@ bool DIType::Verify() const {
>> >    // a CompositeType.
>> >    if (isBasicType())
>> >      return DIBasicType(DbgNode).Verify();
>> > +  else if (isTrivialType())
>> > +    return DITrivialType(DbgNode).Verify();
>> >    else if (isCompositeType())
>> >      return DICompositeType(DbgNode).Verify();
>> >    else if (isDerivedType())
>> > @@ -484,6 +491,10 @@ bool DIBasicType::Verify() const {
>> >    return isBasicType() && DbgNode->getNumOperands() == 10;
>> >  }
>> >
>> > +bool DITrivialType::Verify() const {
>> > +  return isTrivialType() && DbgNode->getNumOperands() == 1;
>> > +}
>> > +
>> >  /// Verify - Verify that a derived type descriptor is well formed.
>> >  bool DIDerivedType::Verify() const {
>> >    // Make sure DerivedFrom @ field 9 is TypeRef.
>> > @@ -624,11 +635,6 @@ bool DILexicalBlockFile::Verify() const
>> >    return isLexicalBlockFile() && DbgNode->getNumOperands() == 3;
>> >  }
>> >
>> > -/// \brief Verify that an unspecified parameter descriptor is well
>> > formed.
>> > -bool DIUnspecifiedParameter::Verify() const {
>> > -  return isUnspecifiedParameter() && DbgNode->getNumOperands() == 1;
>> > -}
>> > -
>> >  /// \brief Verify that the template type parameter descriptor is well
>> > formed.
>> >  bool DITemplateTypeParameter::Verify() const {
>> >    return isTemplateTypeParameter() && DbgNode->getNumOperands() == 7;
>> > @@ -1290,7 +1296,7 @@ void DIEnumerator::printInternal(raw_ost
>> >  }
>> >
>> >  void DIType::printInternal(raw_ostream &OS) const {
>> > -  if (!DbgNode)
>> > +  if (!DbgNode || isTrivialType())
>> >      return;
>> >
>> >    StringRef Res = getName();
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
> _______________________________________________
> 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