Add classof() methods so that dwarf writer can decide what DIDescriptor is in its...
authorDevang Patel <dpatel@apple.com>
Mon, 5 Jan 2009 19:55:07 +0000 (19:55 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 5 Jan 2009 19:55:07 +0000 (19:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61740 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DebugInfo.h
lib/Analysis/DebugInfo.cpp

index bc891024035b27b364223117285df97e5dbcf81c..fae9a4422535608b53c17caaf2bba6de844cb645 100644 (file)
@@ -77,6 +77,7 @@ namespace llvm {
     unsigned getTag() const {
       return getUnsignedField(0) & ~VersionMask;
     }
+    static inline bool classof(const DIDescriptor *D) { return true; }
   };
   
   /// DIAnchor - A wrapper for various anchor descriptors.
@@ -94,6 +95,11 @@ namespace llvm {
     
     int64_t getLo() const { return (int64_t)getUInt64Field(1); }
     int64_t getHi() const { return (int64_t)getUInt64Field(2); }
+    static bool isSubrange(unsigned);
+    static inline bool classof(const DISubrange *) { return true; }
+    static inline bool classof(const DIDescriptor *D) {
+      return isSubrange(D->getTag());
+    }
   };
   
   /// DIArray - This descriptor holds an array of descriptors.
@@ -102,8 +108,8 @@ namespace llvm {
     explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
     
     unsigned getNumElements() const;
-    DISubrange getElement(unsigned Idx) const {
-      return getFieldAs<DISubrange>(Idx); 
+    DIDescriptor getElement(unsigned Idx) const {
+      return getDescriptorField(Idx);
     }
   };
   
@@ -180,6 +186,11 @@ namespace llvm {
     /// isDerivedType - Return true if the specified tag is legal for
     /// DIDerivedType.
     static bool isDerivedType(unsigned TAG);
+
+    static inline bool classof(const DIDerivedType *) { return true; }
+    static inline bool classof(const DIDescriptor *D) {
+      return isDerivedType(D->getTag());
+    }
   };
 
   
@@ -197,6 +208,10 @@ namespace llvm {
     /// isCompositeType - Return true if the specified tag is legal for
     /// DICompositeType.
     static bool isCompositeType(unsigned TAG);
+    static inline bool classof(const DIDerivedType *) { return true; }
+    static inline bool classof(const DIDescriptor *D) {
+      return isCompositeType(D->getTag());
+    }
   };
   
   /// DIGlobal - This is a common class for global variables and subprograms.
index 8b802d7fffaa41efe158bc9f9158f93e7dc98ee8..b5ff34ecaffed01339722e9398bb6ef35a936945 100644 (file)
@@ -181,6 +181,11 @@ unsigned DIArray::getNumElements() const {
   return C->getNumOperands();
 }
 
+/// isSubrange - Return true if the specified tag is legal for DISubrange.
+bool DISubrange::isSubrange(unsigned Tag) {
+  return Tag == dwarf::DW_TAG_subrange_type;
+}
+
 //===----------------------------------------------------------------------===//
 // DIFactory: Basic Helpers
 //===----------------------------------------------------------------------===//