Home | History | Annotate | Download | only in AsmPrinter
      1 //===-- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h ----*- C++ -*--===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains support for writing Microsoft CodeView debug info.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H
     15 #define LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H
     16 
     17 #include "DebugHandlerBase.h"
     18 #include "llvm/ADT/DenseMap.h"
     19 #include "llvm/ADT/StringMap.h"
     20 #include "llvm/CodeGen/AsmPrinter.h"
     21 #include "llvm/CodeGen/MachineFunction.h"
     22 #include "llvm/CodeGen/MachineModuleInfo.h"
     23 #include "llvm/DebugInfo/CodeView/MemoryTypeTableBuilder.h"
     24 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
     25 #include "llvm/IR/DebugInfo.h"
     26 #include "llvm/IR/DebugLoc.h"
     27 #include "llvm/MC/MCStreamer.h"
     28 #include "llvm/Target/TargetLoweringObjectFile.h"
     29 
     30 namespace llvm {
     31 
     32 class StringRef;
     33 class LexicalScope;
     34 struct ClassInfo;
     35 
     36 /// \brief Collects and handles line tables information in a CodeView format.
     37 class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
     38   MCStreamer &OS;
     39   codeview::MemoryTypeTableBuilder TypeTable;
     40 
     41   /// Represents the most general definition range.
     42   struct LocalVarDefRange {
     43     /// Indicates that variable data is stored in memory relative to the
     44     /// specified register.
     45     int InMemory : 1;
     46 
     47     /// Offset of variable data in memory.
     48     int DataOffset : 31;
     49 
     50     /// Offset of the data into the user level struct. If zero, no splitting
     51     /// occurred.
     52     uint16_t StructOffset;
     53 
     54     /// Register containing the data or the register base of the memory
     55     /// location containing the data.
     56     uint16_t CVRegister;
     57 
     58     /// Compares all location fields. This includes all fields except the label
     59     /// ranges.
     60     bool isDifferentLocation(LocalVarDefRange &O) {
     61       return InMemory != O.InMemory || DataOffset != O.DataOffset ||
     62              StructOffset != O.StructOffset || CVRegister != O.CVRegister;
     63     }
     64 
     65     SmallVector<std::pair<const MCSymbol *, const MCSymbol *>, 1> Ranges;
     66   };
     67 
     68   static LocalVarDefRange createDefRangeMem(uint16_t CVRegister, int Offset);
     69   static LocalVarDefRange createDefRangeReg(uint16_t CVRegister);
     70 
     71   /// Similar to DbgVariable in DwarfDebug, but not dwarf-specific.
     72   struct LocalVariable {
     73     const DILocalVariable *DIVar = nullptr;
     74     SmallVector<LocalVarDefRange, 1> DefRanges;
     75   };
     76 
     77   struct InlineSite {
     78     SmallVector<LocalVariable, 1> InlinedLocals;
     79     SmallVector<const DILocation *, 1> ChildSites;
     80     const DISubprogram *Inlinee = nullptr;
     81     unsigned SiteFuncId = 0;
     82   };
     83 
     84   // For each function, store a vector of labels to its instructions, as well as
     85   // to the end of the function.
     86   struct FunctionInfo {
     87     /// Map from inlined call site to inlined instructions and child inlined
     88     /// call sites. Listed in program order.
     89     std::unordered_map<const DILocation *, InlineSite> InlineSites;
     90 
     91     /// Ordered list of top-level inlined call sites.
     92     SmallVector<const DILocation *, 1> ChildSites;
     93 
     94     SmallVector<LocalVariable, 1> Locals;
     95 
     96     DebugLoc LastLoc;
     97     const MCSymbol *Begin = nullptr;
     98     const MCSymbol *End = nullptr;
     99     unsigned FuncId = 0;
    100     unsigned LastFileId = 0;
    101     bool HaveLineInfo = false;
    102   };
    103   FunctionInfo *CurFn;
    104 
    105   /// The set of comdat .debug$S sections that we've seen so far. Each section
    106   /// must start with a magic version number that must only be emitted once.
    107   /// This set tracks which sections we've already opened.
    108   DenseSet<MCSectionCOFF *> ComdatDebugSections;
    109 
    110   /// Switch to the appropriate .debug$S section for GVSym. If GVSym, the symbol
    111   /// of an emitted global value, is in a comdat COFF section, this will switch
    112   /// to a new .debug$S section in that comdat. This method ensures that the
    113   /// section starts with the magic version number on first use. If GVSym is
    114   /// null, uses the main .debug$S section.
    115   void switchToDebugSectionForSymbol(const MCSymbol *GVSym);
    116 
    117   /// The next available function index for use with our .cv_* directives. Not
    118   /// to be confused with type indices for LF_FUNC_ID records.
    119   unsigned NextFuncId = 0;
    120 
    121   InlineSite &getInlineSite(const DILocation *InlinedAt,
    122                             const DISubprogram *Inlinee);
    123 
    124   codeview::TypeIndex getFuncIdForSubprogram(const DISubprogram *SP);
    125 
    126   static void collectInlineSiteChildren(SmallVectorImpl<unsigned> &Children,
    127                                         const FunctionInfo &FI,
    128                                         const InlineSite &Site);
    129 
    130   /// Remember some debug info about each function. Keep it in a stable order to
    131   /// emit at the end of the TU.
    132   MapVector<const Function *, FunctionInfo> FnDebugInfo;
    133 
    134   /// Map from DIFile to .cv_file id.
    135   DenseMap<const DIFile *, unsigned> FileIdMap;
    136 
    137   /// All inlined subprograms in the order they should be emitted.
    138   SmallSetVector<const DISubprogram *, 4> InlinedSubprograms;
    139 
    140   /// Map from a pair of DI metadata nodes and its DI type (or scope) that can
    141   /// be nullptr, to CodeView type indices. Primarily indexed by
    142   /// {DIType*, DIType*} and {DISubprogram*, DIType*}.
    143   ///
    144   /// The second entry in the key is needed for methods as DISubroutineType
    145   /// representing static method type are shared with non-method function type.
    146   DenseMap<std::pair<const DINode *, const DIType *>, codeview::TypeIndex>
    147       TypeIndices;
    148 
    149   /// Map from DICompositeType* to complete type index. Non-record types are
    150   /// always looked up in the normal TypeIndices map.
    151   DenseMap<const DICompositeType *, codeview::TypeIndex> CompleteTypeIndices;
    152 
    153   /// Complete record types to emit after all active type lowerings are
    154   /// finished.
    155   SmallVector<const DICompositeType *, 4> DeferredCompleteTypes;
    156 
    157   /// Number of type lowering frames active on the stack.
    158   unsigned TypeEmissionLevel = 0;
    159 
    160   codeview::TypeIndex VBPType;
    161 
    162   const DISubprogram *CurrentSubprogram = nullptr;
    163 
    164   // The UDTs we have seen while processing types; each entry is a pair of type
    165   // index and type name.
    166   std::vector<std::pair<std::string, codeview::TypeIndex>> LocalUDTs,
    167       GlobalUDTs;
    168 
    169   typedef std::map<const DIFile *, std::string> FileToFilepathMapTy;
    170   FileToFilepathMapTy FileToFilepathMap;
    171   StringRef getFullFilepath(const DIFile *S);
    172 
    173   unsigned maybeRecordFile(const DIFile *F);
    174 
    175   void maybeRecordLocation(const DebugLoc &DL, const MachineFunction *MF);
    176 
    177   void clear();
    178 
    179   void setCurrentSubprogram(const DISubprogram *SP) {
    180     CurrentSubprogram = SP;
    181     LocalUDTs.clear();
    182   }
    183 
    184   /// Emit the magic version number at the start of a CodeView type or symbol
    185   /// section. Appears at the front of every .debug$S or .debug$T section.
    186   void emitCodeViewMagicVersion();
    187 
    188   void emitTypeInformation();
    189 
    190   void emitInlineeLinesSubsection();
    191 
    192   void emitDebugInfoForFunction(const Function *GV, FunctionInfo &FI);
    193 
    194   void emitDebugInfoForGlobals();
    195 
    196   void emitDebugInfoForRetainedTypes();
    197 
    198   void emitDebugInfoForUDTs(
    199       ArrayRef<std::pair<std::string, codeview::TypeIndex>> UDTs);
    200 
    201   void emitDebugInfoForGlobal(const DIGlobalVariable *DIGV, MCSymbol *GVSym);
    202 
    203   /// Opens a subsection of the given kind in a .debug$S codeview section.
    204   /// Returns an end label for use with endCVSubsection when the subsection is
    205   /// finished.
    206   MCSymbol *beginCVSubsection(codeview::ModuleSubstreamKind Kind);
    207 
    208   void endCVSubsection(MCSymbol *EndLabel);
    209 
    210   void emitInlinedCallSite(const FunctionInfo &FI, const DILocation *InlinedAt,
    211                            const InlineSite &Site);
    212 
    213   typedef DbgValueHistoryMap::InlinedVariable InlinedVariable;
    214 
    215   void collectVariableInfo(const DISubprogram *SP);
    216 
    217   void collectVariableInfoFromMMITable(DenseSet<InlinedVariable> &Processed);
    218 
    219   /// Records information about a local variable in the appropriate scope. In
    220   /// particular, locals from inlined code live inside the inlining site.
    221   void recordLocalVariable(LocalVariable &&Var, const DILocation *Loc);
    222 
    223   /// Emits local variables in the appropriate order.
    224   void emitLocalVariableList(ArrayRef<LocalVariable> Locals);
    225 
    226   /// Emits an S_LOCAL record and its associated defined ranges.
    227   void emitLocalVariable(const LocalVariable &Var);
    228 
    229   /// Translates the DIType to codeview if necessary and returns a type index
    230   /// for it.
    231   codeview::TypeIndex getTypeIndex(DITypeRef TypeRef,
    232                                    DITypeRef ClassTyRef = DITypeRef());
    233 
    234   codeview::TypeIndex getMemberFunctionType(const DISubprogram *SP,
    235                                             const DICompositeType *Class);
    236 
    237   codeview::TypeIndex getScopeIndex(const DIScope *Scope);
    238 
    239   codeview::TypeIndex getVBPTypeIndex();
    240 
    241   void addToUDTs(const DIType *Ty, codeview::TypeIndex TI);
    242 
    243   codeview::TypeIndex lowerType(const DIType *Ty, const DIType *ClassTy);
    244   codeview::TypeIndex lowerTypeAlias(const DIDerivedType *Ty);
    245   codeview::TypeIndex lowerTypeArray(const DICompositeType *Ty);
    246   codeview::TypeIndex lowerTypeBasic(const DIBasicType *Ty);
    247   codeview::TypeIndex lowerTypePointer(const DIDerivedType *Ty);
    248   codeview::TypeIndex lowerTypeMemberPointer(const DIDerivedType *Ty);
    249   codeview::TypeIndex lowerTypeModifier(const DIDerivedType *Ty);
    250   codeview::TypeIndex lowerTypeFunction(const DISubroutineType *Ty);
    251   codeview::TypeIndex lowerTypeMemberFunction(const DISubroutineType *Ty,
    252                                               const DIType *ClassTy,
    253                                               int ThisAdjustment);
    254   codeview::TypeIndex lowerTypeEnum(const DICompositeType *Ty);
    255   codeview::TypeIndex lowerTypeClass(const DICompositeType *Ty);
    256   codeview::TypeIndex lowerTypeUnion(const DICompositeType *Ty);
    257 
    258   /// Symbol records should point to complete types, but type records should
    259   /// always point to incomplete types to avoid cycles in the type graph. Only
    260   /// use this entry point when generating symbol records. The complete and
    261   /// incomplete type indices only differ for record types. All other types use
    262   /// the same index.
    263   codeview::TypeIndex getCompleteTypeIndex(DITypeRef TypeRef);
    264 
    265   codeview::TypeIndex lowerCompleteTypeClass(const DICompositeType *Ty);
    266   codeview::TypeIndex lowerCompleteTypeUnion(const DICompositeType *Ty);
    267 
    268   struct TypeLoweringScope;
    269 
    270   void emitDeferredCompleteTypes();
    271 
    272   void collectMemberInfo(ClassInfo &Info, const DIDerivedType *DDTy);
    273   ClassInfo collectClassInfo(const DICompositeType *Ty);
    274 
    275   /// Common record member lowering functionality for record types, which are
    276   /// structs, classes, and unions. Returns the field list index and the member
    277   /// count.
    278   std::tuple<codeview::TypeIndex, codeview::TypeIndex, unsigned, bool>
    279   lowerRecordFieldList(const DICompositeType *Ty);
    280 
    281   /// Inserts {{Node, ClassTy}, TI} into TypeIndices and checks for duplicates.
    282   codeview::TypeIndex recordTypeIndexForDINode(const DINode *Node,
    283                                                codeview::TypeIndex TI,
    284                                                const DIType *ClassTy = nullptr);
    285 
    286   unsigned getPointerSizeInBytes();
    287 
    288 public:
    289   CodeViewDebug(AsmPrinter *Asm);
    290 
    291   void setSymbolSize(const llvm::MCSymbol *, uint64_t) override {}
    292 
    293   /// \brief Emit the COFF section that holds the line table information.
    294   void endModule() override;
    295 
    296   /// \brief Gather pre-function debug information.
    297   void beginFunction(const MachineFunction *MF) override;
    298 
    299   /// \brief Gather post-function debug information.
    300   void endFunction(const MachineFunction *) override;
    301 
    302   /// \brief Process beginning of an instruction.
    303   void beginInstruction(const MachineInstr *MI) override;
    304 };
    305 } // End of namespace llvm
    306 
    307 #endif
    308