aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/Support/DebugInfoBuilder.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Support/DebugInfoBuilder.h')
-rw-r--r--include/llvm/Support/DebugInfoBuilder.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/include/llvm/Support/DebugInfoBuilder.h b/include/llvm/Support/DebugInfoBuilder.h
new file mode 100644
index 0000000000..875ae4180f
--- /dev/null
+++ b/include/llvm/Support/DebugInfoBuilder.h
@@ -0,0 +1,151 @@
+//===-- 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