xref: /llvm-project-15.0.7/llvm/lib/Object/ELF.cpp (revision e23dde64)
1 //===- ELF.cpp - ELF object file implementation ---------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/Object/ELF.h"
11 #include "llvm/BinaryFormat/ELF.h"
12 
13 using namespace llvm;
14 using namespace object;
15 
16 #define STRINGIFY_ENUM_CASE(ns, name)                                          \
17   case ns::name:                                                               \
18     return #name;
19 
20 #define ELF_RELOC(name, value) STRINGIFY_ENUM_CASE(ELF, name)
21 
22 StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
23                                                  uint32_t Type) {
24   switch (Machine) {
25   case ELF::EM_X86_64:
26     switch (Type) {
27 #include "llvm/BinaryFormat/ELFRelocs/x86_64.def"
28     default:
29       break;
30     }
31     break;
32   case ELF::EM_386:
33   case ELF::EM_IAMCU:
34     switch (Type) {
35 #include "llvm/BinaryFormat/ELFRelocs/i386.def"
36     default:
37       break;
38     }
39     break;
40   case ELF::EM_MIPS:
41     switch (Type) {
42 #include "llvm/BinaryFormat/ELFRelocs/Mips.def"
43     default:
44       break;
45     }
46     break;
47   case ELF::EM_AARCH64:
48     switch (Type) {
49 #include "llvm/BinaryFormat/ELFRelocs/AArch64.def"
50     default:
51       break;
52     }
53     break;
54   case ELF::EM_ARM:
55     switch (Type) {
56 #include "llvm/BinaryFormat/ELFRelocs/ARM.def"
57     default:
58       break;
59     }
60     break;
61   case ELF::EM_ARC_COMPACT:
62   case ELF::EM_ARC_COMPACT2:
63     switch (Type) {
64 #include "llvm/BinaryFormat/ELFRelocs/ARC.def"
65     default:
66       break;
67     }
68     break;
69   case ELF::EM_AVR:
70     switch (Type) {
71 #include "llvm/BinaryFormat/ELFRelocs/AVR.def"
72     default:
73       break;
74     }
75     break;
76   case ELF::EM_HEXAGON:
77     switch (Type) {
78 #include "llvm/BinaryFormat/ELFRelocs/Hexagon.def"
79     default:
80       break;
81     }
82     break;
83   case ELF::EM_LANAI:
84     switch (Type) {
85 #include "llvm/BinaryFormat/ELFRelocs/Lanai.def"
86     default:
87       break;
88     }
89     break;
90   case ELF::EM_PPC:
91     switch (Type) {
92 #include "llvm/BinaryFormat/ELFRelocs/PowerPC.def"
93     default:
94       break;
95     }
96     break;
97   case ELF::EM_PPC64:
98     switch (Type) {
99 #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
100     default:
101       break;
102     }
103     break;
104   case ELF::EM_RISCV:
105     switch (Type) {
106 #include "llvm/BinaryFormat/ELFRelocs/RISCV.def"
107     default:
108       break;
109     }
110     break;
111   case ELF::EM_S390:
112     switch (Type) {
113 #include "llvm/BinaryFormat/ELFRelocs/SystemZ.def"
114     default:
115       break;
116     }
117     break;
118   case ELF::EM_SPARC:
119   case ELF::EM_SPARC32PLUS:
120   case ELF::EM_SPARCV9:
121     switch (Type) {
122 #include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
123     default:
124       break;
125     }
126     break;
127   case ELF::EM_WEBASSEMBLY:
128     switch (Type) {
129 #include "llvm/BinaryFormat/ELFRelocs/WebAssembly.def"
130     default:
131       break;
132     }
133     break;
134   case ELF::EM_AMDGPU:
135     switch (Type) {
136 #include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
137     default:
138       break;
139     }
140   case ELF::EM_BPF:
141     switch (Type) {
142 #include "llvm/BinaryFormat/ELFRelocs/BPF.def"
143     default:
144       break;
145     }
146     break;
147   default:
148     break;
149   }
150   return "Unknown";
151 }
152 
153 #undef ELF_RELOC
154 
155 StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
156   switch (Machine) {
157   case ELF::EM_ARM:
158     switch (Type) {
159       STRINGIFY_ENUM_CASE(ELF, SHT_ARM_EXIDX);
160       STRINGIFY_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
161       STRINGIFY_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
162       STRINGIFY_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
163       STRINGIFY_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
164     }
165     break;
166   case ELF::EM_HEXAGON:
167     switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
168     break;
169   case ELF::EM_X86_64:
170     switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
171     break;
172   case ELF::EM_MIPS:
173   case ELF::EM_MIPS_RS3_LE:
174     switch (Type) {
175       STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
176       STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
177       STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
178       STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_DWARF);
179     }
180     break;
181   default:
182     break;
183   }
184 
185   switch (Type) {
186     STRINGIFY_ENUM_CASE(ELF, SHT_NULL);
187     STRINGIFY_ENUM_CASE(ELF, SHT_PROGBITS);
188     STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB);
189     STRINGIFY_ENUM_CASE(ELF, SHT_STRTAB);
190     STRINGIFY_ENUM_CASE(ELF, SHT_RELA);
191     STRINGIFY_ENUM_CASE(ELF, SHT_HASH);
192     STRINGIFY_ENUM_CASE(ELF, SHT_DYNAMIC);
193     STRINGIFY_ENUM_CASE(ELF, SHT_NOTE);
194     STRINGIFY_ENUM_CASE(ELF, SHT_NOBITS);
195     STRINGIFY_ENUM_CASE(ELF, SHT_REL);
196     STRINGIFY_ENUM_CASE(ELF, SHT_SHLIB);
197     STRINGIFY_ENUM_CASE(ELF, SHT_DYNSYM);
198     STRINGIFY_ENUM_CASE(ELF, SHT_INIT_ARRAY);
199     STRINGIFY_ENUM_CASE(ELF, SHT_FINI_ARRAY);
200     STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY);
201     STRINGIFY_ENUM_CASE(ELF, SHT_GROUP);
202     STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX);
203     STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB);
204     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES);
205     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH);
206     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef);
207     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verneed);
208     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_versym);
209   default:
210     return "Unknown";
211   }
212 }
213