diff options
| author | Esme <esme.yi@ibm.com> | 2023-12-07 11:30:30 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-07 11:30:30 +0800 |
| commit | 0e3faa20c467e6cd62423b22cf8650c6aa2628ba (patch) | |
| tree | b58e7a89ede077a2e5a4a74c6628738f5a3c1300 /llvm/lib/ObjectYAML | |
| parent | 986287e7f38321165c0c654f3af06e34af7b161f (diff) | |
| download | llvm-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.cpp | 35 |
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) { |
