diff options
Diffstat (limited to 'llvm/lib/BinaryFormat/ELF.cpp')
-rw-r--r-- | llvm/lib/BinaryFormat/ELF.cpp | 568 |
1 files changed, 568 insertions, 0 deletions
diff --git a/llvm/lib/BinaryFormat/ELF.cpp b/llvm/lib/BinaryFormat/ELF.cpp new file mode 100644 index 0000000..2ede63f --- /dev/null +++ b/llvm/lib/BinaryFormat/ELF.cpp @@ -0,0 +1,568 @@ +//===- 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"; + } +} |