//===- 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/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(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"; } } uint8_t ELF::convertNameToOSABI(StringRef Name) { return StringSwitch(Name) .StartsWith("hpux", ELFOSABI_HPUX) .StartsWith("netbsd", ELFOSABI_NETBSD) .StartsWith("gnu", ELFOSABI_GNU) .StartsWith("hurd", ELFOSABI_HURD) .StartsWith("solaris", ELFOSABI_SOLARIS) .StartsWith("aix", ELFOSABI_AIX) .StartsWith("irix", ELFOSABI_IRIX) .StartsWith("freebsd", ELFOSABI_FREEBSD) .StartsWith("tru64", ELFOSABI_TRU64) .StartsWith("modesto", ELFOSABI_MODESTO) .StartsWith("openbsd", ELFOSABI_OPENBSD) .StartsWith("openvms", ELFOSABI_OPENVMS) .StartsWith("nsk", ELFOSABI_NSK) .StartsWith("aros", ELFOSABI_AROS) .StartsWith("fenixos", ELFOSABI_FENIXOS) .StartsWith("cloudabi", ELFOSABI_CLOUDABI) .StartsWith("cuda", ELFOSABI_CUDA) .StartsWith("amdhsa", ELFOSABI_AMDGPU_HSA) .StartsWith("amdpal", ELFOSABI_AMDGPU_PAL) .StartsWith("mesa3d", ELFOSABI_AMDGPU_MESA3D) .StartsWith("arm", ELFOSABI_ARM) .StartsWith("standalone", ELFOSABI_STANDALONE) .StartsWith("none", ELFOSABI_NONE) .Default(ELFOSABI_NONE); } StringRef ELF::convertOSABIToName(uint8_t OSABI) { switch (OSABI) { case ELFOSABI_HPUX: return "hpux"; case ELFOSABI_NETBSD: return "netbsd"; case ELFOSABI_GNU: return "gnu"; case ELFOSABI_HURD: return "hurd"; case ELFOSABI_SOLARIS: return "solaris"; case ELFOSABI_AIX: return "aix"; case ELFOSABI_IRIX: return "irix"; case ELFOSABI_FREEBSD: return "freebsd"; case ELFOSABI_TRU64: return "tru64"; case ELFOSABI_MODESTO: return "modesto"; case ELFOSABI_OPENBSD: return "openbsd"; case ELFOSABI_OPENVMS: return "openvms"; case ELFOSABI_NSK: return "nsk"; case ELFOSABI_AROS: return "aros"; case ELFOSABI_FENIXOS: return "fenixos"; case ELFOSABI_CLOUDABI: return "cloudabi"; case ELFOSABI_CUDA: return "cuda"; case ELFOSABI_AMDGPU_HSA: return "amdhsa"; case ELFOSABI_AMDGPU_PAL: return "amdpal"; case ELFOSABI_AMDGPU_MESA3D: return "mesa3d"; case ELFOSABI_ARM: return "arm"; case ELFOSABI_STANDALONE: return "standalone"; default: return "none"; } }