1 //===-- llvm/lib/CodeGen/AsmPrinter/WinCodeViewLineTables.h ----*- C++ -*--===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for writing line tables info into COFF files.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H
15 #define LLVM_LIB_CODEGEN_ASMPRINTER_WINCODEVIEWLINETABLES_H
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"
31 /// \brief Collects and handles line tables information in a CodeView format.
32 class LLVM_LIBRARY_VISIBILITY WinCodeViewLineTables : public AsmPrinterHandler {
36 // For each function, store a vector of labels to its instructions, as well as
37 // to the end of the function.
39 SmallVector<MCSymbol *, 10> Instrs;
41 FunctionInfo() : End(nullptr) {}
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;
50 // InstrInfoTy - Holds the Filename:LineNumber information for every
51 // instruction with a unique debug location.
55 unsigned ColumnNumber;
57 InstrInfoTy() : LineNumber(0), ColumnNumber(0) {}
59 InstrInfoTy(StringRef Filename, unsigned LineNumber, unsigned ColumnNumber)
60 : Filename(Filename), LineNumber(LineNumber),
61 ColumnNumber(ColumnNumber) {}
63 DenseMap<MCSymbol *, InstrInfoTy> InstrInfo;
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;
71 size_t FilenameID, StartOffset;
73 StringMap<PerFileInfo> Infos;
75 // The offset in the string table where we'll write the next unique
79 FileNameRegistryTy() {
83 // Add Filename to the registry, if it was not observed before.
84 void add(StringRef Filename) {
85 if (Infos.count(Filename))
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);
101 typedef std::map<std::pair<StringRef, StringRef>, char *>
102 DirAndFilenameToFilepathMapTy;
103 DirAndFilenameToFilepathMapTy DirAndFilenameToFilepathMap;
104 StringRef getFullFilepath(const MDNode *S);
106 void maybeRecordLocation(DebugLoc DL, const MachineFunction *MF);
109 assert(CurFn == nullptr);
110 FileNameRegistry.clear();
114 void emitDebugInfoForFunction(const Function *GV);
117 WinCodeViewLineTables(AsmPrinter *Asm);
119 ~WinCodeViewLineTables() override {
120 for (DirAndFilenameToFilepathMapTy::iterator
121 I = DirAndFilenameToFilepathMap.begin(),
122 E = DirAndFilenameToFilepathMap.end();
127 void setSymbolSize(const llvm::MCSymbol *, uint64_t) override {}
129 /// \brief Emit the COFF section that holds the line table information.
130 void endModule() override;
132 /// \brief Gather pre-function debug information.
133 void beginFunction(const MachineFunction *MF) override;
135 /// \brief Gather post-function debug information.
136 void endFunction(const MachineFunction *) override;
138 /// \brief Process beginning of an instruction.
139 void beginInstruction(const MachineInstr *MI) override;
141 /// \brief Process end of an instruction.
142 void endInstruction() override {}
144 } // End of namespace llvm