blob: 875ae4180f859e66ff9dbe2b7ca15db04215715e [file] [log] [blame]
//===-- 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 <llvm/Module.h>
#include <string>
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