LLVM 24.0.0git
ELF.cpp
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "llvm/ADT/Enum.h"
12
13using namespace llvm;
14using namespace ELF;
15
17#define ELF_MACHINE(em, num, arch, gnuname) {{arch}, em},
18#include "llvm/BinaryFormat/ELF.def"
19};
21
22/// Convert an architecture name into ELF's e_machine value.
24 std::string LowerArch = Arch.lower();
25 if (const auto *E = EnumStrings(ElfMachineArchs).fromString(LowerArch))
26 return E->value();
27 return EM_NONE;
28}
29
31 switch (ArchType) {
33 default:
34 return EM_NONE;
35
36 case Triple::arm:
37 case Triple::armeb:
38 case Triple::thumb:
39 case Triple::thumbeb:
40 return EM_ARM;
41 case Triple::aarch64:
44 return EM_AARCH64;
45 case Triple::arc:
46 return EM_ARC;
47 case Triple::avr:
48 return EM_AVR;
49 case Triple::bpfel:
50 case Triple::bpfeb:
51 return EM_BPF;
52 case Triple::csky:
53 return EM_CSKY;
54 case Triple::hexagon:
55 return EM_HEXAGON;
58 return EM_LOONGARCH;
59 case Triple::m68k:
60 return EM_68K;
61 case Triple::mips:
62 case Triple::mipsel:
63 case Triple::mips64:
65 return EM_MIPS;
66 case Triple::msp430:
67 return EM_MSP430;
68 case Triple::ppc:
69 case Triple::ppcle:
70 return EM_PPC;
71 case Triple::ppc64:
72 case Triple::ppc64le:
73 return EM_PPC;
74 case Triple::riscv32:
75 case Triple::riscv64:
76 return EM_RISCV;
77 case Triple::sparc:
78 case Triple::sparcel:
79 return EM_SPARC;
80 case Triple::sparcv9:
81 return EM_SPARCV9;
82 case Triple::systemz:
83 return EM_S390;
84 case Triple::x86:
85 return EM_386;
86 case Triple::x86_64:
87 return EM_X86_64;
88 case Triple::xcore:
89 return EM_XCORE;
90 case Triple::xtensa:
91 return EM_XTENSA;
92 }
93}
94
95/// Convert an ELF's e_machine value into an architecture name.
97 if (StringRef S = EnumStrings(ElfMachineArchs).toString(EMachine); !S.empty())
98 return S;
99 return "None";
100}
101
103 return StringSwitch<uint16_t>(Name)
104 .StartsWith("hpux", ELFOSABI_HPUX)
105 .StartsWith("netbsd", ELFOSABI_NETBSD)
106 .StartsWith("gnu", ELFOSABI_GNU)
107 .StartsWith("hurd", ELFOSABI_HURD)
108 .StartsWith("solaris", ELFOSABI_SOLARIS)
109 .StartsWith("aix", ELFOSABI_AIX)
110 .StartsWith("irix", ELFOSABI_IRIX)
111 .StartsWith("freebsd", ELFOSABI_FREEBSD)
112 .StartsWith("tru64", ELFOSABI_TRU64)
113 .StartsWith("modesto", ELFOSABI_MODESTO)
114 .StartsWith("openbsd", ELFOSABI_OPENBSD)
115 .StartsWith("openvms", ELFOSABI_OPENVMS)
116 .StartsWith("nsk", ELFOSABI_NSK)
117 .StartsWith("aros", ELFOSABI_AROS)
118 .StartsWith("fenixos", ELFOSABI_FENIXOS)
119 .StartsWith("cloudabi", ELFOSABI_CLOUDABI)
120 .StartsWith("cuda", ELFOSABI_CUDA)
124 .StartsWith("arm", ELFOSABI_ARM)
125 .StartsWith("standalone", ELFOSABI_STANDALONE)
126 .StartsWith("none", ELFOSABI_NONE)
128}
129
131 switch (OSABI) {
132 case ELFOSABI_HPUX:
133 return "hpux";
134 case ELFOSABI_NETBSD:
135 return "netbsd";
136 case ELFOSABI_GNU:
137 return "gnu";
138 case ELFOSABI_HURD:
139 return "hurd";
140 case ELFOSABI_SOLARIS:
141 return "solaris";
142 case ELFOSABI_AIX:
143 return "aix";
144 case ELFOSABI_IRIX:
145 return "irix";
146 case ELFOSABI_FREEBSD:
147 return "freebsd";
148 case ELFOSABI_TRU64:
149 return "tru64";
150 case ELFOSABI_MODESTO:
151 return "modesto";
152 case ELFOSABI_OPENBSD:
153 return "openbsd";
154 case ELFOSABI_OPENVMS:
155 return "openvms";
156 case ELFOSABI_NSK:
157 return "nsk";
158 case ELFOSABI_AROS:
159 return "aros";
160 case ELFOSABI_FENIXOS:
161 return "fenixos";
163 return "cloudabi";
164 case ELFOSABI_CUDA:
165 return "cuda";
167 return "amdhsa";
169 return "amdpal";
171 return "mesa3d";
172 case ELFOSABI_ARM:
173 return "arm";
175 return "standalone";
176 default:
177 return "none";
178 }
179}
constexpr EnumStringDef< uint16_t > ElfMachineArchDefs[]
Definition ELF.cpp:16
constexpr auto ElfMachineArchs
Definition ELF.cpp:20
#define BUILD_ENUM_STRINGS(Tab)
Definition Enum.h:120
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
LLVM_ABI std::string lower() const
A switch()-like statement whose cases are string literals.
StringSwitch & StartsWith(StringLiteral S, T Value)
@ loongarch32
Definition Triple.h:65
@ UnknownArch
Definition Triple.h:51
@ loongarch64
Definition Triple.h:66
LLVM_ABI StringRef convertOSABIToName(uint8_t OSABI)
Definition ELF.cpp:130
LLVM_ABI uint16_t convertTripleArchTypeToEMachine(Triple::ArchType ArchType)
Definition ELF.cpp:30
@ ELFOSABI_ARM
Definition ELF.h:178
@ ELFOSABI_HURD
Definition ELF.h:159
@ ELFOSABI_NSK
Definition ELF.h:168
@ ELFOSABI_FENIXOS
Definition ELF.h:170
@ ELFOSABI_MODESTO
Definition ELF.h:165
@ ELFOSABI_TRU64
Definition ELF.h:164
@ ELFOSABI_CUDA
Definition ELF.h:172
@ ELFOSABI_OPENBSD
Definition ELF.h:166
@ ELFOSABI_HPUX
Definition ELF.h:155
@ ELFOSABI_NETBSD
Definition ELF.h:156
@ ELFOSABI_AMDGPU_HSA
Definition ELF.h:175
@ ELFOSABI_SOLARIS
Definition ELF.h:160
@ ELFOSABI_FREEBSD
Definition ELF.h:163
@ ELFOSABI_STANDALONE
Definition ELF.h:182
@ ELFOSABI_AIX
Definition ELF.h:161
@ ELFOSABI_GNU
Definition ELF.h:157
@ ELFOSABI_IRIX
Definition ELF.h:162
@ ELFOSABI_OPENVMS
Definition ELF.h:167
@ ELFOSABI_AMDGPU_MESA3D
Definition ELF.h:177
@ ELFOSABI_CLOUDABI
Definition ELF.h:171
@ ELFOSABI_AROS
Definition ELF.h:169
@ ELFOSABI_NONE
Definition ELF.h:154
@ ELFOSABI_AMDGPU_PAL
Definition ELF.h:176
LLVM_ABI uint16_t convertArchNameToEMachine(StringRef Arch)
Convert an architecture name into ELF's e_machine value.
Definition ELF.cpp:23
LLVM_ABI StringRef convertEMachineToArchName(uint16_t EMachine)
Convert an ELF's e_machine value into an architecture name.
Definition ELF.cpp:96
LLVM_ABI uint8_t convertNameToOSABI(StringRef Name)
Definition ELF.cpp:102
This is an optimization pass for GlobalISel generic memory operations.
EnumStrings(const EnumStringsStorage< T, NumStrs, N, StrLen > &) -> EnumStrings< T, NumStrs >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
Compile-time data representation of enum entries.
Definition Enum.h:47