Add support for reading ARM ELF build attributes.
[oota-llvm.git] / tools / llvm-readobj / ELFDumper.cpp
1 //===-- ELFDumper.cpp - ELF-specific dumper ---------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file implements the ELF-specific dumper for llvm-readobj.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm-readobj.h"
16 #include "Error.h"
17 #include "ObjDumper.h"
18 #include "StreamWriter.h"
19
20 #include "llvm/ADT/SmallString.h"
21 #include "llvm/Object/ELF.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Support/Format.h"
24 #include "llvm/Support/MathExtras.h"
25 #include "llvm/Support/raw_ostream.h"
26
27 using namespace llvm;
28 using namespace llvm::object;
29 using namespace ELF;
30
31
32 #define LLVM_READOBJ_ENUM_CASE(ns, enum) \
33   case ns::enum: return #enum;
34
35 namespace {
36
37 template<typename ELFT>
38 class ELFDumper : public ObjDumper {
39 public:
40   ELFDumper(const ELFObjectFile<ELFT> *Obj, StreamWriter& Writer)
41     : ObjDumper(Writer)
42     , Obj(Obj) { }
43
44   virtual void printFileHeaders() LLVM_OVERRIDE;
45   virtual void printSections() LLVM_OVERRIDE;
46   virtual void printRelocations() LLVM_OVERRIDE;
47   virtual void printSymbols() LLVM_OVERRIDE;
48   virtual void printDynamicSymbols() LLVM_OVERRIDE;
49   virtual void printUnwindInfo() LLVM_OVERRIDE;
50
51   virtual void printDynamicTable() LLVM_OVERRIDE;
52   virtual void printNeededLibraries() LLVM_OVERRIDE;
53   virtual void printProgramHeaders() LLVM_OVERRIDE;
54   virtual void printARMBuildAttributes() LLVM_OVERRIDE;
55
56 private:
57   typedef ELFObjectFile<ELFT> ELFO;
58   typedef typename ELFO::Elf_Shdr Elf_Shdr;
59   typedef typename ELFO::Elf_Sym Elf_Sym;
60
61   void printSymbol(symbol_iterator SymI, bool IsDynamic = false);
62
63   void printRelocation(section_iterator SecI, relocation_iterator RelI);
64
65   const ELFO *Obj;
66 };
67
68 } // namespace
69
70
71 namespace llvm {
72
73 error_code createELFDumper(const object::ObjectFile *Obj,
74                            StreamWriter& Writer,
75                            OwningPtr<ObjDumper> &Result) {
76   typedef ELFType<support::little, 4, false> Little32ELF;
77   typedef ELFType<support::big,    4, false> Big32ELF;
78   typedef ELFType<support::little, 4, true > Little64ELF;
79   typedef ELFType<support::big,    8, true > Big64ELF;
80
81   typedef ELFObjectFile<Little32ELF> LittleELF32Obj;
82   typedef ELFObjectFile<Big32ELF   > BigELF32Obj;
83   typedef ELFObjectFile<Little64ELF> LittleELF64Obj;
84   typedef ELFObjectFile<Big64ELF   > BigELF64Obj;
85
86   // Little-endian 32-bit
87   if (const LittleELF32Obj *ELFObj = dyn_cast<LittleELF32Obj>(Obj)) {
88     Result.reset(new ELFDumper<Little32ELF>(ELFObj, Writer));
89     return readobj_error::success;
90   }
91
92   // Big-endian 32-bit
93   if (const BigELF32Obj *ELFObj = dyn_cast<BigELF32Obj>(Obj)) {
94     Result.reset(new ELFDumper<Big32ELF>(ELFObj, Writer));
95     return readobj_error::success;
96   }
97
98   // Little-endian 64-bit
99   if (const LittleELF64Obj *ELFObj = dyn_cast<LittleELF64Obj>(Obj)) {
100     Result.reset(new ELFDumper<Little64ELF>(ELFObj, Writer));
101     return readobj_error::success;
102   }
103
104   // Big-endian 64-bit
105   if (const BigELF64Obj *ELFObj = dyn_cast<BigELF64Obj>(Obj)) {
106     Result.reset(new ELFDumper<Big64ELF>(ELFObj, Writer));
107     return readobj_error::success;
108   }
109
110   return readobj_error::unsupported_obj_file_format;
111 }
112
113 } // namespace llvm
114
115
116 static const EnumEntry<unsigned> ElfClass[] = {
117   { "None",   ELF::ELFCLASSNONE },
118   { "32-bit", ELF::ELFCLASS32   },
119   { "64-bit", ELF::ELFCLASS64   },
120 };
121
122 static const EnumEntry<unsigned> ElfDataEncoding[] = {
123   { "None",         ELF::ELFDATANONE },
124   { "LittleEndian", ELF::ELFDATA2LSB },
125   { "BigEndian",    ELF::ELFDATA2MSB },
126 };
127
128 static const EnumEntry<unsigned> ElfObjectFileType[] = {
129   { "None",         ELF::ET_NONE },
130   { "Relocatable",  ELF::ET_REL  },
131   { "Executable",   ELF::ET_EXEC },
132   { "SharedObject", ELF::ET_DYN  },
133   { "Core",         ELF::ET_CORE },
134 };
135
136 static const EnumEntry<unsigned> ElfOSABI[] = {
137   { "SystemV",      ELF::ELFOSABI_NONE         },
138   { "HPUX",         ELF::ELFOSABI_HPUX         },
139   { "NetBSD",       ELF::ELFOSABI_NETBSD       },
140   { "GNU/Linux",    ELF::ELFOSABI_LINUX        },
141   { "GNU/Hurd",     ELF::ELFOSABI_HURD         },
142   { "Solaris",      ELF::ELFOSABI_SOLARIS      },
143   { "AIX",          ELF::ELFOSABI_AIX          },
144   { "IRIX",         ELF::ELFOSABI_IRIX         },
145   { "FreeBSD",      ELF::ELFOSABI_FREEBSD      },
146   { "TRU64",        ELF::ELFOSABI_TRU64        },
147   { "Modesto",      ELF::ELFOSABI_MODESTO      },
148   { "OpenBSD",      ELF::ELFOSABI_OPENBSD      },
149   { "OpenVMS",      ELF::ELFOSABI_OPENVMS      },
150   { "NSK",          ELF::ELFOSABI_NSK          },
151   { "AROS",         ELF::ELFOSABI_AROS         },
152   { "FenixOS",      ELF::ELFOSABI_FENIXOS      },
153   { "C6000_ELFABI", ELF::ELFOSABI_C6000_ELFABI },
154   { "C6000_LINUX" , ELF::ELFOSABI_C6000_LINUX  },
155   { "ARM",          ELF::ELFOSABI_ARM          },
156   { "Standalone"  , ELF::ELFOSABI_STANDALONE   }
157 };
158
159 static const EnumEntry<unsigned> ElfMachineType[] = {
160   LLVM_READOBJ_ENUM_ENT(ELF, EM_NONE         ),
161   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32          ),
162   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC        ),
163   LLVM_READOBJ_ENUM_ENT(ELF, EM_386          ),
164   LLVM_READOBJ_ENUM_ENT(ELF, EM_68K          ),
165   LLVM_READOBJ_ENUM_ENT(ELF, EM_88K          ),
166   LLVM_READOBJ_ENUM_ENT(ELF, EM_486          ),
167   LLVM_READOBJ_ENUM_ENT(ELF, EM_860          ),
168   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS         ),
169   LLVM_READOBJ_ENUM_ENT(ELF, EM_S370         ),
170   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_RS3_LE  ),
171   LLVM_READOBJ_ENUM_ENT(ELF, EM_PARISC       ),
172   LLVM_READOBJ_ENUM_ENT(ELF, EM_VPP500       ),
173   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARC32PLUS  ),
174   LLVM_READOBJ_ENUM_ENT(ELF, EM_960          ),
175   LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC          ),
176   LLVM_READOBJ_ENUM_ENT(ELF, EM_PPC64        ),
177   LLVM_READOBJ_ENUM_ENT(ELF, EM_S390         ),
178   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPU          ),
179   LLVM_READOBJ_ENUM_ENT(ELF, EM_V800         ),
180   LLVM_READOBJ_ENUM_ENT(ELF, EM_FR20         ),
181   LLVM_READOBJ_ENUM_ENT(ELF, EM_RH32         ),
182   LLVM_READOBJ_ENUM_ENT(ELF, EM_RCE          ),
183   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARM          ),
184   LLVM_READOBJ_ENUM_ENT(ELF, EM_ALPHA        ),
185   LLVM_READOBJ_ENUM_ENT(ELF, EM_SH           ),
186   LLVM_READOBJ_ENUM_ENT(ELF, EM_SPARCV9      ),
187   LLVM_READOBJ_ENUM_ENT(ELF, EM_TRICORE      ),
188   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC          ),
189   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300       ),
190   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_300H      ),
191   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8S          ),
192   LLVM_READOBJ_ENUM_ENT(ELF, EM_H8_500       ),
193   LLVM_READOBJ_ENUM_ENT(ELF, EM_IA_64        ),
194   LLVM_READOBJ_ENUM_ENT(ELF, EM_MIPS_X       ),
195   LLVM_READOBJ_ENUM_ENT(ELF, EM_COLDFIRE     ),
196   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC12       ),
197   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMA          ),
198   LLVM_READOBJ_ENUM_ENT(ELF, EM_PCP          ),
199   LLVM_READOBJ_ENUM_ENT(ELF, EM_NCPU         ),
200   LLVM_READOBJ_ENUM_ENT(ELF, EM_NDR1         ),
201   LLVM_READOBJ_ENUM_ENT(ELF, EM_STARCORE     ),
202   LLVM_READOBJ_ENUM_ENT(ELF, EM_ME16         ),
203   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST100        ),
204   LLVM_READOBJ_ENUM_ENT(ELF, EM_TINYJ        ),
205   LLVM_READOBJ_ENUM_ENT(ELF, EM_X86_64       ),
206   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDSP         ),
207   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP10        ),
208   LLVM_READOBJ_ENUM_ENT(ELF, EM_PDP11        ),
209   LLVM_READOBJ_ENUM_ENT(ELF, EM_FX66         ),
210   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST9PLUS      ),
211   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST7          ),
212   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC16       ),
213   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC11       ),
214   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC08       ),
215   LLVM_READOBJ_ENUM_ENT(ELF, EM_68HC05       ),
216   LLVM_READOBJ_ENUM_ENT(ELF, EM_SVX          ),
217   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST19         ),
218   LLVM_READOBJ_ENUM_ENT(ELF, EM_VAX          ),
219   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRIS         ),
220   LLVM_READOBJ_ENUM_ENT(ELF, EM_JAVELIN      ),
221   LLVM_READOBJ_ENUM_ENT(ELF, EM_FIREPATH     ),
222   LLVM_READOBJ_ENUM_ENT(ELF, EM_ZSP          ),
223   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMIX         ),
224   LLVM_READOBJ_ENUM_ENT(ELF, EM_HUANY        ),
225   LLVM_READOBJ_ENUM_ENT(ELF, EM_PRISM        ),
226   LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR          ),
227   LLVM_READOBJ_ENUM_ENT(ELF, EM_FR30         ),
228   LLVM_READOBJ_ENUM_ENT(ELF, EM_D10V         ),
229   LLVM_READOBJ_ENUM_ENT(ELF, EM_D30V         ),
230   LLVM_READOBJ_ENUM_ENT(ELF, EM_V850         ),
231   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32R         ),
232   LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10300      ),
233   LLVM_READOBJ_ENUM_ENT(ELF, EM_MN10200      ),
234   LLVM_READOBJ_ENUM_ENT(ELF, EM_PJ           ),
235   LLVM_READOBJ_ENUM_ENT(ELF, EM_OPENRISC     ),
236   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT  ),
237   LLVM_READOBJ_ENUM_ENT(ELF, EM_XTENSA       ),
238   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE    ),
239   LLVM_READOBJ_ENUM_ENT(ELF, EM_TMM_GPP      ),
240   LLVM_READOBJ_ENUM_ENT(ELF, EM_NS32K        ),
241   LLVM_READOBJ_ENUM_ENT(ELF, EM_TPC          ),
242   LLVM_READOBJ_ENUM_ENT(ELF, EM_SNP1K        ),
243   LLVM_READOBJ_ENUM_ENT(ELF, EM_ST200        ),
244   LLVM_READOBJ_ENUM_ENT(ELF, EM_IP2K         ),
245   LLVM_READOBJ_ENUM_ENT(ELF, EM_MAX          ),
246   LLVM_READOBJ_ENUM_ENT(ELF, EM_CR           ),
247   LLVM_READOBJ_ENUM_ENT(ELF, EM_F2MC16       ),
248   LLVM_READOBJ_ENUM_ENT(ELF, EM_MSP430       ),
249   LLVM_READOBJ_ENUM_ENT(ELF, EM_BLACKFIN     ),
250   LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C33       ),
251   LLVM_READOBJ_ENUM_ENT(ELF, EM_SEP          ),
252   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARCA         ),
253   LLVM_READOBJ_ENUM_ENT(ELF, EM_UNICORE      ),
254   LLVM_READOBJ_ENUM_ENT(ELF, EM_EXCESS       ),
255   LLVM_READOBJ_ENUM_ENT(ELF, EM_DXP          ),
256   LLVM_READOBJ_ENUM_ENT(ELF, EM_ALTERA_NIOS2 ),
257   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRX          ),
258   LLVM_READOBJ_ENUM_ENT(ELF, EM_XGATE        ),
259   LLVM_READOBJ_ENUM_ENT(ELF, EM_C166         ),
260   LLVM_READOBJ_ENUM_ENT(ELF, EM_M16C         ),
261   LLVM_READOBJ_ENUM_ENT(ELF, EM_DSPIC30F     ),
262   LLVM_READOBJ_ENUM_ENT(ELF, EM_CE           ),
263   LLVM_READOBJ_ENUM_ENT(ELF, EM_M32C         ),
264   LLVM_READOBJ_ENUM_ENT(ELF, EM_TSK3000      ),
265   LLVM_READOBJ_ENUM_ENT(ELF, EM_RS08         ),
266   LLVM_READOBJ_ENUM_ENT(ELF, EM_SHARC        ),
267   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG2        ),
268   LLVM_READOBJ_ENUM_ENT(ELF, EM_SCORE7       ),
269   LLVM_READOBJ_ENUM_ENT(ELF, EM_DSP24        ),
270   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE3   ),
271   LLVM_READOBJ_ENUM_ENT(ELF, EM_LATTICEMICO32),
272   LLVM_READOBJ_ENUM_ENT(ELF, EM_SE_C17       ),
273   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C6000     ),
274   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C2000     ),
275   LLVM_READOBJ_ENUM_ENT(ELF, EM_TI_C5500     ),
276   LLVM_READOBJ_ENUM_ENT(ELF, EM_MMDSP_PLUS   ),
277   LLVM_READOBJ_ENUM_ENT(ELF, EM_CYPRESS_M8C  ),
278   LLVM_READOBJ_ENUM_ENT(ELF, EM_R32C         ),
279   LLVM_READOBJ_ENUM_ENT(ELF, EM_TRIMEDIA     ),
280   LLVM_READOBJ_ENUM_ENT(ELF, EM_HEXAGON      ),
281   LLVM_READOBJ_ENUM_ENT(ELF, EM_8051         ),
282   LLVM_READOBJ_ENUM_ENT(ELF, EM_STXP7X       ),
283   LLVM_READOBJ_ENUM_ENT(ELF, EM_NDS32        ),
284   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1        ),
285   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG1X       ),
286   LLVM_READOBJ_ENUM_ENT(ELF, EM_MAXQ30       ),
287   LLVM_READOBJ_ENUM_ENT(ELF, EM_XIMO16       ),
288   LLVM_READOBJ_ENUM_ENT(ELF, EM_MANIK        ),
289   LLVM_READOBJ_ENUM_ENT(ELF, EM_CRAYNV2      ),
290   LLVM_READOBJ_ENUM_ENT(ELF, EM_RX           ),
291   LLVM_READOBJ_ENUM_ENT(ELF, EM_METAG        ),
292   LLVM_READOBJ_ENUM_ENT(ELF, EM_MCST_ELBRUS  ),
293   LLVM_READOBJ_ENUM_ENT(ELF, EM_ECOG16       ),
294   LLVM_READOBJ_ENUM_ENT(ELF, EM_CR16         ),
295   LLVM_READOBJ_ENUM_ENT(ELF, EM_ETPU         ),
296   LLVM_READOBJ_ENUM_ENT(ELF, EM_SLE9X        ),
297   LLVM_READOBJ_ENUM_ENT(ELF, EM_L10M         ),
298   LLVM_READOBJ_ENUM_ENT(ELF, EM_K10M         ),
299   LLVM_READOBJ_ENUM_ENT(ELF, EM_AARCH64      ),
300   LLVM_READOBJ_ENUM_ENT(ELF, EM_AVR32        ),
301   LLVM_READOBJ_ENUM_ENT(ELF, EM_STM8         ),
302   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILE64       ),
303   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEPRO      ),
304   LLVM_READOBJ_ENUM_ENT(ELF, EM_MICROBLAZE   ),
305   LLVM_READOBJ_ENUM_ENT(ELF, EM_CUDA         ),
306   LLVM_READOBJ_ENUM_ENT(ELF, EM_TILEGX       ),
307   LLVM_READOBJ_ENUM_ENT(ELF, EM_CLOUDSHIELD  ),
308   LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_1ST    ),
309   LLVM_READOBJ_ENUM_ENT(ELF, EM_COREA_2ND    ),
310   LLVM_READOBJ_ENUM_ENT(ELF, EM_ARC_COMPACT2 ),
311   LLVM_READOBJ_ENUM_ENT(ELF, EM_OPEN8        ),
312   LLVM_READOBJ_ENUM_ENT(ELF, EM_RL78         ),
313   LLVM_READOBJ_ENUM_ENT(ELF, EM_VIDEOCORE5   ),
314   LLVM_READOBJ_ENUM_ENT(ELF, EM_78KOR        ),
315   LLVM_READOBJ_ENUM_ENT(ELF, EM_56800EX      ),
316   LLVM_READOBJ_ENUM_ENT(ELF, EM_MBLAZE       )
317 };
318
319 static const EnumEntry<unsigned> ElfSymbolBindings[] = {
320   { "Local",  ELF::STB_LOCAL  },
321   { "Global", ELF::STB_GLOBAL },
322   { "Weak",   ELF::STB_WEAK   }
323 };
324
325 static const EnumEntry<unsigned> ElfSymbolTypes[] = {
326   { "None",      ELF::STT_NOTYPE    },
327   { "Object",    ELF::STT_OBJECT    },
328   { "Function",  ELF::STT_FUNC      },
329   { "Section",   ELF::STT_SECTION   },
330   { "File",      ELF::STT_FILE      },
331   { "Common",    ELF::STT_COMMON    },
332   { "TLS",       ELF::STT_TLS       },
333   { "GNU_IFunc", ELF::STT_GNU_IFUNC }
334 };
335
336 static const char *getElfSectionType(unsigned Arch, unsigned Type) {
337   switch (Arch) {
338   case Triple::arm:
339     switch (Type) {
340     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_EXIDX);
341     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
342     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
343     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
344     LLVM_READOBJ_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
345     }
346   case Triple::hexagon:
347     switch (Type) {
348     LLVM_READOBJ_ENUM_CASE(ELF, SHT_HEX_ORDERED);
349     }
350   case Triple::x86_64:
351     switch (Type) {
352     LLVM_READOBJ_ENUM_CASE(ELF, SHT_X86_64_UNWIND);
353     }
354   case Triple::mips:
355   case Triple::mipsel:
356     switch (Type) {
357     LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
358     LLVM_READOBJ_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
359     }
360   }
361
362   switch (Type) {
363   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NULL              );
364   LLVM_READOBJ_ENUM_CASE(ELF, SHT_PROGBITS          );
365   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB            );
366   LLVM_READOBJ_ENUM_CASE(ELF, SHT_STRTAB            );
367   LLVM_READOBJ_ENUM_CASE(ELF, SHT_RELA              );
368   LLVM_READOBJ_ENUM_CASE(ELF, SHT_HASH              );
369   LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNAMIC           );
370   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOTE              );
371   LLVM_READOBJ_ENUM_CASE(ELF, SHT_NOBITS            );
372   LLVM_READOBJ_ENUM_CASE(ELF, SHT_REL               );
373   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SHLIB             );
374   LLVM_READOBJ_ENUM_CASE(ELF, SHT_DYNSYM            );
375   LLVM_READOBJ_ENUM_CASE(ELF, SHT_INIT_ARRAY        );
376   LLVM_READOBJ_ENUM_CASE(ELF, SHT_FINI_ARRAY        );
377   LLVM_READOBJ_ENUM_CASE(ELF, SHT_PREINIT_ARRAY     );
378   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GROUP             );
379   LLVM_READOBJ_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX      );
380   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES    );
381   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_HASH          );
382   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verdef        );
383   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_verneed       );
384   LLVM_READOBJ_ENUM_CASE(ELF, SHT_GNU_versym        );
385   default: return "";
386   }
387 }
388
389 static const EnumEntry<unsigned> ElfSectionFlags[] = {
390   LLVM_READOBJ_ENUM_ENT(ELF, SHF_WRITE           ),
391   LLVM_READOBJ_ENUM_ENT(ELF, SHF_ALLOC           ),
392   LLVM_READOBJ_ENUM_ENT(ELF, SHF_EXECINSTR       ),
393   LLVM_READOBJ_ENUM_ENT(ELF, SHF_MERGE           ),
394   LLVM_READOBJ_ENUM_ENT(ELF, SHF_STRINGS         ),
395   LLVM_READOBJ_ENUM_ENT(ELF, SHF_INFO_LINK       ),
396   LLVM_READOBJ_ENUM_ENT(ELF, SHF_LINK_ORDER      ),
397   LLVM_READOBJ_ENUM_ENT(ELF, SHF_OS_NONCONFORMING),
398   LLVM_READOBJ_ENUM_ENT(ELF, SHF_GROUP           ),
399   LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS             ),
400   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
401   LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
402   LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP    )
403 };
404
405 static const EnumEntry<unsigned> ElfSegmentTypes[] = {
406   LLVM_READOBJ_ENUM_ENT(ELF, PT_NULL   ),
407   LLVM_READOBJ_ENUM_ENT(ELF, PT_LOAD   ),
408   LLVM_READOBJ_ENUM_ENT(ELF, PT_DYNAMIC),
409   LLVM_READOBJ_ENUM_ENT(ELF, PT_INTERP ),
410   LLVM_READOBJ_ENUM_ENT(ELF, PT_NOTE   ),
411   LLVM_READOBJ_ENUM_ENT(ELF, PT_SHLIB  ),
412   LLVM_READOBJ_ENUM_ENT(ELF, PT_PHDR   ),
413   LLVM_READOBJ_ENUM_ENT(ELF, PT_TLS    ),
414
415   LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_EH_FRAME),
416   LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_EH_FRAME),
417   LLVM_READOBJ_ENUM_ENT(ELF, PT_SUNW_UNWIND),
418
419   LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_STACK),
420   LLVM_READOBJ_ENUM_ENT(ELF, PT_GNU_RELRO),
421
422   LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_EXIDX),
423   LLVM_READOBJ_ENUM_ENT(ELF, PT_ARM_UNWIND)
424 };
425
426 static const EnumEntry<unsigned> ElfSegmentFlags[] = {
427   LLVM_READOBJ_ENUM_ENT(ELF, PF_X),
428   LLVM_READOBJ_ENUM_ENT(ELF, PF_W),
429   LLVM_READOBJ_ENUM_ENT(ELF, PF_R)
430 };
431
432
433 template<class ELFT>
434 void ELFDumper<ELFT>::printFileHeaders() {
435   error_code EC;
436
437   const typename ELFO::Elf_Ehdr *Header = Obj->getElfHeader();
438
439   {
440     DictScope D(W, "ElfHeader");
441     {
442       DictScope D(W, "Ident");
443       W.printBinary("Magic", makeArrayRef(Header->e_ident).slice(ELF::EI_MAG0,
444                                                                  4));
445       W.printEnum  ("Class", Header->e_ident[ELF::EI_CLASS],
446                       makeArrayRef(ElfClass));
447       W.printEnum  ("DataEncoding", Header->e_ident[ELF::EI_DATA],
448                       makeArrayRef(ElfDataEncoding));
449       W.printNumber("FileVersion", Header->e_ident[ELF::EI_VERSION]);
450       W.printEnum  ("OS/ABI", Header->e_ident[ELF::EI_OSABI],
451                       makeArrayRef(ElfOSABI));
452       W.printNumber("ABIVersion", Header->e_ident[ELF::EI_ABIVERSION]);
453       W.printBinary("Unused", makeArrayRef(Header->e_ident).slice(ELF::EI_PAD));
454     }
455
456     W.printEnum  ("Type", Header->e_type, makeArrayRef(ElfObjectFileType));
457     W.printEnum  ("Machine", Header->e_machine, makeArrayRef(ElfMachineType));
458     W.printNumber("Version", Header->e_version);
459     W.printHex   ("Entry", Header->e_entry);
460     W.printHex   ("ProgramHeaderOffset", Header->e_phoff);
461     W.printHex   ("SectionHeaderOffset", Header->e_shoff);
462     W.printFlags ("Flags", Header->e_flags);
463     W.printNumber("HeaderSize", Header->e_ehsize);
464     W.printNumber("ProgramHeaderEntrySize", Header->e_phentsize);
465     W.printNumber("ProgramHeaderCount", Header->e_phnum);
466     W.printNumber("SectionHeaderEntrySize", Header->e_shentsize);
467     W.printNumber("SectionHeaderCount", Header->e_shnum);
468     W.printNumber("StringTableSectionIndex", Header->e_shstrndx);
469   }
470 }
471
472 template<class ELFT>
473 void ELFDumper<ELFT>::printSections() {
474   ListScope SectionsD(W, "Sections");
475
476   int SectionIndex = -1;
477   error_code EC;
478   for (section_iterator SecI = Obj->begin_sections(),
479                         SecE = Obj->end_sections();
480                         SecI != SecE; SecI.increment(EC)) {
481     if (error(EC)) break;
482
483     ++SectionIndex;
484
485     const Elf_Shdr *Section = Obj->getElfSection(SecI);
486     StringRef Name;
487     if (error(SecI->getName(Name)))
488         Name = "";
489
490     DictScope SectionD(W, "Section");
491     W.printNumber("Index", SectionIndex);
492     W.printNumber("Name", Name, Section->sh_name);
493     W.printHex   ("Type", getElfSectionType(Obj->getArch(), Section->sh_type),
494                     Section->sh_type);
495     W.printFlags ("Flags", Section->sh_flags, makeArrayRef(ElfSectionFlags));
496     W.printHex   ("Address", Section->sh_addr);
497     W.printHex   ("Offset", Section->sh_offset);
498     W.printNumber("Size", Section->sh_size);
499     W.printNumber("Link", Section->sh_link);
500     W.printNumber("Info", Section->sh_info);
501     W.printNumber("AddressAlignment", Section->sh_addralign);
502     W.printNumber("EntrySize", Section->sh_entsize);
503
504     if (opts::SectionRelocations) {
505       ListScope D(W, "Relocations");
506       for (relocation_iterator RelI = SecI->begin_relocations(),
507                                RelE = SecI->end_relocations();
508                                RelI != RelE; RelI.increment(EC)) {
509         if (error(EC)) break;
510
511         printRelocation(SecI, RelI);
512       }
513     }
514
515     if (opts::SectionSymbols) {
516       ListScope D(W, "Symbols");
517       for (symbol_iterator SymI = Obj->begin_symbols(),
518                            SymE = Obj->end_symbols();
519                            SymI != SymE; SymI.increment(EC)) {
520         if (error(EC)) break;
521
522         bool Contained = false;
523         if (SecI->containsSymbol(*SymI, Contained) || !Contained)
524           continue;
525
526         printSymbol(SymI);
527       }
528     }
529
530     if (opts::SectionData) {
531       StringRef Data;
532       if (error(SecI->getContents(Data))) break;
533
534       W.printBinaryBlock("SectionData", Data);
535     }
536   }
537 }
538
539 template<class ELFT>
540 void ELFDumper<ELFT>::printRelocations() {
541   ListScope D(W, "Relocations");
542
543   error_code EC;
544   int SectionNumber = -1;
545   for (section_iterator SecI = Obj->begin_sections(),
546                         SecE = Obj->end_sections();
547                         SecI != SecE; SecI.increment(EC)) {
548     if (error(EC)) break;
549
550     ++SectionNumber;
551     StringRef Name;
552     if (error(SecI->getName(Name)))
553       continue;
554
555     bool PrintedGroup = false;
556     for (relocation_iterator RelI = SecI->begin_relocations(),
557                              RelE = SecI->end_relocations();
558                              RelI != RelE; RelI.increment(EC)) {
559       if (error(EC)) break;
560
561       if (!PrintedGroup) {
562         W.startLine() << "Section (" << SectionNumber << ") " << Name << " {\n";
563         W.indent();
564         PrintedGroup = true;
565       }
566
567       printRelocation(SecI, RelI);
568     }
569
570     if (PrintedGroup) {
571       W.unindent();
572       W.startLine() << "}\n";
573     }
574   }
575 }
576
577 template<class ELFT>
578 void ELFDumper<ELFT>::printRelocation(section_iterator Sec,
579                                       relocation_iterator RelI) {
580   uint64_t Offset;
581   uint64_t RelocType;
582   SmallString<32> RelocName;
583   int64_t Info;
584   StringRef SymbolName;
585   SymbolRef Symbol;
586   if (Obj->getElfHeader()->e_type == ELF::ET_REL){
587     if (error(RelI->getOffset(Offset))) return;
588   } else {
589     if (error(RelI->getAddress(Offset))) return;
590   }
591   if (error(RelI->getType(RelocType))) return;
592   if (error(RelI->getTypeName(RelocName))) return;
593   if (error(RelI->getAdditionalInfo(Info))) return;
594   if (error(RelI->getSymbol(Symbol))) return;
595   if (error(Symbol.getName(SymbolName))) return;
596
597   if (opts::ExpandRelocs) {
598     DictScope Group(W, "Relocation");
599     W.printHex("Offset", Offset);
600     W.printNumber("Type", RelocName, RelocType);
601     W.printString("Symbol", SymbolName.size() > 0 ? SymbolName : "-");
602     W.printHex("Info", Info);
603   } else {
604     raw_ostream& OS = W.startLine();
605     OS << W.hex(Offset)
606        << " " << RelocName
607        << " " << (SymbolName.size() > 0 ? SymbolName : "-")
608        << " " << W.hex(Info)
609        << "\n";
610   }
611 }
612
613 template<class ELFT>
614 void ELFDumper<ELFT>::printSymbols() {
615   ListScope Group(W, "Symbols");
616
617   error_code EC;
618   for (symbol_iterator SymI = Obj->begin_symbols(), SymE = Obj->end_symbols();
619                        SymI != SymE; SymI.increment(EC)) {
620     if (error(EC)) break;
621
622     printSymbol(SymI);
623   }
624 }
625
626 template<class ELFT>
627 void ELFDumper<ELFT>::printDynamicSymbols() {
628   ListScope Group(W, "DynamicSymbols");
629
630   error_code EC;
631   for (symbol_iterator SymI = Obj->begin_dynamic_symbols(),
632                        SymE = Obj->end_dynamic_symbols();
633                        SymI != SymE; SymI.increment(EC)) {
634     if (error(EC)) break;
635
636     printSymbol(SymI, true);
637   }
638 }
639
640 template<class ELFT>
641 void ELFDumper<ELFT>::printSymbol(symbol_iterator SymI, bool IsDynamic) {
642   error_code EC;
643
644   const Elf_Sym *Symbol = Obj->getElfSymbol(SymI);
645   const Elf_Shdr *Section = Obj->getSection(Symbol);
646
647   StringRef SymbolName;
648   if (SymI->getName(SymbolName))
649     SymbolName = "";
650
651   StringRef SectionName = "";
652   if (Section)
653     Obj->getSectionName(Section, SectionName);
654
655   std::string FullSymbolName(SymbolName);
656   if (IsDynamic) {
657     StringRef Version;
658     bool IsDefault;
659     if (error(Obj->getSymbolVersion(*SymI, Version, IsDefault)))
660       return;
661     if (!Version.empty()) {
662       FullSymbolName += (IsDefault ? "@@" : "@");
663       FullSymbolName += Version;
664     }
665   }
666
667   DictScope D(W, "Symbol");
668   W.printNumber("Name", FullSymbolName, Symbol->st_name);
669   W.printHex   ("Value", Symbol->st_value);
670   W.printNumber("Size", Symbol->st_size);
671   W.printEnum  ("Binding", Symbol->getBinding(),
672                   makeArrayRef(ElfSymbolBindings));
673   W.printEnum  ("Type", Symbol->getType(), makeArrayRef(ElfSymbolTypes));
674   W.printNumber("Other", Symbol->st_other);
675   W.printHex   ("Section", SectionName, Symbol->st_shndx);
676 }
677
678 #define LLVM_READOBJ_TYPE_CASE(name) \
679   case DT_##name: return #name
680
681 static const char *getTypeString(uint64_t Type) {
682   switch (Type) {
683   LLVM_READOBJ_TYPE_CASE(BIND_NOW);
684   LLVM_READOBJ_TYPE_CASE(DEBUG);
685   LLVM_READOBJ_TYPE_CASE(FINI);
686   LLVM_READOBJ_TYPE_CASE(FINI_ARRAY);
687   LLVM_READOBJ_TYPE_CASE(FINI_ARRAYSZ);
688   LLVM_READOBJ_TYPE_CASE(FLAGS);
689   LLVM_READOBJ_TYPE_CASE(HASH);
690   LLVM_READOBJ_TYPE_CASE(INIT);
691   LLVM_READOBJ_TYPE_CASE(INIT_ARRAY);
692   LLVM_READOBJ_TYPE_CASE(INIT_ARRAYSZ);
693   LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAY);
694   LLVM_READOBJ_TYPE_CASE(PREINIT_ARRAYSZ);
695   LLVM_READOBJ_TYPE_CASE(JMPREL);
696   LLVM_READOBJ_TYPE_CASE(NEEDED);
697   LLVM_READOBJ_TYPE_CASE(NULL);
698   LLVM_READOBJ_TYPE_CASE(PLTGOT);
699   LLVM_READOBJ_TYPE_CASE(PLTREL);
700   LLVM_READOBJ_TYPE_CASE(PLTRELSZ);
701   LLVM_READOBJ_TYPE_CASE(REL);
702   LLVM_READOBJ_TYPE_CASE(RELA);
703   LLVM_READOBJ_TYPE_CASE(RELENT);
704   LLVM_READOBJ_TYPE_CASE(RELSZ);
705   LLVM_READOBJ_TYPE_CASE(RELAENT);
706   LLVM_READOBJ_TYPE_CASE(RELASZ);
707   LLVM_READOBJ_TYPE_CASE(RPATH);
708   LLVM_READOBJ_TYPE_CASE(RUNPATH);
709   LLVM_READOBJ_TYPE_CASE(SONAME);
710   LLVM_READOBJ_TYPE_CASE(STRSZ);
711   LLVM_READOBJ_TYPE_CASE(STRTAB);
712   LLVM_READOBJ_TYPE_CASE(SYMBOLIC);
713   LLVM_READOBJ_TYPE_CASE(SYMENT);
714   LLVM_READOBJ_TYPE_CASE(SYMTAB);
715   LLVM_READOBJ_TYPE_CASE(TEXTREL);
716   default: return "unknown";
717   }
718 }
719
720 #undef LLVM_READOBJ_TYPE_CASE
721
722 template<class ELFT>
723 static void printValue(const ELFObjectFile<ELFT> *O, uint64_t Type,
724                        uint64_t Value, bool Is64, raw_ostream &OS) {
725   switch (Type) {
726   case DT_PLTREL:
727     if (Value == DT_REL) {
728       OS << "REL";
729       break;
730     } else if (Value == DT_RELA) {
731       OS << "RELA";
732       break;
733     }
734   // Fallthrough.
735   case DT_PLTGOT:
736   case DT_HASH:
737   case DT_STRTAB:
738   case DT_SYMTAB:
739   case DT_RELA:
740   case DT_INIT:
741   case DT_FINI:
742   case DT_REL:
743   case DT_JMPREL:
744   case DT_INIT_ARRAY:
745   case DT_FINI_ARRAY:
746   case DT_PREINIT_ARRAY:
747   case DT_DEBUG:
748   case DT_NULL:
749     OS << format("0x%" PRIX64, Value);
750     break;
751   case DT_PLTRELSZ:
752   case DT_RELASZ:
753   case DT_RELAENT:
754   case DT_STRSZ:
755   case DT_SYMENT:
756   case DT_RELSZ:
757   case DT_RELENT:
758   case DT_INIT_ARRAYSZ:
759   case DT_FINI_ARRAYSZ:
760   case DT_PREINIT_ARRAYSZ:
761     OS << Value << " (bytes)";
762     break;
763   case DT_NEEDED:
764     OS << "SharedLibrary ("
765        << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")";
766     break;
767   case DT_SONAME:
768     OS << "LibrarySoname ("
769        << O->getString(O->getDynamicStringTableSectionHeader(), Value) << ")";
770     break;
771   }
772 }
773
774 template<class ELFT>
775 void ELFDumper<ELFT>::printUnwindInfo() {
776   W.startLine() << "UnwindInfo not implemented.\n";
777 }
778
779 template<class ELFT>
780 void ELFDumper<ELFT>::printDynamicTable() {
781   typedef typename ELFO::Elf_Dyn_iterator EDI;
782   EDI Start = Obj->begin_dynamic_table(),
783       End = Obj->end_dynamic_table(true);
784
785   if (Start == End)
786     return;
787
788   ptrdiff_t Total = std::distance(Start, End);
789   raw_ostream &OS = W.getOStream();
790   W.startLine() << "DynamicSection [ (" << Total << " entries)\n";
791
792   bool Is64 = Obj->getBytesInAddress() == 8;
793
794   W.startLine()
795      << "  Tag" << (Is64 ? "                " : "        ") << "Type"
796      << "                 " << "Name/Value\n";
797   for (; Start != End; ++Start) {
798     W.startLine()
799        << "  "
800        << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Start->getTag())
801        << " " << format("%-21s", getTypeString(Start->getTag()));
802     printValue(Obj, Start->getTag(), Start->getVal(), Is64, OS);
803     OS << "\n";
804   }
805
806   W.startLine() << "]\n";
807 }
808
809 static bool compareLibraryName(const LibraryRef &L, const LibraryRef &R) {
810   StringRef LPath, RPath;
811   L.getPath(LPath);
812   R.getPath(RPath);
813   return LPath < RPath;
814 }
815
816 template<class ELFT>
817 void ELFDumper<ELFT>::printNeededLibraries() {
818   ListScope D(W, "NeededLibraries");
819
820   error_code EC;
821
822   typedef std::vector<LibraryRef> LibsTy;
823   LibsTy Libs;
824
825   for (library_iterator I = Obj->begin_libraries_needed(),
826                         E = Obj->end_libraries_needed();
827                         I != E; I.increment(EC)) {
828     if (EC)
829       report_fatal_error("Needed libraries iteration failed");
830
831     Libs.push_back(*I);
832   }
833
834   std::sort(Libs.begin(), Libs.end(), &compareLibraryName);
835
836   for (LibsTy::const_iterator I = Libs.begin(), E = Libs.end();
837                                   I != E; ++I) {
838     StringRef Path;
839     I->getPath(Path);
840     outs() << "  " << Path << "\n";
841   }
842 }
843
844 template<class ELFT>
845 void ELFDumper<ELFT>::printProgramHeaders() {
846   ListScope L(W, "ProgramHeaders");
847
848   for (typename ELFO::Elf_Phdr_Iter PI = Obj->begin_program_headers(),
849                                     PE = Obj->end_program_headers();
850                                     PI != PE; ++PI) {
851     DictScope P(W, "ProgramHeader");
852     W.printEnum  ("Type", PI->p_type, makeArrayRef(ElfSegmentTypes));
853     W.printHex   ("Offset", PI->p_offset);
854     W.printHex   ("VirtualAddress", PI->p_vaddr);
855     W.printHex   ("PhysicalAddress", PI->p_paddr);
856     W.printNumber("FileSize", PI->p_filesz);
857     W.printNumber("MemSize", PI->p_memsz);
858     W.printFlags ("Flags", PI->p_flags, makeArrayRef(ElfSegmentFlags));
859     W.printNumber("Alignment", PI->p_align);
860   }
861 }
862
863 #define LLVM_READOBJ_ARMATTR_NUMCASE(X) case ARMBuildAttrs::X: \
864   W.printNumber("  Tag_" #X, BuildAttrs.Tag_##X); \
865   break; \
866
867 #define LLVM_READOBJ_ARMATTR_STRCASE(X) case ARMBuildAttrs::X: \
868   W.printString("  Tag_" #X, BuildAttrs.Tag_##X); \
869   break; \
870
871 template<class ELFT>
872 void ELFDumper<ELFT>::printARMBuildAttributes() {
873   if (Obj->getArch() != Triple::arm || !Obj->hasARMBuildAttributes())
874     return;
875   ARMBuildAttrs::ARMGenericBuildAttrInfo BuildAttrs;
876   SmallVector<unsigned, 16> AttrsRead;
877   error_code EC = Obj->readARMBuildAttributes(BuildAttrs, AttrsRead);
878   if (error(EC))
879     return;
880
881   DictScope D(W, "ARMBuildAttributes");
882
883   for (SmallVector<unsigned, 16>::iterator I = AttrsRead.begin(),
884        E = AttrsRead.end(); I != E; ++I) {
885     switch (*I) {
886     LLVM_READOBJ_ARMATTR_STRCASE(CPU_name)
887     LLVM_READOBJ_ARMATTR_STRCASE(CPU_raw_name)
888     LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch)
889     LLVM_READOBJ_ARMATTR_NUMCASE(CPU_arch_profile)
890     LLVM_READOBJ_ARMATTR_NUMCASE(ARM_ISA_use)
891     LLVM_READOBJ_ARMATTR_NUMCASE(THUMB_ISA_use)
892     LLVM_READOBJ_ARMATTR_NUMCASE(FP_arch)
893     LLVM_READOBJ_ARMATTR_NUMCASE(WMMX_arch)
894     LLVM_READOBJ_ARMATTR_NUMCASE(Advanced_SIMD_arch)
895     LLVM_READOBJ_ARMATTR_NUMCASE(PCS_config)
896     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_R9_use)
897     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RW_data)
898     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_RO_data)
899     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_GOT_use)
900     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_PCS_wchar_t)
901     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_rounding)
902     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_denormal)
903     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_exceptions)
904     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_user_exceptions)
905     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_number_model)
906     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_needed)
907     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_align8_preserved)
908     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_enum_size)
909     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_HardFP_use)
910     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_VFP_args)
911     LLVM_READOBJ_ARMATTR_NUMCASE(CPU_unaligned_access)
912     LLVM_READOBJ_ARMATTR_NUMCASE(FP_HP_extension)
913     LLVM_READOBJ_ARMATTR_NUMCASE(MPextension_use)
914     LLVM_READOBJ_ARMATTR_NUMCASE(DIV_use)
915     LLVM_READOBJ_ARMATTR_NUMCASE(T2EE_use)
916     LLVM_READOBJ_ARMATTR_NUMCASE(Virtualization_use)
917     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_optimization_goals)
918     LLVM_READOBJ_ARMATTR_NUMCASE(ABI_FP_optimization_goals)
919     default:
920       break;
921     }
922   }
923 }