Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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_NATIVE_DBIMODULEDESCRIPTORBUILDER_H
10
#define LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULEDESCRIPTORBUILDER_H
11
 
12
#include "llvm/ADT/ArrayRef.h"
13
#include "llvm/ADT/StringRef.h"
14
#include "llvm/DebugInfo/CodeView/CVRecord.h"
15
#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
16
#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
17
#include "llvm/Support/BinaryStreamRef.h"
18
#include "llvm/Support/Error.h"
19
#include <cstdint>
20
#include <string>
21
#include <vector>
22
 
23
namespace llvm {
24
class BinaryStreamWriter;
25
namespace codeview {
26
class DebugSubsection;
27
}
28
 
29
namespace msf {
30
class MSFBuilder;
31
struct MSFLayout;
32
}
33
namespace pdb {
34
 
35
// Represents merged or unmerged symbols. Merged symbols can be written to the
36
// output file as is, but unmerged symbols must be rewritten first. In either
37
// case, the size must be known up front.
38
struct SymbolListWrapper {
39
  explicit SymbolListWrapper(ArrayRef<uint8_t> Syms)
40
      : SymPtr(const_cast<uint8_t *>(Syms.data())), SymSize(Syms.size()),
41
        NeedsToBeMerged(false) {}
42
  explicit SymbolListWrapper(void *SymSrc, uint32_t Length)
43
      : SymPtr(SymSrc), SymSize(Length), NeedsToBeMerged(true) {}
44
 
45
  ArrayRef<uint8_t> asArray() const {
46
    return ArrayRef<uint8_t>(static_cast<const uint8_t *>(SymPtr), SymSize);
47
  }
48
 
49
  uint32_t size() const { return SymSize; }
50
 
51
  void *SymPtr = nullptr;
52
  uint32_t SymSize = 0;
53
  bool NeedsToBeMerged = false;
54
};
55
 
56
/// Represents a string table reference at some offset in the module symbol
57
/// stream.
58
struct StringTableFixup {
59
  uint32_t StrTabOffset = 0;
60
  uint32_t SymOffsetOfReference = 0;
61
};
62
 
63
class DbiModuleDescriptorBuilder {
64
  friend class DbiStreamBuilder;
65
 
66
public:
67
  DbiModuleDescriptorBuilder(StringRef ModuleName, uint32_t ModIndex,
68
                             msf::MSFBuilder &Msf);
69
  ~DbiModuleDescriptorBuilder();
70
 
71
  DbiModuleDescriptorBuilder(const DbiModuleDescriptorBuilder &) = delete;
72
  DbiModuleDescriptorBuilder &
73
  operator=(const DbiModuleDescriptorBuilder &) = delete;
74
 
75
  void setPdbFilePathNI(uint32_t NI);
76
  void setObjFileName(StringRef Name);
77
 
78
  // Callback to merge one source of unmerged symbols.
79
  using MergeSymbolsCallback = Error (*)(void *Ctx, void *Symbols,
80
                                         BinaryStreamWriter &Writer);
81
 
82
  void setMergeSymbolsCallback(void *Ctx, MergeSymbolsCallback Callback) {
83
    MergeSymsCtx = Ctx;
84
    MergeSymsCallback = Callback;
85
  }
86
 
87
  void setStringTableFixups(std::vector<StringTableFixup> &&Fixups) {
88
    StringTableFixups = std::move(Fixups);
89
  }
90
 
91
  void setFirstSectionContrib(const SectionContrib &SC);
92
  void addSymbol(codeview::CVSymbol Symbol);
93
  void addSymbolsInBulk(ArrayRef<uint8_t> BulkSymbols);
94
 
95
  // Add symbols of known size which will be merged (rewritten) when committing
96
  // the PDB to disk.
97
  void addUnmergedSymbols(void *SymSrc, uint32_t SymLength);
98
 
99
  void
100
  addDebugSubsection(std::shared_ptr<codeview::DebugSubsection> Subsection);
101
 
102
  void
103
  addDebugSubsection(const codeview::DebugSubsectionRecord &SubsectionContents);
104
 
105
  uint16_t getStreamIndex() const;
106
  StringRef getModuleName() const { return ModuleName; }
107
  StringRef getObjFileName() const { return ObjFileName; }
108
 
109
  unsigned getModuleIndex() const { return Layout.Mod; }
110
 
111
  ArrayRef<std::string> source_files() const { return SourceFiles; }
112
 
113
  uint32_t calculateSerializedLength() const;
114
 
115
  /// Return the offset within the module symbol stream of the next symbol
116
  /// record passed to addSymbol. Add four to account for the signature.
117
  uint32_t getNextSymbolOffset() const { return SymbolByteSize + 4; }
118
 
119
  void finalize();
120
  Error finalizeMsfLayout();
121
 
122
  /// Commit the DBI descriptor to the DBI stream.
123
  Error commit(BinaryStreamWriter &ModiWriter);
124
 
125
  /// Commit the accumulated symbols to the module symbol stream. Safe to call
126
  /// in parallel on different DbiModuleDescriptorBuilder objects. Only modifies
127
  /// the pre-allocated stream in question.
128
  Error commitSymbolStream(const msf::MSFLayout &MsfLayout,
129
                           WritableBinaryStreamRef MsfBuffer);
130
 
131
private:
132
  uint32_t calculateC13DebugInfoSize() const;
133
 
134
  void addSourceFile(StringRef Path);
135
  msf::MSFBuilder &MSF;
136
 
137
  uint32_t SymbolByteSize = 0;
138
  uint32_t PdbFilePathNI = 0;
139
  std::string ModuleName;
140
  std::string ObjFileName;
141
  std::vector<std::string> SourceFiles;
142
  std::vector<SymbolListWrapper> Symbols;
143
 
144
  void *MergeSymsCtx = nullptr;
145
  MergeSymbolsCallback MergeSymsCallback = nullptr;
146
 
147
  std::vector<StringTableFixup> StringTableFixups;
148
 
149
  std::vector<codeview::DebugSubsectionRecordBuilder> C13Builders;
150
 
151
  ModuleInfoHeader Layout;
152
};
153
 
154
} // end namespace pdb
155
 
156
} // end namespace llvm
157
 
158
#endif // LLVM_DEBUGINFO_PDB_NATIVE_DBIMODULEDESCRIPTORBUILDER_H