aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML
diff options
context:
space:
mode:
authorEsme <esme.yi@ibm.com>2023-12-07 11:30:30 +0800
committerGitHub <noreply@github.com>2023-12-07 11:30:30 +0800
commit0e3faa20c467e6cd62423b22cf8650c6aa2628ba (patch)
treeb58e7a89ede077a2e5a4a74c6628738f5a3c1300 /llvm/lib/ObjectYAML
parent986287e7f38321165c0c654f3af06e34af7b161f (diff)
downloadllvm-0e3faa20c467e6cd62423b22cf8650c6aa2628ba.tar.gz
llvm-0e3faa20c467e6cd62423b22cf8650c6aa2628ba.tar.bz2
llvm-0e3faa20c467e6cd62423b22cf8650c6aa2628ba.zip
[XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (#70642)
This PR adds the support for parsing auxiliary symbols of XCOFF object file for obj2yaml.
Diffstat (limited to 'llvm/lib/ObjectYAML')
-rw-r--r--llvm/lib/ObjectYAML/XCOFFYAML.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
index 44ef33501b65..b71a7b8b6cb4 100644
--- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
@@ -282,45 +282,57 @@ static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {
void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(
IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
- assert(!IO.outputting() && "We don't dump aux symbols currently.");
+
+ auto ResetAuxSym = [&](auto *AuxEnt) {
+ if (!IO.outputting())
+ AuxSym.reset(AuxEnt);
+ };
+
const bool Is64 =
static_cast<XCOFFYAML::Object *>(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)
+ if (!Is64) {
IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in "
"XCOFF32");
- AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
+ return;
+ }
+ ResetAuxSym(new XCOFFYAML::ExcpetionAuxEnt());
auxSymMapping(IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get()));
break;
case XCOFFYAML::AUX_FCN:
- AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
+ ResetAuxSym(new XCOFFYAML::FunctionAuxEnt());
auxSymMapping(IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_SYM:
- AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
+ ResetAuxSym(new XCOFFYAML::BlockAuxEnt());
auxSymMapping(IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_FILE:
- AuxSym.reset(new XCOFFYAML::FileAuxEnt());
+ ResetAuxSym(new XCOFFYAML::FileAuxEnt());
auxSymMapping(IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get()));
break;
case XCOFFYAML::AUX_CSECT:
- AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
+ ResetAuxSym(new XCOFFYAML::CsectAuxEnt());
auxSymMapping(IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get()), Is64);
break;
case XCOFFYAML::AUX_SECT:
- AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
+ ResetAuxSym(new XCOFFYAML::SectAuxEntForDWARF());
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get()));
break;
case XCOFFYAML::AUX_STAT:
- if (Is64)
+ if (Is64) {
IO.setError(
"an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
- AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
+ return;
+ }
+ ResetAuxSym(new XCOFFYAML::SectAuxEntForStat());
auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get()));
break;
}
@@ -334,8 +346,7 @@ void MappingTraits<XCOFFYAML::Symbol>::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<XCOFFYAML::StringTable>::mapping(IO &IO, XCOFFYAML::StringTable &Str) {