Path: blob/main/contrib/llvm-project/llvm/lib/BinaryFormat/ELF.cpp
35232 views
//===- llvm/BinaryFormat/ELF.cpp - The ELF format ---------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/BinaryFormat/ELF.h"9#include "llvm/ADT/StringSwitch.h"1011using namespace llvm;12using namespace ELF;1314/// Convert an architecture name into ELF's e_machine value.15uint16_t ELF::convertArchNameToEMachine(StringRef Arch) {16std::string LowerArch = Arch.lower();17return StringSwitch<uint16_t>(LowerArch)18.Case("none", EM_NONE)19.Case("m32", EM_M32)20.Case("sparc", EM_SPARC)21.Case("386", EM_386)22.Case("68k", EM_68K)23.Case("88k", EM_88K)24.Case("iamcu", EM_IAMCU)25.Case("860", EM_860)26.Case("mips", EM_MIPS)27.Case("s370", EM_S370)28.Case("mips_rs3_le", EM_MIPS_RS3_LE)29.Case("parisc", EM_PARISC)30.Case("vpp500", EM_VPP500)31.Case("sparc32plus", EM_SPARC32PLUS)32.Case("960", EM_960)33.Case("ppc", EM_PPC)34.Case("ppc64", EM_PPC64)35.Case("s390", EM_S390)36.Case("spu", EM_SPU)37.Case("v800", EM_V800)38.Case("fr20", EM_FR20)39.Case("rh32", EM_RH32)40.Case("rce", EM_RCE)41.Case("arm", EM_ARM)42.Case("alpha", EM_ALPHA)43.Case("sh", EM_SH)44.Case("sparcv9", EM_SPARCV9)45.Case("tricore", EM_TRICORE)46.Case("arc", EM_ARC)47.Case("h8_300", EM_H8_300)48.Case("h8_300h", EM_H8_300H)49.Case("h8s", EM_H8S)50.Case("h8_500", EM_H8_500)51.Case("ia_64", EM_IA_64)52.Case("mips_x", EM_MIPS_X)53.Case("coldfire", EM_COLDFIRE)54.Case("68hc12", EM_68HC12)55.Case("mma", EM_MMA)56.Case("pcp", EM_PCP)57.Case("ncpu", EM_NCPU)58.Case("ndr1", EM_NDR1)59.Case("starcore", EM_STARCORE)60.Case("me16", EM_ME16)61.Case("st100", EM_ST100)62.Case("tinyj", EM_TINYJ)63.Case("x86_64", EM_X86_64)64.Case("pdsp", EM_PDSP)65.Case("pdp10", EM_PDP10)66.Case("pdp11", EM_PDP11)67.Case("fx66", EM_FX66)68.Case("st9plus", EM_ST9PLUS)69.Case("st7", EM_ST7)70.Case("68hc16", EM_68HC16)71.Case("68hc11", EM_68HC11)72.Case("68hc08", EM_68HC08)73.Case("68hc05", EM_68HC05)74.Case("svx", EM_SVX)75.Case("st19", EM_ST19)76.Case("vax", EM_VAX)77.Case("cris", EM_CRIS)78.Case("javelin", EM_JAVELIN)79.Case("firepath", EM_FIREPATH)80.Case("zsp", EM_ZSP)81.Case("mmix", EM_MMIX)82.Case("huany", EM_HUANY)83.Case("prism", EM_PRISM)84.Case("avr", EM_AVR)85.Case("fr30", EM_FR30)86.Case("d10v", EM_D10V)87.Case("d30v", EM_D30V)88.Case("v850", EM_V850)89.Case("m32r", EM_M32R)90.Case("mn10300", EM_MN10300)91.Case("mn10200", EM_MN10200)92.Case("pj", EM_PJ)93.Case("openrisc", EM_OPENRISC)94.Case("arc_compact", EM_ARC_COMPACT)95.Case("xtensa", EM_XTENSA)96.Case("videocore", EM_VIDEOCORE)97.Case("tmm_gpp", EM_TMM_GPP)98.Case("ns32k", EM_NS32K)99.Case("tpc", EM_TPC)100.Case("snp1k", EM_SNP1K)101.Case("st200", EM_ST200)102.Case("ip2k", EM_IP2K)103.Case("max", EM_MAX)104.Case("cr", EM_CR)105.Case("f2mc16", EM_F2MC16)106.Case("msp430", EM_MSP430)107.Case("blackfin", EM_BLACKFIN)108.Case("se_c33", EM_SE_C33)109.Case("sep", EM_SEP)110.Case("arca", EM_ARCA)111.Case("unicore", EM_UNICORE)112.Case("excess", EM_EXCESS)113.Case("dxp", EM_DXP)114.Case("altera_nios2", EM_ALTERA_NIOS2)115.Case("crx", EM_CRX)116.Case("xgate", EM_XGATE)117.Case("c166", EM_C166)118.Case("m16c", EM_M16C)119.Case("dspic30f", EM_DSPIC30F)120.Case("ce", EM_CE)121.Case("m32c", EM_M32C)122.Case("tsk3000", EM_TSK3000)123.Case("rs08", EM_RS08)124.Case("sharc", EM_SHARC)125.Case("ecog2", EM_ECOG2)126.Case("score7", EM_SCORE7)127.Case("dsp24", EM_DSP24)128.Case("videocore3", EM_VIDEOCORE3)129.Case("latticemico32", EM_LATTICEMICO32)130.Case("se_c17", EM_SE_C17)131.Case("ti_c6000", EM_TI_C6000)132.Case("ti_c2000", EM_TI_C2000)133.Case("ti_c5500", EM_TI_C5500)134.Case("mmdsp_plus", EM_MMDSP_PLUS)135.Case("cypress_m8c", EM_CYPRESS_M8C)136.Case("r32c", EM_R32C)137.Case("trimedia", EM_TRIMEDIA)138.Case("hexagon", EM_HEXAGON)139.Case("8051", EM_8051)140.Case("stxp7x", EM_STXP7X)141.Case("nds32", EM_NDS32)142.Case("ecog1", EM_ECOG1)143.Case("ecog1x", EM_ECOG1X)144.Case("maxq30", EM_MAXQ30)145.Case("ximo16", EM_XIMO16)146.Case("manik", EM_MANIK)147.Case("craynv2", EM_CRAYNV2)148.Case("rx", EM_RX)149.Case("metag", EM_METAG)150.Case("mcst_elbrus", EM_MCST_ELBRUS)151.Case("ecog16", EM_ECOG16)152.Case("cr16", EM_CR16)153.Case("etpu", EM_ETPU)154.Case("sle9x", EM_SLE9X)155.Case("l10m", EM_L10M)156.Case("k10m", EM_K10M)157.Case("aarch64", EM_AARCH64)158.Case("avr32", EM_AVR32)159.Case("stm8", EM_STM8)160.Case("tile64", EM_TILE64)161.Case("tilepro", EM_TILEPRO)162.Case("cuda", EM_CUDA)163.Case("tilegx", EM_TILEGX)164.Case("cloudshield", EM_CLOUDSHIELD)165.Case("corea_1st", EM_COREA_1ST)166.Case("corea_2nd", EM_COREA_2ND)167.Case("arc_compact2", EM_ARC_COMPACT2)168.Case("open8", EM_OPEN8)169.Case("rl78", EM_RL78)170.Case("videocore5", EM_VIDEOCORE5)171.Case("78kor", EM_78KOR)172.Case("56800ex", EM_56800EX)173.Case("ba1", EM_BA1)174.Case("ba2", EM_BA2)175.Case("xcore", EM_XCORE)176.Case("mchp_pic", EM_MCHP_PIC)177.Case("intel205", EM_INTEL205)178.Case("intel206", EM_INTEL206)179.Case("intel207", EM_INTEL207)180.Case("intel208", EM_INTEL208)181.Case("intel209", EM_INTEL209)182.Case("km32", EM_KM32)183.Case("kmx32", EM_KMX32)184.Case("kmx16", EM_KMX16)185.Case("kmx8", EM_KMX8)186.Case("kvarc", EM_KVARC)187.Case("cdp", EM_CDP)188.Case("coge", EM_COGE)189.Case("cool", EM_COOL)190.Case("norc", EM_NORC)191.Case("csr_kalimba", EM_CSR_KALIMBA)192.Case("amdgpu", EM_AMDGPU)193.Case("riscv", EM_RISCV)194.Case("lanai", EM_LANAI)195.Case("bpf", EM_BPF)196.Case("ve", EM_VE)197.Case("csky", EM_CSKY)198.Case("loongarch", EM_LOONGARCH)199.Default(EM_NONE);200}201202/// Convert an ELF's e_machine value into an architecture name.203StringRef ELF::convertEMachineToArchName(uint16_t EMachine) {204switch (EMachine) {205case EM_NONE:206return "None";207case EM_M32:208return "m32";209case EM_SPARC:210return "sparc";211case EM_386:212return "386";213case EM_68K:214return "68k";215case EM_88K:216return "88k";217case EM_IAMCU:218return "iamcu";219case EM_860:220return "860";221case EM_MIPS:222return "mips";223case EM_S370:224return "s370";225case EM_MIPS_RS3_LE:226return "mips_rs3_le";227case EM_PARISC:228return "parisc";229case EM_VPP500:230return "vpp500";231case EM_SPARC32PLUS:232return "sparc32plus";233case EM_960:234return "960";235case EM_PPC:236return "ppc";237case EM_PPC64:238return "ppc64";239case EM_S390:240return "s390";241case EM_SPU:242return "spu";243case EM_V800:244return "v800";245case EM_FR20:246return "fr20";247case EM_RH32:248return "rh32";249case EM_RCE:250return "rce";251case EM_ARM:252return "arm";253case EM_ALPHA:254return "alpha";255case EM_SH:256return "sh";257case EM_SPARCV9:258return "sparcv9";259case EM_TRICORE:260return "tricore";261case EM_ARC:262return "arc";263case EM_H8_300:264return "h8_300";265case EM_H8_300H:266return "h8_300h";267case EM_H8S:268return "h8s";269case EM_H8_500:270return "h8_500";271case EM_IA_64:272return "ia_64";273case EM_MIPS_X:274return "mips_x";275case EM_COLDFIRE:276return "coldfire";277case EM_68HC12:278return "68hc12";279case EM_MMA:280return "mma";281case EM_PCP:282return "pcp";283case EM_NCPU:284return "ncpu";285case EM_NDR1:286return "ndr1";287case EM_STARCORE:288return "starcore";289case EM_ME16:290return "me16";291case EM_ST100:292return "st100";293case EM_TINYJ:294return "tinyj";295case EM_X86_64:296return "x86_64";297case EM_PDSP:298return "pdsp";299case EM_PDP10:300return "pdp10";301case EM_PDP11:302return "pdp11";303case EM_FX66:304return "fx66";305case EM_ST9PLUS:306return "st9plus";307case EM_ST7:308return "st7";309case EM_68HC16:310return "68hc16";311case EM_68HC11:312return "68hc11";313case EM_68HC08:314return "68hc08";315case EM_68HC05:316return "68hc05";317case EM_SVX:318return "svx";319case EM_ST19:320return "st19";321case EM_VAX:322return "vax";323case EM_CRIS:324return "cris";325case EM_JAVELIN:326return "javelin";327case EM_FIREPATH:328return "firepath";329case EM_ZSP:330return "zsp";331case EM_MMIX:332return "mmix";333case EM_HUANY:334return "huany";335case EM_PRISM:336return "prism";337case EM_AVR:338return "avr";339case EM_FR30:340return "fr30";341case EM_D10V:342return "d10v";343case EM_D30V:344return "d30v";345case EM_V850:346return "v850";347case EM_M32R:348return "m32r";349case EM_MN10300:350return "mn10300";351case EM_MN10200:352return "mn10200";353case EM_PJ:354return "pj";355case EM_OPENRISC:356return "openrisc";357case EM_ARC_COMPACT:358return "arc_compact";359case EM_XTENSA:360return "xtensa";361case EM_VIDEOCORE:362return "videocore";363case EM_TMM_GPP:364return "tmm_gpp";365case EM_NS32K:366return "ns32k";367case EM_TPC:368return "tpc";369case EM_SNP1K:370return "snp1k";371case EM_ST200:372return "st200";373case EM_IP2K:374return "ip2k";375case EM_MAX:376return "max";377case EM_CR:378return "cr";379case EM_F2MC16:380return "f2mc16";381case EM_MSP430:382return "msp430";383case EM_BLACKFIN:384return "blackfin";385case EM_SE_C33:386return "se_c33";387case EM_SEP:388return "sep";389case EM_ARCA:390return "arca";391case EM_UNICORE:392return "unicore";393case EM_EXCESS:394return "excess";395case EM_DXP:396return "dxp";397case EM_ALTERA_NIOS2:398return "altera_nios2";399case EM_CRX:400return "crx";401case EM_XGATE:402return "xgate";403case EM_C166:404return "c166";405case EM_M16C:406return "m16c";407case EM_DSPIC30F:408return "dspic30f";409case EM_CE:410return "ce";411case EM_M32C:412return "m32c";413case EM_TSK3000:414return "tsk3000";415case EM_RS08:416return "rs08";417case EM_SHARC:418return "sharc";419case EM_ECOG2:420return "ecog2";421case EM_SCORE7:422return "score7";423case EM_DSP24:424return "dsp24";425case EM_VIDEOCORE3:426return "videocore3";427case EM_LATTICEMICO32:428return "latticemico32";429case EM_SE_C17:430return "se_c17";431case EM_TI_C6000:432return "ti_c6000";433case EM_TI_C2000:434return "ti_c2000";435case EM_TI_C5500:436return "ti_c5500";437case EM_MMDSP_PLUS:438return "mmdsp_plus";439case EM_CYPRESS_M8C:440return "cypress_m8c";441case EM_R32C:442return "r32c";443case EM_TRIMEDIA:444return "trimedia";445case EM_HEXAGON:446return "hexagon";447case EM_8051:448return "8051";449case EM_STXP7X:450return "stxp7x";451case EM_NDS32:452return "nds32";453case EM_ECOG1:454return "ecog1";455case EM_MAXQ30:456return "maxq30";457case EM_XIMO16:458return "ximo16";459case EM_MANIK:460return "manik";461case EM_CRAYNV2:462return "craynv2";463case EM_RX:464return "rx";465case EM_METAG:466return "metag";467case EM_MCST_ELBRUS:468return "mcst_elbrus";469case EM_ECOG16:470return "ecog16";471case EM_CR16:472return "cr16";473case EM_ETPU:474return "etpu";475case EM_SLE9X:476return "sle9x";477case EM_L10M:478return "l10m";479case EM_K10M:480return "k10m";481case EM_AARCH64:482return "AArch64";483case EM_AVR32:484return "avr32";485case EM_STM8:486return "stm8";487case EM_TILE64:488return "tile64";489case EM_TILEPRO:490return "tilepro";491case EM_CUDA:492return "cuda";493case EM_TILEGX:494return "tilegx";495case EM_CLOUDSHIELD:496return "cloudshield";497case EM_COREA_1ST:498return "corea_1st";499case EM_COREA_2ND:500return "corea_2nd";501case EM_ARC_COMPACT2:502return "arc_compact2";503case EM_OPEN8:504return "open8";505case EM_RL78:506return "rl78";507case EM_VIDEOCORE5:508return "videocore5";509case EM_78KOR:510return "78kor";511case EM_56800EX:512return "56800ex";513case EM_BA1:514return "ba1";515case EM_BA2:516return "ba2";517case EM_XCORE:518return "xcore";519case EM_MCHP_PIC:520return "mchp_pic";521case EM_INTEL205:522return "intel205";523case EM_INTEL206:524return "intel206";525case EM_INTEL207:526return "intel207";527case EM_INTEL208:528return "intel208";529case EM_INTEL209:530return "intel209";531case EM_KM32:532return "km32";533case EM_KMX32:534return "kmx32";535case EM_KMX16:536return "kmx16";537case EM_KMX8:538return "kmx8";539case EM_KVARC:540return "kvarc";541case EM_CDP:542return "cdp";543case EM_COGE:544return "coge";545case EM_COOL:546return "cool";547case EM_NORC:548return "norc";549case EM_CSR_KALIMBA:550return "csr_kalimba";551case EM_AMDGPU:552return "amdgpu";553case EM_RISCV:554return "riscv";555case EM_LANAI:556return "lanai";557case EM_BPF:558return "bpf";559case EM_VE:560return "ve";561case EM_CSKY:562return "csky";563case EM_LOONGARCH:564return "loongarch";565default:566return "None";567}568}569570uint8_t ELF::convertNameToOSABI(StringRef Name) {571return StringSwitch<uint16_t>(Name)572.StartsWith("hpux", ELFOSABI_HPUX)573.StartsWith("netbsd", ELFOSABI_NETBSD)574.StartsWith("gnu", ELFOSABI_GNU)575.StartsWith("hurd", ELFOSABI_HURD)576.StartsWith("solaris", ELFOSABI_SOLARIS)577.StartsWith("aix", ELFOSABI_AIX)578.StartsWith("irix", ELFOSABI_IRIX)579.StartsWith("freebsd", ELFOSABI_FREEBSD)580.StartsWith("tru64", ELFOSABI_TRU64)581.StartsWith("modesto", ELFOSABI_MODESTO)582.StartsWith("openbsd", ELFOSABI_OPENBSD)583.StartsWith("openvms", ELFOSABI_OPENVMS)584.StartsWith("nsk", ELFOSABI_NSK)585.StartsWith("aros", ELFOSABI_AROS)586.StartsWith("fenixos", ELFOSABI_FENIXOS)587.StartsWith("cloudabi", ELFOSABI_CLOUDABI)588.StartsWith("cuda", ELFOSABI_CUDA)589.StartsWith("amdhsa", ELFOSABI_AMDGPU_HSA)590.StartsWith("amdpal", ELFOSABI_AMDGPU_PAL)591.StartsWith("mesa3d", ELFOSABI_AMDGPU_MESA3D)592.StartsWith("arm", ELFOSABI_ARM)593.StartsWith("standalone", ELFOSABI_STANDALONE)594.StartsWith("none", ELFOSABI_NONE)595.Default(ELFOSABI_NONE);596}597598StringRef ELF::convertOSABIToName(uint8_t OSABI) {599switch (OSABI) {600case ELFOSABI_HPUX:601return "hpux";602case ELFOSABI_NETBSD:603return "netbsd";604case ELFOSABI_GNU:605return "gnu";606case ELFOSABI_HURD:607return "hurd";608case ELFOSABI_SOLARIS:609return "solaris";610case ELFOSABI_AIX:611return "aix";612case ELFOSABI_IRIX:613return "irix";614case ELFOSABI_FREEBSD:615return "freebsd";616case ELFOSABI_TRU64:617return "tru64";618case ELFOSABI_MODESTO:619return "modesto";620case ELFOSABI_OPENBSD:621return "openbsd";622case ELFOSABI_OPENVMS:623return "openvms";624case ELFOSABI_NSK:625return "nsk";626case ELFOSABI_AROS:627return "aros";628case ELFOSABI_FENIXOS:629return "fenixos";630case ELFOSABI_CLOUDABI:631return "cloudabi";632case ELFOSABI_CUDA:633return "cuda";634case ELFOSABI_AMDGPU_HSA:635return "amdhsa";636case ELFOSABI_AMDGPU_PAL:637return "amdpal";638case ELFOSABI_AMDGPU_MESA3D:639return "mesa3d";640case ELFOSABI_ARM:641return "arm";642case ELFOSABI_STANDALONE:643return "standalone";644default:645return "none";646}647}648649650