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