Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 1 | //===------ utils/obj2yaml.cpp - obj2yaml conversion tool -------*- 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 | #include "obj2yaml.h" |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 11 | #include "llvm/Object/COFF.h" |
| 12 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 13 | using namespace llvm; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 14 | |
| 15 | template <typename One, typename Two> |
| 16 | struct pod_pair { // I'd much rather use std::pair, but it's not a POD |
| 17 | One first; |
| 18 | Two second; |
| 19 | }; |
| 20 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 21 | #define STRING_PAIR(x) {COFF::x, #x} |
| 22 | static const pod_pair<COFF::MachineTypes, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 23 | MachineTypePairs [] = { |
| 24 | STRING_PAIR(IMAGE_FILE_MACHINE_UNKNOWN), |
| 25 | STRING_PAIR(IMAGE_FILE_MACHINE_AM33), |
| 26 | STRING_PAIR(IMAGE_FILE_MACHINE_AMD64), |
| 27 | STRING_PAIR(IMAGE_FILE_MACHINE_ARM), |
| 28 | STRING_PAIR(IMAGE_FILE_MACHINE_ARMV7), |
| 29 | STRING_PAIR(IMAGE_FILE_MACHINE_EBC), |
| 30 | STRING_PAIR(IMAGE_FILE_MACHINE_I386), |
| 31 | STRING_PAIR(IMAGE_FILE_MACHINE_IA64), |
| 32 | STRING_PAIR(IMAGE_FILE_MACHINE_M32R), |
| 33 | STRING_PAIR(IMAGE_FILE_MACHINE_MIPS16), |
| 34 | STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU), |
| 35 | STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU16), |
| 36 | STRING_PAIR(IMAGE_FILE_MACHINE_POWERPC), |
| 37 | STRING_PAIR(IMAGE_FILE_MACHINE_POWERPCFP), |
| 38 | STRING_PAIR(IMAGE_FILE_MACHINE_R4000), |
| 39 | STRING_PAIR(IMAGE_FILE_MACHINE_SH3), |
| 40 | STRING_PAIR(IMAGE_FILE_MACHINE_SH3DSP), |
| 41 | STRING_PAIR(IMAGE_FILE_MACHINE_SH4), |
| 42 | STRING_PAIR(IMAGE_FILE_MACHINE_SH5), |
| 43 | STRING_PAIR(IMAGE_FILE_MACHINE_THUMB), |
| 44 | STRING_PAIR(IMAGE_FILE_MACHINE_WCEMIPSV2) |
| 45 | }; |
| 46 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 47 | static const pod_pair<COFF::SectionCharacteristics, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 48 | SectionCharacteristicsPairs1 [] = { |
| 49 | STRING_PAIR(IMAGE_SCN_TYPE_NO_PAD), |
| 50 | STRING_PAIR(IMAGE_SCN_CNT_CODE), |
| 51 | STRING_PAIR(IMAGE_SCN_CNT_INITIALIZED_DATA), |
| 52 | STRING_PAIR(IMAGE_SCN_CNT_UNINITIALIZED_DATA), |
| 53 | STRING_PAIR(IMAGE_SCN_LNK_OTHER), |
| 54 | STRING_PAIR(IMAGE_SCN_LNK_INFO), |
| 55 | STRING_PAIR(IMAGE_SCN_LNK_REMOVE), |
| 56 | STRING_PAIR(IMAGE_SCN_LNK_COMDAT), |
| 57 | STRING_PAIR(IMAGE_SCN_GPREL), |
| 58 | STRING_PAIR(IMAGE_SCN_MEM_PURGEABLE), |
| 59 | STRING_PAIR(IMAGE_SCN_MEM_16BIT), |
| 60 | STRING_PAIR(IMAGE_SCN_MEM_LOCKED), |
| 61 | STRING_PAIR(IMAGE_SCN_MEM_PRELOAD) |
| 62 | }; |
| 63 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 64 | static const pod_pair<COFF::SectionCharacteristics, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 65 | SectionCharacteristicsPairsAlignment [] = { |
| 66 | STRING_PAIR(IMAGE_SCN_ALIGN_1BYTES), |
| 67 | STRING_PAIR(IMAGE_SCN_ALIGN_2BYTES), |
| 68 | STRING_PAIR(IMAGE_SCN_ALIGN_4BYTES), |
| 69 | STRING_PAIR(IMAGE_SCN_ALIGN_8BYTES), |
| 70 | STRING_PAIR(IMAGE_SCN_ALIGN_16BYTES), |
| 71 | STRING_PAIR(IMAGE_SCN_ALIGN_32BYTES), |
| 72 | STRING_PAIR(IMAGE_SCN_ALIGN_64BYTES), |
| 73 | STRING_PAIR(IMAGE_SCN_ALIGN_128BYTES), |
| 74 | STRING_PAIR(IMAGE_SCN_ALIGN_256BYTES), |
| 75 | STRING_PAIR(IMAGE_SCN_ALIGN_512BYTES), |
| 76 | STRING_PAIR(IMAGE_SCN_ALIGN_1024BYTES), |
| 77 | STRING_PAIR(IMAGE_SCN_ALIGN_2048BYTES), |
| 78 | STRING_PAIR(IMAGE_SCN_ALIGN_4096BYTES), |
| 79 | STRING_PAIR(IMAGE_SCN_ALIGN_8192BYTES) |
| 80 | }; |
| 81 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 82 | static const pod_pair<COFF::SectionCharacteristics, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 83 | SectionCharacteristicsPairs2 [] = { |
| 84 | STRING_PAIR(IMAGE_SCN_LNK_NRELOC_OVFL), |
| 85 | STRING_PAIR(IMAGE_SCN_MEM_DISCARDABLE), |
| 86 | STRING_PAIR(IMAGE_SCN_MEM_NOT_CACHED), |
| 87 | STRING_PAIR(IMAGE_SCN_MEM_NOT_PAGED), |
| 88 | STRING_PAIR(IMAGE_SCN_MEM_SHARED), |
| 89 | STRING_PAIR(IMAGE_SCN_MEM_EXECUTE), |
| 90 | STRING_PAIR(IMAGE_SCN_MEM_READ), |
| 91 | STRING_PAIR(IMAGE_SCN_MEM_WRITE) |
| 92 | }; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 93 | |
| 94 | static const pod_pair<COFF::SymbolBaseType, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 95 | SymbolBaseTypePairs [] = { |
| 96 | STRING_PAIR(IMAGE_SYM_TYPE_NULL), |
| 97 | STRING_PAIR(IMAGE_SYM_TYPE_VOID), |
| 98 | STRING_PAIR(IMAGE_SYM_TYPE_CHAR), |
| 99 | STRING_PAIR(IMAGE_SYM_TYPE_SHORT), |
| 100 | STRING_PAIR(IMAGE_SYM_TYPE_INT), |
| 101 | STRING_PAIR(IMAGE_SYM_TYPE_LONG), |
| 102 | STRING_PAIR(IMAGE_SYM_TYPE_FLOAT), |
| 103 | STRING_PAIR(IMAGE_SYM_TYPE_DOUBLE), |
| 104 | STRING_PAIR(IMAGE_SYM_TYPE_STRUCT), |
| 105 | STRING_PAIR(IMAGE_SYM_TYPE_UNION), |
| 106 | STRING_PAIR(IMAGE_SYM_TYPE_ENUM), |
| 107 | STRING_PAIR(IMAGE_SYM_TYPE_MOE), |
| 108 | STRING_PAIR(IMAGE_SYM_TYPE_BYTE), |
| 109 | STRING_PAIR(IMAGE_SYM_TYPE_WORD), |
| 110 | STRING_PAIR(IMAGE_SYM_TYPE_UINT), |
| 111 | STRING_PAIR(IMAGE_SYM_TYPE_DWORD) |
| 112 | }; |
| 113 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 114 | static const pod_pair<COFF::SymbolComplexType, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 115 | SymbolComplexTypePairs [] = { |
| 116 | STRING_PAIR(IMAGE_SYM_DTYPE_NULL), |
| 117 | STRING_PAIR(IMAGE_SYM_DTYPE_POINTER), |
| 118 | STRING_PAIR(IMAGE_SYM_DTYPE_FUNCTION), |
| 119 | STRING_PAIR(IMAGE_SYM_DTYPE_ARRAY), |
| 120 | }; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 121 | |
| 122 | static const pod_pair<COFF::SymbolStorageClass, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 123 | SymbolStorageClassPairs [] = { |
| 124 | STRING_PAIR(IMAGE_SYM_CLASS_END_OF_FUNCTION), |
| 125 | STRING_PAIR(IMAGE_SYM_CLASS_NULL), |
| 126 | STRING_PAIR(IMAGE_SYM_CLASS_AUTOMATIC), |
| 127 | STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL), |
| 128 | STRING_PAIR(IMAGE_SYM_CLASS_STATIC), |
| 129 | STRING_PAIR(IMAGE_SYM_CLASS_REGISTER), |
| 130 | STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL_DEF), |
| 131 | STRING_PAIR(IMAGE_SYM_CLASS_LABEL), |
| 132 | STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_LABEL), |
| 133 | STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT), |
| 134 | STRING_PAIR(IMAGE_SYM_CLASS_ARGUMENT), |
| 135 | STRING_PAIR(IMAGE_SYM_CLASS_STRUCT_TAG), |
| 136 | STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_UNION), |
| 137 | STRING_PAIR(IMAGE_SYM_CLASS_UNION_TAG), |
| 138 | STRING_PAIR(IMAGE_SYM_CLASS_TYPE_DEFINITION), |
| 139 | STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_STATIC), |
| 140 | STRING_PAIR(IMAGE_SYM_CLASS_ENUM_TAG), |
| 141 | STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_ENUM), |
| 142 | STRING_PAIR(IMAGE_SYM_CLASS_REGISTER_PARAM), |
| 143 | STRING_PAIR(IMAGE_SYM_CLASS_BIT_FIELD), |
| 144 | STRING_PAIR(IMAGE_SYM_CLASS_BLOCK), |
| 145 | STRING_PAIR(IMAGE_SYM_CLASS_FUNCTION), |
| 146 | STRING_PAIR(IMAGE_SYM_CLASS_END_OF_STRUCT), |
| 147 | STRING_PAIR(IMAGE_SYM_CLASS_FILE), |
| 148 | STRING_PAIR(IMAGE_SYM_CLASS_SECTION), |
| 149 | STRING_PAIR(IMAGE_SYM_CLASS_WEAK_EXTERNAL), |
| 150 | STRING_PAIR(IMAGE_SYM_CLASS_CLR_TOKEN), |
| 151 | }; |
| 152 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 153 | static const pod_pair<COFF::RelocationTypeX86, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 154 | RelocationTypeX86Pairs [] = { |
| 155 | STRING_PAIR(IMAGE_REL_I386_ABSOLUTE), |
| 156 | STRING_PAIR(IMAGE_REL_I386_DIR16), |
| 157 | STRING_PAIR(IMAGE_REL_I386_REL16), |
| 158 | STRING_PAIR(IMAGE_REL_I386_DIR32), |
| 159 | STRING_PAIR(IMAGE_REL_I386_DIR32NB), |
| 160 | STRING_PAIR(IMAGE_REL_I386_SEG12), |
| 161 | STRING_PAIR(IMAGE_REL_I386_SECTION), |
| 162 | STRING_PAIR(IMAGE_REL_I386_SECREL), |
| 163 | STRING_PAIR(IMAGE_REL_I386_TOKEN), |
| 164 | STRING_PAIR(IMAGE_REL_I386_SECREL7), |
| 165 | STRING_PAIR(IMAGE_REL_I386_REL32), |
| 166 | STRING_PAIR(IMAGE_REL_AMD64_ABSOLUTE), |
| 167 | STRING_PAIR(IMAGE_REL_AMD64_ADDR64), |
| 168 | STRING_PAIR(IMAGE_REL_AMD64_ADDR32), |
| 169 | STRING_PAIR(IMAGE_REL_AMD64_ADDR32NB), |
| 170 | STRING_PAIR(IMAGE_REL_AMD64_REL32), |
| 171 | STRING_PAIR(IMAGE_REL_AMD64_REL32_1), |
| 172 | STRING_PAIR(IMAGE_REL_AMD64_REL32_2), |
| 173 | STRING_PAIR(IMAGE_REL_AMD64_REL32_3), |
| 174 | STRING_PAIR(IMAGE_REL_AMD64_REL32_4), |
| 175 | STRING_PAIR(IMAGE_REL_AMD64_REL32_5), |
| 176 | STRING_PAIR(IMAGE_REL_AMD64_SECTION), |
| 177 | STRING_PAIR(IMAGE_REL_AMD64_SECREL), |
| 178 | STRING_PAIR(IMAGE_REL_AMD64_SECREL7), |
| 179 | STRING_PAIR(IMAGE_REL_AMD64_TOKEN), |
| 180 | STRING_PAIR(IMAGE_REL_AMD64_SREL32), |
| 181 | STRING_PAIR(IMAGE_REL_AMD64_PAIR), |
| 182 | STRING_PAIR(IMAGE_REL_AMD64_SSPAN32) |
| 183 | }; |
| 184 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 185 | static const pod_pair<COFF::RelocationTypesARM, const char *> |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 186 | RelocationTypesARMPairs [] = { |
| 187 | STRING_PAIR(IMAGE_REL_ARM_ABSOLUTE), |
| 188 | STRING_PAIR(IMAGE_REL_ARM_ADDR32), |
| 189 | STRING_PAIR(IMAGE_REL_ARM_ADDR32NB), |
| 190 | STRING_PAIR(IMAGE_REL_ARM_BRANCH24), |
| 191 | STRING_PAIR(IMAGE_REL_ARM_BRANCH11), |
| 192 | STRING_PAIR(IMAGE_REL_ARM_TOKEN), |
| 193 | STRING_PAIR(IMAGE_REL_ARM_BLX24), |
| 194 | STRING_PAIR(IMAGE_REL_ARM_BLX11), |
| 195 | STRING_PAIR(IMAGE_REL_ARM_SECTION), |
| 196 | STRING_PAIR(IMAGE_REL_ARM_SECREL), |
| 197 | STRING_PAIR(IMAGE_REL_ARM_MOV32A), |
| 198 | STRING_PAIR(IMAGE_REL_ARM_MOV32T), |
| 199 | STRING_PAIR(IMAGE_REL_ARM_BRANCH20T), |
| 200 | STRING_PAIR(IMAGE_REL_ARM_BRANCH24T), |
| 201 | STRING_PAIR(IMAGE_REL_ARM_BLX23T) |
| 202 | }; |
| 203 | #undef STRING_PAIR |
| 204 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 205 | static raw_ostream &writeName(raw_ostream &Out, |
| 206 | const char *Name, std::size_t NameSize) { |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 207 | for (std::size_t i = 0; i < NameSize; ++i) { |
| 208 | if (!Name[i]) break; |
| 209 | Out << Name[i]; |
| 210 | } |
| 211 | return Out; |
| 212 | } |
| 213 | |
| 214 | // Given an array of pod_pair<enum, const char *>, write all enums that match |
| 215 | template <typename T, std::size_t N> |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 216 | static raw_ostream &writeBitMask(raw_ostream &Out, |
| 217 | const pod_pair<T, const char *> (&Arr)[N], |
| 218 | unsigned long Val) { |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 219 | for (std::size_t i = 0; i < N; ++i) |
| 220 | if (Val & Arr[i].first) |
| 221 | Out << Arr[i].second << ", "; |
| 222 | return Out; |
| 223 | } |
| 224 | |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 225 | // Given an array of pod_pair<enum, const char *>, look up a value |
| 226 | template <typename T, std::size_t N> |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 227 | const char *nameLookup(const pod_pair<T, const char *> (&Arr)[N], |
| 228 | unsigned long Val, const char *NotFound = NULL) { |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 229 | T n = static_cast<T>(Val); |
| 230 | for (std::size_t i = 0; i < N; ++i) |
| 231 | if (n == Arr[i].first) |
| 232 | return Arr[i].second; |
| 233 | return NotFound; |
| 234 | } |
| 235 | |
Rafael Espindola | d0ec6dd | 2013-04-20 03:33:09 +0000 | [diff] [blame] | 236 | static void yamlCOFFHeader(const object::coff_file_header *Header, |
| 237 | raw_ostream &Out) { |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 238 | Out << "header: !Header\n"; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 239 | Out << " Machine: "; |
| 240 | Out << nameLookup(MachineTypePairs, Header->Machine, "# Unknown_MachineTypes") |
| 241 | << " # ("; |
Rafael Espindola | d0ec6dd | 2013-04-20 03:33:09 +0000 | [diff] [blame] | 242 | objyaml::writeHexNumber(Out, Header->Machine) << ")\n\n"; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 243 | } |
| 244 | |
| 245 | |
Rafael Espindola | d0ec6dd | 2013-04-20 03:33:09 +0000 | [diff] [blame] | 246 | static void yamlCOFFSections(object::COFFObjectFile &Obj, |
| 247 | std::size_t NumSections, raw_ostream &Out) { |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 248 | error_code ec; |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 249 | Out << "sections:\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 250 | for (object::section_iterator iter = Obj.begin_sections(); |
| 251 | iter != Obj.end_sections(); iter.increment(ec)) { |
| 252 | const object::coff_section *sect = Obj.getCOFFSection(iter); |
| 253 | |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 254 | Out << " - !Section\n"; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 255 | Out << " Name: "; |
Rafael Espindola | 9e39d0b | 2013-04-20 03:13:00 +0000 | [diff] [blame] | 256 | writeName(Out, sect->Name, sizeof(sect->Name)) << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 257 | |
| 258 | Out << " Characteristics: ["; |
Rafael Espindola | 9e39d0b | 2013-04-20 03:13:00 +0000 | [diff] [blame] | 259 | writeBitMask(Out, SectionCharacteristicsPairs1, sect->Characteristics); |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 260 | Out << nameLookup(SectionCharacteristicsPairsAlignment, |
| 261 | sect->Characteristics & 0x00F00000, "# Unrecognized_IMAGE_SCN_ALIGN") |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 262 | << ", "; |
Rafael Espindola | 9e39d0b | 2013-04-20 03:13:00 +0000 | [diff] [blame] | 263 | writeBitMask(Out, SectionCharacteristicsPairs2, sect->Characteristics); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 264 | Out << "] # "; |
Rafael Espindola | daf0f44 | 2013-04-20 03:16:59 +0000 | [diff] [blame] | 265 | objyaml::writeHexNumber(Out, sect->Characteristics) << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 266 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 267 | ArrayRef<uint8_t> sectionData; |
| 268 | Obj.getSectionContents(sect, sectionData); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 269 | Out << " SectionData: "; |
Rafael Espindola | daf0f44 | 2013-04-20 03:16:59 +0000 | [diff] [blame] | 270 | objyaml::writeHexStream(Out, sectionData) << '\n'; |
Michael J. Spencer | d77ce4a | 2012-07-31 22:04:08 +0000 | [diff] [blame] | 271 | if (iter->begin_relocations() != iter->end_relocations()) |
| 272 | Out << " Relocations:\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 273 | for (object::relocation_iterator rIter = iter->begin_relocations(); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 274 | rIter != iter->end_relocations(); rIter.increment(ec)) { |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 275 | const object::coff_relocation *reloc = Obj.getCOFFRelocation(rIter); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 276 | |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 277 | Out << " - !Relocation\n"; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 278 | Out << " VirtualAddress: " ; |
Rafael Espindola | daf0f44 | 2013-04-20 03:16:59 +0000 | [diff] [blame] | 279 | objyaml::writeHexNumber(Out, reloc->VirtualAddress) << '\n'; |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 280 | Out << " SymbolTableIndex: " << reloc->SymbolTableIndex << '\n'; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 281 | Out << " Type: " |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 282 | << nameLookup(RelocationTypeX86Pairs, reloc->Type) << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 283 | // TODO: Use the correct reloc type for the machine. |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 284 | Out << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 285 | } |
| 286 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 287 | } |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 288 | } |
| 289 | |
Rafael Espindola | d0ec6dd | 2013-04-20 03:33:09 +0000 | [diff] [blame] | 290 | static void yamlCOFFSymbols(object::COFFObjectFile &Obj, std::size_t NumSymbols, |
| 291 | raw_ostream &Out) { |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 292 | error_code ec; |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 293 | Out << "symbols:\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 294 | for (object::symbol_iterator iter = Obj.begin_symbols(); |
| 295 | iter != Obj.end_symbols(); iter.increment(ec)) { |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 296 | // Gather all the info that we need |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 297 | StringRef str; |
| 298 | const object::coff_symbol *symbol = Obj.getCOFFSymbol(iter); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 299 | Obj.getSymbolName(symbol, str); |
| 300 | std::size_t simpleType = symbol->getBaseType(); |
| 301 | std::size_t complexType = symbol->getComplexType(); |
| 302 | std::size_t storageClass = symbol->StorageClass; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 303 | |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 304 | Out << " - !Symbol\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 305 | Out << " Name: " << str << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 306 | |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 307 | Out << " Value: " << symbol->Value << '\n'; |
| 308 | Out << " SectionNumber: " << symbol->SectionNumber << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 309 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 310 | Out << " SimpleType: " |
| 311 | << nameLookup(SymbolBaseTypePairs, simpleType, |
| 312 | "# Unknown_SymbolBaseType") |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 313 | << " # (" << simpleType << ")\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 314 | |
| 315 | Out << " ComplexType: " |
| 316 | << nameLookup(SymbolComplexTypePairs, complexType, |
| 317 | "# Unknown_SymbolComplexType") |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 318 | << " # (" << complexType << ")\n"; |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 319 | |
| 320 | Out << " StorageClass: " |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 321 | << nameLookup(SymbolStorageClassPairs, storageClass, |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 322 | "# Unknown_StorageClass") |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 323 | << " # (" << (int) storageClass << ")\n"; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 324 | |
| 325 | if (symbol->NumberOfAuxSymbols > 0) { |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 326 | ArrayRef<uint8_t> aux = Obj.getSymbolAuxData(symbol); |
| 327 | Out << " NumberOfAuxSymbols: " |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 328 | << (int) symbol->NumberOfAuxSymbols << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 329 | Out << " AuxillaryData: "; |
Rafael Espindola | daf0f44 | 2013-04-20 03:16:59 +0000 | [diff] [blame] | 330 | objyaml::writeHexStream(Out, aux); |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 331 | } |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 332 | |
Chandler Carruth | 89ec385 | 2013-04-08 08:55:18 +0000 | [diff] [blame] | 333 | Out << '\n'; |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 334 | } |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 335 | } |
| 336 | |
| 337 | |
Rafael Espindola | da177ce | 2013-04-20 02:55:00 +0000 | [diff] [blame] | 338 | error_code coff2yaml(raw_ostream &Out, MemoryBuffer *TheObj) { |
| 339 | error_code ec; |
| 340 | object::COFFObjectFile obj(TheObj, ec); |
| 341 | if (ec) |
| 342 | return ec; |
| 343 | |
| 344 | const object::coff_file_header *hd; |
| 345 | ec = obj.getHeader(hd); |
| 346 | if (ec) |
| 347 | return ec; |
| 348 | |
| 349 | yamlCOFFHeader(hd, Out); |
| 350 | yamlCOFFSections(obj, hd->NumberOfSections, Out); |
| 351 | yamlCOFFSymbols(obj, hd->NumberOfSymbols, Out); |
| 352 | |
Marshall Clow | c57b888 | 2012-06-19 18:02:35 +0000 | [diff] [blame] | 353 | return ec; |
| 354 | } |