[Debug Info] replace DIUnspecifiedParameter with DITrivialType.
authorManman Ren <manman.ren@gmail.com>
Mon, 28 Jul 2014 18:52:30 +0000 (18:52 +0000)
committerManman Ren <manman.ren@gmail.com>
Mon, 28 Jul 2014 18:52:30 +0000 (18:52 +0000)
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.

This commit should have no functionality change. With this commit, we may
change unspecified type to be a DITrivialType instead of a DIType.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214111 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/DIBuilder.h
include/llvm/IR/DebugInfo.h
lib/IR/DIBuilder.cpp
lib/IR/DebugInfo.cpp

index 267350409604c9ee304eb5d58e1f4509f2b83bee..156017b50e4d85d1ef000be40c24e5272061581c 100644 (file)
@@ -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);
index 088eb9f01049de72c5b5bde27d5ed9597a94e413..19108ae625047d4db73c94b75cd14aebb6985721 100644 (file)
@@ -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:
index 218787c9933a9dff461e8e08b72cbd16fc593062..2df302cd672820c3a98054cdacc121924ccd649e 100644 (file)
@@ -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
index 5e39b242dbbc84cd9a7cb64d65dfbd42483c45d5..8e05435cb3319b17037ce6713290d489dc16fde3 100644 (file)
@@ -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 { return getNodeField(DbgNode, 7); }
 // 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_ostream &OS) const {
 }
 
 void DIType::printInternal(raw_ostream &OS) const {
-  if (!DbgNode)
+  if (!DbgNode || isTrivialType())
     return;
 
   StringRef Res = getName();