1303231Sdim//===- COFFYAML.h - COFF YAMLIO implementation ------------------*- C++ -*-===//
2303231Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6303231Sdim//
7303231Sdim//===----------------------------------------------------------------------===//
8303231Sdim//
9303231Sdim// This file declares classes for handling the YAML representation of COFF.
10303231Sdim//
11303231Sdim//===----------------------------------------------------------------------===//
12303231Sdim
13303231Sdim#ifndef LLVM_OBJECTYAML_COFFYAML_H
14303231Sdim#define LLVM_OBJECTYAML_COFFYAML_H
15303231Sdim
16303231Sdim#include "llvm/ADT/Optional.h"
17321369Sdim#include "llvm/ADT/StringRef.h"
18321369Sdim#include "llvm/BinaryFormat/COFF.h"
19321369Sdim#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
20327952Sdim#include "llvm/ObjectYAML/CodeViewYAMLTypeHashing.h"
21321369Sdim#include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
22303231Sdim#include "llvm/ObjectYAML/YAML.h"
23321369Sdim#include <cstdint>
24321369Sdim#include <vector>
25303231Sdim
26303231Sdimnamespace llvm {
27303231Sdim
28303231Sdimnamespace COFF {
29321369Sdim
30303231Sdiminline Characteristics operator|(Characteristics a, Characteristics b) {
31303231Sdim  uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
32303231Sdim  return static_cast<Characteristics>(Ret);
33303231Sdim}
34303231Sdim
35303231Sdiminline SectionCharacteristics operator|(SectionCharacteristics a,
36303231Sdim                                        SectionCharacteristics b) {
37303231Sdim  uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
38303231Sdim  return static_cast<SectionCharacteristics>(Ret);
39303231Sdim}
40303231Sdim
41303231Sdiminline DLLCharacteristics operator|(DLLCharacteristics a,
42303231Sdim                                    DLLCharacteristics b) {
43303231Sdim  uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b);
44303231Sdim  return static_cast<DLLCharacteristics>(Ret);
45303231Sdim}
46303231Sdim
47321369Sdim} // end namespace COFF
48321369Sdim
49303231Sdim// The structure of the yaml files is not an exact 1:1 match to COFF. In order
50303231Sdim// to use yaml::IO, we use these structures which are closer to the source.
51303231Sdimnamespace COFFYAML {
52303231Sdim
53321369SdimLLVM_YAML_STRONG_TYPEDEF(uint8_t, COMDATType)
54321369SdimLLVM_YAML_STRONG_TYPEDEF(uint32_t, WeakExternalCharacteristics)
55321369SdimLLVM_YAML_STRONG_TYPEDEF(uint8_t, AuxSymbolType)
56303231Sdim
57321369Sdimstruct Relocation {
58321369Sdim  uint32_t VirtualAddress;
59321369Sdim  uint16_t Type;
60344779Sdim
61344779Sdim  // Normally a Relocation can refer to the symbol via its name.
62344779Sdim  // It can also use a direct symbol table index instead (with no name
63344779Sdim  // specified), allowing disambiguating between multiple symbols with the
64344779Sdim  // same name or crafting intentionally broken files for testing.
65321369Sdim  StringRef SymbolName;
66344779Sdim  Optional<uint32_t> SymbolTableIndex;
67321369Sdim};
68303231Sdim
69321369Sdimstruct Section {
70321369Sdim  COFF::section Header;
71321369Sdim  unsigned Alignment = 0;
72321369Sdim  yaml::BinaryRef SectionData;
73321369Sdim  std::vector<CodeViewYAML::YAMLDebugSubsection> DebugS;
74321369Sdim  std::vector<CodeViewYAML::LeafRecord> DebugT;
75341825Sdim  std::vector<CodeViewYAML::LeafRecord> DebugP;
76327952Sdim  Optional<CodeViewYAML::DebugHSection> DebugH;
77321369Sdim  std::vector<Relocation> Relocations;
78321369Sdim  StringRef Name;
79303231Sdim
80321369Sdim  Section();
81321369Sdim};
82303231Sdim
83321369Sdimstruct Symbol {
84321369Sdim  COFF::symbol Header;
85321369Sdim  COFF::SymbolBaseType SimpleType = COFF::IMAGE_SYM_TYPE_NULL;
86321369Sdim  COFF::SymbolComplexType ComplexType = COFF::IMAGE_SYM_DTYPE_NULL;
87321369Sdim  Optional<COFF::AuxiliaryFunctionDefinition> FunctionDefinition;
88321369Sdim  Optional<COFF::AuxiliarybfAndefSymbol> bfAndefSymbol;
89321369Sdim  Optional<COFF::AuxiliaryWeakExternal> WeakExternal;
90321369Sdim  StringRef File;
91321369Sdim  Optional<COFF::AuxiliarySectionDefinition> SectionDefinition;
92321369Sdim  Optional<COFF::AuxiliaryCLRToken> CLRToken;
93321369Sdim  StringRef Name;
94303231Sdim
95321369Sdim  Symbol();
96321369Sdim};
97321369Sdim
98321369Sdimstruct PEHeader {
99321369Sdim  COFF::PE32Header Header;
100321369Sdim  Optional<COFF::DataDirectory> DataDirectories[COFF::NUM_DATA_DIRECTORIES];
101321369Sdim};
102321369Sdim
103321369Sdimstruct Object {
104321369Sdim  Optional<PEHeader> OptionalHeader;
105321369Sdim  COFF::header Header;
106321369Sdim  std::vector<Section> Sections;
107321369Sdim  std::vector<Symbol> Symbols;
108321369Sdim
109321369Sdim  Object();
110321369Sdim};
111321369Sdim
112321369Sdim} // end namespace COFFYAML
113321369Sdim
114321369Sdim} // end namespace llvm
115321369Sdim
116303231SdimLLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
117303231SdimLLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
118303231SdimLLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
119303231Sdim
120303231Sdimnamespace llvm {
121303231Sdimnamespace yaml {
122303231Sdim
123303231Sdimtemplate <>
124303231Sdimstruct ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics> {
125303231Sdim  static void enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value);
126303231Sdim};
127303231Sdim
128303231Sdimtemplate <>
129303231Sdimstruct ScalarEnumerationTraits<COFFYAML::AuxSymbolType> {
130303231Sdim  static void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value);
131303231Sdim};
132303231Sdim
133303231Sdimtemplate <>
134303231Sdimstruct ScalarEnumerationTraits<COFFYAML::COMDATType> {
135303231Sdim  static void enumeration(IO &IO, COFFYAML::COMDATType &Value);
136303231Sdim};
137303231Sdim
138303231Sdimtemplate <>
139303231Sdimstruct ScalarEnumerationTraits<COFF::MachineTypes> {
140303231Sdim  static void enumeration(IO &IO, COFF::MachineTypes &Value);
141303231Sdim};
142303231Sdim
143303231Sdimtemplate <>
144303231Sdimstruct ScalarEnumerationTraits<COFF::SymbolBaseType> {
145303231Sdim  static void enumeration(IO &IO, COFF::SymbolBaseType &Value);
146303231Sdim};
147303231Sdim
148303231Sdimtemplate <>
149303231Sdimstruct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
150303231Sdim  static void enumeration(IO &IO, COFF::SymbolStorageClass &Value);
151303231Sdim};
152303231Sdim
153303231Sdimtemplate <>
154303231Sdimstruct ScalarEnumerationTraits<COFF::SymbolComplexType> {
155303231Sdim  static void enumeration(IO &IO, COFF::SymbolComplexType &Value);
156303231Sdim};
157303231Sdim
158303231Sdimtemplate <>
159303231Sdimstruct ScalarEnumerationTraits<COFF::RelocationTypeI386> {
160303231Sdim  static void enumeration(IO &IO, COFF::RelocationTypeI386 &Value);
161303231Sdim};
162303231Sdim
163303231Sdimtemplate <>
164303231Sdimstruct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
165303231Sdim  static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
166303231Sdim};
167303231Sdim
168303231Sdimtemplate <>
169327952Sdimstruct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
170327952Sdim  static void enumeration(IO &IO, COFF::RelocationTypesARM &Value);
171327952Sdim};
172327952Sdim
173327952Sdimtemplate <>
174327952Sdimstruct ScalarEnumerationTraits<COFF::RelocationTypesARM64> {
175327952Sdim  static void enumeration(IO &IO, COFF::RelocationTypesARM64 &Value);
176327952Sdim};
177327952Sdim
178327952Sdimtemplate <>
179303231Sdimstruct ScalarEnumerationTraits<COFF::WindowsSubsystem> {
180303231Sdim  static void enumeration(IO &IO, COFF::WindowsSubsystem &Value);
181303231Sdim};
182303231Sdim
183303231Sdimtemplate <>
184303231Sdimstruct ScalarBitSetTraits<COFF::Characteristics> {
185303231Sdim  static void bitset(IO &IO, COFF::Characteristics &Value);
186303231Sdim};
187303231Sdim
188303231Sdimtemplate <>
189303231Sdimstruct ScalarBitSetTraits<COFF::SectionCharacteristics> {
190303231Sdim  static void bitset(IO &IO, COFF::SectionCharacteristics &Value);
191303231Sdim};
192303231Sdim
193303231Sdimtemplate <>
194303231Sdimstruct ScalarBitSetTraits<COFF::DLLCharacteristics> {
195303231Sdim  static void bitset(IO &IO, COFF::DLLCharacteristics &Value);
196303231Sdim};
197303231Sdim
198303231Sdimtemplate <>
199303231Sdimstruct MappingTraits<COFFYAML::Relocation> {
200303231Sdim  static void mapping(IO &IO, COFFYAML::Relocation &Rel);
201303231Sdim};
202303231Sdim
203303231Sdimtemplate <>
204303231Sdimstruct MappingTraits<COFFYAML::PEHeader> {
205303231Sdim  static void mapping(IO &IO, COFFYAML::PEHeader &PH);
206303231Sdim};
207303231Sdim
208303231Sdimtemplate <>
209303231Sdimstruct MappingTraits<COFF::DataDirectory> {
210303231Sdim  static void mapping(IO &IO, COFF::DataDirectory &DD);
211303231Sdim};
212303231Sdim
213303231Sdimtemplate <>
214303231Sdimstruct MappingTraits<COFF::header> {
215303231Sdim  static void mapping(IO &IO, COFF::header &H);
216303231Sdim};
217303231Sdim
218303231Sdimtemplate <> struct MappingTraits<COFF::AuxiliaryFunctionDefinition> {
219303231Sdim  static void mapping(IO &IO, COFF::AuxiliaryFunctionDefinition &AFD);
220303231Sdim};
221303231Sdim
222303231Sdimtemplate <> struct MappingTraits<COFF::AuxiliarybfAndefSymbol> {
223303231Sdim  static void mapping(IO &IO, COFF::AuxiliarybfAndefSymbol &AAS);
224303231Sdim};
225303231Sdim
226303231Sdimtemplate <> struct MappingTraits<COFF::AuxiliaryWeakExternal> {
227303231Sdim  static void mapping(IO &IO, COFF::AuxiliaryWeakExternal &AWE);
228303231Sdim};
229303231Sdim
230303231Sdimtemplate <> struct MappingTraits<COFF::AuxiliarySectionDefinition> {
231303231Sdim  static void mapping(IO &IO, COFF::AuxiliarySectionDefinition &ASD);
232303231Sdim};
233303231Sdim
234303231Sdimtemplate <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
235303231Sdim  static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
236303231Sdim};
237303231Sdim
238303231Sdimtemplate <>
239303231Sdimstruct MappingTraits<COFFYAML::Symbol> {
240303231Sdim  static void mapping(IO &IO, COFFYAML::Symbol &S);
241303231Sdim};
242303231Sdim
243303231Sdimtemplate <>
244303231Sdimstruct MappingTraits<COFFYAML::Section> {
245303231Sdim  static void mapping(IO &IO, COFFYAML::Section &Sec);
246303231Sdim};
247303231Sdim
248303231Sdimtemplate <>
249303231Sdimstruct MappingTraits<COFFYAML::Object> {
250303231Sdim  static void mapping(IO &IO, COFFYAML::Object &Obj);
251303231Sdim};
252303231Sdim
253303231Sdim} // end namespace yaml
254303231Sdim} // end namespace llvm
255303231Sdim
256321369Sdim#endif // LLVM_OBJECTYAML_COFFYAML_H
257