summaryrefslogtreecommitdiff
path: root/include/llvm/Analysis/DebugInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Analysis/DebugInfo.h')
-rw-r--r--include/llvm/Analysis/DebugInfo.h111
1 files changed, 57 insertions, 54 deletions
diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h
index 9f90f6435e..c0721d33c6 100644
--- a/include/llvm/Analysis/DebugInfo.h
+++ b/include/llvm/Analysis/DebugInfo.h
@@ -17,7 +17,6 @@
#ifndef LLVM_ANALYSIS_DEBUGINFO_H
#define LLVM_ANALYSIS_DEBUGINFO_H
-#include "llvm/Metadata.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/DenseMap.h"
@@ -45,12 +44,12 @@ namespace llvm {
class DIDescriptor {
protected:
- MDNode *DbgNode;
+ GlobalVariable *DbgGV;
- /// DIDescriptor constructor. If the specified node is non-null, check
+ /// DIDescriptor constructor. If the specified GV is non-null, this checks
/// to make sure that the tag in the descriptor matches 'RequiredTag'. If
/// not, the debug info is corrupt and we ignore it.
- DIDescriptor(MDNode *N, unsigned RequiredTag);
+ DIDescriptor(GlobalVariable *GV, unsigned RequiredTag);
const std::string &getStringField(unsigned Elt, std::string &Result) const;
unsigned getUnsignedField(unsigned Elt) const {
@@ -61,18 +60,18 @@ namespace llvm {
template <typename DescTy>
DescTy getFieldAs(unsigned Elt) const {
- return DescTy(getDescriptorField(Elt).getNode());
+ return DescTy(getDescriptorField(Elt).getGV());
}
GlobalVariable *getGlobalVariableField(unsigned Elt) const;
public:
- explicit DIDescriptor() : DbgNode(0) {}
- explicit DIDescriptor(MDNode *N) : DbgNode(N) {}
+ explicit DIDescriptor() : DbgGV(0) {}
+ explicit DIDescriptor(GlobalVariable *GV) : DbgGV(GV) {}
- bool isNull() const { return DbgNode == 0; }
+ bool isNull() const { return DbgGV == 0; }
- MDNode *getNode() const { return DbgNode; }
+ GlobalVariable *getGV() const { return DbgGV; }
unsigned getVersion() const {
return getUnsignedField(0) & LLVMDebugVersionMask;
@@ -82,8 +81,8 @@ namespace llvm {
return getUnsignedField(0) & ~LLVMDebugVersionMask;
}
- /// ValidDebugInfo - Return true if N represents valid debug info value.
- static bool ValidDebugInfo(MDNode *N, CodeGenOpt::Level OptLevel);
+ /// ValidDebugInfo - Return true if V represents valid debug info value.
+ static bool ValidDebugInfo(Value *V, CodeGenOpt::Level OptLevel);
/// dump - print descriptor.
void dump() const;
@@ -92,8 +91,8 @@ namespace llvm {
/// DISubrange - This is used to represent ranges, for array bounds.
class DISubrange : public DIDescriptor {
public:
- explicit DISubrange(MDNode *N = 0)
- : DIDescriptor(N, dwarf::DW_TAG_subrange_type) {}
+ explicit DISubrange(GlobalVariable *GV = 0)
+ : DIDescriptor(GV, dwarf::DW_TAG_subrange_type) {}
int64_t getLo() const { return (int64_t)getUInt64Field(1); }
int64_t getHi() const { return (int64_t)getUInt64Field(2); }
@@ -102,8 +101,7 @@ namespace llvm {
/// DIArray - This descriptor holds an array of descriptors.
class DIArray : public DIDescriptor {
public:
- explicit DIArray(MDNode *N = 0)
- : DIDescriptor(N) {}
+ explicit DIArray(GlobalVariable *GV = 0) : DIDescriptor(GV) {}
unsigned getNumElements() const;
DIDescriptor getElement(unsigned Idx) const {
@@ -114,8 +112,8 @@ namespace llvm {
/// DICompileUnit - A wrapper for a compile unit.
class DICompileUnit : public DIDescriptor {
public:
- explicit DICompileUnit(MDNode *N = 0)
- : DIDescriptor(N, dwarf::DW_TAG_compile_unit) {}
+ explicit DICompileUnit(GlobalVariable *GV = 0)
+ : DIDescriptor(GV, dwarf::DW_TAG_compile_unit) {}
unsigned getLanguage() const { return getUnsignedField(2); }
const std::string &getFilename(std::string &F) const {
@@ -156,8 +154,8 @@ namespace llvm {
/// type/precision or a file/line pair for location info.
class DIEnumerator : public DIDescriptor {
public:
- explicit DIEnumerator(MDNode *N = 0)
- : DIDescriptor(N, dwarf::DW_TAG_enumerator) {}
+ explicit DIEnumerator(GlobalVariable *GV = 0)
+ : DIDescriptor(GV, dwarf::DW_TAG_enumerator) {}
const std::string &getName(std::string &F) const {
return getStringField(1, F);
@@ -178,11 +176,10 @@ namespace llvm {
};
protected:
- DIType(MDNode *N, unsigned Tag)
- : DIDescriptor(N, Tag) {}
+ DIType(GlobalVariable *GV, unsigned Tag) : DIDescriptor(GV, Tag) {}
// This ctor is used when the Tag has already been validated by a derived
// ctor.
- DIType(MDNode *N, bool, bool) : DIDescriptor(N) {}
+ DIType(GlobalVariable *GV, bool, bool) : DIDescriptor(GV) {}
public:
/// isDerivedType - Return true if the specified tag is legal for
@@ -202,7 +199,7 @@ namespace llvm {
/// Verify - Verify that a type descriptor is well formed.
bool Verify() const;
public:
- explicit DIType(MDNode *N);
+ explicit DIType(GlobalVariable *GV);
explicit DIType() {}
virtual ~DIType() {}
@@ -238,8 +235,8 @@ namespace llvm {
/// DIBasicType - A basic type, like 'int' or 'float'.
class DIBasicType : public DIType {
public:
- explicit DIBasicType(MDNode *N = 0)
- : DIType(N, dwarf::DW_TAG_base_type) {}
+ explicit DIBasicType(GlobalVariable *GV)
+ : DIType(GV, dwarf::DW_TAG_base_type) {}
unsigned getEncoding() const { return getUnsignedField(9); }
@@ -251,13 +248,13 @@ namespace llvm {
/// a typedef, a pointer or reference, etc.
class DIDerivedType : public DIType {
protected:
- explicit DIDerivedType(MDNode *N, bool, bool)
- : DIType(N, true, true) {}
+ explicit DIDerivedType(GlobalVariable *GV, bool, bool)
+ : DIType(GV, true, true) {}
public:
- explicit DIDerivedType(MDNode *N = 0)
- : DIType(N, true, true) {
- if (DbgNode && !isDerivedType(getTag()))
- DbgNode = 0;
+ explicit DIDerivedType(GlobalVariable *GV)
+ : DIType(GV, true, true) {
+ if (GV && !isDerivedType(getTag()))
+ DbgGV = 0;
}
DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); }
@@ -279,10 +276,10 @@ namespace llvm {
/// FIXME: Why is this a DIDerivedType??
class DICompositeType : public DIDerivedType {
public:
- explicit DICompositeType(MDNode *N = 0)
- : DIDerivedType(N, true, true) {
- if (N && !isCompositeType(getTag()))
- DbgNode = 0;
+ explicit DICompositeType(GlobalVariable *GV)
+ : DIDerivedType(GV, true, true) {
+ if (GV && !isCompositeType(getTag()))
+ DbgGV = 0;
}
DIArray getTypeArray() const { return getFieldAs<DIArray>(10); }
@@ -298,8 +295,8 @@ namespace llvm {
/// DIGlobal - This is a common class for global variables and subprograms.
class DIGlobal : public DIDescriptor {
protected:
- explicit DIGlobal(MDNode *N, unsigned RequiredTag)
- : DIDescriptor(N, RequiredTag) {}
+ explicit DIGlobal(GlobalVariable *GV, unsigned RequiredTag)
+ : DIDescriptor(GV, RequiredTag) {}
/// isSubprogram - Return true if the specified tag is legal for
/// DISubprogram.
@@ -342,8 +339,8 @@ namespace llvm {
/// DISubprogram - This is a wrapper for a subprogram (e.g. a function).
class DISubprogram : public DIGlobal {
public:
- explicit DISubprogram(MDNode *N = 0)
- : DIGlobal(N, dwarf::DW_TAG_subprogram) {}
+ explicit DISubprogram(GlobalVariable *GV = 0)
+ : DIGlobal(GV, dwarf::DW_TAG_subprogram) {}
DICompositeType getType() const { return getFieldAs<DICompositeType>(8); }
@@ -353,7 +350,7 @@ namespace llvm {
DICompositeType DCT(getFieldAs<DICompositeType>(8));
if (!DCT.isNull()) {
DIArray A = DCT.getTypeArray();
- DIType T(A.getElement(0).getNode());
+ DIType T(A.getElement(0).getGV());
return T.getName(F);
}
DIType T(getFieldAs<DIType>(8));
@@ -374,8 +371,8 @@ namespace llvm {
/// DIGlobalVariable - This is a wrapper for a global variable.
class DIGlobalVariable : public DIGlobal {
public:
- explicit DIGlobalVariable(MDNode *N = 0)
- : DIGlobal(N, dwarf::DW_TAG_variable) {}
+ explicit DIGlobalVariable(GlobalVariable *GV = 0)
+ : DIGlobal(GV, dwarf::DW_TAG_variable) {}
GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
@@ -390,10 +387,10 @@ namespace llvm {
/// global etc).
class DIVariable : public DIDescriptor {
public:
- explicit DIVariable(MDNode *N = 0)
- : DIDescriptor(N) {
- if (DbgNode && !isVariable(getTag()))
- DbgNode = 0;
+ explicit DIVariable(GlobalVariable *GV = 0)
+ : DIDescriptor(GV) {
+ if (GV && !isVariable(getTag()))
+ DbgGV = 0;
}
DIDescriptor getContext() const { return getDescriptorField(1); }
@@ -417,8 +414,8 @@ namespace llvm {
/// DIBlock - This is a wrapper for a block (e.g. a function, scope, etc).
class DIBlock : public DIDescriptor {
public:
- explicit DIBlock(MDNode *N = 0)
- : DIDescriptor(N, dwarf::DW_TAG_lexical_block) {}
+ explicit DIBlock(GlobalVariable *GV = 0)
+ : DIDescriptor(GV, dwarf::DW_TAG_lexical_block) {}
DIDescriptor getContext() const { return getDescriptorField(1); }
};
@@ -545,6 +542,10 @@ namespace llvm {
private:
Constant *GetTagConstant(unsigned TAG);
+ Constant *GetStringConstant(const std::string &String);
+
+ /// getCastToEmpty - Return the descriptor as a Constant* with type '{}*'.
+ Constant *getCastToEmpty(DIDescriptor D);
};
/// Finds the stoppoint coressponding to this instruction, that is the
@@ -606,6 +607,7 @@ namespace llvm {
/// isInlinedFnEnd - Return true if REI is ending an inlined function.
bool isInlinedFnEnd(DbgRegionEndInst &REI, const Function *CurrentFn);
+
/// DebugInfoFinder - This object collects DebugInfo from a module.
class DebugInfoFinder {
@@ -649,7 +651,7 @@ namespace llvm {
bool addType(DIType DT);
public:
- typedef SmallVector<MDNode *, 8>::iterator iterator;
+ typedef SmallVector<GlobalVariable *, 8>::iterator iterator;
iterator compile_unit_begin() { return CUs.begin(); }
iterator compile_unit_end() { return CUs.end(); }
iterator subprogram_begin() { return SPs.begin(); }
@@ -665,11 +667,12 @@ namespace llvm {
unsigned type_count() { return TYs.size(); }
private:
- SmallVector<MDNode *, 8> CUs; // Compile Units
- SmallVector<MDNode *, 8> SPs; // Subprograms
- SmallVector<MDNode *, 8> GVs; // Global Variables;
- SmallVector<MDNode *, 8> TYs; // Types
- SmallPtrSet<MDNode *, 64> NodesSeen;
+ SmallVector<GlobalVariable *, 8> CUs; // Compile Units
+ SmallVector<GlobalVariable *, 8> SPs; // Subprograms
+ SmallVector<GlobalVariable *, 8> GVs; // Global Variables
+ SmallVector<GlobalVariable *, 8> TYs; // Types
+ SmallPtrSet<GlobalVariable *, 64> NodesSeen;
+
};
} // end namespace llvm