1//===-- llvm/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.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 line tables info into COFF files.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H
15#define LLVM_LIB_CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H
16
17#include "AsmPrinterHandler.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/StringMap.h"
20#include "llvm/ADT/StringRef.h"
21#include "llvm/CodeGen/AsmPrinter.h"
22#include "llvm/CodeGen/LexicalScopes.h"
23#include "llvm/CodeGen/MachineFunction.h"
24#include "llvm/CodeGen/MachineModuleInfo.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
30namespace llvm {
31/// \brief Collects and handles line tables information in a CodeView format.
32class LLVM_LIBRARY_VISIBILITY WinCodeViewLineTables : public AsmPrinterHandler {
33  AsmPrinter *Asm;
34  DebugLoc PrevInstLoc;
35
36  // For each function, store a vector of labels to its instructions, as well as
37  // to the end of the function.
38  struct FunctionInfo {
39    SmallVector<MCSymbol *, 10> Instrs;
40    MCSymbol *End;
41    FunctionInfo() : End(nullptr) {}
42  } *CurFn;
43
44  typedef DenseMap<const Function *, FunctionInfo> FnDebugInfoTy;
45  FnDebugInfoTy FnDebugInfo;
46  // Store the functions we've visited in a vector so we can maintain a stable
47  // order while emitting subsections.
48  SmallVector<const Function *, 10> VisitedFunctions;
49
50  // InstrInfoTy - Holds the Filename:LineNumber information for every
51  // instruction with a unique debug location.
52  struct InstrInfoTy {
53    StringRef Filename;
54    unsigned LineNumber;
55    unsigned ColumnNumber;
56
57    InstrInfoTy() : LineNumber(0), ColumnNumber(0) {}
58
59    InstrInfoTy(StringRef Filename, unsigned LineNumber, unsigned ColumnNumber)
60        : Filename(Filename), LineNumber(LineNumber),
61          ColumnNumber(ColumnNumber) {}
62  };
63  DenseMap<MCSymbol *, InstrInfoTy> InstrInfo;
64
65  // FileNameRegistry - Manages filenames observed while generating debug info
66  // by filtering out duplicates and bookkeeping the offsets in the string
67  // table to be generated.
68  struct FileNameRegistryTy {
69    SmallVector<StringRef, 10> Filenames;
70    struct PerFileInfo {
71      size_t FilenameID, StartOffset;
72    };
73    StringMap<PerFileInfo> Infos;
74
75    // The offset in the string table where we'll write the next unique
76    // filename.
77    size_t LastOffset;
78
79    FileNameRegistryTy() {
80      clear();
81    }
82
83    // Add Filename to the registry, if it was not observed before.
84    void add(StringRef Filename) {
85      if (Infos.count(Filename))
86        return;
87      size_t OldSize = Infos.size();
88      Infos[Filename].FilenameID = OldSize;
89      Infos[Filename].StartOffset = LastOffset;
90      LastOffset += Filename.size() + 1;
91      Filenames.push_back(Filename);
92    }
93
94    void clear() {
95      LastOffset = 1;
96      Infos.clear();
97      Filenames.clear();
98    }
99  } FileNameRegistry;
100
101  typedef std::map<std::pair<StringRef, StringRef>, std::string>
102      DirAndFilenameToFilepathMapTy;
103  DirAndFilenameToFilepathMapTy DirAndFilenameToFilepathMap;
104  StringRef getFullFilepath(const MDNode *S);
105
106  void maybeRecordLocation(DebugLoc DL, const MachineFunction *MF);
107
108  void clear() {
109    assert(CurFn == nullptr);
110    FileNameRegistry.clear();
111    InstrInfo.clear();
112  }
113
114  void emitDebugInfoForFunction(const Function *GV);
115
116public:
117  WinCodeViewLineTables(AsmPrinter *Asm);
118
119  void setSymbolSize(const llvm::MCSymbol *, uint64_t) override {}
120
121  /// \brief Emit the COFF section that holds the line table information.
122  void endModule() override;
123
124  /// \brief Gather pre-function debug information.
125  void beginFunction(const MachineFunction *MF) override;
126
127  /// \brief Gather post-function debug information.
128  void endFunction(const MachineFunction *) override;
129
130  /// \brief Process beginning of an instruction.
131  void beginInstruction(const MachineInstr *MI) override;
132
133  /// \brief Process end of an instruction.
134  void endInstruction() override {}
135};
136} // End of namespace llvm
137
138#endif
139