xref: /freebsd/contrib/llvm-project/llvm/lib/BinaryFormat/ELF.cpp (revision c2de0116c80176829406289da3b79b6e70855ea4)
1  //===- llvm/BinaryFormat/ELF.cpp - The ELF format ---------------*- C++ -*-===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  
9  #include "llvm/BinaryFormat/ELF.h"
10  #include "llvm/ADT/StringSwitch.h"
11  
12  using namespace llvm;
13  using namespace ELF;
14  
15  /// Convert an architecture name into ELF's e_machine value.
16  uint16_t ELF::convertArchNameToEMachine(StringRef Arch) {
17    std::string LowerArch = Arch.lower();
18    return StringSwitch<uint16_t>(LowerArch)
19        .Case("none", EM_NONE)
20        .Case("m32", EM_M32)
21        .Case("sparc", EM_SPARC)
22        .Case("386", EM_386)
23        .Case("68k", EM_68K)
24        .Case("88k", EM_88K)
25        .Case("iamcu", EM_IAMCU)
26        .Case("860", EM_860)
27        .Case("mips", EM_MIPS)
28        .Case("s370", EM_S370)
29        .Case("mips_rs3_le", EM_MIPS_RS3_LE)
30        .Case("parisc", EM_PARISC)
31        .Case("vpp500", EM_VPP500)
32        .Case("sparc32plus", EM_SPARC32PLUS)
33        .Case("960", EM_960)
34        .Case("ppc", EM_PPC)
35        .Case("ppc64", EM_PPC64)
36        .Case("s390", EM_S390)
37        .Case("spu", EM_SPU)
38        .Case("v800", EM_V800)
39        .Case("fr20", EM_FR20)
40        .Case("rh32", EM_RH32)
41        .Case("rce", EM_RCE)
42        .Case("arm", EM_ARM)
43        .Case("alpha", EM_ALPHA)
44        .Case("sh", EM_SH)
45        .Case("sparcv9", EM_SPARCV9)
46        .Case("tricore", EM_TRICORE)
47        .Case("arc", EM_ARC)
48        .Case("h8_300", EM_H8_300)
49        .Case("h8_300h", EM_H8_300H)
50        .Case("h8s", EM_H8S)
51        .Case("h8_500", EM_H8_500)
52        .Case("ia_64", EM_IA_64)
53        .Case("mips_x", EM_MIPS_X)
54        .Case("coldfire", EM_COLDFIRE)
55        .Case("68hc12", EM_68HC12)
56        .Case("mma", EM_MMA)
57        .Case("pcp", EM_PCP)
58        .Case("ncpu", EM_NCPU)
59        .Case("ndr1", EM_NDR1)
60        .Case("starcore", EM_STARCORE)
61        .Case("me16", EM_ME16)
62        .Case("st100", EM_ST100)
63        .Case("tinyj", EM_TINYJ)
64        .Case("x86_64", EM_X86_64)
65        .Case("pdsp", EM_PDSP)
66        .Case("pdp10", EM_PDP10)
67        .Case("pdp11", EM_PDP11)
68        .Case("fx66", EM_FX66)
69        .Case("st9plus", EM_ST9PLUS)
70        .Case("st7", EM_ST7)
71        .Case("68hc16", EM_68HC16)
72        .Case("68hc11", EM_68HC11)
73        .Case("68hc08", EM_68HC08)
74        .Case("68hc05", EM_68HC05)
75        .Case("svx", EM_SVX)
76        .Case("st19", EM_ST19)
77        .Case("vax", EM_VAX)
78        .Case("cris", EM_CRIS)
79        .Case("javelin", EM_JAVELIN)
80        .Case("firepath", EM_FIREPATH)
81        .Case("zsp", EM_ZSP)
82        .Case("mmix", EM_MMIX)
83        .Case("huany", EM_HUANY)
84        .Case("prism", EM_PRISM)
85        .Case("avr", EM_AVR)
86        .Case("fr30", EM_FR30)
87        .Case("d10v", EM_D10V)
88        .Case("d30v", EM_D30V)
89        .Case("v850", EM_V850)
90        .Case("m32r", EM_M32R)
91        .Case("mn10300", EM_MN10300)
92        .Case("mn10200", EM_MN10200)
93        .Case("pj", EM_PJ)
94        .Case("openrisc", EM_OPENRISC)
95        .Case("arc_compact", EM_ARC_COMPACT)
96        .Case("xtensa", EM_XTENSA)
97        .Case("videocore", EM_VIDEOCORE)
98        .Case("tmm_gpp", EM_TMM_GPP)
99        .Case("ns32k", EM_NS32K)
100        .Case("tpc", EM_TPC)
101        .Case("snp1k", EM_SNP1K)
102        .Case("st200", EM_ST200)
103        .Case("ip2k", EM_IP2K)
104        .Case("max", EM_MAX)
105        .Case("cr", EM_CR)
106        .Case("f2mc16", EM_F2MC16)
107        .Case("msp430", EM_MSP430)
108        .Case("blackfin", EM_BLACKFIN)
109        .Case("se_c33", EM_SE_C33)
110        .Case("sep", EM_SEP)
111        .Case("arca", EM_ARCA)
112        .Case("unicore", EM_UNICORE)
113        .Case("excess", EM_EXCESS)
114        .Case("dxp", EM_DXP)
115        .Case("altera_nios2", EM_ALTERA_NIOS2)
116        .Case("crx", EM_CRX)
117        .Case("xgate", EM_XGATE)
118        .Case("c166", EM_C166)
119        .Case("m16c", EM_M16C)
120        .Case("dspic30f", EM_DSPIC30F)
121        .Case("ce", EM_CE)
122        .Case("m32c", EM_M32C)
123        .Case("tsk3000", EM_TSK3000)
124        .Case("rs08", EM_RS08)
125        .Case("sharc", EM_SHARC)
126        .Case("ecog2", EM_ECOG2)
127        .Case("score7", EM_SCORE7)
128        .Case("dsp24", EM_DSP24)
129        .Case("videocore3", EM_VIDEOCORE3)
130        .Case("latticemico32", EM_LATTICEMICO32)
131        .Case("se_c17", EM_SE_C17)
132        .Case("ti_c6000", EM_TI_C6000)
133        .Case("ti_c2000", EM_TI_C2000)
134        .Case("ti_c5500", EM_TI_C5500)
135        .Case("mmdsp_plus", EM_MMDSP_PLUS)
136        .Case("cypress_m8c", EM_CYPRESS_M8C)
137        .Case("r32c", EM_R32C)
138        .Case("trimedia", EM_TRIMEDIA)
139        .Case("hexagon", EM_HEXAGON)
140        .Case("8051", EM_8051)
141        .Case("stxp7x", EM_STXP7X)
142        .Case("nds32", EM_NDS32)
143        .Case("ecog1", EM_ECOG1)
144        .Case("ecog1x", EM_ECOG1X)
145        .Case("maxq30", EM_MAXQ30)
146        .Case("ximo16", EM_XIMO16)
147        .Case("manik", EM_MANIK)
148        .Case("craynv2", EM_CRAYNV2)
149        .Case("rx", EM_RX)
150        .Case("metag", EM_METAG)
151        .Case("mcst_elbrus", EM_MCST_ELBRUS)
152        .Case("ecog16", EM_ECOG16)
153        .Case("cr16", EM_CR16)
154        .Case("etpu", EM_ETPU)
155        .Case("sle9x", EM_SLE9X)
156        .Case("l10m", EM_L10M)
157        .Case("k10m", EM_K10M)
158        .Case("aarch64", EM_AARCH64)
159        .Case("avr32", EM_AVR32)
160        .Case("stm8", EM_STM8)
161        .Case("tile64", EM_TILE64)
162        .Case("tilepro", EM_TILEPRO)
163        .Case("cuda", EM_CUDA)
164        .Case("tilegx", EM_TILEGX)
165        .Case("cloudshield", EM_CLOUDSHIELD)
166        .Case("corea_1st", EM_COREA_1ST)
167        .Case("corea_2nd", EM_COREA_2ND)
168        .Case("arc_compact2", EM_ARC_COMPACT2)
169        .Case("open8", EM_OPEN8)
170        .Case("rl78", EM_RL78)
171        .Case("videocore5", EM_VIDEOCORE5)
172        .Case("78kor", EM_78KOR)
173        .Case("56800ex", EM_56800EX)
174        .Case("ba1", EM_BA1)
175        .Case("ba2", EM_BA2)
176        .Case("xcore", EM_XCORE)
177        .Case("mchp_pic", EM_MCHP_PIC)
178        .Case("intel205", EM_INTEL205)
179        .Case("intel206", EM_INTEL206)
180        .Case("intel207", EM_INTEL207)
181        .Case("intel208", EM_INTEL208)
182        .Case("intel209", EM_INTEL209)
183        .Case("km32", EM_KM32)
184        .Case("kmx32", EM_KMX32)
185        .Case("kmx16", EM_KMX16)
186        .Case("kmx8", EM_KMX8)
187        .Case("kvarc", EM_KVARC)
188        .Case("cdp", EM_CDP)
189        .Case("coge", EM_COGE)
190        .Case("cool", EM_COOL)
191        .Case("norc", EM_NORC)
192        .Case("csr_kalimba", EM_CSR_KALIMBA)
193        .Case("amdgpu", EM_AMDGPU)
194        .Case("riscv", EM_RISCV)
195        .Case("lanai", EM_LANAI)
196        .Case("bpf", EM_BPF)
197        .Case("ve", EM_VE)
198        .Case("csky", EM_CSKY)
199        .Case("loongarch", EM_LOONGARCH)
200        .Default(EM_NONE);
201  }
202  
203  /// Convert an ELF's e_machine value into an architecture name.
204  StringRef ELF::convertEMachineToArchName(uint16_t EMachine) {
205    switch (EMachine) {
206    case EM_NONE:
207      return "None";
208    case EM_M32:
209      return "m32";
210    case EM_SPARC:
211      return "sparc";
212    case EM_386:
213      return "386";
214    case EM_68K:
215      return "68k";
216    case EM_88K:
217      return "88k";
218    case EM_IAMCU:
219      return "iamcu";
220    case EM_860:
221      return "860";
222    case EM_MIPS:
223      return "mips";
224    case EM_S370:
225      return "s370";
226    case EM_MIPS_RS3_LE:
227      return "mips_rs3_le";
228    case EM_PARISC:
229      return "parisc";
230    case EM_VPP500:
231      return "vpp500";
232    case EM_SPARC32PLUS:
233      return "sparc32plus";
234    case EM_960:
235      return "960";
236    case EM_PPC:
237      return "ppc";
238    case EM_PPC64:
239      return "ppc64";
240    case EM_S390:
241      return "s390";
242    case EM_SPU:
243      return "spu";
244    case EM_V800:
245      return "v800";
246    case EM_FR20:
247      return "fr20";
248    case EM_RH32:
249      return "rh32";
250    case EM_RCE:
251      return "rce";
252    case EM_ARM:
253      return "arm";
254    case EM_ALPHA:
255      return "alpha";
256    case EM_SH:
257      return "sh";
258    case EM_SPARCV9:
259      return "sparcv9";
260    case EM_TRICORE:
261      return "tricore";
262    case EM_ARC:
263      return "arc";
264    case EM_H8_300:
265      return "h8_300";
266    case EM_H8_300H:
267      return "h8_300h";
268    case EM_H8S:
269      return "h8s";
270    case EM_H8_500:
271      return "h8_500";
272    case EM_IA_64:
273      return "ia_64";
274    case EM_MIPS_X:
275      return "mips_x";
276    case EM_COLDFIRE:
277      return "coldfire";
278    case EM_68HC12:
279      return "68hc12";
280    case EM_MMA:
281      return "mma";
282    case EM_PCP:
283      return "pcp";
284    case EM_NCPU:
285      return "ncpu";
286    case EM_NDR1:
287      return "ndr1";
288    case EM_STARCORE:
289      return "starcore";
290    case EM_ME16:
291      return "me16";
292    case EM_ST100:
293      return "st100";
294    case EM_TINYJ:
295      return "tinyj";
296    case EM_X86_64:
297      return "x86_64";
298    case EM_PDSP:
299      return "pdsp";
300    case EM_PDP10:
301      return "pdp10";
302    case EM_PDP11:
303      return "pdp11";
304    case EM_FX66:
305      return "fx66";
306    case EM_ST9PLUS:
307      return "st9plus";
308    case EM_ST7:
309      return "st7";
310    case EM_68HC16:
311      return "68hc16";
312    case EM_68HC11:
313      return "68hc11";
314    case EM_68HC08:
315      return "68hc08";
316    case EM_68HC05:
317      return "68hc05";
318    case EM_SVX:
319      return "svx";
320    case EM_ST19:
321      return "st19";
322    case EM_VAX:
323      return "vax";
324    case EM_CRIS:
325      return "cris";
326    case EM_JAVELIN:
327      return "javelin";
328    case EM_FIREPATH:
329      return "firepath";
330    case EM_ZSP:
331      return "zsp";
332    case EM_MMIX:
333      return "mmix";
334    case EM_HUANY:
335      return "huany";
336    case EM_PRISM:
337      return "prism";
338    case EM_AVR:
339      return "avr";
340    case EM_FR30:
341      return "fr30";
342    case EM_D10V:
343      return "d10v";
344    case EM_D30V:
345      return "d30v";
346    case EM_V850:
347      return "v850";
348    case EM_M32R:
349      return "m32r";
350    case EM_MN10300:
351      return "mn10300";
352    case EM_MN10200:
353      return "mn10200";
354    case EM_PJ:
355      return "pj";
356    case EM_OPENRISC:
357      return "openrisc";
358    case EM_ARC_COMPACT:
359      return "arc_compact";
360    case EM_XTENSA:
361      return "xtensa";
362    case EM_VIDEOCORE:
363      return "videocore";
364    case EM_TMM_GPP:
365      return "tmm_gpp";
366    case EM_NS32K:
367      return "ns32k";
368    case EM_TPC:
369      return "tpc";
370    case EM_SNP1K:
371      return "snp1k";
372    case EM_ST200:
373      return "st200";
374    case EM_IP2K:
375      return "ip2k";
376    case EM_MAX:
377      return "max";
378    case EM_CR:
379      return "cr";
380    case EM_F2MC16:
381      return "f2mc16";
382    case EM_MSP430:
383      return "msp430";
384    case EM_BLACKFIN:
385      return "blackfin";
386    case EM_SE_C33:
387      return "se_c33";
388    case EM_SEP:
389      return "sep";
390    case EM_ARCA:
391      return "arca";
392    case EM_UNICORE:
393      return "unicore";
394    case EM_EXCESS:
395      return "excess";
396    case EM_DXP:
397      return "dxp";
398    case EM_ALTERA_NIOS2:
399      return "altera_nios2";
400    case EM_CRX:
401      return "crx";
402    case EM_XGATE:
403      return "xgate";
404    case EM_C166:
405      return "c166";
406    case EM_M16C:
407      return "m16c";
408    case EM_DSPIC30F:
409      return "dspic30f";
410    case EM_CE:
411      return "ce";
412    case EM_M32C:
413      return "m32c";
414    case EM_TSK3000:
415      return "tsk3000";
416    case EM_RS08:
417      return "rs08";
418    case EM_SHARC:
419      return "sharc";
420    case EM_ECOG2:
421      return "ecog2";
422    case EM_SCORE7:
423      return "score7";
424    case EM_DSP24:
425      return "dsp24";
426    case EM_VIDEOCORE3:
427      return "videocore3";
428    case EM_LATTICEMICO32:
429      return "latticemico32";
430    case EM_SE_C17:
431      return "se_c17";
432    case EM_TI_C6000:
433      return "ti_c6000";
434    case EM_TI_C2000:
435      return "ti_c2000";
436    case EM_TI_C5500:
437      return "ti_c5500";
438    case EM_MMDSP_PLUS:
439      return "mmdsp_plus";
440    case EM_CYPRESS_M8C:
441      return "cypress_m8c";
442    case EM_R32C:
443      return "r32c";
444    case EM_TRIMEDIA:
445      return "trimedia";
446    case EM_HEXAGON:
447      return "hexagon";
448    case EM_8051:
449      return "8051";
450    case EM_STXP7X:
451      return "stxp7x";
452    case EM_NDS32:
453      return "nds32";
454    case EM_ECOG1:
455      return "ecog1";
456    case EM_MAXQ30:
457      return "maxq30";
458    case EM_XIMO16:
459      return "ximo16";
460    case EM_MANIK:
461      return "manik";
462    case EM_CRAYNV2:
463      return "craynv2";
464    case EM_RX:
465      return "rx";
466    case EM_METAG:
467      return "metag";
468    case EM_MCST_ELBRUS:
469      return "mcst_elbrus";
470    case EM_ECOG16:
471      return "ecog16";
472    case EM_CR16:
473      return "cr16";
474    case EM_ETPU:
475      return "etpu";
476    case EM_SLE9X:
477      return "sle9x";
478    case EM_L10M:
479      return "l10m";
480    case EM_K10M:
481      return "k10m";
482    case EM_AARCH64:
483      return "AArch64";
484    case EM_AVR32:
485      return "avr32";
486    case EM_STM8:
487      return "stm8";
488    case EM_TILE64:
489      return "tile64";
490    case EM_TILEPRO:
491      return "tilepro";
492    case EM_CUDA:
493      return "cuda";
494    case EM_TILEGX:
495      return "tilegx";
496    case EM_CLOUDSHIELD:
497      return "cloudshield";
498    case EM_COREA_1ST:
499      return "corea_1st";
500    case EM_COREA_2ND:
501      return "corea_2nd";
502    case EM_ARC_COMPACT2:
503      return "arc_compact2";
504    case EM_OPEN8:
505      return "open8";
506    case EM_RL78:
507      return "rl78";
508    case EM_VIDEOCORE5:
509      return "videocore5";
510    case EM_78KOR:
511      return "78kor";
512    case EM_56800EX:
513      return "56800ex";
514    case EM_BA1:
515      return "ba1";
516    case EM_BA2:
517      return "ba2";
518    case EM_XCORE:
519      return "xcore";
520    case EM_MCHP_PIC:
521      return "mchp_pic";
522    case EM_INTEL205:
523      return "intel205";
524    case EM_INTEL206:
525      return "intel206";
526    case EM_INTEL207:
527      return "intel207";
528    case EM_INTEL208:
529      return "intel208";
530    case EM_INTEL209:
531      return "intel209";
532    case EM_KM32:
533      return "km32";
534    case EM_KMX32:
535      return "kmx32";
536    case EM_KMX16:
537      return "kmx16";
538    case EM_KMX8:
539      return "kmx8";
540    case EM_KVARC:
541      return "kvarc";
542    case EM_CDP:
543      return "cdp";
544    case EM_COGE:
545      return "coge";
546    case EM_COOL:
547      return "cool";
548    case EM_NORC:
549      return "norc";
550    case EM_CSR_KALIMBA:
551      return "csr_kalimba";
552    case EM_AMDGPU:
553      return "amdgpu";
554    case EM_RISCV:
555      return "riscv";
556    case EM_LANAI:
557      return "lanai";
558    case EM_BPF:
559      return "bpf";
560    case EM_VE:
561      return "ve";
562    case EM_CSKY:
563      return "csky";
564    case EM_LOONGARCH:
565      return "loongarch";
566    default:
567      return "None";
568    }
569  }
570  
571  uint8_t ELF::convertNameToOSABI(StringRef Name) {
572    return StringSwitch<uint16_t>(Name)
573        .StartsWith("hpux", ELFOSABI_HPUX)
574        .StartsWith("netbsd", ELFOSABI_NETBSD)
575        .StartsWith("gnu", ELFOSABI_GNU)
576        .StartsWith("hurd", ELFOSABI_HURD)
577        .StartsWith("solaris", ELFOSABI_SOLARIS)
578        .StartsWith("aix", ELFOSABI_AIX)
579        .StartsWith("irix", ELFOSABI_IRIX)
580        .StartsWith("freebsd", ELFOSABI_FREEBSD)
581        .StartsWith("tru64", ELFOSABI_TRU64)
582        .StartsWith("modesto", ELFOSABI_MODESTO)
583        .StartsWith("openbsd", ELFOSABI_OPENBSD)
584        .StartsWith("openvms", ELFOSABI_OPENVMS)
585        .StartsWith("nsk", ELFOSABI_NSK)
586        .StartsWith("aros", ELFOSABI_AROS)
587        .StartsWith("fenixos", ELFOSABI_FENIXOS)
588        .StartsWith("cloudabi", ELFOSABI_CLOUDABI)
589        .StartsWith("cuda", ELFOSABI_CUDA)
590        .StartsWith("amdhsa", ELFOSABI_AMDGPU_HSA)
591        .StartsWith("amdpal", ELFOSABI_AMDGPU_PAL)
592        .StartsWith("mesa3d", ELFOSABI_AMDGPU_MESA3D)
593        .StartsWith("arm", ELFOSABI_ARM)
594        .StartsWith("standalone", ELFOSABI_STANDALONE)
595        .StartsWith("none", ELFOSABI_NONE)
596        .Default(ELFOSABI_NONE);
597  }
598  
599  StringRef ELF::convertOSABIToName(uint8_t OSABI) {
600    switch (OSABI) {
601    case ELFOSABI_HPUX:
602      return "hpux";
603    case ELFOSABI_NETBSD:
604      return "netbsd";
605    case ELFOSABI_GNU:
606      return "gnu";
607    case ELFOSABI_HURD:
608      return "hurd";
609    case ELFOSABI_SOLARIS:
610      return "solaris";
611    case ELFOSABI_AIX:
612      return "aix";
613    case ELFOSABI_IRIX:
614      return "irix";
615    case ELFOSABI_FREEBSD:
616      return "freebsd";
617    case ELFOSABI_TRU64:
618      return "tru64";
619    case ELFOSABI_MODESTO:
620      return "modesto";
621    case ELFOSABI_OPENBSD:
622      return "openbsd";
623    case ELFOSABI_OPENVMS:
624      return "openvms";
625    case ELFOSABI_NSK:
626      return "nsk";
627    case ELFOSABI_AROS:
628      return "aros";
629    case ELFOSABI_FENIXOS:
630      return "fenixos";
631    case ELFOSABI_CLOUDABI:
632      return "cloudabi";
633    case ELFOSABI_CUDA:
634      return "cuda";
635    case ELFOSABI_AMDGPU_HSA:
636      return "amdhsa";
637    case ELFOSABI_AMDGPU_PAL:
638      return "amdpal";
639    case ELFOSABI_AMDGPU_MESA3D:
640      return "mesa3d";
641    case ELFOSABI_ARM:
642      return "arm";
643    case ELFOSABI_STANDALONE:
644      return "standalone";
645    default:
646      return "none";
647    }
648  }
649