diff options
Diffstat (limited to 'llvm/include/llvm/ObjectYAML/XCOFFYAML.h')
-rw-r--r-- | llvm/include/llvm/ObjectYAML/XCOFFYAML.h | 124 |
1 files changed, 123 insertions, 1 deletions
diff --git a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h index aa1bc396f134..39bc334e1a89 100644 --- a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h +++ b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h @@ -82,6 +82,110 @@ struct Section { std::vector<Relocation> 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<StringRef> FileNameOrString; + Optional<XCOFF::CFileStringType> 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<uint32_t> SectionOrLength; + Optional<uint32_t> StabInfoIndex; + Optional<uint16_t> StabSectNum; + // Only for XCOFF64. + Optional<uint32_t> SectionOrLengthLo; + Optional<uint32_t> SectionOrLengthHi; + // Common fields for both XCOFF32 and XCOFF64. + Optional<uint32_t> ParameterHashIndex; + Optional<uint16_t> TypeChkSectNum; + Optional<uint8_t> SymbolAlignmentAndType; + Optional<XCOFF::StorageMappingClass> StorageMappingClass; + + CsectAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_CSECT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_CSECT; + } +}; + +struct FunctionAuxEnt : AuxSymbolEnt { + Optional<uint32_t> OffsetToExceptionTbl; // Only for XCOFF32. + Optional<uint64_t> PtrToLineNum; + Optional<uint32_t> SizeOfFunction; + Optional<int32_t> SymIdxOfNextBeyond; + + FunctionAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_FCN) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_FCN; + } +}; + +struct ExcpetionAuxEnt : AuxSymbolEnt { + Optional<uint64_t> OffsetToExceptionTbl; + Optional<uint32_t> SizeOfFunction; + Optional<int32_t> 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<uint16_t> LineNumHi; + Optional<uint16_t> LineNumLo; + // Only for XCOFF64. + Optional<uint32_t> LineNum; + + BlockAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_SYM) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_SYM; + } +}; + +struct SectAuxEntForDWARF : AuxSymbolEnt { + Optional<uint32_t> LengthOfSectionPortion; + Optional<uint32_t> NumberOfRelocEnt; + + SectAuxEntForDWARF() : AuxSymbolEnt(AuxSymbolType::AUX_SECT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_SECT; + } +}; + +struct SectAuxEntForStat : AuxSymbolEnt { + Optional<uint32_t> SectionLength; + Optional<uint16_t> NumberOfRelocEnt; + Optional<uint16_t> 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. @@ -89,7 +193,8 @@ struct Symbol { Optional<uint16_t> SectionIndex; llvm::yaml::Hex16 Type; XCOFF::StorageClass StorageClass; - uint8_t NumberOfAuxEntries; + Optional<uint8_t> NumberOfAuxEntries; + std::vector<std::unique_ptr<AuxSymbolEnt>> AuxEntries; }; struct StringTable { @@ -114,6 +219,7 @@ struct Object { 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<llvm::XCOFFYAML::AuxSymbolEnt>) namespace llvm { namespace yaml { @@ -126,6 +232,18 @@ template <> struct ScalarEnumerationTraits<XCOFF::StorageClass> { static void enumeration(IO &IO, XCOFF::StorageClass &Value); }; +template <> struct ScalarEnumerationTraits<XCOFF::StorageMappingClass> { + static void enumeration(IO &IO, XCOFF::StorageMappingClass &Value); +}; + +template <> struct ScalarEnumerationTraits<XCOFF::CFileStringType> { + static void enumeration(IO &IO, XCOFF::CFileStringType &Type); +}; + +template <> struct ScalarEnumerationTraits<XCOFFYAML::AuxSymbolType> { + static void enumeration(IO &IO, XCOFFYAML::AuxSymbolType &Type); +}; + template <> struct MappingTraits<XCOFFYAML::FileHeader> { static void mapping(IO &IO, XCOFFYAML::FileHeader &H); }; @@ -134,6 +252,10 @@ template <> struct MappingTraits<XCOFFYAML::AuxiliaryHeader> { static void mapping(IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr); }; +template <> struct MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>> { + static void mapping(IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym); +}; + template <> struct MappingTraits<XCOFFYAML::Symbol> { static void mapping(IO &IO, XCOFFYAML::Symbol &S); }; |