//===-- llvm/Support/DebugInfoBuilder.h - -----------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains the declaration of the DebugInfoBuilder class, which is // a helper class used to construct source level debugging information. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_DEBUGINFOBUILDER_H #define LLVM_SUPPORT_DEBUGINFOBUILDER_H #include #include namespace llvm { class Type; class IntegerType; class FloatType; class StructType; class PointerType; class Module; class GlobalVariable; class Constant; namespace sys { class Path; } /// Helper class used to construct source-level debugging information. /// /// The helper contains a notion of "current context", which is a /// DWARF descriptor object representing the scope (module, class, /// function, etc.) that currently encloses the definitions being /// emitted. /// /// Initially, you should call setModule() to specify the target /// module. Descriptors which are generated will be inserted into /// this module. This also generates the initial set of anchor /// descriptors, if they have not already been created for the module. /// /// Next, you should call createCompileUnitDescriptor() to create /// the descriptor for the current compilation unit. This method /// sets the current context to the newly created descriptor. /// /// Once that has been done, you can then create descriptors for /// global definitions (functions, variables, etc.). You can use /// setContext() to modify the current context. setContext() returns /// a reference to the previous context, allowing easy restoration /// of the previous context. class DebugInfoBuilder { private: Module * module; PointerType * anyPtrType; // Pointer to empty struct StructType * anchorType; GlobalVariable * compileUnit; GlobalVariable * context; GlobalVariable * compileUnitAnchor; GlobalVariable * globalVariableAnchor; GlobalVariable * subprogramAnchor; GlobalVariable * compileUnitDescriptor; // Create an anchor with the specified tag. GlobalVariable * createAnchor(unsigned anchorTag, const char * anchorName); // Calculate alignement for primitive types. unsigned getBasicAlignment(unsigned sizeInBits); // Calculate the size of the specified LLVM type. Constant * getSize(const Type * type); // Calculate the alignment of the specified LLVM type. Constant * getAlignment(const Type * type); public: /// Constructor DebugInfoBuilder(); /// Return the type defined by llvm.dbg.anchor.type StructType * getAnchorType() const { return anchorType; } /// Set the reference to the module where we will insert debugging /// information. Also defines the debug info types for the module and /// creates the initial anchors. Also changes the current context to the // global context for that module. void setModule(Module * m); /// Emit a compile unit descriptor. This should be done once for each /// module before any other debug descriptors are created. This also /// changes the current context to the global context for the compile unit. GlobalVariable * createCompileUnitDescriptor( unsigned langId, const sys::Path & srcPath, const std::string & producer); /// Set a new context, returning the previous context. The context is the /// debug descriptor representing the current scope (module, function, /// class, etc.) GlobalVariable * setContext(GlobalVariable * ctx) { GlobalVariable * prev = context; context = ctx; return prev; } /// Emit a subprogram descriptor in the current context. GlobalVariable * createSubProgramDescriptor( const std::string & name, // Name of the subprogram const std::string & qualName, // Fully-qualified name unsigned line, // Line number GlobalVariable * typeDesc, // Type descriptor bool isInternalScoped, // True if internal to module. bool isDefined); // True if defined in this module. /// Create a type descriptor for a primitive type. GlobalVariable * createBasicTypeDescriptor( std::string & name, unsigned line, unsigned sizeInBits, unsigned alignmentInBits, unsigned offsetInBits, unsigned typeEncoding); /// Create a type descriptor for an integer type GlobalVariable * createIntegerTypeDescriptor( std::string & name, const IntegerType * type, bool isSigned); /// Create a type descriptor for an character type GlobalVariable * createCharacterTypeDescriptor( std::string & name, const IntegerType * type, bool isSigned); /// Create a type descriptor for an floating-point type GlobalVariable * createFloatTypeDescriptor(std::string & name, const Type * type); /// Create a type descriptor for a pointer type. GlobalVariable * createPointerTypeDescriptor( std::string & name, // Name of the type GlobalVariable * referenceType, // Descriptor for what is pointed to const PointerType * type, // LLVM type of the pointer unsigned line); // Line number of definition (0 if none) }; } #endif