Add difference_type to ImmutableMap/Set iterators so they have a complete set of...
[oota-llvm.git] / include / llvm / DebugInfo.h
index 450404ec619fc9ecbc019e589426b5c368f4c528..2efc730f09d7262575ad74ff5bc0f65b88b6d5d5 100644 (file)
@@ -89,14 +89,7 @@ namespace llvm {
     void replaceFunctionField(unsigned Elt, Function *F);
 
   public:
-    explicit DIDescriptor() : DbgNode(0) {}
-    explicit DIDescriptor(const MDNode *N) : DbgNode(N) {}
-    explicit DIDescriptor(const DIFile F);
-    explicit DIDescriptor(const DISubprogram F);
-    explicit DIDescriptor(const DILexicalBlockFile F);
-    explicit DIDescriptor(const DILexicalBlock F);
-    explicit DIDescriptor(const DIVariable F);
-    explicit DIDescriptor(const DIType F);
+    explicit DIDescriptor(const MDNode *N = 0) : DbgNode(N) {}
 
     bool Verify() const;
 
@@ -117,7 +110,7 @@ namespace llvm {
       return !operator==(Other);
     }
 
-    unsigned getTag() const {
+    uint16_t getTag() const {
       return getUnsignedField(0) & ~LLVMDebugVersionMask;
     }
 
@@ -136,7 +129,6 @@ namespace llvm {
     bool isSubrange() const;
     bool isEnumerator() const;
     bool isType() const;
-    bool isGlobal() const;
     bool isUnspecifiedParameter() const;
     bool isTemplateTypeParameter() const;
     bool isTemplateValueParameter() const;
@@ -165,8 +157,7 @@ namespace llvm {
   /// DIArray - This descriptor holds an array of descriptors.
   class DIArray : public DIDescriptor {
   public:
-    explicit DIArray(const MDNode *N = 0)
-      : DIDescriptor(N) {}
+    explicit DIArray(const MDNode *N = 0) : DIDescriptor(N) {}
 
     unsigned getNumElements() const;
     DIDescriptor getElement(unsigned Idx) const {
@@ -196,6 +187,9 @@ namespace llvm {
   public:
     explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {}
 
+    /// Gets the parent scope for this scope node or returns a
+    /// default constructed scope.
+    DIScope getContext() const;
     StringRef getFilename() const;
     StringRef getDirectory() const;
   };
@@ -209,10 +203,10 @@ namespace llvm {
     void printInternal(raw_ostream &OS) const;
 
   public:
+    DIType(const MDNode *N = 0) : DIScope(N) {}
+
     /// Verify - Verify that a type descriptor is well formed.
     bool Verify() const;
-    explicit DIType(const MDNode *N);
-    explicit DIType() {}
 
     DIScope getContext() const          { return getFieldAs<DIScope>(2); }
     StringRef getName() const           { return getStringField(3);     }
@@ -289,8 +283,7 @@ namespace llvm {
     void printInternal(raw_ostream &OS) const;
 
   public:
-    explicit DIDerivedType(const MDNode *N = 0)
-      : DIType(N) {}
+    explicit DIDerivedType(const MDNode *N = 0) : DIType(N) {}
 
     DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
 
@@ -326,14 +319,11 @@ namespace llvm {
     friend class DIDescriptor;
     void printInternal(raw_ostream &OS) const;
   public:
-    explicit DICompositeType(const MDNode *N = 0)
-      : DIDerivedType(N) {
-      if (N && !isCompositeType())
-        DbgNode = 0;
-    }
+    explicit DICompositeType(const MDNode *N = 0) : DIDerivedType(N) {}
 
     DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
     void setTypeArray(DIArray Elements, DIArray TParams = DIArray());
+    void addMember(DIDescriptor D);
     unsigned getRunTimeLang() const { return getUnsignedField(11); }
     DICompositeType getContainingType() const {
       return getFieldAs<DICompositeType>(12);
@@ -349,10 +339,7 @@ namespace llvm {
   class DIFile : public DIScope {
     friend class DIDescriptor;
   public:
-    explicit DIFile(const MDNode *N = 0) : DIScope(N) {
-      if (DbgNode && !isFile())
-        DbgNode = 0;
-    }
+    explicit DIFile(const MDNode *N = 0) : DIScope(N) {}
     MDNode *getFileNode() const;
     bool Verify() const;
   };
@@ -576,8 +563,7 @@ namespace llvm {
     friend class DIDescriptor;
     void printInternal(raw_ostream &OS) const;
   public:
-    explicit DIVariable(const MDNode *N = 0)
-      : DIDescriptor(N) {}
+    explicit DIVariable(const MDNode *N = 0) : DIDescriptor(N) {}
 
     DIScope getContext() const          { return getFieldAs<DIScope>(1); }
     StringRef getName() const           { return getStringField(2);     }
@@ -732,10 +718,12 @@ namespace llvm {
   /// cleanseInlinedVariable - Remove inlined scope from the variable.
   DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext);
 
-  /// DebugInfoFinder tries to list all debug info MDNodes in a module. To
+  /// DebugInfoFinder tries to list all debug info MDNodes used in a module. To
   /// list debug info MDNodes used by an instruction, DebugInfoFinder uses
-  /// processDeclare and processValue. processModule will go through
-  /// all DICompileUnits and list debug info MDNodes used by the CUs.
+  /// processDeclare, processValue and processLocation to handle DbgDeclareInst,
+  /// DbgValueInst and DbgLoc attached to instructions. processModule will go
+  /// through all DICompileUnits in llvm.dbg.cu and list debug info MDNodes
+  /// used by the CUs.
   class DebugInfoFinder {
   public:
     /// processModule - Process entire module and collect debug info
@@ -746,6 +734,8 @@ namespace llvm {
     void processDeclare(const DbgDeclareInst *DDI);
     /// Process DbgValueInst.
     void processValue(const DbgValueInst *DVI);
+    /// processLocation - Process DILocation.
+    void processLocation(DILocation Loc);
 
     /// Clear all lists.
     void reset();
@@ -759,9 +749,6 @@ namespace llvm {
     /// processSubprogram - Process DISubprogram.
     void processSubprogram(DISubprogram SP);
 
-    /// processLocation - Process DILocation.
-    void processLocation(DILocation Loc);
-
     void processScope(DIScope Scope);
 
     /// addCompileUnit - Add compile unit into CUs.