From e3fe6698559f80a79286980e6b2a4c291c5e7585 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Mon, 16 Apr 2018 18:17:13 +0000 Subject: [PATCH] Resubmit "Fix some incorrect fields in our generated PDBs." This fixes the failing tests. They simply hadn't been updated to match the new output resulting from this patch. llvm-svn: 330145 --- lld/COFF/PDB.cpp | 26 ++++++++++++++++++- lld/test/COFF/pdb-source-lines.test | 4 +-- lld/test/COFF/pdb.test | 4 +-- .../DebugInfo/PDB/Native/DbiStreamBuilder.h | 1 + .../DebugInfo/PDB/Native/DbiStreamBuilder.cpp | 10 ++++++- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp index 69c044234491..9aa4c648dbb6 100644 --- a/lld/COFF/PDB.cpp +++ b/lld/COFF/PDB.cpp @@ -978,6 +978,23 @@ void PDBLinker::addNatvisFiles() { } } +static codeview::CPUType toCodeViewMachine(COFF::MachineTypes Machine) { + switch (Machine) { + case COFF::IMAGE_FILE_MACHINE_AMD64: + return codeview::CPUType::X64; + case COFF::IMAGE_FILE_MACHINE_ARM: + return codeview::CPUType::ARM7; + case COFF::IMAGE_FILE_MACHINE_ARM64: + return codeview::CPUType::ARM64; + case COFF::IMAGE_FILE_MACHINE_ARMNT: + return codeview::CPUType::ARMNT; + case COFF::IMAGE_FILE_MACHINE_I386: + return codeview::CPUType::Intel80386; + default: + llvm_unreachable("Unsupported CPU Type"); + } +} + static void addCommonLinkerModuleSymbols(StringRef Path, pdb::DbiModuleDescriptorBuilder &Mod, BumpPtrAllocator &Allocator) { @@ -988,7 +1005,7 @@ static void addCommonLinkerModuleSymbols(StringRef Path, ONS.Name = "* Linker *"; ONS.Signature = 0; - CS.Machine = Config->is64() ? CPUType::X64 : CPUType::Intel80386; + CS.Machine = toCodeViewMachine(Config->Machine); // Interestingly, if we set the string to 0.0.0.0, then when trying to view // local variables WinDbg emits an error that private symbols are not present. // By setting this to a valid MSVC linker version string, local variables are @@ -1085,6 +1102,13 @@ void PDBLinker::initialize(const llvm::codeview::DebugInfo &BuildId) { pdb::DbiStreamBuilder &DbiBuilder = Builder.getDbiBuilder(); DbiBuilder.setAge(BuildId.PDB70.Age); DbiBuilder.setVersionHeader(pdb::PdbDbiV70); + DbiBuilder.setMachineType(Config->is64() ? pdb::PDB_Machine::Amd64 + : pdb::PDB_Machine::x86); + // Technically we are not link.exe 14.11, but there are known cases where + // debugging tools on Windows expect Microsoft-specific version numbers or + // they fail to work at all. Since we know we produce PDBs that are + // compatible with LINK 14.11, we set that version number here. + DbiBuilder.setBuildNumber(14, 11); } void PDBLinker::addSectionContrib(pdb::DbiModuleDescriptorBuilder &LinkerModule, diff --git a/lld/test/COFF/pdb-source-lines.test b/lld/test/COFF/pdb-source-lines.test index 2a90719c330f..416cab02fd26 100644 --- a/lld/test/COFF/pdb-source-lines.test +++ b/lld/test/COFF/pdb-source-lines.test @@ -26,11 +26,11 @@ RUN: llvm-pdbutil pdb2yaml -modules -module-files -subsections=lines,fc %t.pdb | CHECK-LABEL: DbiStream: CHECK-NEXT: VerHeader: V70 CHECK-NEXT: Age: 1 -CHECK-NEXT: BuildNumber: 0 +CHECK-NEXT: BuildNumber: 36363 CHECK-NEXT: PdbDllVersion: 0 CHECK-NEXT: PdbDllRbld: 0 CHECK-NEXT: Flags: 0 -CHECK-NEXT: MachineType: x86 +CHECK-NEXT: MachineType: Amd64 CHECK-NEXT: Modules: CHECK-LABEL: - Module: {{.*}}pdb_lines_1.obj diff --git a/lld/test/COFF/pdb.test b/lld/test/COFF/pdb.test index 11c2351c17e2..20629f53a063 100644 --- a/lld/test/COFF/pdb.test +++ b/lld/test/COFF/pdb.test @@ -34,11 +34,11 @@ # CHECK-NEXT: DbiStream: # CHECK-NEXT: VerHeader: V70 # CHECK-NEXT: Age: 1 -# CHECK-NEXT: BuildNumber: 0 +# CHECK-NEXT: BuildNumber: 36363 # CHECK-NEXT: PdbDllVersion: 0 # CHECK-NEXT: PdbDllRbld: 0 # CHECK-NEXT: Flags: 0 -# CHECK-NEXT: MachineType: x86 +# CHECK-NEXT: MachineType: Amd64 # CHECK-NEXT: TpiStream: # CHECK-NEXT: Version: VC80 # CHECK-NEXT: Records: diff --git a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h index daea062ca640..316be090411c 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h @@ -46,6 +46,7 @@ public: void setVersionHeader(PdbRaw_DbiVer V); void setAge(uint32_t A); void setBuildNumber(uint16_t B); + void setBuildNumber(uint8_t Major, uint8_t Minor); void setPdbDllVersion(uint16_t V); void setPdbDllRbld(uint16_t R); void setFlags(uint16_t F); diff --git a/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp index f17e0815ccf0..52886d566e76 100644 --- a/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp @@ -37,6 +37,14 @@ void DbiStreamBuilder::setAge(uint32_t A) { Age = A; } void DbiStreamBuilder::setBuildNumber(uint16_t B) { BuildNumber = B; } +void DbiStreamBuilder::setBuildNumber(uint8_t Major, uint8_t Minor) { + BuildNumber = (uint16_t(Major) << DbiBuildNo::BuildMajorShift) & + DbiBuildNo::BuildMajorMask; + BuildNumber |= (uint16_t(Minor) << DbiBuildNo::BuildMinorShift) & + DbiBuildNo::BuildMinorMask; + BuildNumber |= DbiBuildNo::NewVersionFormatMask; +} + void DbiStreamBuilder::setPdbDllVersion(uint16_t V) { PdbDllVersion = V; } void DbiStreamBuilder::setPdbDllRbld(uint16_t R) { PdbDllRbld = R; } @@ -251,7 +259,7 @@ Error DbiStreamBuilder::finalize() { H->TypeServerSize = 0; H->SymRecordStreamIndex = SymRecordStreamIndex; H->PublicSymbolStreamIndex = PublicsStreamIndex; - H->MFCTypeServerIndex = kInvalidStreamIndex; + H->MFCTypeServerIndex = 0; // Not sure what this is, but link.exe writes 0. H->GlobalSymbolStreamIndex = GlobalsStreamIndex; Header = H;