1//===- DbiModuleDescriptorBuilder.h - PDB module information ----*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_DEBUGINFO_PDB_RAW_DBIMODULEDESCRIPTORBUILDER_H 10#define LLVM_DEBUGINFO_PDB_RAW_DBIMODULEDESCRIPTORBUILDER_H 11 12#include "llvm/ADT/StringRef.h" 13#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 14#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h" 15#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h" 16#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 17#include "llvm/DebugInfo/CodeView/SymbolRecord.h" 18#include "llvm/DebugInfo/PDB/Native/RawTypes.h" 19#include "llvm/Support/Error.h" 20#include <cstdint> 21#include <string> 22#include <vector> 23 24namespace llvm { 25class BinaryStreamWriter; 26 27namespace codeview { 28class DebugSubsectionRecordBuilder; 29} 30 31namespace msf { 32class MSFBuilder; 33struct MSFLayout; 34} 35namespace pdb { 36 37class DbiModuleDescriptorBuilder { 38 friend class DbiStreamBuilder; 39 40public: 41 DbiModuleDescriptorBuilder(StringRef ModuleName, uint32_t ModIndex, 42 msf::MSFBuilder &Msf); 43 ~DbiModuleDescriptorBuilder(); 44 45 DbiModuleDescriptorBuilder(const DbiModuleDescriptorBuilder &) = delete; 46 DbiModuleDescriptorBuilder & 47 operator=(const DbiModuleDescriptorBuilder &) = delete; 48 49 void setPdbFilePathNI(uint32_t NI); 50 void setObjFileName(StringRef Name); 51 void setFirstSectionContrib(const SectionContrib &SC); 52 void addSymbol(codeview::CVSymbol Symbol); 53 void addSymbolsInBulk(ArrayRef<uint8_t> BulkSymbols); 54 55 void 56 addDebugSubsection(std::shared_ptr<codeview::DebugSubsection> Subsection); 57 58 void 59 addDebugSubsection(const codeview::DebugSubsectionRecord &SubsectionContents); 60 61 uint16_t getStreamIndex() const; 62 StringRef getModuleName() const { return ModuleName; } 63 StringRef getObjFileName() const { return ObjFileName; } 64 65 unsigned getModuleIndex() const { return Layout.Mod; } 66 67 ArrayRef<std::string> source_files() const { 68 return makeArrayRef(SourceFiles); 69 } 70 71 uint32_t calculateSerializedLength() const; 72 73 /// Return the offset within the module symbol stream of the next symbol 74 /// record passed to addSymbol. Add four to account for the signature. 75 uint32_t getNextSymbolOffset() const { return SymbolByteSize + 4; } 76 77 void finalize(); 78 Error finalizeMsfLayout(); 79 80 Error commit(BinaryStreamWriter &ModiWriter, const msf::MSFLayout &MsfLayout, 81 WritableBinaryStreamRef MsfBuffer); 82 83private: 84 uint32_t calculateC13DebugInfoSize() const; 85 86 void addSourceFile(StringRef Path); 87 msf::MSFBuilder &MSF; 88 89 uint32_t SymbolByteSize = 0; 90 uint32_t PdbFilePathNI = 0; 91 std::string ModuleName; 92 std::string ObjFileName; 93 std::vector<std::string> SourceFiles; 94 std::vector<ArrayRef<uint8_t>> Symbols; 95 96 std::vector<std::unique_ptr<codeview::DebugSubsectionRecordBuilder>> 97 C13Builders; 98 99 ModuleInfoHeader Layout; 100}; 101 102} // end namespace pdb 103 104} // end namespace llvm 105 106#endif // LLVM_DEBUGINFO_PDB_RAW_DBIMODULEDESCRIPTORBUILDER_H 107