| //===--- CGDebugInfo.h - DebugInfo for LLVM CodeGen -----------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This is the source level debug info generator for llvm translation. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef CLANG_CODEGEN_CGDEBUGINFO_H |
| #define CLANG_CODEGEN_CGDEBUGINFO_H |
| |
| #include "clang/AST/Type.h" |
| #include "clang/Basic/SourceLocation.h" |
| #include <map> |
| #include <vector> |
| |
| |
| namespace llvm { |
| class Function; |
| class IRBuilder; |
| class DISerializer; |
| class CompileUnitDesc; |
| class BasicBlock; |
| class AnchorDesc; |
| class DebugInfoDesc; |
| class Value; |
| class TypeDesc; |
| class VariableDesc; |
| class SubprogramDesc; |
| class GlobalVariable; |
| class GlobalVariableDesc; |
| class EnumeratorDesc; |
| class SubrangeDesc; |
| } |
| |
| namespace clang { |
| class FunctionDecl; |
| class VarDecl; |
| namespace CodeGen { |
| class CodeGenModule; |
| |
| /// CGDebugInfo - This class gathers all debug information during compilation |
| /// and is responsible for emitting to llvm globals or pass directly to |
| /// the backend. |
| class CGDebugInfo { |
| private: |
| CodeGenModule *M; |
| llvm::DISerializer *SR; |
| SourceLocation CurLoc; |
| SourceLocation PrevLoc; |
| |
| /// CompileUnitCache - Cache of previously constructed CompileUnits. |
| std::map<unsigned, llvm::CompileUnitDesc *> CompileUnitCache; |
| |
| /// TypeCache - Cache of previously constructed Types. |
| std::map<void *, llvm::TypeDesc *> TypeCache; |
| |
| llvm::Function *StopPointFn; |
| llvm::Function *FuncStartFn; |
| llvm::Function *DeclareFn; |
| llvm::Function *RegionStartFn; |
| llvm::Function *RegionEndFn; |
| llvm::AnchorDesc *CompileUnitAnchor; |
| llvm::AnchorDesc *SubprogramAnchor; |
| llvm::AnchorDesc *GlobalVariableAnchor; |
| std::vector<llvm::DebugInfoDesc *> RegionStack; |
| std::vector<llvm::VariableDesc *> VariableDescList; |
| std::vector<llvm::GlobalVariableDesc *> GlobalVarDescList; |
| std::vector<llvm::EnumeratorDesc *> EnumDescList; |
| std::vector<llvm::SubrangeDesc *> SubrangeDescList; |
| llvm::SubprogramDesc *Subprogram; |
| |
| /// Helper functions for getOrCreateType. |
| llvm::TypeDesc *getOrCreateCVRType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateBuiltinType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateTypedefType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreatePointerType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateFunctionType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateRecordType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateEnumType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateTaggedType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| llvm::TypeDesc *getOrCreateArrayType(QualType type, |
| llvm::CompileUnitDesc *unit); |
| |
| public: |
| CGDebugInfo(CodeGenModule *m); |
| ~CGDebugInfo(); |
| |
| void setLocation(SourceLocation loc); |
| |
| /// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of |
| /// source line. |
| void EmitStopPoint(llvm::Function *Fn, llvm::IRBuilder &Builder); |
| |
| /// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate |
| /// start of a new function |
| void EmitFunctionStart(const FunctionDecl *FnDecl, llvm::Function *Fn, |
| llvm::IRBuilder &Builder); |
| |
| /// EmitRegionStart - Emit a call to llvm.dbg.region.start to indicate start |
| /// of a new block. |
| void EmitRegionStart(llvm::Function *Fn, llvm::IRBuilder &Builder); |
| |
| /// EmitRegionEnd - Emit call to llvm.dbg.region.end to indicate end of a |
| /// block. |
| void EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder &Builder); |
| |
| /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration. |
| void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI, |
| llvm::IRBuilder &Builder); |
| |
| /// EmitGlobalVariable - Emit information about a global variable. |
| void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *decl); |
| |
| /// getOrCreateCompileUnit - Get the compile unit from the cache or create a |
| /// new one if necessary. |
| llvm::CompileUnitDesc *getOrCreateCompileUnit(SourceLocation loc); |
| |
| /// getOrCreateType - Get the type from the cache or create a new type if |
| /// necessary. |
| llvm::TypeDesc *getOrCreateType(QualType type, llvm::CompileUnitDesc *unit); |
| |
| /// getCastValueFor - Return a llvm representation for a given debug |
| /// information descriptor cast to an empty struct pointer. |
| llvm::Value *getCastValueFor(llvm::DebugInfoDesc *DD); |
| |
| /// getValueFor - Return a llvm representation for a given debug information |
| /// descriptor. |
| llvm::Value *getValueFor(llvm::DebugInfoDesc *DD); |
| }; |
| } // namespace CodeGen |
| } // namespace clang |
| |
| #endif |