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