| //===- 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/DenseMapInfo.h" | |
| #include "llvm/ADT/StringSwitch.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) | |
| .Case("loongarch", EM_LOONGARCH) | |
| .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"; | |
| case EM_LOONGARCH: | |
| return "loongarch"; | |
| default: | |
| return "None"; | |
| } | |
| } |