[llvm] [llvm-pdbutil] Fix register enum field dumping/parsing (PR #82299)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 23 01:53:06 PDT 2025
https://github.com/nikitalita updated https://github.com/llvm/llvm-project/pull/82299
>From f4c5323f146da3765a641d48fd2e8e1b62484a9a Mon Sep 17 00:00:00 2001
From: nikitalita <69168929+nikitalita at 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<uint16_t>(MachineType);
+ Out.setContext(&Header);
flush();
+ Out.setContext(nullptr);
+
return Error::success();
}
>From ce624715a94b5b5d4a20ef93259084812fdba83a Mon Sep 17 00:00:00 2001
From: nikitalita <69168929+nikitalita at 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<PdbDbiStream>::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<uint16_t>(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<PdbDbiModuleInfo> ModInfos;
+ COFF::header FakeHeader;
};
struct PdbTpiStream {
>From 9bdafa5e628a5cd31110200e3c3dbc4a4a9fa873 Mon Sep 17 00:00:00 2001
From: nikitalita <69168929+nikitalita at 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 (<unknown UDT>), 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
More information about the llvm-commits
mailing list