Path: blob/main/contrib/llvm-project/llvm/lib/ObjectYAML/XCOFFYAML.cpp
35233 views
//===-- XCOFFYAML.cpp - XCOFF YAMLIO implementation -------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines classes for handling the YAML representation of XCOFF.9//10//===----------------------------------------------------------------------===//1112#include "llvm/ObjectYAML/XCOFFYAML.h"13#include "llvm/BinaryFormat/XCOFF.h"14#include <string.h>1516namespace llvm {17namespace XCOFFYAML {1819Object::Object() { memset(&Header, 0, sizeof(Header)); }2021AuxSymbolEnt::~AuxSymbolEnt() = default;2223} // namespace XCOFFYAML2425namespace yaml {2627void ScalarBitSetTraits<XCOFF::SectionTypeFlags>::bitset(28IO &IO, XCOFF::SectionTypeFlags &Value) {29#define ECase(X) IO.bitSetCase(Value, #X, XCOFF::X)30ECase(STYP_PAD);31ECase(STYP_DWARF);32ECase(STYP_TEXT);33ECase(STYP_DATA);34ECase(STYP_BSS);35ECase(STYP_EXCEPT);36ECase(STYP_INFO);37ECase(STYP_TDATA);38ECase(STYP_TBSS);39ECase(STYP_LOADER);40ECase(STYP_DEBUG);41ECase(STYP_TYPCHK);42ECase(STYP_OVRFLO);43#undef ECase44}4546void ScalarEnumerationTraits<XCOFF::DwarfSectionSubtypeFlags>::enumeration(47IO &IO, XCOFF::DwarfSectionSubtypeFlags &Value) {48#define ECase(X) IO.enumCase(Value, #X, XCOFF::X)49ECase(SSUBTYP_DWINFO);50ECase(SSUBTYP_DWLINE);51ECase(SSUBTYP_DWPBNMS);52ECase(SSUBTYP_DWPBTYP);53ECase(SSUBTYP_DWARNGE);54ECase(SSUBTYP_DWABREV);55ECase(SSUBTYP_DWSTR);56ECase(SSUBTYP_DWRNGES);57ECase(SSUBTYP_DWLOC);58ECase(SSUBTYP_DWFRAME);59ECase(SSUBTYP_DWMAC);60#undef ECase61IO.enumFallback<Hex32>(Value);62}6364void ScalarEnumerationTraits<XCOFF::StorageClass>::enumeration(65IO &IO, XCOFF::StorageClass &Value) {66#define ECase(X) IO.enumCase(Value, #X, XCOFF::X)67ECase(C_NULL);68ECase(C_AUTO);69ECase(C_EXT);70ECase(C_STAT);71ECase(C_REG);72ECase(C_EXTDEF);73ECase(C_LABEL);74ECase(C_ULABEL);75ECase(C_MOS);76ECase(C_ARG);77ECase(C_STRTAG);78ECase(C_MOU);79ECase(C_UNTAG);80ECase(C_TPDEF);81ECase(C_USTATIC);82ECase(C_ENTAG);83ECase(C_MOE);84ECase(C_REGPARM);85ECase(C_FIELD);86ECase(C_BLOCK);87ECase(C_FCN);88ECase(C_EOS);89ECase(C_FILE);90ECase(C_LINE);91ECase(C_ALIAS);92ECase(C_HIDDEN);93ECase(C_HIDEXT);94ECase(C_BINCL);95ECase(C_EINCL);96ECase(C_INFO);97ECase(C_WEAKEXT);98ECase(C_DWARF);99ECase(C_GSYM);100ECase(C_LSYM);101ECase(C_PSYM);102ECase(C_RSYM);103ECase(C_RPSYM);104ECase(C_STSYM);105ECase(C_TCSYM);106ECase(C_BCOMM);107ECase(C_ECOML);108ECase(C_ECOMM);109ECase(C_DECL);110ECase(C_ENTRY);111ECase(C_FUN);112ECase(C_BSTAT);113ECase(C_ESTAT);114ECase(C_GTLS);115ECase(C_STTLS);116ECase(C_EFCN);117#undef ECase118}119120void ScalarEnumerationTraits<XCOFF::StorageMappingClass>::enumeration(121IO &IO, XCOFF::StorageMappingClass &Value) {122#define ECase(X) IO.enumCase(Value, #X, XCOFF::X)123ECase(XMC_PR);124ECase(XMC_RO);125ECase(XMC_DB);126ECase(XMC_GL);127ECase(XMC_XO);128ECase(XMC_SV);129ECase(XMC_SV64);130ECase(XMC_SV3264);131ECase(XMC_TI);132ECase(XMC_TB);133ECase(XMC_RW);134ECase(XMC_TC0);135ECase(XMC_TC);136ECase(XMC_TD);137ECase(XMC_DS);138ECase(XMC_UA);139ECase(XMC_BS);140ECase(XMC_UC);141ECase(XMC_TL);142ECase(XMC_UL);143ECase(XMC_TE);144#undef ECase145}146147void ScalarEnumerationTraits<XCOFF::SymbolType>::enumeration(148IO &IO, XCOFF::SymbolType &Value) {149#define ECase(X) IO.enumCase(Value, #X, XCOFF::X)150ECase(XTY_ER);151ECase(XTY_SD);152ECase(XTY_LD);153ECase(XTY_CM);154#undef ECase155IO.enumFallback<Hex8>(Value);156}157158void ScalarEnumerationTraits<XCOFFYAML::AuxSymbolType>::enumeration(159IO &IO, XCOFFYAML::AuxSymbolType &Type) {160#define ECase(X) IO.enumCase(Type, #X, XCOFFYAML::X)161ECase(AUX_EXCEPT);162ECase(AUX_FCN);163ECase(AUX_SYM);164ECase(AUX_FILE);165ECase(AUX_CSECT);166ECase(AUX_SECT);167ECase(AUX_STAT);168#undef ECase169}170171void ScalarEnumerationTraits<XCOFF::CFileStringType>::enumeration(172IO &IO, XCOFF::CFileStringType &Type) {173#define ECase(X) IO.enumCase(Type, #X, XCOFF::X)174ECase(XFT_FN);175ECase(XFT_CT);176ECase(XFT_CV);177ECase(XFT_CD);178#undef ECase179}180181struct NSectionFlags {182NSectionFlags(IO &) : Flags(XCOFF::SectionTypeFlags(0)) {}183NSectionFlags(IO &, uint32_t C) : Flags(XCOFF::SectionTypeFlags(C)) {}184185uint32_t denormalize(IO &) { return Flags; }186187XCOFF::SectionTypeFlags Flags;188};189190void MappingTraits<XCOFFYAML::FileHeader>::mapping(191IO &IO, XCOFFYAML::FileHeader &FileHdr) {192IO.mapOptional("MagicNumber", FileHdr.Magic);193IO.mapOptional("NumberOfSections", FileHdr.NumberOfSections);194IO.mapOptional("CreationTime", FileHdr.TimeStamp);195IO.mapOptional("OffsetToSymbolTable", FileHdr.SymbolTableOffset);196IO.mapOptional("EntriesInSymbolTable", FileHdr.NumberOfSymTableEntries);197IO.mapOptional("AuxiliaryHeaderSize", FileHdr.AuxHeaderSize);198IO.mapOptional("Flags", FileHdr.Flags);199}200201void MappingTraits<XCOFFYAML::AuxiliaryHeader>::mapping(202IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr) {203IO.mapOptional("Magic", AuxHdr.Magic);204IO.mapOptional("Version", AuxHdr.Version);205IO.mapOptional("TextStartAddr", AuxHdr.TextStartAddr);206IO.mapOptional("DataStartAddr", AuxHdr.DataStartAddr);207IO.mapOptional("TOCAnchorAddr", AuxHdr.TOCAnchorAddr);208IO.mapOptional("TextSectionSize", AuxHdr.TextSize);209IO.mapOptional("DataSectionSize", AuxHdr.InitDataSize);210IO.mapOptional("BssSectionSize", AuxHdr.BssDataSize);211IO.mapOptional("SecNumOfEntryPoint", AuxHdr.SecNumOfEntryPoint);212IO.mapOptional("SecNumOfText", AuxHdr.SecNumOfText);213IO.mapOptional("SecNumOfData", AuxHdr.SecNumOfData);214IO.mapOptional("SecNumOfTOC", AuxHdr.SecNumOfTOC);215IO.mapOptional("SecNumOfLoader", AuxHdr.SecNumOfLoader);216IO.mapOptional("SecNumOfBSS", AuxHdr.SecNumOfBSS);217IO.mapOptional("MaxAlignOfText", AuxHdr.MaxAlignOfText);218IO.mapOptional("MaxAlignOfData", AuxHdr.MaxAlignOfData);219IO.mapOptional("ModuleType", AuxHdr.CpuFlag);220IO.mapOptional("TextPageSize", AuxHdr.TextPageSize);221IO.mapOptional("DataPageSize", AuxHdr.DataPageSize);222IO.mapOptional("StackPageSize", AuxHdr.StackPageSize);223IO.mapOptional("FlagAndTDataAlignment", AuxHdr.FlagAndTDataAlignment);224IO.mapOptional("EntryPointAddr", AuxHdr.EntryPointAddr);225IO.mapOptional("MaxStackSize", AuxHdr.MaxStackSize);226IO.mapOptional("MaxDataSize", AuxHdr.MaxDataSize);227IO.mapOptional("SecNumOfTData", AuxHdr.SecNumOfTData);228IO.mapOptional("SecNumOfTBSS", AuxHdr.SecNumOfTBSS);229IO.mapOptional("Flag", AuxHdr.Flag);230}231232void MappingTraits<XCOFFYAML::Relocation>::mapping(IO &IO,233XCOFFYAML::Relocation &R) {234IO.mapOptional("Address", R.VirtualAddress);235IO.mapOptional("Symbol", R.SymbolIndex);236IO.mapOptional("Info", R.Info);237IO.mapOptional("Type", R.Type);238}239240void MappingTraits<XCOFFYAML::Section>::mapping(IO &IO,241XCOFFYAML::Section &Sec) {242MappingNormalization<NSectionFlags, uint32_t> NC(IO, Sec.Flags);243IO.mapOptional("Name", Sec.SectionName);244IO.mapOptional("Address", Sec.Address);245IO.mapOptional("Size", Sec.Size);246IO.mapOptional("FileOffsetToData", Sec.FileOffsetToData);247IO.mapOptional("FileOffsetToRelocations", Sec.FileOffsetToRelocations);248IO.mapOptional("FileOffsetToLineNumbers", Sec.FileOffsetToLineNumbers);249IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations);250IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers);251IO.mapOptional("Flags", NC->Flags);252IO.mapOptional("DWARFSectionSubtype", Sec.SectionSubtype);253IO.mapOptional("SectionData", Sec.SectionData);254IO.mapOptional("Relocations", Sec.Relocations);255}256257static void auxSymMapping(IO &IO, XCOFFYAML::CsectAuxEnt &AuxSym, bool Is64) {258IO.mapOptional("ParameterHashIndex", AuxSym.ParameterHashIndex);259IO.mapOptional("TypeChkSectNum", AuxSym.TypeChkSectNum);260IO.mapOptional("SymbolAlignmentAndType", AuxSym.SymbolAlignmentAndType);261IO.mapOptional("SymbolType", AuxSym.SymbolType);262IO.mapOptional("SymbolAlignment", AuxSym.SymbolAlignment);263IO.mapOptional("StorageMappingClass", AuxSym.StorageMappingClass);264if (Is64) {265IO.mapOptional("SectionOrLengthLo", AuxSym.SectionOrLengthLo);266IO.mapOptional("SectionOrLengthHi", AuxSym.SectionOrLengthHi);267} else {268IO.mapOptional("SectionOrLength", AuxSym.SectionOrLength);269IO.mapOptional("StabInfoIndex", AuxSym.StabInfoIndex);270IO.mapOptional("StabSectNum", AuxSym.StabSectNum);271}272}273274static void auxSymMapping(IO &IO, XCOFFYAML::FileAuxEnt &AuxSym) {275IO.mapOptional("FileNameOrString", AuxSym.FileNameOrString);276IO.mapOptional("FileStringType", AuxSym.FileStringType);277}278279static void auxSymMapping(IO &IO, XCOFFYAML::BlockAuxEnt &AuxSym, bool Is64) {280if (Is64) {281IO.mapOptional("LineNum", AuxSym.LineNum);282} else {283IO.mapOptional("LineNumHi", AuxSym.LineNumHi);284IO.mapOptional("LineNumLo", AuxSym.LineNumLo);285}286}287288static void auxSymMapping(IO &IO, XCOFFYAML::FunctionAuxEnt &AuxSym,289bool Is64) {290if (!Is64)291IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl);292IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction);293IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond);294IO.mapOptional("PtrToLineNum", AuxSym.PtrToLineNum);295}296297static void auxSymMapping(IO &IO, XCOFFYAML::ExcpetionAuxEnt &AuxSym) {298IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl);299IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction);300IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond);301}302303static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForDWARF &AuxSym) {304IO.mapOptional("LengthOfSectionPortion", AuxSym.LengthOfSectionPortion);305IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt);306}307308static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {309IO.mapOptional("SectionLength", AuxSym.SectionLength);310IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt);311IO.mapOptional("NumberOfLineNum", AuxSym.NumberOfLineNum);312}313314template <typename AuxEntT>315static void ResetAuxSym(IO &IO,316std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {317if (!IO.outputting())318AuxSym.reset(new AuxEntT);319}320321void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(322IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {323const bool Is64 =324static_cast<XCOFFYAML::Object *>(IO.getContext())->Header.Magic ==325(llvm::yaml::Hex16)XCOFF::XCOFF64;326327XCOFFYAML::AuxSymbolType AuxType;328if (IO.outputting())329AuxType = AuxSym->Type;330IO.mapRequired("Type", AuxType);331switch (AuxType) {332case XCOFFYAML::AUX_EXCEPT:333if (!Is64) {334IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in "335"XCOFF32");336return;337}338ResetAuxSym<XCOFFYAML::ExcpetionAuxEnt>(IO, AuxSym);339auxSymMapping(IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get()));340break;341case XCOFFYAML::AUX_FCN:342ResetAuxSym<XCOFFYAML::FunctionAuxEnt>(IO, AuxSym);343auxSymMapping(IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get()), Is64);344break;345case XCOFFYAML::AUX_SYM:346ResetAuxSym<XCOFFYAML::BlockAuxEnt>(IO, AuxSym);347auxSymMapping(IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get()), Is64);348break;349case XCOFFYAML::AUX_FILE:350ResetAuxSym<XCOFFYAML::FileAuxEnt>(IO, AuxSym);351auxSymMapping(IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get()));352break;353case XCOFFYAML::AUX_CSECT:354ResetAuxSym<XCOFFYAML::CsectAuxEnt>(IO, AuxSym);355auxSymMapping(IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get()), Is64);356break;357case XCOFFYAML::AUX_SECT:358ResetAuxSym<XCOFFYAML::SectAuxEntForDWARF>(IO, AuxSym);359auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get()));360break;361case XCOFFYAML::AUX_STAT:362if (Is64) {363IO.setError(364"an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");365return;366}367ResetAuxSym<XCOFFYAML::SectAuxEntForStat>(IO, AuxSym);368auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get()));369break;370}371}372373void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {374IO.mapOptional("Name", S.SymbolName);375IO.mapOptional("Value", S.Value);376IO.mapOptional("Section", S.SectionName);377IO.mapOptional("SectionIndex", S.SectionIndex);378IO.mapOptional("Type", S.Type);379IO.mapOptional("StorageClass", S.StorageClass);380IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);381IO.mapOptional("AuxEntries", S.AuxEntries);382}383384void MappingTraits<XCOFFYAML::StringTable>::mapping(385IO &IO, XCOFFYAML::StringTable &Str) {386IO.mapOptional("ContentSize", Str.ContentSize);387IO.mapOptional("Length", Str.Length);388IO.mapOptional("Strings", Str.Strings);389IO.mapOptional("RawContent", Str.RawContent);390}391392void MappingTraits<XCOFFYAML::Object>::mapping(IO &IO, XCOFFYAML::Object &Obj) {393IO.setContext(&Obj);394IO.mapTag("!XCOFF", true);395IO.mapRequired("FileHeader", Obj.Header);396IO.mapOptional("AuxiliaryHeader", Obj.AuxHeader);397IO.mapOptional("Sections", Obj.Sections);398IO.mapOptional("Symbols", Obj.Symbols);399IO.mapOptional("StringTable", Obj.StrTbl);400IO.setContext(nullptr);401}402403} // namespace yaml404} // namespace llvm405406407