| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 1 | //===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===// | 
|  | 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 | // This file defines classes for handling the YAML representation of ELF. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | #include "llvm/Object/ELFYAML.h" | 
| Benjamin Kramer | d59664f | 2014-04-29 23:26:49 +0000 | [diff] [blame] | 15 | #include "llvm/Support/Casting.h" | 
| Simon Atanasyan | 04d9e65 | 2015-05-07 15:40:48 +0000 | [diff] [blame] | 16 | #include "llvm/Support/MipsABIFlags.h" | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 17 |  | 
|  | 18 | namespace llvm { | 
| Simon Atanasyan | 62fce0a | 2014-04-23 11:10:55 +0000 | [diff] [blame] | 19 |  | 
| Simon Atanasyan | eb08c4f | 2014-04-23 17:30:29 +0000 | [diff] [blame] | 20 | ELFYAML::Section::~Section() {} | 
| Simon Atanasyan | 62fce0a | 2014-04-23 11:10:55 +0000 | [diff] [blame] | 21 |  | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 22 | namespace yaml { | 
|  | 23 |  | 
|  | 24 | void | 
|  | 25 | ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration(IO &IO, | 
|  | 26 | ELFYAML::ELF_ET &Value) { | 
|  | 27 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 28 | ECase(ET_NONE) | 
|  | 29 | ECase(ET_REL) | 
|  | 30 | ECase(ET_EXEC) | 
|  | 31 | ECase(ET_DYN) | 
|  | 32 | ECase(ET_CORE) | 
|  | 33 | #undef ECase | 
| Michael J. Spencer | e368a62 | 2015-01-23 21:58:09 +0000 | [diff] [blame] | 34 | IO.enumFallback<Hex16>(Value); | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 35 | } | 
|  | 36 |  | 
|  | 37 | void | 
|  | 38 | ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(IO &IO, | 
|  | 39 | ELFYAML::ELF_EM &Value) { | 
|  | 40 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 41 | ECase(EM_NONE) | 
|  | 42 | ECase(EM_M32) | 
|  | 43 | ECase(EM_SPARC) | 
|  | 44 | ECase(EM_386) | 
|  | 45 | ECase(EM_68K) | 
|  | 46 | ECase(EM_88K) | 
| Rafael Espindola | 9fed250 | 2015-06-19 14:34:12 +0000 | [diff] [blame] | 47 | ECase(EM_IAMCU) | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 48 | ECase(EM_860) | 
|  | 49 | ECase(EM_MIPS) | 
|  | 50 | ECase(EM_S370) | 
|  | 51 | ECase(EM_MIPS_RS3_LE) | 
|  | 52 | ECase(EM_PARISC) | 
|  | 53 | ECase(EM_VPP500) | 
|  | 54 | ECase(EM_SPARC32PLUS) | 
|  | 55 | ECase(EM_960) | 
|  | 56 | ECase(EM_PPC) | 
|  | 57 | ECase(EM_PPC64) | 
|  | 58 | ECase(EM_S390) | 
|  | 59 | ECase(EM_SPU) | 
|  | 60 | ECase(EM_V800) | 
|  | 61 | ECase(EM_FR20) | 
|  | 62 | ECase(EM_RH32) | 
|  | 63 | ECase(EM_RCE) | 
|  | 64 | ECase(EM_ARM) | 
|  | 65 | ECase(EM_ALPHA) | 
|  | 66 | ECase(EM_SH) | 
|  | 67 | ECase(EM_SPARCV9) | 
|  | 68 | ECase(EM_TRICORE) | 
|  | 69 | ECase(EM_ARC) | 
|  | 70 | ECase(EM_H8_300) | 
|  | 71 | ECase(EM_H8_300H) | 
|  | 72 | ECase(EM_H8S) | 
|  | 73 | ECase(EM_H8_500) | 
|  | 74 | ECase(EM_IA_64) | 
|  | 75 | ECase(EM_MIPS_X) | 
|  | 76 | ECase(EM_COLDFIRE) | 
|  | 77 | ECase(EM_68HC12) | 
|  | 78 | ECase(EM_MMA) | 
|  | 79 | ECase(EM_PCP) | 
|  | 80 | ECase(EM_NCPU) | 
|  | 81 | ECase(EM_NDR1) | 
|  | 82 | ECase(EM_STARCORE) | 
|  | 83 | ECase(EM_ME16) | 
|  | 84 | ECase(EM_ST100) | 
|  | 85 | ECase(EM_TINYJ) | 
|  | 86 | ECase(EM_X86_64) | 
|  | 87 | ECase(EM_PDSP) | 
|  | 88 | ECase(EM_PDP10) | 
|  | 89 | ECase(EM_PDP11) | 
|  | 90 | ECase(EM_FX66) | 
|  | 91 | ECase(EM_ST9PLUS) | 
|  | 92 | ECase(EM_ST7) | 
|  | 93 | ECase(EM_68HC16) | 
|  | 94 | ECase(EM_68HC11) | 
|  | 95 | ECase(EM_68HC08) | 
|  | 96 | ECase(EM_68HC05) | 
|  | 97 | ECase(EM_SVX) | 
|  | 98 | ECase(EM_ST19) | 
|  | 99 | ECase(EM_VAX) | 
|  | 100 | ECase(EM_CRIS) | 
|  | 101 | ECase(EM_JAVELIN) | 
|  | 102 | ECase(EM_FIREPATH) | 
|  | 103 | ECase(EM_ZSP) | 
|  | 104 | ECase(EM_MMIX) | 
|  | 105 | ECase(EM_HUANY) | 
|  | 106 | ECase(EM_PRISM) | 
|  | 107 | ECase(EM_AVR) | 
|  | 108 | ECase(EM_FR30) | 
|  | 109 | ECase(EM_D10V) | 
|  | 110 | ECase(EM_D30V) | 
|  | 111 | ECase(EM_V850) | 
|  | 112 | ECase(EM_M32R) | 
|  | 113 | ECase(EM_MN10300) | 
|  | 114 | ECase(EM_MN10200) | 
|  | 115 | ECase(EM_PJ) | 
|  | 116 | ECase(EM_OPENRISC) | 
|  | 117 | ECase(EM_ARC_COMPACT) | 
|  | 118 | ECase(EM_XTENSA) | 
|  | 119 | ECase(EM_VIDEOCORE) | 
|  | 120 | ECase(EM_TMM_GPP) | 
|  | 121 | ECase(EM_NS32K) | 
|  | 122 | ECase(EM_TPC) | 
|  | 123 | ECase(EM_SNP1K) | 
|  | 124 | ECase(EM_ST200) | 
|  | 125 | ECase(EM_IP2K) | 
|  | 126 | ECase(EM_MAX) | 
|  | 127 | ECase(EM_CR) | 
|  | 128 | ECase(EM_F2MC16) | 
|  | 129 | ECase(EM_MSP430) | 
|  | 130 | ECase(EM_BLACKFIN) | 
|  | 131 | ECase(EM_SE_C33) | 
|  | 132 | ECase(EM_SEP) | 
|  | 133 | ECase(EM_ARCA) | 
|  | 134 | ECase(EM_UNICORE) | 
|  | 135 | ECase(EM_EXCESS) | 
|  | 136 | ECase(EM_DXP) | 
|  | 137 | ECase(EM_ALTERA_NIOS2) | 
|  | 138 | ECase(EM_CRX) | 
|  | 139 | ECase(EM_XGATE) | 
|  | 140 | ECase(EM_C166) | 
|  | 141 | ECase(EM_M16C) | 
|  | 142 | ECase(EM_DSPIC30F) | 
|  | 143 | ECase(EM_CE) | 
|  | 144 | ECase(EM_M32C) | 
|  | 145 | ECase(EM_TSK3000) | 
|  | 146 | ECase(EM_RS08) | 
|  | 147 | ECase(EM_SHARC) | 
|  | 148 | ECase(EM_ECOG2) | 
|  | 149 | ECase(EM_SCORE7) | 
|  | 150 | ECase(EM_DSP24) | 
|  | 151 | ECase(EM_VIDEOCORE3) | 
|  | 152 | ECase(EM_LATTICEMICO32) | 
|  | 153 | ECase(EM_SE_C17) | 
|  | 154 | ECase(EM_TI_C6000) | 
|  | 155 | ECase(EM_TI_C2000) | 
|  | 156 | ECase(EM_TI_C5500) | 
|  | 157 | ECase(EM_MMDSP_PLUS) | 
|  | 158 | ECase(EM_CYPRESS_M8C) | 
|  | 159 | ECase(EM_R32C) | 
|  | 160 | ECase(EM_TRIMEDIA) | 
|  | 161 | ECase(EM_HEXAGON) | 
|  | 162 | ECase(EM_8051) | 
|  | 163 | ECase(EM_STXP7X) | 
|  | 164 | ECase(EM_NDS32) | 
|  | 165 | ECase(EM_ECOG1) | 
|  | 166 | ECase(EM_ECOG1X) | 
|  | 167 | ECase(EM_MAXQ30) | 
|  | 168 | ECase(EM_XIMO16) | 
|  | 169 | ECase(EM_MANIK) | 
|  | 170 | ECase(EM_CRAYNV2) | 
|  | 171 | ECase(EM_RX) | 
|  | 172 | ECase(EM_METAG) | 
|  | 173 | ECase(EM_MCST_ELBRUS) | 
|  | 174 | ECase(EM_ECOG16) | 
|  | 175 | ECase(EM_CR16) | 
|  | 176 | ECase(EM_ETPU) | 
|  | 177 | ECase(EM_SLE9X) | 
|  | 178 | ECase(EM_L10M) | 
|  | 179 | ECase(EM_K10M) | 
|  | 180 | ECase(EM_AARCH64) | 
|  | 181 | ECase(EM_AVR32) | 
|  | 182 | ECase(EM_STM8) | 
|  | 183 | ECase(EM_TILE64) | 
|  | 184 | ECase(EM_TILEPRO) | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 185 | ECase(EM_CUDA) | 
|  | 186 | ECase(EM_TILEGX) | 
|  | 187 | ECase(EM_CLOUDSHIELD) | 
|  | 188 | ECase(EM_COREA_1ST) | 
|  | 189 | ECase(EM_COREA_2ND) | 
|  | 190 | ECase(EM_ARC_COMPACT2) | 
|  | 191 | ECase(EM_OPEN8) | 
|  | 192 | ECase(EM_RL78) | 
|  | 193 | ECase(EM_VIDEOCORE5) | 
|  | 194 | ECase(EM_78KOR) | 
|  | 195 | ECase(EM_56800EX) | 
| Tom Stellard | e182e74 | 2015-07-31 01:15:15 +0000 | [diff] [blame] | 196 | ECase(EM_AMDGPU) | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 197 | #undef ECase | 
|  | 198 | } | 
|  | 199 |  | 
|  | 200 | void ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration( | 
|  | 201 | IO &IO, ELFYAML::ELF_ELFCLASS &Value) { | 
|  | 202 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 203 | // Since the semantics of ELFCLASSNONE is "invalid", just don't accept it | 
|  | 204 | // here. | 
|  | 205 | ECase(ELFCLASS32) | 
|  | 206 | ECase(ELFCLASS64) | 
|  | 207 | #undef ECase | 
|  | 208 | } | 
|  | 209 |  | 
|  | 210 | void ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration( | 
|  | 211 | IO &IO, ELFYAML::ELF_ELFDATA &Value) { | 
|  | 212 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 213 | // Since the semantics of ELFDATANONE is "invalid", just don't accept it | 
|  | 214 | // here. | 
|  | 215 | ECase(ELFDATA2LSB) | 
|  | 216 | ECase(ELFDATA2MSB) | 
|  | 217 | #undef ECase | 
|  | 218 | } | 
|  | 219 |  | 
| Sean Silva | 8432251 | 2013-06-19 00:55:28 +0000 | [diff] [blame] | 220 | void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( | 
|  | 221 | IO &IO, ELFYAML::ELF_ELFOSABI &Value) { | 
|  | 222 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 223 | ECase(ELFOSABI_NONE) | 
|  | 224 | ECase(ELFOSABI_HPUX) | 
|  | 225 | ECase(ELFOSABI_NETBSD) | 
|  | 226 | ECase(ELFOSABI_GNU) | 
|  | 227 | ECase(ELFOSABI_GNU) | 
|  | 228 | ECase(ELFOSABI_HURD) | 
|  | 229 | ECase(ELFOSABI_SOLARIS) | 
|  | 230 | ECase(ELFOSABI_AIX) | 
|  | 231 | ECase(ELFOSABI_IRIX) | 
|  | 232 | ECase(ELFOSABI_FREEBSD) | 
|  | 233 | ECase(ELFOSABI_TRU64) | 
|  | 234 | ECase(ELFOSABI_MODESTO) | 
|  | 235 | ECase(ELFOSABI_OPENBSD) | 
|  | 236 | ECase(ELFOSABI_OPENVMS) | 
|  | 237 | ECase(ELFOSABI_NSK) | 
|  | 238 | ECase(ELFOSABI_AROS) | 
|  | 239 | ECase(ELFOSABI_FENIXOS) | 
| Ed Schouten | dae7189 | 2015-03-09 18:40:45 +0000 | [diff] [blame] | 240 | ECase(ELFOSABI_CLOUDABI) | 
| Sean Silva | 8432251 | 2013-06-19 00:55:28 +0000 | [diff] [blame] | 241 | ECase(ELFOSABI_C6000_ELFABI) | 
|  | 242 | ECase(ELFOSABI_C6000_LINUX) | 
|  | 243 | ECase(ELFOSABI_ARM) | 
|  | 244 | ECase(ELFOSABI_STANDALONE) | 
|  | 245 | #undef ECase | 
|  | 246 | } | 
|  | 247 |  | 
| Daniel Sanders | 9cf3d3b | 2014-03-31 09:44:05 +0000 | [diff] [blame] | 248 | void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, | 
|  | 249 | ELFYAML::ELF_EF &Value) { | 
| Simon Atanasyan | 1e3edf9 | 2014-05-03 11:39:50 +0000 | [diff] [blame] | 250 | const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); | 
|  | 251 | assert(Object && "The IO context is not initialized"); | 
| Daniel Sanders | 9cf3d3b | 2014-03-31 09:44:05 +0000 | [diff] [blame] | 252 | #define BCase(X) IO.bitSetCase(Value, #X, ELF::X); | 
| Simon Atanasyan | 84242dc | 2014-05-23 08:07:09 +0000 | [diff] [blame] | 253 | #define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M); | 
| Simon Atanasyan | 1e3edf9 | 2014-05-03 11:39:50 +0000 | [diff] [blame] | 254 | switch (Object->Header.Machine) { | 
|  | 255 | case ELF::EM_ARM: | 
|  | 256 | BCase(EF_ARM_SOFT_FLOAT) | 
|  | 257 | BCase(EF_ARM_VFP_FLOAT) | 
| Simon Atanasyan | 84242dc | 2014-05-23 08:07:09 +0000 | [diff] [blame] | 258 | BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK) | 
|  | 259 | BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK) | 
|  | 260 | BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK) | 
|  | 261 | BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK) | 
|  | 262 | BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK) | 
|  | 263 | BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK) | 
| Simon Atanasyan | 1e3edf9 | 2014-05-03 11:39:50 +0000 | [diff] [blame] | 264 | break; | 
|  | 265 | case ELF::EM_MIPS: | 
|  | 266 | BCase(EF_MIPS_NOREORDER) | 
|  | 267 | BCase(EF_MIPS_PIC) | 
|  | 268 | BCase(EF_MIPS_CPIC) | 
|  | 269 | BCase(EF_MIPS_ABI2) | 
|  | 270 | BCase(EF_MIPS_32BITMODE) | 
| Simon Atanasyan | 67bdc79 | 2015-05-07 14:04:44 +0000 | [diff] [blame] | 271 | BCase(EF_MIPS_FP64) | 
| Simon Atanasyan | d2bfd00 | 2014-11-04 13:33:36 +0000 | [diff] [blame] | 272 | BCase(EF_MIPS_NAN2008) | 
| Simon Atanasyan | 1e3edf9 | 2014-05-03 11:39:50 +0000 | [diff] [blame] | 273 | BCase(EF_MIPS_MICROMIPS) | 
|  | 274 | BCase(EF_MIPS_ARCH_ASE_M16) | 
| Simon Atanasyan | 67bdc79 | 2015-05-07 14:04:44 +0000 | [diff] [blame] | 275 | BCase(EF_MIPS_ARCH_ASE_MDMX) | 
|  | 276 | BCaseMask(EF_MIPS_ABI_O32, EF_MIPS_ABI) | 
|  | 277 | BCaseMask(EF_MIPS_ABI_O64, EF_MIPS_ABI) | 
|  | 278 | BCaseMask(EF_MIPS_ABI_EABI32, EF_MIPS_ABI) | 
|  | 279 | BCaseMask(EF_MIPS_ABI_EABI64, EF_MIPS_ABI) | 
| Simon Atanasyan | 40e7eb1 | 2015-05-08 07:04:59 +0000 | [diff] [blame] | 280 | BCaseMask(EF_MIPS_MACH_3900, EF_MIPS_MACH) | 
|  | 281 | BCaseMask(EF_MIPS_MACH_4010, EF_MIPS_MACH) | 
|  | 282 | BCaseMask(EF_MIPS_MACH_4100, EF_MIPS_MACH) | 
|  | 283 | BCaseMask(EF_MIPS_MACH_4650, EF_MIPS_MACH) | 
|  | 284 | BCaseMask(EF_MIPS_MACH_4120, EF_MIPS_MACH) | 
|  | 285 | BCaseMask(EF_MIPS_MACH_4111, EF_MIPS_MACH) | 
|  | 286 | BCaseMask(EF_MIPS_MACH_SB1, EF_MIPS_MACH) | 
|  | 287 | BCaseMask(EF_MIPS_MACH_OCTEON, EF_MIPS_MACH) | 
|  | 288 | BCaseMask(EF_MIPS_MACH_XLR, EF_MIPS_MACH) | 
|  | 289 | BCaseMask(EF_MIPS_MACH_OCTEON2, EF_MIPS_MACH) | 
|  | 290 | BCaseMask(EF_MIPS_MACH_OCTEON3, EF_MIPS_MACH) | 
|  | 291 | BCaseMask(EF_MIPS_MACH_5400, EF_MIPS_MACH) | 
|  | 292 | BCaseMask(EF_MIPS_MACH_5900, EF_MIPS_MACH) | 
|  | 293 | BCaseMask(EF_MIPS_MACH_5500, EF_MIPS_MACH) | 
|  | 294 | BCaseMask(EF_MIPS_MACH_9000, EF_MIPS_MACH) | 
|  | 295 | BCaseMask(EF_MIPS_MACH_LS2E, EF_MIPS_MACH) | 
|  | 296 | BCaseMask(EF_MIPS_MACH_LS2F, EF_MIPS_MACH) | 
|  | 297 | BCaseMask(EF_MIPS_MACH_LS3A, EF_MIPS_MACH) | 
| Simon Atanasyan | 84242dc | 2014-05-23 08:07:09 +0000 | [diff] [blame] | 298 | BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH) | 
|  | 299 | BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH) | 
|  | 300 | BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH) | 
|  | 301 | BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH) | 
|  | 302 | BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH) | 
|  | 303 | BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH) | 
|  | 304 | BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH) | 
|  | 305 | BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH) | 
|  | 306 | BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH) | 
|  | 307 | BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH) | 
|  | 308 | BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH) | 
| Simon Atanasyan | 1e3edf9 | 2014-05-03 11:39:50 +0000 | [diff] [blame] | 309 | break; | 
|  | 310 | case ELF::EM_HEXAGON: | 
|  | 311 | BCase(EF_HEXAGON_MACH_V2) | 
|  | 312 | BCase(EF_HEXAGON_MACH_V3) | 
|  | 313 | BCase(EF_HEXAGON_MACH_V4) | 
|  | 314 | BCase(EF_HEXAGON_MACH_V5) | 
|  | 315 | BCase(EF_HEXAGON_ISA_V2) | 
|  | 316 | BCase(EF_HEXAGON_ISA_V3) | 
|  | 317 | BCase(EF_HEXAGON_ISA_V4) | 
|  | 318 | BCase(EF_HEXAGON_ISA_V5) | 
|  | 319 | break; | 
|  | 320 | default: | 
|  | 321 | llvm_unreachable("Unsupported architecture"); | 
|  | 322 | } | 
| Daniel Sanders | 9cf3d3b | 2014-03-31 09:44:05 +0000 | [diff] [blame] | 323 | #undef BCase | 
| Simon Atanasyan | 84242dc | 2014-05-23 08:07:09 +0000 | [diff] [blame] | 324 | #undef BCaseMask | 
| Daniel Sanders | 9cf3d3b | 2014-03-31 09:44:05 +0000 | [diff] [blame] | 325 | } | 
|  | 326 |  | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 327 | void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( | 
|  | 328 | IO &IO, ELFYAML::ELF_SHT &Value) { | 
| Simon Atanasyan | 8ebb6ae | 2014-07-12 18:25:08 +0000 | [diff] [blame] | 329 | const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); | 
|  | 330 | assert(Object && "The IO context is not initialized"); | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 331 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 332 | ECase(SHT_NULL) | 
|  | 333 | ECase(SHT_PROGBITS) | 
| Sean Silva | 8217757 | 2013-06-22 01:38:00 +0000 | [diff] [blame] | 334 | // No SHT_SYMTAB. Use the top-level `Symbols` key instead. | 
|  | 335 | // FIXME: Issue a diagnostic with this information. | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 336 | ECase(SHT_STRTAB) | 
|  | 337 | ECase(SHT_RELA) | 
|  | 338 | ECase(SHT_HASH) | 
|  | 339 | ECase(SHT_DYNAMIC) | 
|  | 340 | ECase(SHT_NOTE) | 
|  | 341 | ECase(SHT_NOBITS) | 
|  | 342 | ECase(SHT_REL) | 
|  | 343 | ECase(SHT_SHLIB) | 
|  | 344 | ECase(SHT_DYNSYM) | 
|  | 345 | ECase(SHT_INIT_ARRAY) | 
|  | 346 | ECase(SHT_FINI_ARRAY) | 
|  | 347 | ECase(SHT_PREINIT_ARRAY) | 
|  | 348 | ECase(SHT_GROUP) | 
|  | 349 | ECase(SHT_SYMTAB_SHNDX) | 
| Simon Atanasyan | 9a922c4 | 2014-05-03 11:39:44 +0000 | [diff] [blame] | 350 | ECase(SHT_LOOS) | 
|  | 351 | ECase(SHT_GNU_ATTRIBUTES) | 
|  | 352 | ECase(SHT_GNU_HASH) | 
|  | 353 | ECase(SHT_GNU_verdef) | 
|  | 354 | ECase(SHT_GNU_verneed) | 
|  | 355 | ECase(SHT_GNU_versym) | 
|  | 356 | ECase(SHT_HIOS) | 
|  | 357 | ECase(SHT_LOPROC) | 
| Simon Atanasyan | 8ebb6ae | 2014-07-12 18:25:08 +0000 | [diff] [blame] | 358 | switch (Object->Header.Machine) { | 
|  | 359 | case ELF::EM_ARM: | 
|  | 360 | ECase(SHT_ARM_EXIDX) | 
|  | 361 | ECase(SHT_ARM_PREEMPTMAP) | 
|  | 362 | ECase(SHT_ARM_ATTRIBUTES) | 
|  | 363 | ECase(SHT_ARM_DEBUGOVERLAY) | 
|  | 364 | ECase(SHT_ARM_OVERLAYSECTION) | 
|  | 365 | break; | 
|  | 366 | case ELF::EM_HEXAGON: | 
|  | 367 | ECase(SHT_HEX_ORDERED) | 
|  | 368 | break; | 
|  | 369 | case ELF::EM_X86_64: | 
|  | 370 | ECase(SHT_X86_64_UNWIND) | 
|  | 371 | break; | 
|  | 372 | case ELF::EM_MIPS: | 
|  | 373 | ECase(SHT_MIPS_REGINFO) | 
|  | 374 | ECase(SHT_MIPS_OPTIONS) | 
| Simon Atanasyan | 1cd169f | 2014-07-13 15:28:54 +0000 | [diff] [blame] | 375 | ECase(SHT_MIPS_ABIFLAGS) | 
| Simon Atanasyan | 6abd4be | 2014-07-13 16:18:56 +0000 | [diff] [blame] | 376 | break; | 
| Simon Atanasyan | 8ebb6ae | 2014-07-12 18:25:08 +0000 | [diff] [blame] | 377 | default: | 
|  | 378 | // Nothing to do. | 
|  | 379 | break; | 
|  | 380 | } | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 381 | #undef ECase | 
|  | 382 | } | 
|  | 383 |  | 
|  | 384 | void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, | 
|  | 385 | ELFYAML::ELF_SHF &Value) { | 
|  | 386 | #define BCase(X) IO.bitSetCase(Value, #X, ELF::X); | 
|  | 387 | BCase(SHF_WRITE) | 
|  | 388 | BCase(SHF_ALLOC) | 
| Benjamin Kramer | ac511ca | 2013-09-15 19:53:20 +0000 | [diff] [blame] | 389 | BCase(SHF_EXCLUDE) | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 390 | BCase(SHF_EXECINSTR) | 
|  | 391 | BCase(SHF_MERGE) | 
|  | 392 | BCase(SHF_STRINGS) | 
|  | 393 | BCase(SHF_INFO_LINK) | 
|  | 394 | BCase(SHF_LINK_ORDER) | 
|  | 395 | BCase(SHF_OS_NONCONFORMING) | 
|  | 396 | BCase(SHF_GROUP) | 
|  | 397 | BCase(SHF_TLS) | 
|  | 398 | #undef BCase | 
|  | 399 | } | 
|  | 400 |  | 
| Sean Silva | bba8559 | 2013-06-19 00:11:59 +0000 | [diff] [blame] | 401 | void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration( | 
|  | 402 | IO &IO, ELFYAML::ELF_STT &Value) { | 
|  | 403 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 404 | ECase(STT_NOTYPE) | 
|  | 405 | ECase(STT_OBJECT) | 
|  | 406 | ECase(STT_FUNC) | 
|  | 407 | ECase(STT_SECTION) | 
|  | 408 | ECase(STT_FILE) | 
|  | 409 | ECase(STT_COMMON) | 
|  | 410 | ECase(STT_TLS) | 
|  | 411 | ECase(STT_GNU_IFUNC) | 
|  | 412 | #undef ECase | 
|  | 413 | } | 
|  | 414 |  | 
| Simon Atanasyan | 65e6467 | 2014-06-06 07:41:57 +0000 | [diff] [blame] | 415 | void ScalarEnumerationTraits<ELFYAML::ELF_STV>::enumeration( | 
|  | 416 | IO &IO, ELFYAML::ELF_STV &Value) { | 
|  | 417 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 418 | ECase(STV_DEFAULT) | 
|  | 419 | ECase(STV_INTERNAL) | 
|  | 420 | ECase(STV_HIDDEN) | 
|  | 421 | ECase(STV_PROTECTED) | 
|  | 422 | #undef ECase | 
|  | 423 | } | 
|  | 424 |  | 
| Simon Atanasyan | 60e1a79 | 2014-11-06 22:46:24 +0000 | [diff] [blame] | 425 | void ScalarBitSetTraits<ELFYAML::ELF_STO>::bitset(IO &IO, | 
|  | 426 | ELFYAML::ELF_STO &Value) { | 
|  | 427 | const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); | 
|  | 428 | assert(Object && "The IO context is not initialized"); | 
|  | 429 | #define BCase(X) IO.bitSetCase(Value, #X, ELF::X); | 
|  | 430 | switch (Object->Header.Machine) { | 
|  | 431 | case ELF::EM_MIPS: | 
|  | 432 | BCase(STO_MIPS_OPTIONAL) | 
|  | 433 | BCase(STO_MIPS_PLT) | 
|  | 434 | BCase(STO_MIPS_PIC) | 
|  | 435 | BCase(STO_MIPS_MICROMIPS) | 
|  | 436 | break; | 
|  | 437 | default: | 
|  | 438 | break; // Nothing to do | 
|  | 439 | } | 
|  | 440 | #undef BCase | 
|  | 441 | #undef BCaseMask | 
|  | 442 | } | 
|  | 443 |  | 
| Simon Atanasyan | 5d19c67 | 2015-01-25 13:29:25 +0000 | [diff] [blame] | 444 | void ScalarEnumerationTraits<ELFYAML::ELF_RSS>::enumeration( | 
|  | 445 | IO &IO, ELFYAML::ELF_RSS &Value) { | 
|  | 446 | #define ECase(X) IO.enumCase(Value, #X, ELF::X); | 
|  | 447 | ECase(RSS_UNDEF) | 
|  | 448 | ECase(RSS_GP) | 
|  | 449 | ECase(RSS_GP0) | 
|  | 450 | ECase(RSS_LOC) | 
|  | 451 | #undef ECase | 
|  | 452 | } | 
|  | 453 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 454 | void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( | 
|  | 455 | IO &IO, ELFYAML::ELF_REL &Value) { | 
|  | 456 | const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); | 
|  | 457 | assert(Object && "The IO context is not initialized"); | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 458 | #define ELF_RELOC(X, Y) IO.enumCase(Value, #X, ELF::X); | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 459 | switch (Object->Header.Machine) { | 
|  | 460 | case ELF::EM_X86_64: | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 461 | #include "llvm/Support/ELFRelocs/x86_64.def" | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 462 | break; | 
|  | 463 | case ELF::EM_MIPS: | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 464 | #include "llvm/Support/ELFRelocs/Mips.def" | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 465 | break; | 
|  | 466 | case ELF::EM_HEXAGON: | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 467 | #include "llvm/Support/ELFRelocs/Hexagon.def" | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 468 | break; | 
| Simon Atanasyan | 68f6150 | 2014-05-07 17:06:38 +0000 | [diff] [blame] | 469 | case ELF::EM_386: | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 470 | #include "llvm/Support/ELFRelocs/i386.def" | 
| Simon Atanasyan | 68f6150 | 2014-05-07 17:06:38 +0000 | [diff] [blame] | 471 | break; | 
| Chad Rosier | a9ae3e3 | 2014-11-10 23:02:03 +0000 | [diff] [blame] | 472 | case ELF::EM_AARCH64: | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 473 | #include "llvm/Support/ELFRelocs/AArch64.def" | 
| Chad Rosier | a9ae3e3 | 2014-11-10 23:02:03 +0000 | [diff] [blame] | 474 | break; | 
| Will Newton | 9efe625 | 2014-12-02 09:49:09 +0000 | [diff] [blame] | 475 | case ELF::EM_ARM: | 
|  | 476 | #include "llvm/Support/ELFRelocs/ARM.def" | 
|  | 477 | break; | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 478 | default: | 
|  | 479 | llvm_unreachable("Unsupported architecture"); | 
|  | 480 | } | 
| Tim Northover | 6e8e506 | 2014-11-21 20:16:09 +0000 | [diff] [blame] | 481 | #undef ELF_RELOC | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 482 | } | 
|  | 483 |  | 
| Simon Atanasyan | 04d9e65 | 2015-05-07 15:40:48 +0000 | [diff] [blame] | 484 | void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration( | 
|  | 485 | IO &IO, ELFYAML::MIPS_AFL_REG &Value) { | 
|  | 486 | #define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X); | 
|  | 487 | ECase(REG_NONE) | 
|  | 488 | ECase(REG_32) | 
|  | 489 | ECase(REG_64) | 
|  | 490 | ECase(REG_128) | 
|  | 491 | #undef ECase | 
|  | 492 | } | 
|  | 493 |  | 
|  | 494 | void ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP>::enumeration( | 
|  | 495 | IO &IO, ELFYAML::MIPS_ABI_FP &Value) { | 
|  | 496 | #define ECase(X) IO.enumCase(Value, #X, Mips::Val_GNU_MIPS_ABI_##X); | 
|  | 497 | ECase(FP_ANY) | 
|  | 498 | ECase(FP_DOUBLE) | 
|  | 499 | ECase(FP_SINGLE) | 
|  | 500 | ECase(FP_SOFT) | 
|  | 501 | ECase(FP_OLD_64) | 
|  | 502 | ECase(FP_XX) | 
|  | 503 | ECase(FP_64) | 
|  | 504 | ECase(FP_64A) | 
|  | 505 | #undef ECase | 
|  | 506 | } | 
|  | 507 |  | 
|  | 508 | void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT>::enumeration( | 
|  | 509 | IO &IO, ELFYAML::MIPS_AFL_EXT &Value) { | 
|  | 510 | #define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X); | 
|  | 511 | ECase(EXT_NONE) | 
|  | 512 | ECase(EXT_XLR) | 
|  | 513 | ECase(EXT_OCTEON2) | 
|  | 514 | ECase(EXT_OCTEONP) | 
|  | 515 | ECase(EXT_LOONGSON_3A) | 
|  | 516 | ECase(EXT_OCTEON) | 
|  | 517 | ECase(EXT_5900) | 
|  | 518 | ECase(EXT_4650) | 
|  | 519 | ECase(EXT_4010) | 
|  | 520 | ECase(EXT_4100) | 
|  | 521 | ECase(EXT_3900) | 
|  | 522 | ECase(EXT_10000) | 
|  | 523 | ECase(EXT_SB1) | 
|  | 524 | ECase(EXT_4111) | 
|  | 525 | ECase(EXT_4120) | 
|  | 526 | ECase(EXT_5400) | 
|  | 527 | ECase(EXT_5500) | 
|  | 528 | ECase(EXT_LOONGSON_2E) | 
|  | 529 | ECase(EXT_LOONGSON_2F) | 
|  | 530 | ECase(EXT_OCTEON3) | 
|  | 531 | #undef ECase | 
|  | 532 | } | 
|  | 533 |  | 
|  | 534 | void ScalarEnumerationTraits<ELFYAML::MIPS_ISA>::enumeration( | 
|  | 535 | IO &IO, ELFYAML::MIPS_ISA &Value) { | 
|  | 536 | IO.enumCase(Value, "MIPS1", 1); | 
|  | 537 | IO.enumCase(Value, "MIPS2", 2); | 
|  | 538 | IO.enumCase(Value, "MIPS3", 3); | 
|  | 539 | IO.enumCase(Value, "MIPS4", 4); | 
|  | 540 | IO.enumCase(Value, "MIPS5", 5); | 
|  | 541 | IO.enumCase(Value, "MIPS32", 32); | 
|  | 542 | IO.enumCase(Value, "MIPS64", 64); | 
|  | 543 | } | 
|  | 544 |  | 
|  | 545 | void ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE>::bitset( | 
|  | 546 | IO &IO, ELFYAML::MIPS_AFL_ASE &Value) { | 
|  | 547 | #define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_ASE_##X); | 
|  | 548 | BCase(DSP) | 
|  | 549 | BCase(DSPR2) | 
|  | 550 | BCase(EVA) | 
|  | 551 | BCase(MCU) | 
|  | 552 | BCase(MDMX) | 
|  | 553 | BCase(MIPS3D) | 
|  | 554 | BCase(MT) | 
|  | 555 | BCase(SMARTMIPS) | 
|  | 556 | BCase(VIRT) | 
|  | 557 | BCase(MSA) | 
|  | 558 | BCase(MIPS16) | 
|  | 559 | BCase(MICROMIPS) | 
|  | 560 | BCase(XPA) | 
|  | 561 | #undef BCase | 
|  | 562 | } | 
|  | 563 |  | 
|  | 564 | void ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1>::bitset( | 
|  | 565 | IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value) { | 
|  | 566 | #define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_FLAGS1_##X); | 
|  | 567 | BCase(ODDSPREG) | 
|  | 568 | #undef BCase | 
|  | 569 | } | 
|  | 570 |  | 
| Sean Silva | 31836f3 | 2013-06-12 00:01:22 +0000 | [diff] [blame] | 571 | void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, | 
|  | 572 | ELFYAML::FileHeader &FileHdr) { | 
| Sean Silva | 864dd75 | 2013-06-11 00:13:52 +0000 | [diff] [blame] | 573 | IO.mapRequired("Class", FileHdr.Class); | 
|  | 574 | IO.mapRequired("Data", FileHdr.Data); | 
| Sean Silva | 8432251 | 2013-06-19 00:55:28 +0000 | [diff] [blame] | 575 | IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0)); | 
| Sean Silva | 864dd75 | 2013-06-11 00:13:52 +0000 | [diff] [blame] | 576 | IO.mapRequired("Type", FileHdr.Type); | 
|  | 577 | IO.mapRequired("Machine", FileHdr.Machine); | 
| Daniel Sanders | 9cf3d3b | 2014-03-31 09:44:05 +0000 | [diff] [blame] | 578 | IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0)); | 
| Sean Silva | 864dd75 | 2013-06-11 00:13:52 +0000 | [diff] [blame] | 579 | IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 580 | } | 
|  | 581 |  | 
| Simon Atanasyan | 60e1a79 | 2014-11-06 22:46:24 +0000 | [diff] [blame] | 582 | namespace { | 
|  | 583 | struct NormalizedOther { | 
|  | 584 | NormalizedOther(IO &) | 
|  | 585 | : Visibility(ELFYAML::ELF_STV(0)), Other(ELFYAML::ELF_STO(0)) {} | 
|  | 586 | NormalizedOther(IO &, uint8_t Original) | 
|  | 587 | : Visibility(Original & 0x3), Other(Original & ~0x3) {} | 
|  | 588 |  | 
|  | 589 | uint8_t denormalize(IO &) { return Visibility | Other; } | 
|  | 590 |  | 
|  | 591 | ELFYAML::ELF_STV Visibility; | 
|  | 592 | ELFYAML::ELF_STO Other; | 
|  | 593 | }; | 
| Alexander Kornienko | f00654e | 2015-06-23 09:49:53 +0000 | [diff] [blame] | 594 | } | 
| Simon Atanasyan | 60e1a79 | 2014-11-06 22:46:24 +0000 | [diff] [blame] | 595 |  | 
| Sean Silva | 6b08388 | 2013-06-18 23:14:03 +0000 | [diff] [blame] | 596 | void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { | 
|  | 597 | IO.mapOptional("Name", Symbol.Name, StringRef()); | 
| Sean Silva | bba8559 | 2013-06-19 00:11:59 +0000 | [diff] [blame] | 598 | IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); | 
| Sean Silva | 9818622 | 2013-06-20 20:59:41 +0000 | [diff] [blame] | 599 | IO.mapOptional("Section", Symbol.Section, StringRef()); | 
| Sean Silva | 05001b9 | 2013-06-20 20:59:47 +0000 | [diff] [blame] | 600 | IO.mapOptional("Value", Symbol.Value, Hex64(0)); | 
|  | 601 | IO.mapOptional("Size", Symbol.Size, Hex64(0)); | 
| Simon Atanasyan | 60e1a79 | 2014-11-06 22:46:24 +0000 | [diff] [blame] | 602 |  | 
|  | 603 | MappingNormalization<NormalizedOther, uint8_t> Keys(IO, Symbol.Other); | 
|  | 604 | IO.mapOptional("Visibility", Keys->Visibility, ELFYAML::ELF_STV(0)); | 
|  | 605 | IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0)); | 
| Sean Silva | 6b08388 | 2013-06-18 23:14:03 +0000 | [diff] [blame] | 606 | } | 
|  | 607 |  | 
| Sean Silva | aff5125 | 2013-06-21 00:27:50 +0000 | [diff] [blame] | 608 | void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping( | 
|  | 609 | IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) { | 
|  | 610 | IO.mapOptional("Local", Symbols.Local); | 
|  | 611 | IO.mapOptional("Global", Symbols.Global); | 
|  | 612 | IO.mapOptional("Weak", Symbols.Weak); | 
|  | 613 | } | 
|  | 614 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 615 | static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 616 | IO.mapOptional("Name", Section.Name, StringRef()); | 
|  | 617 | IO.mapRequired("Type", Section.Type); | 
|  | 618 | IO.mapOptional("Flags", Section.Flags, ELFYAML::ELF_SHF(0)); | 
| Sean Silva | f4bfced | 2013-06-13 22:19:54 +0000 | [diff] [blame] | 619 | IO.mapOptional("Address", Section.Address, Hex64(0)); | 
| Simon Atanasyan | 8d59c8d | 2014-05-15 18:04:02 +0000 | [diff] [blame] | 620 | IO.mapOptional("Link", Section.Link, StringRef()); | 
| Sean Silva | 0a409cf | 2013-06-14 00:38:02 +0000 | [diff] [blame] | 621 | IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); | 
| Shankar Easwaran | 6fbbe20 | 2015-02-21 04:28:26 +0000 | [diff] [blame] | 622 | IO.mapOptional("Info", Section.Info, StringRef()); | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 623 | } | 
|  | 624 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 625 | static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) { | 
|  | 626 | commonSectionMapping(IO, Section); | 
|  | 627 | IO.mapOptional("Content", Section.Content); | 
| Simon Atanasyan | b83f380 | 2014-05-16 16:01:00 +0000 | [diff] [blame] | 628 | IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size())); | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 629 | } | 
|  | 630 |  | 
| Simon Atanasyan | 5db0276 | 2015-07-03 23:00:54 +0000 | [diff] [blame] | 631 | static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) { | 
|  | 632 | commonSectionMapping(IO, Section); | 
|  | 633 | IO.mapOptional("Size", Section.Size, Hex64(0)); | 
|  | 634 | } | 
|  | 635 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 636 | static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { | 
|  | 637 | commonSectionMapping(IO, Section); | 
|  | 638 | IO.mapOptional("Relocations", Section.Relocations); | 
|  | 639 | } | 
|  | 640 |  | 
| Shankar Easwaran | 6fbbe20 | 2015-02-21 04:28:26 +0000 | [diff] [blame] | 641 | static void groupSectionMapping(IO &IO, ELFYAML::Group &group) { | 
|  | 642 | commonSectionMapping(IO, group); | 
|  | 643 | IO.mapRequired("Members", group.Members); | 
|  | 644 | } | 
|  | 645 |  | 
|  | 646 | void MappingTraits<ELFYAML::SectionOrType>::mapping( | 
|  | 647 | IO &IO, ELFYAML::SectionOrType §ionOrType) { | 
|  | 648 | IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType); | 
|  | 649 | } | 
|  | 650 |  | 
| Simon Atanasyan | 04d9e65 | 2015-05-07 15:40:48 +0000 | [diff] [blame] | 651 | static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) { | 
|  | 652 | commonSectionMapping(IO, Section); | 
|  | 653 | IO.mapOptional("Version", Section.Version, Hex16(0)); | 
|  | 654 | IO.mapRequired("ISA", Section.ISALevel); | 
|  | 655 | IO.mapOptional("ISARevision", Section.ISARevision, Hex8(0)); | 
|  | 656 | IO.mapOptional("ISAExtension", Section.ISAExtension, | 
|  | 657 | ELFYAML::MIPS_AFL_EXT(Mips::AFL_EXT_NONE)); | 
|  | 658 | IO.mapOptional("ASEs", Section.ASEs, ELFYAML::MIPS_AFL_ASE(0)); | 
|  | 659 | IO.mapOptional("FpABI", Section.FpABI, | 
|  | 660 | ELFYAML::MIPS_ABI_FP(Mips::Val_GNU_MIPS_ABI_FP_ANY)); | 
|  | 661 | IO.mapOptional("GPRSize", Section.GPRSize, | 
|  | 662 | ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); | 
|  | 663 | IO.mapOptional("CPR1Size", Section.CPR1Size, | 
|  | 664 | ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); | 
|  | 665 | IO.mapOptional("CPR2Size", Section.CPR2Size, | 
|  | 666 | ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); | 
|  | 667 | IO.mapOptional("Flags1", Section.Flags1, ELFYAML::MIPS_AFL_FLAGS1(0)); | 
|  | 668 | IO.mapOptional("Flags2", Section.Flags2, Hex32(0)); | 
|  | 669 | } | 
|  | 670 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 671 | void MappingTraits<std::unique_ptr<ELFYAML::Section>>::mapping( | 
|  | 672 | IO &IO, std::unique_ptr<ELFYAML::Section> &Section) { | 
|  | 673 | ELFYAML::ELF_SHT sectionType; | 
|  | 674 | if (IO.outputting()) | 
|  | 675 | sectionType = Section->Type; | 
| Simon Atanasyan | ae6bb33 | 2014-05-14 05:07:47 +0000 | [diff] [blame] | 676 | else | 
|  | 677 | IO.mapRequired("Type", sectionType); | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 678 |  | 
|  | 679 | switch (sectionType) { | 
|  | 680 | case ELF::SHT_REL: | 
|  | 681 | case ELF::SHT_RELA: | 
|  | 682 | if (!IO.outputting()) | 
|  | 683 | Section.reset(new ELFYAML::RelocationSection()); | 
|  | 684 | sectionMapping(IO, *cast<ELFYAML::RelocationSection>(Section.get())); | 
|  | 685 | break; | 
| Shankar Easwaran | 6fbbe20 | 2015-02-21 04:28:26 +0000 | [diff] [blame] | 686 | case ELF::SHT_GROUP: | 
|  | 687 | if (!IO.outputting()) | 
|  | 688 | Section.reset(new ELFYAML::Group()); | 
|  | 689 | groupSectionMapping(IO, *cast<ELFYAML::Group>(Section.get())); | 
|  | 690 | break; | 
| Simon Atanasyan | 5db0276 | 2015-07-03 23:00:54 +0000 | [diff] [blame] | 691 | case ELF::SHT_NOBITS: | 
|  | 692 | if (!IO.outputting()) | 
|  | 693 | Section.reset(new ELFYAML::NoBitsSection()); | 
|  | 694 | sectionMapping(IO, *cast<ELFYAML::NoBitsSection>(Section.get())); | 
|  | 695 | break; | 
| Simon Atanasyan | 04d9e65 | 2015-05-07 15:40:48 +0000 | [diff] [blame] | 696 | case ELF::SHT_MIPS_ABIFLAGS: | 
|  | 697 | if (!IO.outputting()) | 
|  | 698 | Section.reset(new ELFYAML::MipsABIFlags()); | 
|  | 699 | sectionMapping(IO, *cast<ELFYAML::MipsABIFlags>(Section.get())); | 
|  | 700 | break; | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 701 | default: | 
|  | 702 | if (!IO.outputting()) | 
|  | 703 | Section.reset(new ELFYAML::RawContentSection()); | 
|  | 704 | sectionMapping(IO, *cast<ELFYAML::RawContentSection>(Section.get())); | 
|  | 705 | } | 
|  | 706 | } | 
|  | 707 |  | 
| Simon Atanasyan | b83f380 | 2014-05-16 16:01:00 +0000 | [diff] [blame] | 708 | StringRef MappingTraits<std::unique_ptr<ELFYAML::Section>>::validate( | 
|  | 709 | IO &io, std::unique_ptr<ELFYAML::Section> &Section) { | 
|  | 710 | const auto *RawSection = dyn_cast<ELFYAML::RawContentSection>(Section.get()); | 
|  | 711 | if (!RawSection || RawSection->Size >= RawSection->Content.binary_size()) | 
|  | 712 | return StringRef(); | 
|  | 713 | return "Section size must be greater or equal to the content size"; | 
|  | 714 | } | 
|  | 715 |  | 
| Simon Atanasyan | 5d19c67 | 2015-01-25 13:29:25 +0000 | [diff] [blame] | 716 | namespace { | 
|  | 717 | struct NormalizedMips64RelType { | 
|  | 718 | NormalizedMips64RelType(IO &) | 
|  | 719 | : Type(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), | 
|  | 720 | Type2(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), | 
|  | 721 | Type3(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), | 
|  | 722 | SpecSym(ELFYAML::ELF_REL(ELF::RSS_UNDEF)) {} | 
|  | 723 | NormalizedMips64RelType(IO &, ELFYAML::ELF_REL Original) | 
|  | 724 | : Type(Original & 0xFF), Type2(Original >> 8 & 0xFF), | 
|  | 725 | Type3(Original >> 16 & 0xFF), SpecSym(Original >> 24 & 0xFF) {} | 
|  | 726 |  | 
|  | 727 | ELFYAML::ELF_REL denormalize(IO &) { | 
|  | 728 | ELFYAML::ELF_REL Res = Type | Type2 << 8 | Type3 << 16 | SpecSym << 24; | 
|  | 729 | return Res; | 
|  | 730 | } | 
|  | 731 |  | 
|  | 732 | ELFYAML::ELF_REL Type; | 
|  | 733 | ELFYAML::ELF_REL Type2; | 
|  | 734 | ELFYAML::ELF_REL Type3; | 
|  | 735 | ELFYAML::ELF_RSS SpecSym; | 
|  | 736 | }; | 
| Alexander Kornienko | f00654e | 2015-06-23 09:49:53 +0000 | [diff] [blame] | 737 | } | 
| Simon Atanasyan | 5d19c67 | 2015-01-25 13:29:25 +0000 | [diff] [blame] | 738 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 739 | void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO, | 
|  | 740 | ELFYAML::Relocation &Rel) { | 
| Simon Atanasyan | 5d19c67 | 2015-01-25 13:29:25 +0000 | [diff] [blame] | 741 | const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); | 
|  | 742 | assert(Object && "The IO context is not initialized"); | 
|  | 743 |  | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 744 | IO.mapRequired("Offset", Rel.Offset); | 
|  | 745 | IO.mapRequired("Symbol", Rel.Symbol); | 
| Simon Atanasyan | 5d19c67 | 2015-01-25 13:29:25 +0000 | [diff] [blame] | 746 |  | 
|  | 747 | if (Object->Header.Machine == ELFYAML::ELF_EM(ELF::EM_MIPS) && | 
|  | 748 | Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { | 
|  | 749 | MappingNormalization<NormalizedMips64RelType, ELFYAML::ELF_REL> Key( | 
|  | 750 | IO, Rel.Type); | 
|  | 751 | IO.mapRequired("Type", Key->Type); | 
|  | 752 | IO.mapOptional("Type2", Key->Type2, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); | 
|  | 753 | IO.mapOptional("Type3", Key->Type3, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); | 
|  | 754 | IO.mapOptional("SpecSym", Key->SpecSym, ELFYAML::ELF_RSS(ELF::RSS_UNDEF)); | 
|  | 755 | } else | 
|  | 756 | IO.mapRequired("Type", Rel.Type); | 
|  | 757 |  | 
| Simon Atanasyan | 99cd1fb | 2015-01-29 06:56:24 +0000 | [diff] [blame] | 758 | IO.mapOptional("Addend", Rel.Addend, (int64_t)0); | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 759 | } | 
|  | 760 |  | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 761 | void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) { | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 762 | assert(!IO.getContext() && "The IO context is initialized already"); | 
|  | 763 | IO.setContext(&Object); | 
| Sean Silva | 864dd75 | 2013-06-11 00:13:52 +0000 | [diff] [blame] | 764 | IO.mapRequired("FileHeader", Object.Header); | 
| Sean Silva | 3820593 | 2013-06-13 22:19:48 +0000 | [diff] [blame] | 765 | IO.mapOptional("Sections", Object.Sections); | 
| Sean Silva | 8217757 | 2013-06-22 01:38:00 +0000 | [diff] [blame] | 766 | IO.mapOptional("Symbols", Object.Symbols); | 
| Simon Atanasyan | 42ac0dd | 2014-04-11 04:13:39 +0000 | [diff] [blame] | 767 | IO.setContext(nullptr); | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 768 | } | 
|  | 769 |  | 
| Simon Atanasyan | 04d9e65 | 2015-05-07 15:40:48 +0000 | [diff] [blame] | 770 | LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG) | 
|  | 771 | LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP) | 
|  | 772 | LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT) | 
|  | 773 | LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE) | 
|  | 774 | LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1) | 
|  | 775 |  | 
| Sean Silva | f99309c | 2013-06-10 23:44:15 +0000 | [diff] [blame] | 776 | } // end namespace yaml | 
|  | 777 | } // end namespace llvm |