-/// BasicTypeDesc - This class packages debug information associated with a
-/// basic type (eg. int, bool, double.)
-class BasicTypeDesc : public TypeDesc {
-private:
- unsigned Encoding; // Type encoding.
-
-public:
- BasicTypeDesc();
-
- // Accessors
- unsigned getEncoding() const { return Encoding; }
- void setEncoding(unsigned E) { Encoding = E; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const BasicTypeDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the BasicTypeDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-
-//===----------------------------------------------------------------------===//
-/// DerivedTypeDesc - This class packages debug information associated with a
-/// derived types (eg., typedef, pointer, reference.)
-class DerivedTypeDesc : public TypeDesc {
-private:
- DebugInfoDesc *FromType; // Type derived from.
-
-public:
- explicit DerivedTypeDesc(unsigned T);
-
- // Accessors
- TypeDesc *getFromType() const {
- return static_cast<TypeDesc *>(FromType);
- }
- void setFromType(TypeDesc *F) {
- FromType = static_cast<DebugInfoDesc *>(F);
- }
-
- // Implement isa/cast/dyncast.
- static bool classof(const DerivedTypeDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the DerivedTypeDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// CompositeTypeDesc - This class packages debug information associated with a
-/// array/struct types (eg., arrays, struct, union, enums.)
-class CompositeTypeDesc : public DerivedTypeDesc {
-private:
- std::vector<DebugInfoDesc *> Elements;// Information used to compose type.
-
-public:
- explicit CompositeTypeDesc(unsigned T);
-
- // Accessors
- std::vector<DebugInfoDesc *> &getElements() { return Elements; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const CompositeTypeDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// SubrangeDesc - This class packages debug information associated with integer
-/// value ranges.
-class SubrangeDesc : public DebugInfoDesc {
-private:
- int64_t Lo; // Low value of range.
- int64_t Hi; // High value of range.
-
-public:
- SubrangeDesc();
-
- // Accessors
- int64_t getLo() const { return Lo; }
- int64_t getHi() const { return Hi; }
- void setLo(int64_t L) { Lo = L; }
- void setHi(int64_t H) { Hi = H; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const SubrangeDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the SubrangeDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// EnumeratorDesc - This class packages debug information associated with
-/// named integer constants.
-class EnumeratorDesc : public DebugInfoDesc {
-private:
- std::string Name; // Enumerator name.
- int64_t Value; // Enumerator value.
-
-public:
- EnumeratorDesc();
-
- // Accessors
- const std::string &getName() const { return Name; }
- int64_t getValue() const { return Value; }
- void setName(const std::string &N) { Name = N; }
- void setValue(int64_t V) { Value = V; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const EnumeratorDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the EnumeratorDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// VariableDesc - This class packages debug information associated with a
-/// subprogram variable.
-///
-class VariableDesc : public DebugInfoDesc {
-private:
- DebugInfoDesc *Context; // Context debug descriptor.
- std::string Name; // Type name (may be empty.)
- DebugInfoDesc *File; // Defined compile unit (may be NULL.)
- unsigned Line; // Defined line# (may be zero.)
- DebugInfoDesc *TyDesc; // Type of variable.
-
-public:
- explicit VariableDesc(unsigned T);
-
- // Accessors
- DebugInfoDesc *getContext() const { return Context; }
- const std::string &getName() const { return Name; }
- CompileUnitDesc *getFile() const {
- return static_cast<CompileUnitDesc *>(File);
- }
- unsigned getLine() const { return Line; }
- TypeDesc *getType() const {
- return static_cast<TypeDesc *>(TyDesc);
- }
- void setContext(DebugInfoDesc *C) { Context = C; }
- void setName(const std::string &N) { Name = N; }
- void setFile(CompileUnitDesc *U) {
- File = static_cast<DebugInfoDesc *>(U);
- }
- void setLine(unsigned L) { Line = L; }
- void setType(TypeDesc *T) {
- TyDesc = static_cast<DebugInfoDesc *>(T);
- }
-
- // Implement isa/cast/dyncast.
- static bool classof(const VariableDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the VariableDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// GlobalDesc - This class is the base descriptor for global functions and
-/// variables.
-class GlobalDesc : public AnchoredDesc {
-private:
- DebugInfoDesc *Context; // Context debug descriptor.
- std::string Name; // Global name.
- std::string FullName; // Fully qualified name.
- std::string LinkageName; // Name for binding to MIPS linkage.
- DebugInfoDesc *File; // Defined compile unit (may be NULL.)
- unsigned Line; // Defined line# (may be zero.)
- DebugInfoDesc *TyDesc; // Type debug descriptor.
- bool IsStatic; // Is the global a static.
- bool IsDefinition; // Is the global defined in context.
-
-protected:
- explicit GlobalDesc(unsigned T);
-
-public:
- // Accessors
- DebugInfoDesc *getContext() const { return Context; }
- const std::string &getName() const { return Name; }
- const std::string &getFullName() const { return FullName; }
- const std::string &getLinkageName() const { return LinkageName; }
- CompileUnitDesc *getFile() const {
- return static_cast<CompileUnitDesc *>(File);
- }
- unsigned getLine() const { return Line; }
- TypeDesc *getType() const {
- return static_cast<TypeDesc *>(TyDesc);
- }
- bool isStatic() const { return IsStatic; }
- bool isDefinition() const { return IsDefinition; }
- void setContext(DebugInfoDesc *C) { Context = C; }
- void setName(const std::string &N) { Name = N; }
- void setFullName(const std::string &N) { FullName = N; }
- void setLinkageName(const std::string &N) { LinkageName = N; }
- void setFile(CompileUnitDesc *U) {
- File = static_cast<DebugInfoDesc *>(U);
- }
- void setLine(unsigned L) { Line = L; }
- void setType(TypeDesc *T) {
- TyDesc = static_cast<DebugInfoDesc *>(T);
- }
- void setIsStatic(bool IS) { IsStatic = IS; }
- void setIsDefinition(bool ID) { IsDefinition = ID; }
-
- /// ApplyToFields - Target the visitor to the fields of the GlobalDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-};
-
-//===----------------------------------------------------------------------===//
-/// GlobalVariableDesc - This class packages debug information associated with a
-/// GlobalVariable.
-class GlobalVariableDesc : public GlobalDesc {
-private:
- GlobalVariable *Global; // llvm global.
-
-public:
- GlobalVariableDesc();
-
- // Accessors.
- GlobalVariable *getGlobalVariable() const { return Global; }
- void setGlobalVariable(GlobalVariable *GV) { Global = GV; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const GlobalVariableDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the
- /// GlobalVariableDesc.
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
- /// getAnchorString - Return a string used to label this descriptor's anchor.
- ///
- static const char *const AnchorString;
- virtual const char *getAnchorString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// SubprogramDesc - This class packages debug information associated with a
-/// subprogram/function.
-class SubprogramDesc : public GlobalDesc {
-private:
-
-public:
- SubprogramDesc();
-
- // Accessors
-
- // Implement isa/cast/dyncast.
- static bool classof(const SubprogramDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the SubprogramDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
- /// getAnchorString - Return a string used to label this descriptor's anchor.
- ///
- static const char *const AnchorString;
- virtual const char *getAnchorString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// BlockDesc - This descriptor groups variables and blocks nested in a block.
-///
-class BlockDesc : public DebugInfoDesc {
-private:
- DebugInfoDesc *Context; // Context debug descriptor.
-
-public:
- BlockDesc();
-
- // Accessors
- DebugInfoDesc *getContext() const { return Context; }
- void setContext(DebugInfoDesc *C) { Context = C; }
-
- // Implement isa/cast/dyncast.
- static bool classof(const BlockDesc *) { return true; }
- static bool classof(const DebugInfoDesc *D);
-
- /// ApplyToFields - Target the visitor to the fields of the BlockDesc.
- ///
- virtual void ApplyToFields(DIVisitor *Visitor);
-
- /// getDescString - Return a string used to compose global names and labels.
- ///
- virtual const char *getDescString() const;
-
- /// getTypeString - Return a string used to label this descriptor's type.
- ///
- virtual const char *getTypeString() const;
-
-#ifndef NDEBUG
- virtual void dump();
-#endif
-};
-
-//===----------------------------------------------------------------------===//
-/// DIDeserializer - This class is responsible for casting GlobalVariables
-/// into DebugInfoDesc objects.
-class DIDeserializer {
- // Previously defined gloabls.
- std::map<GlobalVariable*, DebugInfoDesc*> GlobalDescs;
-public:
- const std::map<GlobalVariable *, DebugInfoDesc *> &getGlobalDescs() const {
- return GlobalDescs;
- }
-
- /// Deserialize - Reconstitute a GlobalVariable into it's component
- /// DebugInfoDesc objects.
- DebugInfoDesc *Deserialize(Value *V);
- DebugInfoDesc *Deserialize(GlobalVariable *GV);
-};
-
-//===----------------------------------------------------------------------===//
-/// DISerializer - This class is responsible for casting DebugInfoDesc objects
-/// into GlobalVariables.
-class DISerializer {
- Module *M; // Definition space module.
- PointerType *StrPtrTy; // A "i8*" type. Created lazily.
- PointerType *EmptyStructPtrTy; // A "{ }*" type. Created lazily.
-
- // Types per Tag. Created lazily.
- std::map<unsigned, StructType *> TagTypes;
-
- // Previously defined descriptors.
- DenseMap<DebugInfoDesc *, GlobalVariable *> DescGlobals;
-
- // Previously defined strings.
- StringMap<Constant*> StringCache;
-public:
- DISerializer()
- : M(NULL), StrPtrTy(NULL), EmptyStructPtrTy(NULL), TagTypes(),
- DescGlobals(), StringCache()
- {}
-
- // Accessors
- Module *getModule() const { return M; };
- void setModule(Module *module) { M = module; }
-
- /// getStrPtrType - Return a "i8*" type.
- ///
- const PointerType *getStrPtrType();
-
- /// getEmptyStructPtrType - Return a "{ }*" type.
- ///
- const PointerType *getEmptyStructPtrType();
-
- /// getTagType - Return the type describing the specified descriptor (via
- /// tag.)
- const StructType *getTagType(DebugInfoDesc *DD);
-
- /// getString - Construct the string as constant string global.
- ///
- Constant *getString(const std::string &String);
-
- /// Serialize - Recursively cast the specified descriptor into a
- /// GlobalVariable so that it can be serialized to a .bc or .ll file.
- GlobalVariable *Serialize(DebugInfoDesc *DD);
-
- /// addDescriptor - Directly connect DD with existing GV.
- void addDescriptor(DebugInfoDesc *DD, GlobalVariable *GV);
-};
-
-//===----------------------------------------------------------------------===//
-/// DIVerifier - This class is responsible for verifying the given network of
-/// GlobalVariables are valid as DebugInfoDesc objects.
-class DIVerifier {
- enum {
- Unknown = 0,
- Invalid,
- Valid
- };
- DenseMap<GlobalVariable *, unsigned> Validity; // Tracks prior results.
- std::map<unsigned, unsigned> Counts; // Count of fields per Tag type.
-public:
- DIVerifier()
- : Validity(), Counts()
- {}
-
- /// Verify - Return true if the GlobalVariable appears to be a valid
- /// serialization of a DebugInfoDesc.
- bool Verify(Value *V);
- bool Verify(GlobalVariable *GV);
-
- /// isVerified - Return true if the specified GV has already been
- /// verified as a debug information descriptor.
- bool isVerified(GlobalVariable *GV);
-};
-
-//===----------------------------------------------------------------------===//
-/// SourceLineInfo - This class is used to record source line correspondence.