From f4c5323f146da3765a641d48fd2e8e1b62484a9a Mon Sep 17 00:00:00 2001 From: nikitalita <69168929+nikitalita@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:10:36 -0800 Subject: [PATCH 1/3] [llvm-pdbutil] Fix dumping register enums --- llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp index 80b76657facc7..ecb4c2175e49a 100644 --- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp @@ -11,6 +11,7 @@ #include "PdbYaml.h" #include "llvm-pdbutil.h" +#include "llvm/BinaryFormat/COFF.h" #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" #include "llvm/DebugInfo/CodeView/DebugSubsection.h" #include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h" @@ -73,7 +74,15 @@ Error YAMLOutputStyle::dump() { if (auto EC = dumpPublics()) return EC; + // Fake Coff header for dumping register enumerations. + COFF::header Header; + auto MachineType = + Obj.DbiStream ? Obj.DbiStream->MachineType : PDB_Machine::Unknown; + Header.Machine = static_cast(MachineType); + Out.setContext(&Header); flush(); + Out.setContext(nullptr); + return Error::success(); } From ce624715a94b5b5d4a20ef93259084812fdba83a Mon Sep 17 00:00:00 2001 From: nikitalita <69168929+nikitalita@users.noreply.github.com> Date: Thu, 2 Nov 2023 18:41:16 -0700 Subject: [PATCH 2/3] [llvm-pdbutil] Fix yaml2pdb failing to parse yaml with register enums --- llvm/tools/llvm-pdbutil/PdbYaml.cpp | 7 +++++++ llvm/tools/llvm-pdbutil/PdbYaml.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.cpp b/llvm/tools/llvm-pdbutil/PdbYaml.cpp index a26241967b5ad..fac1d89321610 100644 --- a/llvm/tools/llvm-pdbutil/PdbYaml.cpp +++ b/llvm/tools/llvm-pdbutil/PdbYaml.cpp @@ -155,6 +155,13 @@ void MappingTraits::mapping(IO &IO, PdbDbiStream &Obj) { IO.mapOptional("PdbDllRbld", Obj.PdbDllRbld, uint16_t(0U)); IO.mapOptional("Flags", Obj.Flags, uint16_t(1U)); IO.mapOptional("MachineType", Obj.MachineType, PDB_Machine::x86); + // This is a workaround for IO not having document context with the + // machine type. The machine type is needed to properly parse Register enums + // in the PDB. + if (!IO.getContext()) { + Obj.FakeHeader.Machine = static_cast(Obj.MachineType); + IO.setContext(&Obj.FakeHeader); + } IO.mapOptional("Modules", Obj.ModInfos); } diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.h b/llvm/tools/llvm-pdbutil/PdbYaml.h index 21658e9d0e75e..d5111a9e8d3a3 100644 --- a/llvm/tools/llvm-pdbutil/PdbYaml.h +++ b/llvm/tools/llvm-pdbutil/PdbYaml.h @@ -11,6 +11,7 @@ #include "OutputStyle.h" +#include "llvm/BinaryFormat/COFF.h" #include "llvm/DebugInfo/CodeView/SymbolRecord.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/MSF/MSFCommon.h" @@ -80,6 +81,7 @@ struct PdbDbiStream { PDB_Machine MachineType = PDB_Machine::x86; std::vector ModInfos; + COFF::header FakeHeader; }; struct PdbTpiStream { From 9bdafa5e628a5cd31110200e3c3dbc4a4a9fa873 Mon Sep 17 00:00:00 2001 From: nikitalita <69168929+nikitalita@users.noreply.github.com> Date: Wed, 10 Apr 2024 15:57:56 -0700 Subject: [PATCH 3/3] [llvm-pdbutil] add register-records unit-test --- .../llvm-pdbutil/Inputs/register-records.yaml | 21 +++++++++++++++++++ .../tools/llvm-pdbutil/register-records.test | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 llvm/test/tools/llvm-pdbutil/Inputs/register-records.yaml create mode 100644 llvm/test/tools/llvm-pdbutil/register-records.test diff --git a/llvm/test/tools/llvm-pdbutil/Inputs/register-records.yaml b/llvm/test/tools/llvm-pdbutil/Inputs/register-records.yaml new file mode 100644 index 0000000000000..2e7d707529eba --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/Inputs/register-records.yaml @@ -0,0 +1,21 @@ +--- +DbiStream: + VerHeader: V70 + Age: 1 + BuildNumber: 36363 + PdbDllVersion: 0 + PdbDllRbld: 0 + Flags: 0 + MachineType: Amd64 + Modules: + - Module: '/tmp/test.obj' + Modi: + Signature: 4 + Records: + - Kind: S_REGREL32 + RegRelativeSym: + Offset: 56 + Type: 4494 + Register: RSP + VarName: this +... diff --git a/llvm/test/tools/llvm-pdbutil/register-records.test b/llvm/test/tools/llvm-pdbutil/register-records.test new file mode 100644 index 0000000000000..60a02732ba94d --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/register-records.test @@ -0,0 +1,18 @@ +; RUN: llvm-pdbutil yaml2pdb %p/Inputs/register-records.yaml --pdb=%t.pdb +; RUN: llvm-pdbutil dump --symbols %t.pdb | FileCheck --check-prefix=CHECK_YAML2PDB %s + +; RUN: llvm-pdbutil pdb2yaml --module-syms %t.pdb > %t.yaml +; RUN: FileCheck --input-file=%t.yaml --check-prefix=CHECK_PDB2YAML %s + +CHECK_YAML2PDB: Symbols +CHECK_YAML2PDB: ============================================================ +CHECK_YAML2PDB: Mod 0000 | `/tmp/test.obj`: +CHECK_YAML2PDB: 4 | S_REGREL32 [size = 20] `this` +CHECK_YAML2PDB: type = 0x118E (), register = RSP, offset = 56 + +CHECK_PDB2YAML: - Kind: S_REGREL32 +CHECK_PDB2YAML: RegRelativeSym: +CHECK_PDB2YAML: Offset: 56 +CHECK_PDB2YAML: Type: 4494 +CHECK_PDB2YAML: Register: RSP +CHECK_PDB2YAML: VarName: this