diff options
Diffstat (limited to 'lib/CodeGen/AsmPrinter/CodeViewDebug.h')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/CodeViewDebug.h | 104 | 
1 files changed, 85 insertions, 19 deletions
diff --git a/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/lib/CodeGen/AsmPrinter/CodeViewDebug.h index 6a0da5f993d0..21557ed1be35 100644 --- a/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -14,14 +14,14 @@  #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H  #define LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H -#include "DbgValueHistoryCalculator.h" -#include "DebugHandlerBase.h"  #include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/DenseSet.h"  #include "llvm/ADT/MapVector.h"  #include "llvm/ADT/SetVector.h"  #include "llvm/ADT/SmallVector.h" +#include "llvm/CodeGen/DbgEntityHistoryCalculator.h" +#include "llvm/CodeGen/DebugHandlerBase.h"  #include "llvm/DebugInfo/CodeView/CodeView.h"  #include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"  #include "llvm/DebugInfo/CodeView/TypeIndex.h" @@ -54,6 +54,12 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    BumpPtrAllocator Allocator;    codeview::GlobalTypeTableBuilder TypeTable; +  /// Whether to emit type record hashes into .debug$H. +  bool EmitDebugGlobalHashes = false; + +  /// The codeview CPU type used by the translation unit. +  codeview::CPUType TheCPU; +    /// Represents the most general definition range.    struct LocalVarDefRange {      /// Indicates that variable data is stored in memory relative to the @@ -85,10 +91,6 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    };    static LocalVarDefRange createDefRangeMem(uint16_t CVRegister, int Offset); -  static LocalVarDefRange createDefRangeGeneral(uint16_t CVRegister, -                                                bool InMemory, int Offset, -                                                bool IsSubfield, -                                                uint16_t StructOffset);    /// Similar to DbgVariable in DwarfDebug, but not dwarf-specific.    struct LocalVariable { @@ -97,6 +99,11 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {      bool UseReferenceType = false;    }; +  struct CVGlobalVariable { +    const DIGlobalVariable *DIGV; +    const GlobalVariable *GV; +  }; +    struct InlineSite {      SmallVector<LocalVariable, 1> InlinedLocals;      SmallVector<const DILocation *, 1> ChildSites; @@ -110,6 +117,7 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    // Combines information from DILexicalBlock and LexicalScope.    struct LexicalBlock {      SmallVector<LocalVariable, 1> Locals; +    SmallVector<CVGlobalVariable, 1> Globals;      SmallVector<LexicalBlock *, 1> Children;      const MCSymbol *Begin;      const MCSymbol *End; @@ -132,6 +140,7 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {      SmallVector<const DILocation *, 1> ChildSites;      SmallVector<LocalVariable, 1> Locals; +    SmallVector<CVGlobalVariable, 1> Globals;      std::unordered_map<const DILexicalBlockBase*, LexicalBlock> LexicalBlocks; @@ -144,6 +153,33 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {      const MCSymbol *End = nullptr;      unsigned FuncId = 0;      unsigned LastFileId = 0; + +    /// Number of bytes allocated in the prologue for all local stack objects. +    unsigned FrameSize = 0; + +    /// Number of bytes of parameters on the stack. +    unsigned ParamSize = 0; + +    /// Number of bytes pushed to save CSRs. +    unsigned CSRSize = 0; + +    /// Adjustment to apply on x86 when using the VFRAME frame pointer. +    int OffsetAdjustment = 0; + +    /// Two-bit value indicating which register is the designated frame pointer +    /// register for local variables. Included in S_FRAMEPROC. +    codeview::EncodedFramePtrReg EncodedLocalFramePtrReg = +        codeview::EncodedFramePtrReg::None; + +    /// Two-bit value indicating which register is the designated frame pointer +    /// register for stack parameters. Included in S_FRAMEPROC. +    codeview::EncodedFramePtrReg EncodedParamFramePtrReg = +        codeview::EncodedFramePtrReg::None; + +    codeview::FrameProcedureOptions FrameProcOpts; + +    bool HasStackRealignment = false; +      bool HaveLineInfo = false;    };    FunctionInfo *CurFn = nullptr; @@ -154,6 +190,17 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    // and LexicalBlocks.    DenseMap<const LexicalScope *, SmallVector<LocalVariable, 1>> ScopeVariables; +  // Map to separate global variables according to the lexical scope they +  // belong in. A null local scope represents the global scope. +  typedef SmallVector<CVGlobalVariable, 1> GlobalVariableList; +  DenseMap<const DIScope*, std::unique_ptr<GlobalVariableList> > ScopeGlobals; + +  // Array of global variables which  need to be emitted into a COMDAT section. +  SmallVector<CVGlobalVariable, 1> ComdatVariables; + +  // Array of non-COMDAT global variables. +  SmallVector<CVGlobalVariable, 1> GlobalVariables; +    /// The set of comdat .debug$S sections that we've seen so far. Each section    /// must start with a magic version number that must only be emitted once.    /// This set tracks which sections we've already opened. @@ -249,6 +296,8 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    void emitCompilerInformation(); +  void emitBuildInfo(); +    void emitInlineeLinesSubsection();    void emitDebugInfoForThunk(const Function *GV, @@ -257,13 +306,13 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    void emitDebugInfoForFunction(const Function *GV, FunctionInfo &FI); -  void emitDebugInfoForGlobals(); -    void emitDebugInfoForRetainedTypes();    void    emitDebugInfoForUDTs(ArrayRef<std::pair<std::string, const DIType *>> UDTs); +  void emitDebugInfoForGlobals(); +  void emitGlobalVariableList(ArrayRef<CVGlobalVariable> Globals);    void emitDebugInfoForGlobal(const DIGlobalVariable *DIGV,                                const GlobalVariable *GV, MCSymbol *GVSym); @@ -271,36 +320,49 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    /// Returns an end label for use with endCVSubsection when the subsection is    /// finished.    MCSymbol *beginCVSubsection(codeview::DebugSubsectionKind Kind); -    void endCVSubsection(MCSymbol *EndLabel); +  /// Opens a symbol record of the given kind. Returns an end label for use with +  /// endSymbolRecord. +  MCSymbol *beginSymbolRecord(codeview::SymbolKind Kind); +  void endSymbolRecord(MCSymbol *SymEnd); + +  /// Emits an S_END, S_INLINESITE_END, or S_PROC_ID_END record. These records +  /// are empty, so we emit them with a simpler assembly sequence that doesn't +  /// involve labels. +  void emitEndSymbolRecord(codeview::SymbolKind EndKind); +    void emitInlinedCallSite(const FunctionInfo &FI, const DILocation *InlinedAt,                             const InlineSite &Site); -  using InlinedVariable = DbgValueHistoryMap::InlinedVariable; +  using InlinedEntity = DbgValueHistoryMap::InlinedEntity; +  void collectGlobalVariableInfo();    void collectVariableInfo(const DISubprogram *SP); -  void collectVariableInfoFromMFTable(DenseSet<InlinedVariable> &Processed); +  void collectVariableInfoFromMFTable(DenseSet<InlinedEntity> &Processed);    // Construct the lexical block tree for a routine, pruning emptpy lexical    // scopes, and populate it with local variables.    void collectLexicalBlockInfo(SmallVectorImpl<LexicalScope *> &Scopes,                                 SmallVectorImpl<LexicalBlock *> &Blocks, -                               SmallVectorImpl<LocalVariable> &Locals); +                               SmallVectorImpl<LocalVariable> &Locals, +                               SmallVectorImpl<CVGlobalVariable> &Globals);    void collectLexicalBlockInfo(LexicalScope &Scope,                                 SmallVectorImpl<LexicalBlock *> &ParentBlocks, -                               SmallVectorImpl<LocalVariable> &ParentLocals); +                               SmallVectorImpl<LocalVariable> &ParentLocals, +                               SmallVectorImpl<CVGlobalVariable> &ParentGlobals);    /// Records information about a local variable in the appropriate scope. In    /// particular, locals from inlined code live inside the inlining site.    void recordLocalVariable(LocalVariable &&Var, const LexicalScope *LS);    /// Emits local variables in the appropriate order. -  void emitLocalVariableList(ArrayRef<LocalVariable> Locals); +  void emitLocalVariableList(const FunctionInfo &FI, +                             ArrayRef<LocalVariable> Locals);    /// Emits an S_LOCAL record and its associated defined ranges. -  void emitLocalVariable(const LocalVariable &Var); +  void emitLocalVariable(const FunctionInfo &FI, const LocalVariable &Var);    /// Emits a sequence of lexical block scopes and their children.    void emitLexicalBlockList(ArrayRef<LexicalBlock *> Blocks, @@ -314,6 +376,10 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    codeview::TypeIndex getTypeIndex(DITypeRef TypeRef,                                     DITypeRef ClassTyRef = DITypeRef()); +  codeview::TypeIndex +  getTypeIndexForThisPtr(const DIDerivedType *PtrTy, +                         const DISubroutineType *SubroutineTy); +    codeview::TypeIndex getTypeIndexForReferenceTo(DITypeRef TypeRef);    codeview::TypeIndex getMemberFunctionType(const DISubprogram *SP, @@ -340,10 +406,10 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {    codeview::TypeIndex lowerTypeModifier(const DIDerivedType *Ty);    codeview::TypeIndex lowerTypeFunction(const DISubroutineType *Ty);    codeview::TypeIndex lowerTypeVFTableShape(const DIDerivedType *Ty); -  codeview::TypeIndex lowerTypeMemberFunction(const DISubroutineType *Ty, -                                              const DIType *ClassTy, -                                              int ThisAdjustment, -                                              bool IsStaticMethod); +  codeview::TypeIndex lowerTypeMemberFunction( +      const DISubroutineType *Ty, const DIType *ClassTy, int ThisAdjustment, +      bool IsStaticMethod, +      codeview::FunctionOptions FO = codeview::FunctionOptions::None);    codeview::TypeIndex lowerTypeEnum(const DICompositeType *Ty);    codeview::TypeIndex lowerTypeClass(const DICompositeType *Ty);    codeview::TypeIndex lowerTypeUnion(const DICompositeType *Ty);  | 
