123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 |
- //===- 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)
- .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";
- }
- }
|