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