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