xref: /llvm-project-15.0.7/lld/COFF/PDB.cpp (revision 9284931e)
1 //===- PDB.cpp ------------------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "PDB.h"
11 #include "Chunks.h"
12 #include "Config.h"
13 #include "Driver.h"
14 #include "SymbolTable.h"
15 #include "Symbols.h"
16 #include "Writer.h"
17 #include "lld/Common/ErrorHandler.h"
18 #include "lld/Common/Timer.h"
19 #include "llvm/DebugInfo/CodeView/CVDebugRecord.h"
20 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
21 #include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"
22 #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
23 #include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
24 #include "llvm/DebugInfo/CodeView/RecordName.h"
25 #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
26 #include "llvm/DebugInfo/CodeView/SymbolSerializer.h"
27 #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
28 #include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
29 #include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
30 #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
31 #include "llvm/DebugInfo/MSF/MSFBuilder.h"
32 #include "llvm/DebugInfo/MSF/MSFCommon.h"
33 #include "llvm/DebugInfo/PDB/GenericError.h"
34 #include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h"
35 #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
36 #include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h"
37 #include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h"
38 #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
39 #include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"
40 #include "llvm/DebugInfo/PDB/Native/NativeSession.h"
41 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
42 #include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
43 #include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
44 #include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
45 #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
46 #include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h"
47 #include "llvm/DebugInfo/PDB/PDB.h"
48 #include "llvm/Object/COFF.h"
49 #include "llvm/Support/BinaryByteStream.h"
50 #include "llvm/Support/Endian.h"
51 #include "llvm/Support/FormatVariadic.h"
52 #include "llvm/Support/JamCRC.h"
53 #include "llvm/Support/Path.h"
54 #include "llvm/Support/ScopedPrinter.h"
55 #include <memory>
56 
57 using namespace lld;
58 using namespace lld::coff;
59 using namespace llvm;
60 using namespace llvm::codeview;
61 
62 using llvm::object::coff_section;
63 
64 static ExitOnError ExitOnErr;
65 
66 static Timer TotalPdbLinkTimer("PDB Emission (Cumulative)", Timer::root());
67 
68 static Timer AddObjectsTimer("Add Objects", TotalPdbLinkTimer);
69 static Timer TypeMergingTimer("Type Merging", AddObjectsTimer);
70 static Timer SymbolMergingTimer("Symbol Merging", AddObjectsTimer);
71 static Timer GlobalsLayoutTimer("Globals Stream Layout", TotalPdbLinkTimer);
72 static Timer TpiStreamLayoutTimer("TPI Stream Layout", TotalPdbLinkTimer);
73 static Timer DiskCommitTimer("Commit to Disk", TotalPdbLinkTimer);
74 
75 namespace {
76 /// Map from type index and item index in a type server PDB to the
77 /// corresponding index in the destination PDB.
78 struct CVIndexMap {
79   SmallVector<TypeIndex, 0> TPIMap;
80   SmallVector<TypeIndex, 0> IPIMap;
81   bool IsTypeServerMap = false;
82 };
83 
84 class PDBLinker {
85 public:
86   PDBLinker(SymbolTable *Symtab)
87       : Alloc(), Symtab(Symtab), Builder(Alloc), TypeTable(Alloc),
88         IDTable(Alloc), GlobalTypeTable(Alloc), GlobalIDTable(Alloc) {}
89 
90   /// Emit the basic PDB structure: initial streams, headers, etc.
91   void initialize(const llvm::codeview::DebugInfo &BuildId);
92 
93   /// Link CodeView from each object file in the symbol table into the PDB.
94   void addObjectsToPDB();
95 
96   /// Link CodeView from a single object file into the PDB.
97   void addObjFile(ObjFile *File);
98 
99   /// Produce a mapping from the type and item indices used in the object
100   /// file to those in the destination PDB.
101   ///
102   /// If the object file uses a type server PDB (compiled with /Zi), merge TPI
103   /// and IPI from the type server PDB and return a map for it. Each unique type
104   /// server PDB is merged at most once, so this may return an existing index
105   /// mapping.
106   ///
107   /// If the object does not use a type server PDB (compiled with /Z7), we merge
108   /// all the type and item records from the .debug$S stream and fill in the
109   /// caller-provided ObjectIndexMap.
110   Expected<const CVIndexMap&> mergeDebugT(ObjFile *File,
111                                           CVIndexMap &ObjectIndexMap);
112 
113   Expected<const CVIndexMap&> maybeMergeTypeServerPDB(ObjFile *File,
114                                                       TypeServer2Record &TS);
115 
116   /// Add the section map and section contributions to the PDB.
117   void addSections(ArrayRef<OutputSection *> OutputSections,
118                    ArrayRef<uint8_t> SectionTable);
119 
120   void addSectionContrib(pdb::DbiModuleDescriptorBuilder &LinkerModule,
121                          OutputSection *OS, Chunk *C);
122 
123   /// Write the PDB to disk.
124   void commit();
125 
126 private:
127   BumpPtrAllocator Alloc;
128 
129   SymbolTable *Symtab;
130 
131   pdb::PDBFileBuilder Builder;
132 
133   /// Type records that will go into the PDB TPI stream.
134   MergingTypeTableBuilder TypeTable;
135 
136   /// Item records that will go into the PDB IPI stream.
137   MergingTypeTableBuilder IDTable;
138 
139   /// Type records that will go into the PDB TPI stream (for /DEBUG:GHASH)
140   GlobalTypeTableBuilder GlobalTypeTable;
141 
142   /// Item records that will go into the PDB IPI stream (for /DEBUG:GHASH)
143   GlobalTypeTableBuilder GlobalIDTable;
144 
145   /// PDBs use a single global string table for filenames in the file checksum
146   /// table.
147   DebugStringTableSubsection PDBStrTab;
148 
149   llvm::SmallString<128> NativePath;
150 
151   std::vector<pdb::SecMapEntry> SectionMap;
152 
153   /// Type index mappings of type server PDBs that we've loaded so far.
154   std::map<GUID, CVIndexMap> TypeServerIndexMappings;
155 
156   /// List of TypeServer PDBs which cannot be loaded.
157   /// Cached to prevent repeated load attempts.
158   std::set<GUID> MissingTypeServerPDBs;
159 };
160 }
161 
162 static SectionChunk *findByName(ArrayRef<SectionChunk *> Sections,
163                                 StringRef Name) {
164   for (SectionChunk *C : Sections)
165     if (C->getSectionName() == Name)
166       return C;
167   return nullptr;
168 }
169 
170 static ArrayRef<uint8_t> consumeDebugMagic(ArrayRef<uint8_t> Data,
171                                            StringRef SecName) {
172   // First 4 bytes are section magic.
173   if (Data.size() < 4)
174     fatal(SecName + " too short");
175   if (support::endian::read32le(Data.data()) != COFF::DEBUG_SECTION_MAGIC)
176     fatal(SecName + " has an invalid magic");
177   return Data.slice(4);
178 }
179 
180 static ArrayRef<uint8_t> getDebugSection(ObjFile *File, StringRef SecName) {
181   if (SectionChunk *Sec = findByName(File->getDebugChunks(), SecName))
182     return consumeDebugMagic(Sec->getContents(), SecName);
183   return {};
184 }
185 
186 // A COFF .debug$H section is currently a clang extension.  This function checks
187 // if a .debug$H section is in a format that we expect / understand, so that we
188 // can ignore any sections which are coincidentally also named .debug$H but do
189 // not contain a format we recognize.
190 static bool canUseDebugH(ArrayRef<uint8_t> DebugH) {
191   if (DebugH.size() < sizeof(object::debug_h_header))
192     return false;
193   auto *Header =
194       reinterpret_cast<const object::debug_h_header *>(DebugH.data());
195   DebugH = DebugH.drop_front(sizeof(object::debug_h_header));
196   return Header->Magic == COFF::DEBUG_HASHES_SECTION_MAGIC &&
197          Header->Version == 0 &&
198          Header->HashAlgorithm == uint16_t(GlobalTypeHashAlg::SHA1) &&
199          (DebugH.size() % 20 == 0);
200 }
201 
202 static Optional<ArrayRef<uint8_t>> getDebugH(ObjFile *File) {
203   SectionChunk *Sec = findByName(File->getDebugChunks(), ".debug$H");
204   if (!Sec)
205     return llvm::None;
206   ArrayRef<uint8_t> Contents = Sec->getContents();
207   if (!canUseDebugH(Contents))
208     return None;
209   return Contents;
210 }
211 
212 static ArrayRef<GloballyHashedType>
213 getHashesFromDebugH(ArrayRef<uint8_t> DebugH) {
214   assert(canUseDebugH(DebugH));
215 
216   DebugH = DebugH.drop_front(sizeof(object::debug_h_header));
217   uint32_t Count = DebugH.size() / sizeof(GloballyHashedType);
218   return {reinterpret_cast<const GloballyHashedType *>(DebugH.data()), Count};
219 }
220 
221 static void addTypeInfo(pdb::TpiStreamBuilder &TpiBuilder,
222                         TypeCollection &TypeTable) {
223   // Start the TPI or IPI stream header.
224   TpiBuilder.setVersionHeader(pdb::PdbTpiV80);
225 
226   // Flatten the in memory type table and hash each type.
227   TypeTable.ForEachRecord([&](TypeIndex TI, const CVType &Type) {
228     auto Hash = pdb::hashTypeRecord(Type);
229     if (auto E = Hash.takeError())
230       fatal("type hashing error");
231     TpiBuilder.addTypeRecord(Type.RecordData, *Hash);
232   });
233 }
234 
235 static Optional<TypeServer2Record>
236 maybeReadTypeServerRecord(CVTypeArray &Types) {
237   auto I = Types.begin();
238   if (I == Types.end())
239     return None;
240   const CVType &Type = *I;
241   if (Type.kind() != LF_TYPESERVER2)
242     return None;
243   TypeServer2Record TS;
244   if (auto EC = TypeDeserializer::deserializeAs(const_cast<CVType &>(Type), TS))
245     fatal("error reading type server record: " + toString(std::move(EC)));
246   return std::move(TS);
247 }
248 
249 Expected<const CVIndexMap&> PDBLinker::mergeDebugT(ObjFile *File,
250                                                    CVIndexMap &ObjectIndexMap) {
251   ScopedTimer T(TypeMergingTimer);
252 
253   ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
254   if (Data.empty())
255     return ObjectIndexMap;
256 
257   BinaryByteStream Stream(Data, support::little);
258   CVTypeArray Types;
259   BinaryStreamReader Reader(Stream);
260   if (auto EC = Reader.readArray(Types, Reader.getLength()))
261     fatal("Reader::readArray failed: " + toString(std::move(EC)));
262 
263   // Look through type servers. If we've already seen this type server, don't
264   // merge any type information.
265   if (Optional<TypeServer2Record> TS = maybeReadTypeServerRecord(Types))
266     return maybeMergeTypeServerPDB(File, *TS);
267 
268   // This is a /Z7 object. Fill in the temporary, caller-provided
269   // ObjectIndexMap.
270   if (Config->DebugGHashes) {
271     ArrayRef<GloballyHashedType> Hashes;
272     std::vector<GloballyHashedType> OwnedHashes;
273     if (Optional<ArrayRef<uint8_t>> DebugH = getDebugH(File))
274       Hashes = getHashesFromDebugH(*DebugH);
275     else {
276       OwnedHashes = GloballyHashedType::hashTypes(Types);
277       Hashes = OwnedHashes;
278     }
279 
280     if (auto Err = mergeTypeAndIdRecords(GlobalIDTable, GlobalTypeTable,
281                                          ObjectIndexMap.TPIMap, Types, Hashes))
282       fatal("codeview::mergeTypeAndIdRecords failed: " +
283             toString(std::move(Err)));
284   } else {
285     if (auto Err = mergeTypeAndIdRecords(IDTable, TypeTable,
286                                          ObjectIndexMap.TPIMap, Types))
287       fatal("codeview::mergeTypeAndIdRecords failed: " +
288             toString(std::move(Err)));
289   }
290   return ObjectIndexMap;
291 }
292 
293 static Expected<std::unique_ptr<pdb::NativeSession>>
294 tryToLoadPDB(const GUID &GuidFromObj, StringRef TSPath) {
295   ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(
296       TSPath, /*FileSize=*/-1, /*RequiresNullTerminator=*/false);
297   if (!MBOrErr)
298     return errorCodeToError(MBOrErr.getError());
299 
300   std::unique_ptr<pdb::IPDBSession> ThisSession;
301   if (auto EC = pdb::NativeSession::createFromPdb(
302           MemoryBuffer::getMemBuffer(Driver->takeBuffer(std::move(*MBOrErr)),
303                                      /*RequiresNullTerminator=*/false),
304           ThisSession))
305     return std::move(EC);
306 
307   std::unique_ptr<pdb::NativeSession> NS(
308       static_cast<pdb::NativeSession *>(ThisSession.release()));
309   pdb::PDBFile &File = NS->getPDBFile();
310   auto ExpectedInfo = File.getPDBInfoStream();
311   // All PDB Files should have an Info stream.
312   if (!ExpectedInfo)
313     return ExpectedInfo.takeError();
314 
315   // Just because a file with a matching name was found and it was an actual
316   // PDB file doesn't mean it matches.  For it to match the InfoStream's GUID
317   // must match the GUID specified in the TypeServer2 record.
318   if (ExpectedInfo->getGuid() != GuidFromObj)
319     return make_error<pdb::GenericError>(
320         pdb::generic_error_code::type_server_not_found, TSPath);
321 
322   return std::move(NS);
323 }
324 
325 Expected<const CVIndexMap&> PDBLinker::maybeMergeTypeServerPDB(ObjFile *File,
326                                                                TypeServer2Record &TS) {
327   const GUID& TSId = TS.getGuid();
328   StringRef TSPath = TS.getName();
329 
330   // First, check if the PDB has previously failed to load.
331   if (MissingTypeServerPDBs.count(TSId))
332     return make_error<pdb::GenericError>(
333       pdb::generic_error_code::type_server_not_found, TSPath);
334 
335   // Second, check if we already loaded a PDB with this GUID. Return the type
336   // index mapping if we have it.
337   auto Insertion = TypeServerIndexMappings.insert({TSId, CVIndexMap()});
338   CVIndexMap &IndexMap = Insertion.first->second;
339   if (!Insertion.second)
340     return IndexMap;
341 
342   // Mark this map as a type server map.
343   IndexMap.IsTypeServerMap = true;
344 
345   // Check for a PDB at:
346   // 1. The given file path
347   // 2. Next to the object file or archive file
348   auto ExpectedSession = tryToLoadPDB(TSId, TSPath);
349   if (!ExpectedSession) {
350     consumeError(ExpectedSession.takeError());
351     StringRef LocalPath =
352         !File->ParentName.empty() ? File->ParentName : File->getName();
353     SmallString<128> Path = sys::path::parent_path(LocalPath);
354     sys::path::append(
355         Path, sys::path::filename(TSPath, sys::path::Style::windows));
356     ExpectedSession = tryToLoadPDB(TSId, Path);
357   }
358   if (auto E = ExpectedSession.takeError()) {
359     TypeServerIndexMappings.erase(TSId);
360     MissingTypeServerPDBs.emplace(TSId);
361     return std::move(E);
362   }
363 
364   auto ExpectedTpi = (*ExpectedSession)->getPDBFile().getPDBTpiStream();
365   if (auto E = ExpectedTpi.takeError())
366     fatal("Type server does not have TPI stream: " + toString(std::move(E)));
367   auto ExpectedIpi = (*ExpectedSession)->getPDBFile().getPDBIpiStream();
368   if (auto E = ExpectedIpi.takeError())
369     fatal("Type server does not have TPI stream: " + toString(std::move(E)));
370 
371   if (Config->DebugGHashes) {
372     // PDBs do not actually store global hashes, so when merging a type server
373     // PDB we have to synthesize global hashes.  To do this, we first synthesize
374     // global hashes for the TPI stream, since it is independent, then we
375     // synthesize hashes for the IPI stream, using the hashes for the TPI stream
376     // as inputs.
377     auto TpiHashes = GloballyHashedType::hashTypes(ExpectedTpi->typeArray());
378     auto IpiHashes =
379         GloballyHashedType::hashIds(ExpectedIpi->typeArray(), TpiHashes);
380 
381     // Merge TPI first, because the IPI stream will reference type indices.
382     if (auto Err = mergeTypeRecords(GlobalTypeTable, IndexMap.TPIMap,
383                                     ExpectedTpi->typeArray(), TpiHashes))
384       fatal("codeview::mergeTypeRecords failed: " + toString(std::move(Err)));
385 
386     // Merge IPI.
387     if (auto Err =
388             mergeIdRecords(GlobalIDTable, IndexMap.TPIMap, IndexMap.IPIMap,
389                            ExpectedIpi->typeArray(), IpiHashes))
390       fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
391   } else {
392     // Merge TPI first, because the IPI stream will reference type indices.
393     if (auto Err = mergeTypeRecords(TypeTable, IndexMap.TPIMap,
394                                     ExpectedTpi->typeArray()))
395       fatal("codeview::mergeTypeRecords failed: " + toString(std::move(Err)));
396 
397     // Merge IPI.
398     if (auto Err = mergeIdRecords(IDTable, IndexMap.TPIMap, IndexMap.IPIMap,
399                                   ExpectedIpi->typeArray()))
400       fatal("codeview::mergeIdRecords failed: " + toString(std::move(Err)));
401   }
402 
403   return IndexMap;
404 }
405 
406 static bool remapTypeIndex(TypeIndex &TI, ArrayRef<TypeIndex> TypeIndexMap) {
407   if (TI.isSimple())
408     return true;
409   if (TI.toArrayIndex() >= TypeIndexMap.size())
410     return false;
411   TI = TypeIndexMap[TI.toArrayIndex()];
412   return true;
413 }
414 
415 static void remapTypesInSymbolRecord(ObjFile *File, SymbolKind SymKind,
416                                      MutableArrayRef<uint8_t> Contents,
417                                      const CVIndexMap &IndexMap,
418                                      ArrayRef<TiReference> TypeRefs) {
419   for (const TiReference &Ref : TypeRefs) {
420     unsigned ByteSize = Ref.Count * sizeof(TypeIndex);
421     if (Contents.size() < Ref.Offset + ByteSize)
422       fatal("symbol record too short");
423 
424     // This can be an item index or a type index. Choose the appropriate map.
425     ArrayRef<TypeIndex> TypeOrItemMap = IndexMap.TPIMap;
426     bool IsItemIndex = Ref.Kind == TiRefKind::IndexRef;
427     if (IsItemIndex && IndexMap.IsTypeServerMap)
428       TypeOrItemMap = IndexMap.IPIMap;
429 
430     MutableArrayRef<TypeIndex> TIs(
431         reinterpret_cast<TypeIndex *>(Contents.data() + Ref.Offset), Ref.Count);
432     for (TypeIndex &TI : TIs) {
433       if (!remapTypeIndex(TI, TypeOrItemMap)) {
434         log("ignoring symbol record of kind 0x" + utohexstr(SymKind) + " in " +
435             File->getName() + " with bad " + (IsItemIndex ? "item" : "type") +
436             " index 0x" + utohexstr(TI.getIndex()));
437         TI = TypeIndex(SimpleTypeKind::NotTranslated);
438         continue;
439       }
440     }
441   }
442 }
443 
444 static void
445 recordStringTableReferenceAtOffset(MutableArrayRef<uint8_t> Contents,
446                                    uint32_t Offset,
447                                    std::vector<ulittle32_t *> &StrTableRefs) {
448   Contents =
449       Contents.drop_front(Offset).take_front(sizeof(support::ulittle32_t));
450   ulittle32_t *Index = reinterpret_cast<ulittle32_t *>(Contents.data());
451   StrTableRefs.push_back(Index);
452 }
453 
454 static void
455 recordStringTableReferences(SymbolKind Kind, MutableArrayRef<uint8_t> Contents,
456                             std::vector<ulittle32_t *> &StrTableRefs) {
457   // For now we only handle S_FILESTATIC, but we may need the same logic for
458   // S_DEFRANGE and S_DEFRANGE_SUBFIELD.  However, I cannot seem to generate any
459   // PDBs that contain these types of records, so because of the uncertainty
460   // they are omitted here until we can prove that it's necessary.
461   switch (Kind) {
462   case SymbolKind::S_FILESTATIC:
463     // FileStaticSym::ModFileOffset
464     recordStringTableReferenceAtOffset(Contents, 4, StrTableRefs);
465     break;
466   case SymbolKind::S_DEFRANGE:
467   case SymbolKind::S_DEFRANGE_SUBFIELD:
468     log("Not fixing up string table reference in S_DEFRANGE / "
469         "S_DEFRANGE_SUBFIELD record");
470     break;
471   default:
472     break;
473   }
474 }
475 
476 static SymbolKind symbolKind(ArrayRef<uint8_t> RecordData) {
477   const RecordPrefix *Prefix =
478       reinterpret_cast<const RecordPrefix *>(RecordData.data());
479   return static_cast<SymbolKind>(uint16_t(Prefix->RecordKind));
480 }
481 
482 /// MSVC translates S_PROC_ID_END to S_END, and S_[LG]PROC32_ID to S_[LG]PROC32
483 static void translateIdSymbols(MutableArrayRef<uint8_t> &RecordData,
484                                TypeCollection &IDTable) {
485   RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(RecordData.data());
486 
487   SymbolKind Kind = symbolKind(RecordData);
488 
489   if (Kind == SymbolKind::S_PROC_ID_END) {
490     Prefix->RecordKind = SymbolKind::S_END;
491     return;
492   }
493 
494   // In an object file, GPROC32_ID has an embedded reference which refers to the
495   // single object file type index namespace.  This has already been translated
496   // to the PDB file's ID stream index space, but we need to convert this to a
497   // symbol that refers to the type stream index space.  So we remap again from
498   // ID index space to type index space.
499   if (Kind == SymbolKind::S_GPROC32_ID || Kind == SymbolKind::S_LPROC32_ID) {
500     SmallVector<TiReference, 1> Refs;
501     auto Content = RecordData.drop_front(sizeof(RecordPrefix));
502     CVSymbol Sym(Kind, RecordData);
503     discoverTypeIndicesInSymbol(Sym, Refs);
504     assert(Refs.size() == 1);
505     assert(Refs.front().Count == 1);
506 
507     TypeIndex *TI =
508         reinterpret_cast<TypeIndex *>(Content.data() + Refs[0].Offset);
509     // `TI` is the index of a FuncIdRecord or MemberFuncIdRecord which lives in
510     // the IPI stream, whose `FunctionType` member refers to the TPI stream.
511     // Note that LF_FUNC_ID and LF_MEMFUNC_ID have the same record layout, and
512     // in both cases we just need the second type index.
513     if (!TI->isSimple() && !TI->isNoneType()) {
514       CVType FuncIdData = IDTable.getType(*TI);
515       SmallVector<TypeIndex, 2> Indices;
516       discoverTypeIndices(FuncIdData, Indices);
517       assert(Indices.size() == 2);
518       *TI = Indices[1];
519     }
520 
521     Kind = (Kind == SymbolKind::S_GPROC32_ID) ? SymbolKind::S_GPROC32
522                                               : SymbolKind::S_LPROC32;
523     Prefix->RecordKind = uint16_t(Kind);
524   }
525 }
526 
527 /// Copy the symbol record. In a PDB, symbol records must be 4 byte aligned.
528 /// The object file may not be aligned.
529 static MutableArrayRef<uint8_t> copySymbolForPdb(const CVSymbol &Sym,
530                                                  BumpPtrAllocator &Alloc) {
531   size_t Size = alignTo(Sym.length(), alignOf(CodeViewContainer::Pdb));
532   assert(Size >= 4 && "record too short");
533   assert(Size <= MaxRecordLength && "record too long");
534   void *Mem = Alloc.Allocate(Size, 4);
535 
536   // Copy the symbol record and zero out any padding bytes.
537   MutableArrayRef<uint8_t> NewData(reinterpret_cast<uint8_t *>(Mem), Size);
538   memcpy(NewData.data(), Sym.data().data(), Sym.length());
539   memset(NewData.data() + Sym.length(), 0, Size - Sym.length());
540 
541   // Update the record prefix length. It should point to the beginning of the
542   // next record.
543   auto *Prefix = reinterpret_cast<RecordPrefix *>(Mem);
544   Prefix->RecordLen = Size - 2;
545   return NewData;
546 }
547 
548 /// Return true if this symbol opens a scope. This implies that the symbol has
549 /// "parent" and "end" fields, which contain the offset of the S_END or
550 /// S_INLINESITE_END record.
551 static bool symbolOpensScope(SymbolKind Kind) {
552   switch (Kind) {
553   case SymbolKind::S_GPROC32:
554   case SymbolKind::S_LPROC32:
555   case SymbolKind::S_LPROC32_ID:
556   case SymbolKind::S_GPROC32_ID:
557   case SymbolKind::S_BLOCK32:
558   case SymbolKind::S_SEPCODE:
559   case SymbolKind::S_THUNK32:
560   case SymbolKind::S_INLINESITE:
561   case SymbolKind::S_INLINESITE2:
562     return true;
563   default:
564     break;
565   }
566   return false;
567 }
568 
569 static bool symbolEndsScope(SymbolKind Kind) {
570   switch (Kind) {
571   case SymbolKind::S_END:
572   case SymbolKind::S_PROC_ID_END:
573   case SymbolKind::S_INLINESITE_END:
574     return true;
575   default:
576     break;
577   }
578   return false;
579 }
580 
581 struct ScopeRecord {
582   ulittle32_t PtrParent;
583   ulittle32_t PtrEnd;
584 };
585 
586 struct SymbolScope {
587   ScopeRecord *OpeningRecord;
588   uint32_t ScopeOffset;
589 };
590 
591 static void scopeStackOpen(SmallVectorImpl<SymbolScope> &Stack,
592                            uint32_t CurOffset, CVSymbol &Sym) {
593   assert(symbolOpensScope(Sym.kind()));
594   SymbolScope S;
595   S.ScopeOffset = CurOffset;
596   S.OpeningRecord = const_cast<ScopeRecord *>(
597       reinterpret_cast<const ScopeRecord *>(Sym.content().data()));
598   S.OpeningRecord->PtrParent = Stack.empty() ? 0 : Stack.back().ScopeOffset;
599   Stack.push_back(S);
600 }
601 
602 static void scopeStackClose(SmallVectorImpl<SymbolScope> &Stack,
603                             uint32_t CurOffset, ObjFile *File) {
604   if (Stack.empty()) {
605     warn("symbol scopes are not balanced in " + File->getName());
606     return;
607   }
608   SymbolScope S = Stack.pop_back_val();
609   S.OpeningRecord->PtrEnd = CurOffset;
610 }
611 
612 static bool symbolGoesInModuleStream(const CVSymbol &Sym) {
613   switch (Sym.kind()) {
614   case SymbolKind::S_GDATA32:
615   case SymbolKind::S_CONSTANT:
616   case SymbolKind::S_UDT:
617   // We really should not be seeing S_PROCREF and S_LPROCREF in the first place
618   // since they are synthesized by the linker in response to S_GPROC32 and
619   // S_LPROC32, but if we do see them, don't put them in the module stream I
620   // guess.
621   case SymbolKind::S_PROCREF:
622   case SymbolKind::S_LPROCREF:
623     return false;
624   // S_GDATA32 does not go in the module stream, but S_LDATA32 does.
625   case SymbolKind::S_LDATA32:
626   default:
627     return true;
628   }
629 }
630 
631 static bool symbolGoesInGlobalsStream(const CVSymbol &Sym) {
632   switch (Sym.kind()) {
633   case SymbolKind::S_CONSTANT:
634   case SymbolKind::S_GDATA32:
635   // S_LDATA32 goes in both the module stream and the globals stream.
636   case SymbolKind::S_LDATA32:
637   case SymbolKind::S_GPROC32:
638   case SymbolKind::S_LPROC32:
639   // We really should not be seeing S_PROCREF and S_LPROCREF in the first place
640   // since they are synthesized by the linker in response to S_GPROC32 and
641   // S_LPROC32, but if we do see them, copy them straight through.
642   case SymbolKind::S_PROCREF:
643   case SymbolKind::S_LPROCREF:
644     return true;
645   // FIXME: For now, we drop all S_UDT symbols (i.e. they don't go in the
646   // globals stream or the modules stream).  These have special handling which
647   // needs more investigation before we can get right, but by putting them all
648   // into the globals stream WinDbg fails to display local variables of class
649   // types saying that it cannot find the type Foo *.  So as a stopgap just to
650   // keep things working, we drop them.
651   case SymbolKind::S_UDT:
652   default:
653     return false;
654   }
655 }
656 
657 static void addGlobalSymbol(pdb::GSIStreamBuilder &Builder, ObjFile &File,
658                             const CVSymbol &Sym) {
659   switch (Sym.kind()) {
660   case SymbolKind::S_CONSTANT:
661   case SymbolKind::S_UDT:
662   case SymbolKind::S_GDATA32:
663   case SymbolKind::S_LDATA32:
664   case SymbolKind::S_PROCREF:
665   case SymbolKind::S_LPROCREF:
666     Builder.addGlobalSymbol(Sym);
667     break;
668   case SymbolKind::S_GPROC32:
669   case SymbolKind::S_LPROC32: {
670     SymbolRecordKind K = SymbolRecordKind::ProcRefSym;
671     if (Sym.kind() == SymbolKind::S_LPROC32)
672       K = SymbolRecordKind::LocalProcRef;
673     ProcRefSym PS(K);
674     PS.Module = static_cast<uint16_t>(File.ModuleDBI->getModuleIndex());
675     // For some reason, MSVC seems to add one to this value.
676     ++PS.Module;
677     PS.Name = getSymbolName(Sym);
678     PS.SumName = 0;
679     PS.SymOffset = File.ModuleDBI->getNextSymbolOffset();
680     Builder.addGlobalSymbol(PS);
681     break;
682   }
683   default:
684     llvm_unreachable("Invalid symbol kind!");
685   }
686 }
687 
688 static void mergeSymbolRecords(BumpPtrAllocator &Alloc, ObjFile *File,
689                                pdb::GSIStreamBuilder &GsiBuilder,
690                                const CVIndexMap &IndexMap,
691                                TypeCollection &IDTable,
692                                std::vector<ulittle32_t *> &StringTableRefs,
693                                BinaryStreamRef SymData) {
694   // FIXME: Improve error recovery by warning and skipping records when
695   // possible.
696   ArrayRef<uint8_t> SymsBuffer;
697   cantFail(SymData.readBytes(0, SymData.getLength(), SymsBuffer));
698   SmallVector<SymbolScope, 4> Scopes;
699 
700   auto EC = forEachCodeViewRecord<CVSymbol>(
701       SymsBuffer, [&](const CVSymbol &Sym) -> llvm::Error {
702         // Discover type index references in the record. Skip it if we don't
703         // know where they are.
704         SmallVector<TiReference, 32> TypeRefs;
705         if (!discoverTypeIndicesInSymbol(Sym, TypeRefs)) {
706           log("ignoring unknown symbol record with kind 0x" +
707               utohexstr(Sym.kind()));
708           return Error::success();
709         }
710 
711         // Copy the symbol record so we can mutate it.
712         MutableArrayRef<uint8_t> NewData = copySymbolForPdb(Sym, Alloc);
713 
714         // Re-map all the type index references.
715         MutableArrayRef<uint8_t> Contents =
716             NewData.drop_front(sizeof(RecordPrefix));
717         remapTypesInSymbolRecord(File, Sym.kind(), Contents, IndexMap,
718                                  TypeRefs);
719 
720         // An object file may have S_xxx_ID symbols, but these get converted to
721         // "real" symbols in a PDB.
722         translateIdSymbols(NewData, IDTable);
723 
724         // If this record refers to an offset in the object file's string table,
725         // add that item to the global PDB string table and re-write the index.
726         recordStringTableReferences(Sym.kind(), Contents, StringTableRefs);
727 
728         SymbolKind NewKind = symbolKind(NewData);
729 
730         // Fill in "Parent" and "End" fields by maintaining a stack of scopes.
731         CVSymbol NewSym(NewKind, NewData);
732         if (symbolOpensScope(NewKind))
733           scopeStackOpen(Scopes, File->ModuleDBI->getNextSymbolOffset(),
734                          NewSym);
735         else if (symbolEndsScope(NewKind))
736           scopeStackClose(Scopes, File->ModuleDBI->getNextSymbolOffset(), File);
737 
738         // Add the symbol to the globals stream if necessary.  Do this before
739         // adding the symbol to the module since we may need to get the next
740         // symbol offset, and writing to the module's symbol stream will update
741         // that offset.
742         if (symbolGoesInGlobalsStream(NewSym))
743           addGlobalSymbol(GsiBuilder, *File, NewSym);
744 
745         // Add the symbol to the module.
746         if (symbolGoesInModuleStream(NewSym))
747           File->ModuleDBI->addSymbol(NewSym);
748         return Error::success();
749       });
750   cantFail(std::move(EC));
751 }
752 
753 // Allocate memory for a .debug$S section and relocate it.
754 static ArrayRef<uint8_t> relocateDebugChunk(BumpPtrAllocator &Alloc,
755                                             SectionChunk *DebugChunk) {
756   uint8_t *Buffer = Alloc.Allocate<uint8_t>(DebugChunk->getSize());
757   assert(DebugChunk->OutputSectionOff == 0 &&
758          "debug sections should not be in output sections");
759   DebugChunk->writeTo(Buffer);
760   return consumeDebugMagic(makeArrayRef(Buffer, DebugChunk->getSize()),
761                            ".debug$S");
762 }
763 
764 void PDBLinker::addObjFile(ObjFile *File) {
765   // Add a module descriptor for every object file. We need to put an absolute
766   // path to the object into the PDB. If this is a plain object, we make its
767   // path absolute. If it's an object in an archive, we make the archive path
768   // absolute.
769   bool InArchive = !File->ParentName.empty();
770   SmallString<128> Path = InArchive ? File->ParentName : File->getName();
771   sys::fs::make_absolute(Path);
772   sys::path::native(Path, sys::path::Style::windows);
773   StringRef Name = InArchive ? File->getName() : StringRef(Path);
774 
775   File->ModuleDBI = &ExitOnErr(Builder.getDbiBuilder().addModuleInfo(Name));
776   File->ModuleDBI->setObjFileName(Path);
777 
778   // Before we can process symbol substreams from .debug$S, we need to process
779   // type information, file checksums, and the string table.  Add type info to
780   // the PDB first, so that we can get the map from object file type and item
781   // indices to PDB type and item indices.
782   CVIndexMap ObjectIndexMap;
783   auto IndexMapResult = mergeDebugT(File, ObjectIndexMap);
784 
785   // If the .debug$T sections fail to merge, assume there is no debug info.
786   if (!IndexMapResult) {
787     warn("Type server PDB for " + Name + " is invalid, ignoring debug info. " +
788          toString(IndexMapResult.takeError()));
789     return;
790   }
791 
792   const CVIndexMap &IndexMap = *IndexMapResult;
793 
794   ScopedTimer T(SymbolMergingTimer);
795 
796   // Now do all live .debug$S sections.
797   DebugStringTableSubsectionRef CVStrTab;
798   DebugChecksumsSubsectionRef Checksums;
799   std::vector<ulittle32_t *> StringTableReferences;
800   for (SectionChunk *DebugChunk : File->getDebugChunks()) {
801     if (!DebugChunk->isLive() || DebugChunk->getSectionName() != ".debug$S")
802       continue;
803 
804     ArrayRef<uint8_t> RelocatedDebugContents =
805         relocateDebugChunk(Alloc, DebugChunk);
806     if (RelocatedDebugContents.empty())
807       continue;
808 
809     DebugSubsectionArray Subsections;
810     BinaryStreamReader Reader(RelocatedDebugContents, support::little);
811     ExitOnErr(Reader.readArray(Subsections, RelocatedDebugContents.size()));
812 
813     for (const DebugSubsectionRecord &SS : Subsections) {
814       switch (SS.kind()) {
815       case DebugSubsectionKind::StringTable: {
816         auto Data = SS.getRecordData();
817         ArrayRef<uint8_t> Buffer;
818         cantFail(Data.readLongestContiguousChunk(0, Buffer));
819         assert(!CVStrTab.valid() &&
820                "Encountered multiple string table subsections!");
821         ExitOnErr(CVStrTab.initialize(SS.getRecordData()));
822         break;
823       }
824       case DebugSubsectionKind::FileChecksums:
825         assert(!Checksums.valid() &&
826                "Encountered multiple checksum subsections!");
827         ExitOnErr(Checksums.initialize(SS.getRecordData()));
828         break;
829       case DebugSubsectionKind::Lines:
830         // We can add the relocated line table directly to the PDB without
831         // modification because the file checksum offsets will stay the same.
832         File->ModuleDBI->addDebugSubsection(SS);
833         break;
834       case DebugSubsectionKind::Symbols:
835         if (Config->DebugGHashes) {
836           mergeSymbolRecords(Alloc, File, Builder.getGsiBuilder(), IndexMap,
837                              GlobalIDTable, StringTableReferences,
838                              SS.getRecordData());
839         } else {
840           mergeSymbolRecords(Alloc, File, Builder.getGsiBuilder(), IndexMap,
841                              IDTable, StringTableReferences,
842                              SS.getRecordData());
843         }
844         break;
845       default:
846         // FIXME: Process the rest of the subsections.
847         break;
848       }
849     }
850   }
851 
852   // We should have seen all debug subsections across the entire object file now
853   // which means that if a StringTable subsection and Checksums subsection were
854   // present, now is the time to handle them.
855   if (!CVStrTab.valid()) {
856     if (Checksums.valid())
857       fatal(".debug$S sections with a checksums subsection must also contain a "
858             "string table subsection");
859 
860     if (!StringTableReferences.empty())
861       warn("No StringTable subsection was encountered, but there are string "
862            "table references");
863     return;
864   }
865 
866   // Rewrite each string table reference based on the value that the string
867   // assumes in the final PDB.
868   for (ulittle32_t *Ref : StringTableReferences) {
869     auto ExpectedString = CVStrTab.getString(*Ref);
870     if (!ExpectedString) {
871       warn("Invalid string table reference");
872       consumeError(ExpectedString.takeError());
873       continue;
874     }
875 
876     *Ref = PDBStrTab.insert(*ExpectedString);
877   }
878 
879   // Make a new file checksum table that refers to offsets in the PDB-wide
880   // string table. Generally the string table subsection appears after the
881   // checksum table, so we have to do this after looping over all the
882   // subsections.
883   auto NewChecksums = make_unique<DebugChecksumsSubsection>(PDBStrTab);
884   for (FileChecksumEntry &FC : Checksums) {
885     StringRef FileName = ExitOnErr(CVStrTab.getString(FC.FileNameOffset));
886     ExitOnErr(Builder.getDbiBuilder().addModuleSourceFile(*File->ModuleDBI,
887                                                           FileName));
888     NewChecksums->addChecksum(FileName, FC.Kind, FC.Checksum);
889   }
890   File->ModuleDBI->addDebugSubsection(std::move(NewChecksums));
891 }
892 
893 static PublicSym32 createPublic(Defined *Def) {
894   PublicSym32 Pub(SymbolKind::S_PUB32);
895   Pub.Name = Def->getName();
896   if (auto *D = dyn_cast<DefinedCOFF>(Def)) {
897     if (D->getCOFFSymbol().isFunctionDefinition())
898       Pub.Flags = PublicSymFlags::Function;
899   } else if (isa<DefinedImportThunk>(Def)) {
900     Pub.Flags = PublicSymFlags::Function;
901   }
902 
903   OutputSection *OS = Def->getChunk()->getOutputSection();
904   assert(OS && "all publics should be in final image");
905   Pub.Offset = Def->getRVA() - OS->getRVA();
906   Pub.Segment = OS->SectionIndex;
907   return Pub;
908 }
909 
910 // Add all object files to the PDB. Merge .debug$T sections into IpiData and
911 // TpiData.
912 void PDBLinker::addObjectsToPDB() {
913   ScopedTimer T1(AddObjectsTimer);
914   for (ObjFile *File : ObjFile::Instances)
915     addObjFile(File);
916 
917   Builder.getStringTableBuilder().setStrings(PDBStrTab);
918   T1.stop();
919 
920   // Construct TPI and IPI stream contents.
921   ScopedTimer T2(TpiStreamLayoutTimer);
922   if (Config->DebugGHashes) {
923     addTypeInfo(Builder.getTpiBuilder(), GlobalTypeTable);
924     addTypeInfo(Builder.getIpiBuilder(), GlobalIDTable);
925   } else {
926     addTypeInfo(Builder.getTpiBuilder(), TypeTable);
927     addTypeInfo(Builder.getIpiBuilder(), IDTable);
928   }
929   T2.stop();
930 
931   ScopedTimer T3(GlobalsLayoutTimer);
932   // Compute the public and global symbols.
933   auto &GsiBuilder = Builder.getGsiBuilder();
934   std::vector<PublicSym32> Publics;
935   Symtab->forEachSymbol([&Publics](Symbol *S) {
936     // Only emit defined, live symbols that have a chunk.
937     auto *Def = dyn_cast<Defined>(S);
938     if (Def && Def->isLive() && Def->getChunk())
939       Publics.push_back(createPublic(Def));
940   });
941 
942   if (!Publics.empty()) {
943     // Sort the public symbols and add them to the stream.
944     std::sort(Publics.begin(), Publics.end(),
945               [](const PublicSym32 &L, const PublicSym32 &R) {
946                 return L.Name < R.Name;
947               });
948     for (const PublicSym32 &Pub : Publics)
949       GsiBuilder.addPublicSymbol(Pub);
950   }
951 }
952 
953 static void addCommonLinkerModuleSymbols(StringRef Path,
954                                          pdb::DbiModuleDescriptorBuilder &Mod,
955                                          BumpPtrAllocator &Allocator) {
956   ObjNameSym ONS(SymbolRecordKind::ObjNameSym);
957   Compile3Sym CS(SymbolRecordKind::Compile3Sym);
958   EnvBlockSym EBS(SymbolRecordKind::EnvBlockSym);
959 
960   ONS.Name = "* Linker *";
961   ONS.Signature = 0;
962 
963   CS.Machine = Config->is64() ? CPUType::X64 : CPUType::Intel80386;
964   // Interestingly, if we set the string to 0.0.0.0, then when trying to view
965   // local variables WinDbg emits an error that private symbols are not present.
966   // By setting this to a valid MSVC linker version string, local variables are
967   // displayed properly.   As such, even though it is not representative of
968   // LLVM's version information, we need this for compatibility.
969   CS.Flags = CompileSym3Flags::None;
970   CS.VersionBackendBuild = 25019;
971   CS.VersionBackendMajor = 14;
972   CS.VersionBackendMinor = 10;
973   CS.VersionBackendQFE = 0;
974 
975   // MSVC also sets the frontend to 0.0.0.0 since this is specifically for the
976   // linker module (which is by definition a backend), so we don't need to do
977   // anything here.  Also, it seems we can use "LLVM Linker" for the linker name
978   // without any problems.  Only the backend version has to be hardcoded to a
979   // magic number.
980   CS.VersionFrontendBuild = 0;
981   CS.VersionFrontendMajor = 0;
982   CS.VersionFrontendMinor = 0;
983   CS.VersionFrontendQFE = 0;
984   CS.Version = "LLVM Linker";
985   CS.setLanguage(SourceLanguage::Link);
986 
987   ArrayRef<StringRef> Args = makeArrayRef(Config->Argv).drop_front();
988   std::string ArgStr = llvm::join(Args, " ");
989   EBS.Fields.push_back("cwd");
990   SmallString<64> cwd;
991   sys::fs::current_path(cwd);
992   EBS.Fields.push_back(cwd);
993   EBS.Fields.push_back("exe");
994   SmallString<64> exe = Config->Argv[0];
995   llvm::sys::fs::make_absolute(exe);
996   EBS.Fields.push_back(exe);
997   EBS.Fields.push_back("pdb");
998   EBS.Fields.push_back(Path);
999   EBS.Fields.push_back("cmd");
1000   EBS.Fields.push_back(ArgStr);
1001   Mod.addSymbol(codeview::SymbolSerializer::writeOneSymbol(
1002       ONS, Allocator, CodeViewContainer::Pdb));
1003   Mod.addSymbol(codeview::SymbolSerializer::writeOneSymbol(
1004       CS, Allocator, CodeViewContainer::Pdb));
1005   Mod.addSymbol(codeview::SymbolSerializer::writeOneSymbol(
1006       EBS, Allocator, CodeViewContainer::Pdb));
1007 }
1008 
1009 static void addLinkerModuleSectionSymbol(pdb::DbiModuleDescriptorBuilder &Mod,
1010                                          OutputSection &OS,
1011                                          BumpPtrAllocator &Allocator) {
1012   SectionSym Sym(SymbolRecordKind::SectionSym);
1013   Sym.Alignment = 12; // 2^12 = 4KB
1014   Sym.Characteristics = OS.getCharacteristics();
1015   Sym.Length = OS.getVirtualSize();
1016   Sym.Name = OS.getName();
1017   Sym.Rva = OS.getRVA();
1018   Sym.SectionNumber = OS.SectionIndex;
1019   Mod.addSymbol(codeview::SymbolSerializer::writeOneSymbol(
1020       Sym, Allocator, CodeViewContainer::Pdb));
1021 }
1022 
1023 // Creates a PDB file.
1024 void coff::createPDB(SymbolTable *Symtab,
1025                      ArrayRef<OutputSection *> OutputSections,
1026                      ArrayRef<uint8_t> SectionTable,
1027                      const llvm::codeview::DebugInfo &BuildId) {
1028   ScopedTimer T1(TotalPdbLinkTimer);
1029   PDBLinker PDB(Symtab);
1030   PDB.initialize(BuildId);
1031   PDB.addObjectsToPDB();
1032   PDB.addSections(OutputSections, SectionTable);
1033 
1034   ScopedTimer T2(DiskCommitTimer);
1035   PDB.commit();
1036 }
1037 
1038 void PDBLinker::initialize(const llvm::codeview::DebugInfo &BuildId) {
1039   ExitOnErr(Builder.initialize(4096)); // 4096 is blocksize
1040 
1041   // Create streams in MSF for predefined streams, namely
1042   // PDB, TPI, DBI and IPI.
1043   for (int I = 0; I < (int)pdb::kSpecialStreamCount; ++I)
1044     ExitOnErr(Builder.getMsfBuilder().addStream(0));
1045 
1046   // Add an Info stream.
1047   auto &InfoBuilder = Builder.getInfoBuilder();
1048   InfoBuilder.setAge(BuildId.PDB70.Age);
1049 
1050   GUID uuid;
1051   memcpy(&uuid, &BuildId.PDB70.Signature, sizeof(uuid));
1052   InfoBuilder.setGuid(uuid);
1053   InfoBuilder.setSignature(time(nullptr));
1054   InfoBuilder.setVersion(pdb::PdbRaw_ImplVer::PdbImplVC70);
1055 
1056   // Add an empty DBI stream.
1057   pdb::DbiStreamBuilder &DbiBuilder = Builder.getDbiBuilder();
1058   DbiBuilder.setAge(BuildId.PDB70.Age);
1059   DbiBuilder.setVersionHeader(pdb::PdbDbiV70);
1060   ExitOnErr(DbiBuilder.addDbgStream(pdb::DbgHeaderType::NewFPO, {}));
1061 }
1062 
1063 void PDBLinker::addSectionContrib(pdb::DbiModuleDescriptorBuilder &LinkerModule,
1064                                   OutputSection *OS, Chunk *C) {
1065   pdb::SectionContrib SC;
1066   memset(&SC, 0, sizeof(SC));
1067   SC.ISect = OS->SectionIndex;
1068   SC.Off = C->getRVA() - OS->getRVA();
1069   SC.Size = C->getSize();
1070   if (auto *SecChunk = dyn_cast<SectionChunk>(C)) {
1071     SC.Characteristics = SecChunk->Header->Characteristics;
1072     SC.Imod = SecChunk->File->ModuleDBI->getModuleIndex();
1073     ArrayRef<uint8_t> Contents = SecChunk->getContents();
1074     JamCRC CRC(0);
1075     ArrayRef<char> CharContents = makeArrayRef(
1076         reinterpret_cast<const char *>(Contents.data()), Contents.size());
1077     CRC.update(CharContents);
1078     SC.DataCrc = CRC.getCRC();
1079   } else {
1080     SC.Characteristics = OS->getCharacteristics();
1081     // FIXME: When we start creating DBI for import libraries, use those here.
1082     SC.Imod = LinkerModule.getModuleIndex();
1083   }
1084   SC.RelocCrc = 0; // FIXME
1085   Builder.getDbiBuilder().addSectionContrib(SC);
1086 }
1087 
1088 void PDBLinker::addSections(ArrayRef<OutputSection *> OutputSections,
1089                             ArrayRef<uint8_t> SectionTable) {
1090   // It's not entirely clear what this is, but the * Linker * module uses it.
1091   pdb::DbiStreamBuilder &DbiBuilder = Builder.getDbiBuilder();
1092   NativePath = Config->PDBPath;
1093   sys::fs::make_absolute(NativePath);
1094   sys::path::native(NativePath, sys::path::Style::windows);
1095   uint32_t PdbFilePathNI = DbiBuilder.addECName(NativePath);
1096   auto &LinkerModule = ExitOnErr(DbiBuilder.addModuleInfo("* Linker *"));
1097   LinkerModule.setPdbFilePathNI(PdbFilePathNI);
1098   addCommonLinkerModuleSymbols(NativePath, LinkerModule, Alloc);
1099 
1100   // Add section contributions. They must be ordered by ascending RVA.
1101   for (OutputSection *OS : OutputSections) {
1102     addLinkerModuleSectionSymbol(LinkerModule, *OS, Alloc);
1103     for (Chunk *C : OS->getChunks())
1104       addSectionContrib(LinkerModule, OS, C);
1105   }
1106 
1107   // Add Section Map stream.
1108   ArrayRef<object::coff_section> Sections = {
1109       (const object::coff_section *)SectionTable.data(),
1110       SectionTable.size() / sizeof(object::coff_section)};
1111   SectionMap = pdb::DbiStreamBuilder::createSectionMap(Sections);
1112   DbiBuilder.setSectionMap(SectionMap);
1113 
1114   // Add COFF section header stream.
1115   ExitOnErr(
1116       DbiBuilder.addDbgStream(pdb::DbgHeaderType::SectionHdr, SectionTable));
1117 }
1118 
1119 void PDBLinker::commit() {
1120   // Write to a file.
1121   ExitOnErr(Builder.commit(Config->PDBPath));
1122 }
1123