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