-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[llvm-pdbutil] Fix register enum field dumping/parsing #82299
base: main
Are you sure you want to change the base?
Conversation
@llvm/pr-subscribers-debuginfo Author: None (nikitalita) ChangesThe main problem that we were encountering is that printing out the code view register enums are taken care of here: Which requires a COFF::header in the IO context for the machine type, which we didn't have when dumping a pdb or parsing a yaml file. So, we make a fake one with the machine type. Full diff: https://github.com/llvm/llvm-project/pull/82299.diff 3 Files Affected:
diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.cpp b/llvm/tools/llvm-pdbutil/PdbYaml.cpp
index a26241967b5add..fac1d89321610b 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 4382e91e209737..b0c0f6a00c499b 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 {
diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp
index 80b76657facc7c..ecb4c2175e49a3 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();
}
|
|
fixes #58916 |
I think we need some kind of test to cover this case. |
This comment was marked as outdated.
This comment was marked as outdated.
Never mind, I found one and I have added unit tests |
This fixes a bug where parsing PDBs with usages of register enums were asserting.
The main problem is that printing out the code view register enums are taken care of here:
https://github.com/nikitalita/llvm-project/blob/e4888a92402f53000a3a5e79d3792c034fc2f343/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp#L152
Which requires a COFF::header in the IO context for the machine type, which we didn't have when dumping a pdb or parsing a yaml file. So, we make a fake one with the machine type.