annotate include/llvm/ObjectYAML/ELFYAML.h @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===- ELFYAML.h - ELF YAMLIO implementation --------------------*- C++ -*-===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 ///
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 /// \file
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 /// \brief This file declares classes for handling the YAML representation
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 /// of ELF.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 ///
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 #ifndef LLVM_OBJECTYAML_ELFYAML_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 #define LLVM_OBJECTYAML_ELFYAML_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
19 #include "llvm/ADT/StringRef.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 #include "llvm/ObjectYAML/YAML.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/Support/YAMLTraits.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
22 #include <cstdint>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 #include <memory>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
24 #include <vector>
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 namespace ELFYAML {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 // These types are invariant across 32/64-bit ELF, so for simplicity just
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 // directly give them their exact sizes. We don't need to worry about
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 // endianness because these are just the types in the YAMLIO structures,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 // and are appropriately converted to the necessary endianness when
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 // reading/generating binary object files.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 // The naming of these types is intended to be ELF_PREFIX, where PREFIX is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 // the common prefix of the respective constants. E.g. ELF_EM corresponds
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 // to the `e_machine` constants, like `EM_X86_64`.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 // In the future, these would probably be better suited by C++11 enum
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 // class's with appropriate fixed underlying type.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_ET)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_PT)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_EM)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFCLASS)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFDATA)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ELFOSABI)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 // Just use 64, since it can hold 32-bit values too.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_EF)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
47 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_PF)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_SHT)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_REL)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_RSS)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 // Just use 64, since it can hold 32-bit values too.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_SHF)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
53 LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_SHN)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STT)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STV)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STO)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_ISA)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 // For now, hardcode 64 bits everywhere that 32 or 64 would be needed
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 // since 64-bit can hold 32-bit values too.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 struct FileHeader {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 ELF_ELFCLASS Class;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 ELF_ELFDATA Data;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 ELF_ELFOSABI OSABI;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 ELF_ET Type;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 ELF_EM Machine;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 ELF_EF Flags;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 llvm::yaml::Hex64 Entry;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 };
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
77 struct SectionName {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 StringRef Section;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
80
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
81 struct ProgramHeader {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
82 ELF_PT Type;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
83 ELF_PF Flags;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
84 llvm::yaml::Hex64 VAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
85 llvm::yaml::Hex64 PAddr;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
86 Optional<llvm::yaml::Hex64> Align;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
87 std::vector<SectionName> Sections;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
88 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
89
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 struct Symbol {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 StringRef Name;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 ELF_STT Type;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 StringRef Section;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
94 Optional<ELF_SHN> Index;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 llvm::yaml::Hex64 Value;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 llvm::yaml::Hex64 Size;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 uint8_t Other;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 };
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 struct LocalGlobalWeakSymbols {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 std::vector<Symbol> Local;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 std::vector<Symbol> Global;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 std::vector<Symbol> Weak;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 struct SectionOrType {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 StringRef sectionNameOrType;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110 struct Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 enum class SectionKind {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 Group,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 RawContent,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 Relocation,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 NoBits,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 MipsABIFlags
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 SectionKind Kind;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 StringRef Name;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 ELF_SHT Type;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 ELF_SHF Flags;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 llvm::yaml::Hex64 Address;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123 StringRef Link;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 StringRef Info;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 llvm::yaml::Hex64 AddressAlign;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
126
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 Section(SectionKind Kind) : Kind(Kind) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 virtual ~Section();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130 struct RawContentSection : Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 yaml::BinaryRef Content;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 llvm::yaml::Hex64 Size;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 RawContentSection() : Section(SectionKind::RawContent) {}
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
135
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 static bool classof(const Section *S) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 return S->Kind == SectionKind::RawContent;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 struct NoBitsSection : Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142 llvm::yaml::Hex64 Size;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
143
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144 NoBitsSection() : Section(SectionKind::NoBits) {}
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
145
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 static bool classof(const Section *S) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147 return S->Kind == SectionKind::NoBits;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 struct Group : Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 // Members of a group contain a flag and a list of section indices
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 // that are part of the group.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 std::vector<SectionOrType> Members;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
155
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156 Group() : Section(SectionKind::Group) {}
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
157
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
158 static bool classof(const Section *S) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
159 return S->Kind == SectionKind::Group;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
160 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
161 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
162
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
163 struct Relocation {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
164 llvm::yaml::Hex64 Offset;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
165 int64_t Addend;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
166 ELF_REL Type;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
167 Optional<StringRef> Symbol;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
168 };
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
169
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
170 struct RelocationSection : Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
171 std::vector<Relocation> Relocations;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
172
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
173 RelocationSection() : Section(SectionKind::Relocation) {}
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
174
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
175 static bool classof(const Section *S) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
176 return S->Kind == SectionKind::Relocation;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
177 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
178 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
179
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 // Represents .MIPS.abiflags section
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181 struct MipsABIFlags : Section {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182 llvm::yaml::Hex16 Version;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183 MIPS_ISA ISALevel;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
184 llvm::yaml::Hex8 ISARevision;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185 MIPS_AFL_REG GPRSize;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 MIPS_AFL_REG CPR1Size;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
187 MIPS_AFL_REG CPR2Size;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
188 MIPS_ABI_FP FpABI;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
189 MIPS_AFL_EXT ISAExtension;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
190 MIPS_AFL_ASE ASEs;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
191 MIPS_AFL_FLAGS1 Flags1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
192 llvm::yaml::Hex32 Flags2;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
193
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
194 MipsABIFlags() : Section(SectionKind::MipsABIFlags) {}
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
195
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
196 static bool classof(const Section *S) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
197 return S->Kind == SectionKind::MipsABIFlags;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
198 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
199 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
200
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
201 struct Object {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
202 FileHeader Header;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
203 std::vector<ProgramHeader> ProgramHeaders;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
204 std::vector<std::unique_ptr<Section>> Sections;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
205 // Although in reality the symbols reside in a section, it is a lot
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
206 // cleaner and nicer if we read them from the YAML as a separate
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
207 // top-level key, which automatically ensures that invariants like there
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
208 // being a single SHT_SYMTAB section are upheld.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
209 LocalGlobalWeakSymbols Symbols;
134
3a76565eade5 update 5.0.1
mir3636
parents: 121
diff changeset
210 LocalGlobalWeakSymbols DynamicSymbols;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
211 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
212
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
213 } // end namespace ELFYAML
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
214 } // end namespace llvm
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
215
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
216 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::ProgramHeader)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
217 LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::ELFYAML::Section>)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
218 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Symbol)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
219 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::Relocation)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
220 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::SectionOrType)
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::SectionName)
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
222
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
223 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
224 namespace yaml {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
225
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
226 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
227 struct ScalarEnumerationTraits<ELFYAML::ELF_ET> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
228 static void enumeration(IO &IO, ELFYAML::ELF_ET &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
229 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
230
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
231 template <> struct ScalarEnumerationTraits<ELFYAML::ELF_PT> {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
232 static void enumeration(IO &IO, ELFYAML::ELF_PT &Value);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
233 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
234
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
235 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
236 struct ScalarEnumerationTraits<ELFYAML::ELF_EM> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
237 static void enumeration(IO &IO, ELFYAML::ELF_EM &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
238 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
239
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
240 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
241 struct ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
242 static void enumeration(IO &IO, ELFYAML::ELF_ELFCLASS &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
243 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
244
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
245 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
246 struct ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
247 static void enumeration(IO &IO, ELFYAML::ELF_ELFDATA &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
248 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
249
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
250 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
251 struct ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
252 static void enumeration(IO &IO, ELFYAML::ELF_ELFOSABI &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
253 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
254
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
255 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
256 struct ScalarBitSetTraits<ELFYAML::ELF_EF> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
257 static void bitset(IO &IO, ELFYAML::ELF_EF &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
258 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
259
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
260 template <> struct ScalarBitSetTraits<ELFYAML::ELF_PF> {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
261 static void bitset(IO &IO, ELFYAML::ELF_PF &Value);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
262 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
263
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
264 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
265 struct ScalarEnumerationTraits<ELFYAML::ELF_SHT> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
266 static void enumeration(IO &IO, ELFYAML::ELF_SHT &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
267 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
268
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
269 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
270 struct ScalarBitSetTraits<ELFYAML::ELF_SHF> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
271 static void bitset(IO &IO, ELFYAML::ELF_SHF &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
272 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
273
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
274 template <> struct ScalarEnumerationTraits<ELFYAML::ELF_SHN> {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
275 static void enumeration(IO &IO, ELFYAML::ELF_SHN &Value);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
276 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
277
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
278 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
279 struct ScalarEnumerationTraits<ELFYAML::ELF_STT> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
280 static void enumeration(IO &IO, ELFYAML::ELF_STT &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
281 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
282
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
283 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
284 struct ScalarEnumerationTraits<ELFYAML::ELF_STV> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
285 static void enumeration(IO &IO, ELFYAML::ELF_STV &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
286 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
287
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
288 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
289 struct ScalarBitSetTraits<ELFYAML::ELF_STO> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
290 static void bitset(IO &IO, ELFYAML::ELF_STO &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
291 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
292
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
293 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
294 struct ScalarEnumerationTraits<ELFYAML::ELF_REL> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
295 static void enumeration(IO &IO, ELFYAML::ELF_REL &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
296 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
297
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
298 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
299 struct ScalarEnumerationTraits<ELFYAML::ELF_RSS> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
300 static void enumeration(IO &IO, ELFYAML::ELF_RSS &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
301 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
302
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
303 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
304 struct ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
305 static void enumeration(IO &IO, ELFYAML::MIPS_AFL_REG &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
306 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
307
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
308 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
309 struct ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
310 static void enumeration(IO &IO, ELFYAML::MIPS_ABI_FP &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
311 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
312
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
313 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
314 struct ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
315 static void enumeration(IO &IO, ELFYAML::MIPS_AFL_EXT &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
316 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
317
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
318 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
319 struct ScalarEnumerationTraits<ELFYAML::MIPS_ISA> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
320 static void enumeration(IO &IO, ELFYAML::MIPS_ISA &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
321 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
322
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
323 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
324 struct ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
325 static void bitset(IO &IO, ELFYAML::MIPS_AFL_ASE &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
326 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
327
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
328 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
329 struct ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
330 static void bitset(IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
331 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
332
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
333 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
334 struct MappingTraits<ELFYAML::FileHeader> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
335 static void mapping(IO &IO, ELFYAML::FileHeader &FileHdr);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
336 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
337
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338 template <> struct MappingTraits<ELFYAML::ProgramHeader> {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 static void mapping(IO &IO, ELFYAML::ProgramHeader &FileHdr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
342 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
343 struct MappingTraits<ELFYAML::Symbol> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
344 static void mapping(IO &IO, ELFYAML::Symbol &Symbol);
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
345 static StringRef validate(IO &IO, ELFYAML::Symbol &Symbol);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
346 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
347
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
348 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
349 struct MappingTraits<ELFYAML::LocalGlobalWeakSymbols> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
350 static void mapping(IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
351 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
352
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
353 template <> struct MappingTraits<ELFYAML::Relocation> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
354 static void mapping(IO &IO, ELFYAML::Relocation &Rel);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
355 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
356
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
357 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
358 struct MappingTraits<std::unique_ptr<ELFYAML::Section>> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
359 static void mapping(IO &IO, std::unique_ptr<ELFYAML::Section> &Section);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
360 static StringRef validate(IO &io, std::unique_ptr<ELFYAML::Section> &Section);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
361 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
362
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
363 template <>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
364 struct MappingTraits<ELFYAML::Object> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
365 static void mapping(IO &IO, ELFYAML::Object &Object);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
366 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
367
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
368 template <> struct MappingTraits<ELFYAML::SectionOrType> {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
369 static void mapping(IO &IO, ELFYAML::SectionOrType &sectionOrType);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
370 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
371
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
372 template <> struct MappingTraits<ELFYAML::SectionName> {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
373 static void mapping(IO &IO, ELFYAML::SectionName &sectionName);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
374 };
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
375
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
376 } // end namespace yaml
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
377 } // end namespace llvm
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
378
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
379 #endif // LLVM_OBJECTYAML_ELFYAML_H