ELFYAML.h revision fe57e347a57d643bbbcc9c19c8267a3e8c06b5a6
1//===- ELFYAML.h - ELF YAMLIO implementation --------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9/// 10/// \file 11/// \brief This file declares classes for handling the YAML representation 12/// of ELF. 13/// 14//===----------------------------------------------------------------------===// 15 16#ifndef LLVM_OBJECT_ELFYAML_H 17#define LLVM_OBJECT_ELFYAML_H 18 19#include "llvm/Object/YAML.h" 20#include "llvm/Support/ELF.h" 21 22namespace llvm { 23namespace ELFYAML { 24 25// These types are invariant across 32/64-bit ELF, so for simplicity just 26// directly give them their exact sizes. We don't need to worry about 27// endianness because these are just the types in the YAMLIO structures, 28// and are appropriately converted to the necessary endianness when 29// reading/generating binary object files. 30// The naming of these types is intended to be ELF_PREFIX, where PREFIX is 31// the common prefix of the respective constants. E.g. ELF_EM corresponds 32// to the `e_machine` constants, like `EM_X86_64`. 33// In the future, these would probably be better suited by C++11 enum 34// class's with appropriate fixed underlying type. 35LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_ET) 36LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_EM) 37LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFCLASS) 38LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFDATA) 39LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_SHT) 40// Just use 64, since it can hold 32-bit values too. 41LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_SHF) 42 43// For now, hardcode 64 bits everywhere that 32 or 64 would be needed 44// since 64-bit can hold 32-bit values too. 45struct FileHeader { 46 ELF_ELFCLASS Class; 47 ELF_ELFDATA Data; 48 ELF_ET Type; 49 ELF_EM Machine; 50 llvm::yaml::Hex64 Entry; 51}; 52struct Section { 53 StringRef Name; 54 ELF_SHT Type; 55 ELF_SHF Flags; 56 llvm::yaml::Hex64 Address; 57 object::yaml::BinaryRef Content; 58 StringRef Link; 59 llvm::yaml::Hex64 AddressAlign; 60}; 61struct Object { 62 FileHeader Header; 63 std::vector<Section> Sections; 64}; 65 66} // end namespace ELFYAML 67} // end namespace llvm 68 69LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Section) 70 71namespace llvm { 72namespace yaml { 73 74template <> 75struct ScalarEnumerationTraits<ELFYAML::ELF_ET> { 76 static void enumeration(IO &IO, ELFYAML::ELF_ET &Value); 77}; 78 79template <> 80struct ScalarEnumerationTraits<ELFYAML::ELF_EM> { 81 static void enumeration(IO &IO, ELFYAML::ELF_EM &Value); 82}; 83 84template <> 85struct ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS> { 86 static void enumeration(IO &IO, ELFYAML::ELF_ELFCLASS &Value); 87}; 88 89template <> 90struct ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA> { 91 static void enumeration(IO &IO, ELFYAML::ELF_ELFDATA &Value); 92}; 93 94template <> 95struct ScalarEnumerationTraits<ELFYAML::ELF_SHT> { 96 static void enumeration(IO &IO, ELFYAML::ELF_SHT &Value); 97}; 98 99template <> 100struct ScalarBitSetTraits<ELFYAML::ELF_SHF> { 101 static void bitset(IO &IO, ELFYAML::ELF_SHF &Value); 102}; 103 104template <> 105struct MappingTraits<ELFYAML::FileHeader> { 106 static void mapping(IO &IO, ELFYAML::FileHeader &FileHdr); 107}; 108 109template <> 110struct MappingTraits<ELFYAML::Section> { 111 static void mapping(IO &IO, ELFYAML::Section &Section); 112}; 113 114template <> 115struct MappingTraits<ELFYAML::Object> { 116 static void mapping(IO &IO, ELFYAML::Object &Object); 117}; 118 119} // end namespace yaml 120} // end namespace llvm 121 122#endif 123