ELFYAML.h revision 5ba1225fb074f8035668637292d994d4c39757d1
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)
42LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STB)
43LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STT)
44
45// For now, hardcode 64 bits everywhere that 32 or 64 would be needed
46// since 64-bit can hold 32-bit values too.
47struct FileHeader {
48  ELF_ELFCLASS Class;
49  ELF_ELFDATA Data;
50  ELF_ET Type;
51  ELF_EM Machine;
52  llvm::yaml::Hex64 Entry;
53};
54struct Symbol {
55  StringRef Name;
56  ELF_STB Binding;
57  ELF_STT Type;
58};
59struct Section {
60  StringRef Name;
61  ELF_SHT Type;
62  ELF_SHF Flags;
63  llvm::yaml::Hex64 Address;
64  object::yaml::BinaryRef Content;
65  StringRef Link;
66  llvm::yaml::Hex64 AddressAlign;
67  // For SHT_SYMTAB; should be empty otherwise.
68  std::vector<Symbol> Symbols;
69};
70struct Object {
71  FileHeader Header;
72  std::vector<Section> Sections;
73};
74
75} // end namespace ELFYAML
76} // end namespace llvm
77
78LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Section)
79LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Symbol)
80
81namespace llvm {
82namespace yaml {
83
84template <>
85struct ScalarEnumerationTraits<ELFYAML::ELF_ET> {
86  static void enumeration(IO &IO, ELFYAML::ELF_ET &Value);
87};
88
89template <>
90struct ScalarEnumerationTraits<ELFYAML::ELF_EM> {
91  static void enumeration(IO &IO, ELFYAML::ELF_EM &Value);
92};
93
94template <>
95struct ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS> {
96  static void enumeration(IO &IO, ELFYAML::ELF_ELFCLASS &Value);
97};
98
99template <>
100struct ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA> {
101  static void enumeration(IO &IO, ELFYAML::ELF_ELFDATA &Value);
102};
103
104template <>
105struct ScalarEnumerationTraits<ELFYAML::ELF_SHT> {
106  static void enumeration(IO &IO, ELFYAML::ELF_SHT &Value);
107};
108
109template <>
110struct ScalarBitSetTraits<ELFYAML::ELF_SHF> {
111  static void bitset(IO &IO, ELFYAML::ELF_SHF &Value);
112};
113
114template <>
115struct ScalarEnumerationTraits<ELFYAML::ELF_STB> {
116  static void enumeration(IO &IO, ELFYAML::ELF_STB &Value);
117};
118
119template <>
120struct ScalarEnumerationTraits<ELFYAML::ELF_STT> {
121  static void enumeration(IO &IO, ELFYAML::ELF_STT &Value);
122};
123
124template <>
125struct MappingTraits<ELFYAML::FileHeader> {
126  static void mapping(IO &IO, ELFYAML::FileHeader &FileHdr);
127};
128
129template <>
130struct MappingTraits<ELFYAML::Symbol> {
131  static void mapping(IO &IO, ELFYAML::Symbol &Symbol);
132};
133
134template <>
135struct MappingTraits<ELFYAML::Section> {
136  static void mapping(IO &IO, ELFYAML::Section &Section);
137};
138
139template <>
140struct MappingTraits<ELFYAML::Object> {
141  static void mapping(IO &IO, ELFYAML::Object &Object);
142};
143
144} // end namespace yaml
145} // end namespace llvm
146
147#endif
148