| //===- llvm/BinaryFormat/ELF.cpp - The ELF format ---------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/BinaryFormat/ELF.h" |
| #include "llvm/ADT/DenseMap.h" |
| #include "llvm/ADT/StringSwitch.h" |
| #include "llvm/Support/Error.h" |
| |
| using namespace llvm; |
| using namespace ELF; |
| |
| /// Convert an architecture name into ELF's e_machine value. |
| uint16_t ELF::convertArchNameToEMachine(StringRef Arch) { |
| std::string LowerArch = Arch.lower(); |
| return StringSwitch<uint16_t>(LowerArch) |
| .Case("none", EM_NONE) |
| .Case("m32", EM_M32) |
| .Case("sparc", EM_SPARC) |
| .Case("386", EM_386) |
| .Case("68k", EM_68K) |
| .Case("88k", EM_88K) |
| .Case("iamcu", EM_IAMCU) |
| .Case("860", EM_860) |
| .Case("mips", EM_MIPS) |
| .Case("s370", EM_S370) |
| .Case("mips_rs3_le", EM_MIPS_RS3_LE) |
| .Case("parisc", EM_PARISC) |
| .Case("vpp500", EM_VPP500) |
| .Case("sparc32plus", EM_SPARC32PLUS) |
| .Case("960", EM_960) |
| .Case("ppc", EM_PPC) |
| .Case("ppc64", EM_PPC64) |
| .Case("s390", EM_S390) |
| .Case("spu", EM_SPU) |
| .Case("v800", EM_V800) |
| .Case("fr20", EM_FR20) |
| .Case("rh32", EM_RH32) |
| .Case("rce", EM_RCE) |
| .Case("arm", EM_ARM) |
| .Case("alpha", EM_ALPHA) |
| .Case("sh", EM_SH) |
| .Case("sparcv9", EM_SPARCV9) |
| .Case("tricore", EM_TRICORE) |
| .Case("arc", EM_ARC) |
| .Case("h8_300", EM_H8_300) |
| .Case("h8_300h", EM_H8_300H) |
| .Case("h8s", EM_H8S) |
| .Case("h8_500", EM_H8_500) |
| .Case("ia_64", EM_IA_64) |
| .Case("mips_x", EM_MIPS_X) |
| .Case("coldfire", EM_COLDFIRE) |
| .Case("68hc12", EM_68HC12) |
| .Case("mma", EM_MMA) |
| .Case("pcp", EM_PCP) |
| .Case("ncpu", EM_NCPU) |
| .Case("ndr1", EM_NDR1) |
| .Case("starcore", EM_STARCORE) |
| .Case("me16", EM_ME16) |
| .Case("st100", EM_ST100) |
| .Case("tinyj", EM_TINYJ) |
| .Case("x86_64", EM_X86_64) |
| .Case("pdsp", EM_PDSP) |
| .Case("pdp10", EM_PDP10) |
| .Case("pdp11", EM_PDP11) |
| .Case("fx66", EM_FX66) |
| .Case("st9plus", EM_ST9PLUS) |
| .Case("st7", EM_ST7) |
| .Case("68hc16", EM_68HC16) |
| .Case("68hc11", EM_68HC11) |
| .Case("68hc08", EM_68HC08) |
| .Case("68hc05", EM_68HC05) |
| .Case("svx", EM_SVX) |
| .Case("st19", EM_ST19) |
| .Case("vax", EM_VAX) |
| .Case("cris", EM_CRIS) |
| .Case("javelin", EM_JAVELIN) |
| .Case("firepath", EM_FIREPATH) |
| .Case("zsp", EM_ZSP) |
| .Case("mmix", EM_MMIX) |
| .Case("huany", EM_HUANY) |
| .Case("prism", EM_PRISM) |
| .Case("avr", EM_AVR) |
| .Case("fr30", EM_FR30) |
| .Case("d10v", EM_D10V) |
| .Case("d30v", EM_D30V) |
| .Case("v850", EM_V850) |
| .Case("m32r", EM_M32R) |
| .Case("mn10300", EM_MN10300) |
| .Case("mn10200", EM_MN10200) |
| .Case("pj", EM_PJ) |
| .Case("openrisc", EM_OPENRISC) |
| .Case("arc_compact", EM_ARC_COMPACT) |
| .Case("xtensa", EM_XTENSA) |
| .Case("videocore", EM_VIDEOCORE) |
| .Case("tmm_gpp", EM_TMM_GPP) |
| .Case("ns32k", EM_NS32K) |
| .Case("tpc", EM_TPC) |
| .Case("snp1k", EM_SNP1K) |
| .Case("st200", EM_ST200) |
| .Case("ip2k", EM_IP2K) |
| .Case("max", EM_MAX) |
| .Case("cr", EM_CR) |
| .Case("f2mc16", EM_F2MC16) |
| .Case("msp430", EM_MSP430) |
| .Case("blackfin", EM_BLACKFIN) |
| .Case("se_c33", EM_SE_C33) |
| .Case("sep", EM_SEP) |
| .Case("arca", EM_ARCA) |
| .Case("unicore", EM_UNICORE) |
| .Case("excess", EM_EXCESS) |
| .Case("dxp", EM_DXP) |
| .Case("altera_nios2", EM_ALTERA_NIOS2) |
| .Case("crx", EM_CRX) |
| .Case("xgate", EM_XGATE) |
| .Case("c166", EM_C166) |
| .Case("m16c", EM_M16C) |
| .Case("dspic30f", EM_DSPIC30F) |
| .Case("ce", EM_CE) |
| .Case("m32c", EM_M32C) |
| .Case("tsk3000", EM_TSK3000) |
| .Case("rs08", EM_RS08) |
| .Case("sharc", EM_SHARC) |
| .Case("ecog2", EM_ECOG2) |
| .Case("score7", EM_SCORE7) |
| .Case("dsp24", EM_DSP24) |
| .Case("videocore3", EM_VIDEOCORE3) |
| .Case("latticemico32", EM_LATTICEMICO32) |
| .Case("se_c17", EM_SE_C17) |
| .Case("ti_c6000", EM_TI_C6000) |
| .Case("ti_c2000", EM_TI_C2000) |
| .Case("ti_c5500", EM_TI_C5500) |
| .Case("mmdsp_plus", EM_MMDSP_PLUS) |
| .Case("cypress_m8c", EM_CYPRESS_M8C) |
| .Case("r32c", EM_R32C) |
| .Case("trimedia", EM_TRIMEDIA) |
| .Case("hexagon", EM_HEXAGON) |
| .Case("8051", EM_8051) |
| .Case("stxp7x", EM_STXP7X) |
| .Case("nds32", EM_NDS32) |
| .Case("ecog1", EM_ECOG1) |
| .Case("ecog1x", EM_ECOG1X) |
| .Case("maxq30", EM_MAXQ30) |
| .Case("ximo16", EM_XIMO16) |
| .Case("manik", EM_MANIK) |
| .Case("craynv2", EM_CRAYNV2) |
| .Case("rx", EM_RX) |
| .Case("metag", EM_METAG) |
| .Case("mcst_elbrus", EM_MCST_ELBRUS) |
| .Case("ecog16", EM_ECOG16) |
| .Case("cr16", EM_CR16) |
| .Case("etpu", EM_ETPU) |
| .Case("sle9x", EM_SLE9X) |
| .Case("l10m", EM_L10M) |
| .Case("k10m", EM_K10M) |
| .Case("aarch64", EM_AARCH64) |
| .Case("avr32", EM_AVR32) |
| .Case("stm8", EM_STM8) |
| .Case("tile64", EM_TILE64) |
| .Case("tilepro", EM_TILEPRO) |
| .Case("cuda", EM_CUDA) |
| .Case("tilegx", EM_TILEGX) |
| .Case("cloudshield", EM_CLOUDSHIELD) |
| .Case("corea_1st", EM_COREA_1ST) |
| .Case("corea_2nd", EM_COREA_2ND) |
| .Case("arc_compact2", EM_ARC_COMPACT2) |
| .Case("open8", EM_OPEN8) |
| .Case("rl78", EM_RL78) |
| .Case("videocore5", EM_VIDEOCORE5) |
| .Case("78kor", EM_78KOR) |
| .Case("56800ex", EM_56800EX) |
| .Case("ba1", EM_BA1) |
| .Case("ba2", EM_BA2) |
| .Case("xcore", EM_XCORE) |
| .Case("mchp_pic", EM_MCHP_PIC) |
| .Case("intel205", EM_INTEL205) |
| .Case("intel206", EM_INTEL206) |
| .Case("intel207", EM_INTEL207) |
| .Case("intel208", EM_INTEL208) |
| .Case("intel209", EM_INTEL209) |
| .Case("km32", EM_KM32) |
| .Case("kmx32", EM_KMX32) |
| .Case("kmx16", EM_KMX16) |
| .Case("kmx8", EM_KMX8) |
| .Case("kvarc", EM_KVARC) |
| .Case("cdp", EM_CDP) |
| .Case("coge", EM_COGE) |
| .Case("cool", EM_COOL) |
| .Case("norc", EM_NORC) |
| .Case("csr_kalimba", EM_CSR_KALIMBA) |
| .Case("amdgpu", EM_AMDGPU) |
| .Case("riscv", EM_RISCV) |
| .Case("lanai", EM_LANAI) |
| .Case("bpf", EM_BPF) |
| .Case("ve", EM_VE) |
| .Case("csky", EM_CSKY) |
| .Default(EM_NONE); |
| } |
| |
| /// Convert an ELF's e_machine value into an architecture name. |
| StringRef ELF::convertEMachineToArchName(uint16_t EMachine) { |
| switch (EMachine) { |
| case EM_NONE: |
| return "None"; |
| case EM_M32: |
| return "m32"; |
| case EM_SPARC: |
| return "sparc"; |
| case EM_386: |
| return "386"; |
| case EM_68K: |
| return "68k"; |
| case EM_88K: |
| return "88k"; |
| case EM_IAMCU: |
| return "iamcu"; |
| case EM_860: |
| return "860"; |
| case EM_MIPS: |
| return "mips"; |
| case EM_S370: |
| return "s370"; |
| case EM_MIPS_RS3_LE: |
| return "mips_rs3_le"; |
| case EM_PARISC: |
| return "parisc"; |
| case EM_VPP500: |
| return "vpp500"; |
| case EM_SPARC32PLUS: |
| return "sparc32plus"; |
| case EM_960: |
| return "960"; |
| case EM_PPC: |
| return "ppc"; |
| case EM_PPC64: |
| return "ppc64"; |
| case EM_S390: |
| return "s390"; |
| case EM_SPU: |
| return "spu"; |
| case EM_V800: |
| return "v800"; |
| case EM_FR20: |
| return "fr20"; |
| case EM_RH32: |
| return "rh32"; |
| case EM_RCE: |
| return "rce"; |
| case EM_ARM: |
| return "arm"; |
| case EM_ALPHA: |
| return "alpha"; |
| case EM_SH: |
| return "sh"; |
| case EM_SPARCV9: |
| return "sparcv9"; |
| case EM_TRICORE: |
| return "tricore"; |
| case EM_ARC: |
| return "arc"; |
| case EM_H8_300: |
| return "h8_300"; |
| case EM_H8_300H: |
| return "h8_300h"; |
| case EM_H8S: |
| return "h8s"; |
| case EM_H8_500: |
| return "h8_500"; |
| case EM_IA_64: |
| return "ia_64"; |
| case EM_MIPS_X: |
| return "mips_x"; |
| case EM_COLDFIRE: |
| return "coldfire"; |
| case EM_68HC12: |
| return "68hc12"; |
| case EM_MMA: |
| return "mma"; |
| case EM_PCP: |
| return "pcp"; |
| case EM_NCPU: |
| return "ncpu"; |
| case EM_NDR1: |
| return "ndr1"; |
| case EM_STARCORE: |
| return "starcore"; |
| case EM_ME16: |
| return "me16"; |
| case EM_ST100: |
| return "st100"; |
| case EM_TINYJ: |
| return "tinyj"; |
| case EM_X86_64: |
| return "x86_64"; |
| case EM_PDSP: |
| return "pdsp"; |
| case EM_PDP10: |
| return "pdp10"; |
| case EM_PDP11: |
| return "pdp11"; |
| case EM_FX66: |
| return "fx66"; |
| case EM_ST9PLUS: |
| return "st9plus"; |
| case EM_ST7: |
| return "st7"; |
| case EM_68HC16: |
| return "68hc16"; |
| case EM_68HC11: |
| return "68hc11"; |
| case EM_68HC08: |
| return "68hc08"; |
| case EM_68HC05: |
| return "68hc05"; |
| case EM_SVX: |
| return "svx"; |
| case EM_ST19: |
| return "st19"; |
| case EM_VAX: |
| return "vax"; |
| case EM_CRIS: |
| return "cris"; |
| case EM_JAVELIN: |
| return "javelin"; |
| case EM_FIREPATH: |
| return "firepath"; |
| case EM_ZSP: |
| return "zsp"; |
| case EM_MMIX: |
| return "mmix"; |
| case EM_HUANY: |
| return "huany"; |
| case EM_PRISM: |
| return "prism"; |
| case EM_AVR: |
| return "avr"; |
| case EM_FR30: |
| return "fr30"; |
| case EM_D10V: |
| return "d10v"; |
| case EM_D30V: |
| return "d30v"; |
| case EM_V850: |
| return "v850"; |
| case EM_M32R: |
| return "m32r"; |
| case EM_MN10300: |
| return "mn10300"; |
| case EM_MN10200: |
| return "mn10200"; |
| case EM_PJ: |
| return "pj"; |
| case EM_OPENRISC: |
| return "openrisc"; |
| case EM_ARC_COMPACT: |
| return "arc_compact"; |
| case EM_XTENSA: |
| return "xtensa"; |
| case EM_VIDEOCORE: |
| return "videocore"; |
| case EM_TMM_GPP: |
| return "tmm_gpp"; |
| case EM_NS32K: |
| return "ns32k"; |
| case EM_TPC: |
| return "tpc"; |
| case EM_SNP1K: |
| return "snp1k"; |
| case EM_ST200: |
| return "st200"; |
| case EM_IP2K: |
| return "ip2k"; |
| case EM_MAX: |
| return "max"; |
| case EM_CR: |
| return "cr"; |
| case EM_F2MC16: |
| return "f2mc16"; |
| case EM_MSP430: |
| return "msp430"; |
| case EM_BLACKFIN: |
| return "blackfin"; |
| case EM_SE_C33: |
| return "se_c33"; |
| case EM_SEP: |
| return "sep"; |
| case EM_ARCA: |
| return "arca"; |
| case EM_UNICORE: |
| return "unicore"; |
| case EM_EXCESS: |
| return "excess"; |
| case EM_DXP: |
| return "dxp"; |
| case EM_ALTERA_NIOS2: |
| return "altera_nios2"; |
| case EM_CRX: |
| return "crx"; |
| case EM_XGATE: |
| return "xgate"; |
| case EM_C166: |
| return "c166"; |
| case EM_M16C: |
| return "m16c"; |
| case EM_DSPIC30F: |
| return "dspic30f"; |
| case EM_CE: |
| return "ce"; |
| case EM_M32C: |
| return "m32c"; |
| case EM_TSK3000: |
| return "tsk3000"; |
| case EM_RS08: |
| return "rs08"; |
| case EM_SHARC: |
| return "sharc"; |
| case EM_ECOG2: |
| return "ecog2"; |
| case EM_SCORE7: |
| return "score7"; |
| case EM_DSP24: |
| return "dsp24"; |
| case EM_VIDEOCORE3: |
| return "videocore3"; |
| case EM_LATTICEMICO32: |
| return "latticemico32"; |
| case EM_SE_C17: |
| return "se_c17"; |
| case EM_TI_C6000: |
| return "ti_c6000"; |
| case EM_TI_C2000: |
| return "ti_c2000"; |
| case EM_TI_C5500: |
| return "ti_c5500"; |
| case EM_MMDSP_PLUS: |
| return "mmdsp_plus"; |
| case EM_CYPRESS_M8C: |
| return "cypress_m8c"; |
| case EM_R32C: |
| return "r32c"; |
| case EM_TRIMEDIA: |
| return "trimedia"; |
| case EM_HEXAGON: |
| return "hexagon"; |
| case EM_8051: |
| return "8051"; |
| case EM_STXP7X: |
| return "stxp7x"; |
| case EM_NDS32: |
| return "nds32"; |
| case EM_ECOG1: |
| return "ecog1"; |
| case EM_MAXQ30: |
| return "maxq30"; |
| case EM_XIMO16: |
| return "ximo16"; |
| case EM_MANIK: |
| return "manik"; |
| case EM_CRAYNV2: |
| return "craynv2"; |
| case EM_RX: |
| return "rx"; |
| case EM_METAG: |
| return "metag"; |
| case EM_MCST_ELBRUS: |
| return "mcst_elbrus"; |
| case EM_ECOG16: |
| return "ecog16"; |
| case EM_CR16: |
| return "cr16"; |
| case EM_ETPU: |
| return "etpu"; |
| case EM_SLE9X: |
| return "sle9x"; |
| case EM_L10M: |
| return "l10m"; |
| case EM_K10M: |
| return "k10m"; |
| case EM_AARCH64: |
| return "AArch64"; |
| case EM_AVR32: |
| return "avr32"; |
| case EM_STM8: |
| return "stm8"; |
| case EM_TILE64: |
| return "tile64"; |
| case EM_TILEPRO: |
| return "tilepro"; |
| case EM_CUDA: |
| return "cuda"; |
| case EM_TILEGX: |
| return "tilegx"; |
| case EM_CLOUDSHIELD: |
| return "cloudshield"; |
| case EM_COREA_1ST: |
| return "corea_1st"; |
| case EM_COREA_2ND: |
| return "corea_2nd"; |
| case EM_ARC_COMPACT2: |
| return "arc_compact2"; |
| case EM_OPEN8: |
| return "open8"; |
| case EM_RL78: |
| return "rl78"; |
| case EM_VIDEOCORE5: |
| return "videocore5"; |
| case EM_78KOR: |
| return "78kor"; |
| case EM_56800EX: |
| return "56800ex"; |
| case EM_BA1: |
| return "ba1"; |
| case EM_BA2: |
| return "ba2"; |
| case EM_XCORE: |
| return "xcore"; |
| case EM_MCHP_PIC: |
| return "mchp_pic"; |
| case EM_INTEL205: |
| return "intel205"; |
| case EM_INTEL206: |
| return "intel206"; |
| case EM_INTEL207: |
| return "intel207"; |
| case EM_INTEL208: |
| return "intel208"; |
| case EM_INTEL209: |
| return "intel209"; |
| case EM_KM32: |
| return "km32"; |
| case EM_KMX32: |
| return "kmx32"; |
| case EM_KMX16: |
| return "kmx16"; |
| case EM_KMX8: |
| return "kmx8"; |
| case EM_KVARC: |
| return "kvarc"; |
| case EM_CDP: |
| return "cdp"; |
| case EM_COGE: |
| return "coge"; |
| case EM_COOL: |
| return "cool"; |
| case EM_NORC: |
| return "norc"; |
| case EM_CSR_KALIMBA: |
| return "csr_kalimba"; |
| case EM_AMDGPU: |
| return "amdgpu"; |
| case EM_RISCV: |
| return "riscv"; |
| case EM_LANAI: |
| return "lanai"; |
| case EM_BPF: |
| return "bpf"; |
| case EM_VE: |
| return "ve"; |
| case EM_CSKY: |
| return "csky"; |
| default: |
| return "None"; |
| } |
| } |