https://github.com/EsmeYi updated
https://github.com/llvm/llvm-project/pull/70642
>From 7ba6a651bb84befdcd1566352d5340880591789d Mon Sep 17 00:00:00 2001
From: esmeyi
Date: Mon, 30 Oct 2023 06:00:18 -0400
Subject: [PATCH 1/7] Add support for parsing auxiliary symbols of XCOFF object
file for obj2yaml.
---
llvm/include/llvm/Object/XCOFFObjectFile.h| 2 +-
llvm/lib/ObjectYAML/XCOFFYAML.cpp | 27 +-
llvm/test/tools/obj2yaml/XCOFF/aix.yaml | 38 +++
.../tools/obj2yaml/XCOFF/aux-symbols.yaml | 264 ++
llvm/tools/obj2yaml/xcoff2yaml.cpp| 185 +++-
5 files changed, 504 insertions(+), 12 deletions(-)
create mode 100644 llvm/test/tools/obj2yaml/XCOFF/aux-symbols.yaml
diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h
b/llvm/include/llvm/Object/XCOFFObjectFile.h
index 63064abb4d3c3..9a3b4aa262355 100644
--- a/llvm/include/llvm/Object/XCOFFObjectFile.h
+++ b/llvm/include/llvm/Object/XCOFFObjectFile.h
@@ -411,13 +411,13 @@ class XCOFFCsectAuxRef {
return Entry64->AuxType;
}
-private:
uint8_t getSymbolAlignmentAndType() const {
return GETVALUE(SymbolAlignmentAndType);
}
#undef GETVALUE
+private:
const XCOFFCsectAuxEnt32 *Entry32 = nullptr;
const XCOFFCsectAuxEnt64 *Entry64 = nullptr;
};
diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp
b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
index 44ef33501b65e..a9af0405546a3 100644
--- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
@@ -282,45 +282,53 @@ static void auxSymMapping(IO &IO,
XCOFFYAML::SectAuxEntForStat &AuxSym) {
void MappingTraits>::mapping(
IO &IO, std::unique_ptr &AuxSym) {
- assert(!IO.outputting() && "We don't dump aux symbols currently.");
const bool Is64 =
static_cast(IO.getContext())->Header.Magic ==
(llvm::yaml::Hex16)XCOFF::XCOFF64;
XCOFFYAML::AuxSymbolType AuxType;
+ if (IO.outputting())
+AuxType = AuxSym.get()->Type;
IO.mapRequired("Type", AuxType);
switch (AuxType) {
case XCOFFYAML::AUX_EXCEPT:
if (!Is64)
IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in
"
"XCOFF32");
-AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
auxSymMapping(IO, *cast(AuxSym.get()));
break;
case XCOFFYAML::AUX_FCN:
-AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
auxSymMapping(IO, *cast(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_SYM:
-AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
auxSymMapping(IO, *cast(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_FILE:
-AuxSym.reset(new XCOFFYAML::FileAuxEnt());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::FileAuxEnt());
auxSymMapping(IO, *cast(AuxSym.get()));
break;
case XCOFFYAML::AUX_CSECT:
-AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
auxSymMapping(IO, *cast(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_SECT:
-AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
auxSymMapping(IO, *cast(AuxSym.get()));
break;
case XCOFFYAML::AUX_STAT:
if (Is64)
IO.setError(
"an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
-AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
+if (!IO.outputting())
+ AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
auxSymMapping(IO, *cast(AuxSym.get()));
break;
}
@@ -334,8 +342,7 @@ void MappingTraits::mapping(IO &IO,
XCOFFYAML::Symbol &S) {
IO.mapOptional("Type", S.Type);
IO.mapOptional("StorageClass", S.StorageClass);
IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);
- if (!IO.outputting())
-IO.mapOptional("AuxEntries", S.AuxEntries);
+ IO.mapOptional("AuxEntries", S.AuxEntries);
}
void MappingTraits::mapping(IO &IO,
XCOFFYAML::StringTable &Str) {
diff --git a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
index cd1e88dec11d2..fbd5fa0629d10 100644
--- a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
+++ b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
@@ -52,12 +52,30 @@
# CHECK32-NEXT: Type:0x0
# CHECK32-NEXT: StorageClass:C_EXT
# CHECK32-NEXT: NumberOfAuxEntries: 1
+# CHECK32-NEXT: AuxEntries:
+# CHECK32-NEXT: - Type:AUX_CSECT
+# CHECK32-NEXT: ParameterHashIndex: 0
+# CHECK32-NEXT: TypeChkSectNum: 0
+# CHECK32-NEXT: SymbolAlignmentAndType: 0
+# CHECK32-NEXT: StorageMappingClass: XMC_PR
+# CHECK32-NEXT: SectionOrLength: 0
+# CHECK32-NEXT: StabInfoIndex: 0
+# C