aboutsummaryrefslogtreecommitdiff
path: root/llvm/include/llvm/ObjectYAML/XCOFFYAML.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/ObjectYAML/XCOFFYAML.h')
-rw-r--r--llvm/include/llvm/ObjectYAML/XCOFFYAML.h124
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);
};