Add isFOO() helpers. Fix getDirectory() and getFilename() for DIScope.
authorDevang Patel <dpatel@apple.com>
Wed, 30 Sep 2009 22:34:41 +0000 (22:34 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 30 Sep 2009 22:34:41 +0000 (22:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83180 91177308-0d34-0410-b5e6-96231b3b80d8

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

index c40cfb2671047d66e16009d605cdc65d3d932223..d19cd0b228d15570bebd6fde475f64d79192056c 100644 (file)
@@ -98,6 +98,10 @@ namespace llvm {
     bool isScope() const;
     bool isCompileUnit() const;
     bool isLexicalBlock() const;
+    bool isSubrange() const;
+    bool isEnumerator() const;
+    bool isType() const;
+    bool isGlobal() const;
   };
 
   /// DISubrange - This is used to represent ranges, for array bounds.
@@ -131,8 +135,8 @@ namespace llvm {
     }
     virtual ~DIScope() {}
 
-    virtual const char *getFilename() const { return NULL; }
-    virtual const char *getDirectory() const { return NULL; }
+    const char *getFilename() const;
+    const char *getDirectory() const;
   };
 
   /// DICompileUnit - A wrapper for a compile unit.
@@ -438,6 +442,7 @@ namespace llvm {
         DbgNode = 0;
     }
     DIScope getContext() const       { return getFieldAs<DIScope>(1); }
+    const char *getDirectory() const { return getContext().getDirectory(); }
     const char *getFilename() const  { return getContext().getFilename(); }
   };
 
index db5a0cbb21476f034f58d972ec9d287de6366f77..6df1610517b9cfbf3ef46483c02bc221c0366d12 100644 (file)
@@ -189,6 +189,11 @@ bool DIDescriptor::isVariable() const {
   }
 }
 
+/// isType - Return true if the specified tag is legal for DIType.
+bool DIDescriptor::isType() const {
+  return isBasicType() || isCompositeType() || isDerivedType();
+}
+
 /// isSubprogram - Return true if the specified tag is legal for
 /// DISubprogram.
 bool DIDescriptor::isSubprogram() const {
@@ -207,6 +212,11 @@ bool DIDescriptor::isGlobalVariable() const {
   return Tag == dwarf::DW_TAG_variable;
 }
 
+/// isGlobal - Return true if the specified tag is legal for DIGlobal.
+bool DIDescriptor::isGlobal() const {
+  return isGlobalVariable();
+}
+
 /// isScope - Return true if the specified tag is one of the scope
 /// related tag.
 bool DIDescriptor::isScope() const {
@@ -240,6 +250,22 @@ bool DIDescriptor::isLexicalBlock() const {
   return Tag == dwarf::DW_TAG_lexical_block;
 }
 
+/// isSubrange - Return true if the specified tag is DW_TAG_subrange_type.
+bool DIDescriptor::isSubrange() const {
+  assert (!isNull() && "Invalid descriptor!");
+  unsigned Tag = getTag();
+
+  return Tag == dwarf::DW_TAG_subrange_type;
+}
+
+/// isEnumerator - Return true if the specified tag is DW_TAG_enumerator.
+bool DIDescriptor::isEnumerator() const {
+  assert (!isNull() && "Invalid descriptor!");
+  unsigned Tag = getTag();
+
+  return Tag == dwarf::DW_TAG_enumerator;
+}
+
 //===----------------------------------------------------------------------===//
 // Simple Descriptor Constructors and other Methods
 //===----------------------------------------------------------------------===//
@@ -392,6 +418,30 @@ bool DISubprogram::describes(const Function *F) {
   return false;
 }
 
+const char *DIScope::getFilename() const {
+  if (isLexicalBlock()) 
+    return DILexicalBlock(DbgNode).getFilename();
+  else if (isSubprogram())
+    return DISubprogram(DbgNode).getFilename();
+  else if (isCompileUnit())
+    return DICompileUnit(DbgNode).getFilename();
+  else 
+    assert (0 && "Invalid DIScope!");
+  return NULL;
+}
+
+const char *DIScope::getDirectory() const {
+  if (isLexicalBlock()) 
+    return DILexicalBlock(DbgNode).getDirectory();
+  else if (isSubprogram())
+    return DISubprogram(DbgNode).getDirectory();
+  else if (isCompileUnit())
+    return DICompileUnit(DbgNode).getDirectory();
+  else 
+    assert (0 && "Invalid DIScope!");
+  return NULL;
+}
+
 //===----------------------------------------------------------------------===//
 // DIDescriptor: dump routines for all descriptors.
 //===----------------------------------------------------------------------===//