#pragma once #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif //===----- XCOFFYAML.h - XCOFF YAMLIO implementation ------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file declares classes for handling the YAML representation of XCOFF. // //===----------------------------------------------------------------------===// #ifndef LLVM_OBJECTYAML_XCOFFYAML_H #define LLVM_OBJECTYAML_XCOFFYAML_H #include "llvm/BinaryFormat/XCOFF.h" #include "llvm/ObjectYAML/YAML.h" #include namespace llvm { namespace XCOFFYAML { struct FileHeader { llvm::yaml::Hex16 Magic; uint16_t NumberOfSections; int32_t TimeStamp; llvm::yaml::Hex64 SymbolTableOffset; int32_t NumberOfSymTableEntries; uint16_t AuxHeaderSize; llvm::yaml::Hex16 Flags; }; struct AuxiliaryHeader { Optional Magic; Optional Version; Optional TextStartAddr; Optional DataStartAddr; Optional TOCAnchorAddr; Optional SecNumOfEntryPoint; Optional SecNumOfText; Optional SecNumOfData; Optional SecNumOfTOC; Optional SecNumOfLoader; Optional SecNumOfBSS; Optional MaxAlignOfText; Optional MaxAlignOfData; Optional ModuleType; Optional CpuFlag; Optional CpuType; Optional TextPageSize; Optional DataPageSize; Optional StackPageSize; Optional FlagAndTDataAlignment; Optional TextSize; Optional InitDataSize; Optional BssDataSize; Optional EntryPointAddr; Optional MaxStackSize; Optional MaxDataSize; Optional SecNumOfTData; Optional SecNumOfTBSS; Optional Flag; }; struct Relocation { llvm::yaml::Hex64 VirtualAddress; llvm::yaml::Hex64 SymbolIndex; llvm::yaml::Hex8 Info; llvm::yaml::Hex8 Type; }; struct Section { StringRef SectionName; llvm::yaml::Hex64 Address; llvm::yaml::Hex64 Size; llvm::yaml::Hex64 FileOffsetToData; llvm::yaml::Hex64 FileOffsetToRelocations; llvm::yaml::Hex64 FileOffsetToLineNumbers; // Line number pointer. Not supported yet. llvm::yaml::Hex16 NumberOfRelocations; llvm::yaml::Hex16 NumberOfLineNumbers; // Line number counts. Not supported yet. uint32_t Flags; yaml::BinaryRef SectionData; std::vector Relocations; }; enum AuxSymbolType : uint8_t { AUX_EXCEPT = 255, AUX_FCN = 254, AUX_SYM = 253, AUX_FILE = 252, AUX_CSECT = 251, AUX_SECT = 250, AUX_STAT = 249 }; struct AuxSymbolEnt { AuxSymbolType Type; explicit AuxSymbolEnt(AuxSymbolType T) : Type(T) {} virtual ~AuxSymbolEnt(); }; struct FileAuxEnt : AuxSymbolEnt { Optional FileNameOrString; Optional FileStringType; FileAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_FILE) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_FILE; } }; struct CsectAuxEnt : AuxSymbolEnt { // Only for XCOFF32. Optional SectionOrLength; Optional StabInfoIndex; Optional StabSectNum; // Only for XCOFF64. Optional SectionOrLengthLo; Optional SectionOrLengthHi; // Common fields for both XCOFF32 and XCOFF64. Optional ParameterHashIndex; Optional TypeChkSectNum; Optional SymbolAlignmentAndType; Optional StorageMappingClass; CsectAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_CSECT) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_CSECT; } }; struct FunctionAuxEnt : AuxSymbolEnt { Optional OffsetToExceptionTbl; // Only for XCOFF32. Optional PtrToLineNum; Optional SizeOfFunction; Optional SymIdxOfNextBeyond; FunctionAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_FCN) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_FCN; } }; struct ExcpetionAuxEnt : AuxSymbolEnt { Optional OffsetToExceptionTbl; Optional SizeOfFunction; Optional SymIdxOfNextBeyond; ExcpetionAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_EXCEPT) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_EXCEPT; } }; // Only for XCOFF64. struct BlockAuxEnt : AuxSymbolEnt { // Only for XCOFF32. Optional LineNumHi; Optional LineNumLo; // Only for XCOFF64. Optional LineNum; BlockAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_SYM) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_SYM; } }; struct SectAuxEntForDWARF : AuxSymbolEnt { Optional LengthOfSectionPortion; Optional NumberOfRelocEnt; SectAuxEntForDWARF() : AuxSymbolEnt(AuxSymbolType::AUX_SECT) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_SECT; } }; struct SectAuxEntForStat : AuxSymbolEnt { Optional SectionLength; Optional NumberOfRelocEnt; Optional NumberOfLineNum; SectAuxEntForStat() : AuxSymbolEnt(AuxSymbolType::AUX_STAT) {} static bool classof(const AuxSymbolEnt *S) { return S->Type == AuxSymbolType::AUX_STAT; } }; // Only for XCOFF32. struct Symbol { StringRef SymbolName; llvm::yaml::Hex64 Value; // Symbol value; storage class-dependent. Optional SectionName; Optional SectionIndex; llvm::yaml::Hex16 Type; XCOFF::StorageClass StorageClass; Optional NumberOfAuxEntries; std::vector> AuxEntries; }; struct StringTable { Optional ContentSize; // The total size of the string table. Optional Length; // The value of the length field for the first // 4 bytes of the table. Optional> Strings; Optional RawContent; }; struct Object { FileHeader Header; Optional AuxHeader; std::vector
Sections; std::vector Symbols; StringTable StrTbl; Object(); }; } // namespace XCOFFYAML } // namespace llvm LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Symbol) LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Relocation) LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Section) LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr) namespace llvm { namespace yaml { template <> struct ScalarBitSetTraits { static void bitset(IO &IO, XCOFF::SectionTypeFlags &Value); }; template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, XCOFF::StorageClass &Value); }; template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, XCOFF::StorageMappingClass &Value); }; template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, XCOFF::CFileStringType &Type); }; template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, XCOFFYAML::AuxSymbolType &Type); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::FileHeader &H); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr); }; template <> struct MappingTraits> { static void mapping(IO &IO, std::unique_ptr &AuxSym); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Symbol &S); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Relocation &R); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Section &Sec); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::StringTable &Str); }; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Object &Obj); }; } // namespace yaml } // namespace llvm #endif // LLVM_OBJECTYAML_XCOFFYAML_H #ifdef __GNUC__ #pragma GCC diagnostic pop #endif