brintos

brintos / llvm-project-archived public Read only

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