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