1//===-- XCOFFYAML.cpp - XCOFF YAMLIO implementation -------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines classes for handling the YAML representation of XCOFF.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/ObjectYAML/XCOFFYAML.h"
14#include "llvm/BinaryFormat/XCOFF.h"
15#include <string.h>
16
17namespace llvm {
18namespace XCOFFYAML {
19
20Object::Object() { memset(&Header, 0, sizeof(Header)); }
21
22} // namespace XCOFFYAML
23
24namespace yaml {
25
26void ScalarEnumerationTraits<XCOFF::StorageClass>::enumeration(
27    IO &IO, XCOFF::StorageClass &Value) {
28#define ECase(X) IO.enumCase(Value, #X, XCOFF::X)
29  ECase(C_NULL);
30  ECase(C_AUTO);
31  ECase(C_EXT);
32  ECase(C_STAT);
33  ECase(C_REG);
34  ECase(C_EXTDEF);
35  ECase(C_LABEL);
36  ECase(C_ULABEL);
37  ECase(C_MOS);
38  ECase(C_ARG);
39  ECase(C_STRTAG);
40  ECase(C_MOU);
41  ECase(C_UNTAG);
42  ECase(C_TPDEF);
43  ECase(C_USTATIC);
44  ECase(C_ENTAG);
45  ECase(C_MOE);
46  ECase(C_REGPARM);
47  ECase(C_FIELD);
48  ECase(C_BLOCK);
49  ECase(C_FCN);
50  ECase(C_EOS);
51  ECase(C_FILE);
52  ECase(C_LINE);
53  ECase(C_ALIAS);
54  ECase(C_HIDDEN);
55  ECase(C_HIDEXT);
56  ECase(C_BINCL);
57  ECase(C_EINCL);
58  ECase(C_INFO);
59  ECase(C_WEAKEXT);
60  ECase(C_DWARF);
61  ECase(C_GSYM);
62  ECase(C_LSYM);
63  ECase(C_PSYM);
64  ECase(C_RSYM);
65  ECase(C_RPSYM);
66  ECase(C_STSYM);
67  ECase(C_TCSYM);
68  ECase(C_BCOMM);
69  ECase(C_ECOML);
70  ECase(C_ECOMM);
71  ECase(C_DECL);
72  ECase(C_ENTRY);
73  ECase(C_FUN);
74  ECase(C_BSTAT);
75  ECase(C_ESTAT);
76  ECase(C_GTLS);
77  ECase(C_STTLS);
78  ECase(C_EFCN);
79#undef ECase
80}
81
82void MappingTraits<XCOFFYAML::FileHeader>::mapping(
83    IO &IO, XCOFFYAML::FileHeader &FileHdr) {
84  IO.mapRequired("MagicNumber", FileHdr.Magic);
85  IO.mapRequired("NumberOfSections", FileHdr.NumberOfSections);
86  IO.mapRequired("CreationTime", FileHdr.TimeStamp);
87  IO.mapRequired("OffsetToSymbolTable", FileHdr.SymbolTableOffset);
88  IO.mapRequired("EntriesInSymbolTable", FileHdr.NumberOfSymTableEntries);
89  IO.mapRequired("AuxiliaryHeaderSize", FileHdr.AuxHeaderSize);
90  IO.mapRequired("Flags", FileHdr.Flags);
91}
92
93void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {
94  IO.mapRequired("Name", S.SymbolName);
95  IO.mapRequired("Value", S.Value);
96  IO.mapRequired("Section", S.SectionName);
97  IO.mapRequired("Type", S.Type);
98  IO.mapRequired("StorageClass", S.StorageClass);
99  IO.mapRequired("NumberOfAuxEntries", S.NumberOfAuxEntries);
100}
101
102void MappingTraits<XCOFFYAML::Object>::mapping(IO &IO, XCOFFYAML::Object &Obj) {
103  IO.mapTag("!XCOFF", true);
104  IO.mapRequired("FileHeader", Obj.Header);
105  IO.mapRequired("Symbols", Obj.Symbols);
106}
107
108} // namespace yaml
109} // namespace llvm
110