blob: 130fb2d9ecc6934aaea8c76e9ebdb5e85fce3c04 [file] [log] [blame]
Eugene Zelenko1df42fa2017-04-24 23:21:38 +00001//===- ELF.cpp - ELF object file implementation ---------------------------===//
Michael J. Spencer126973b2013-08-08 22:27:13 +00002//
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"
Zachary Turner264b5d92017-06-07 03:48:56 +000011#include "llvm/BinaryFormat/ELF.h"
Michael J. Spencer126973b2013-08-08 22:27:13 +000012
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000013using namespace llvm;
14using namespace object;
Michael J. Spencer126973b2013-08-08 22:27:13 +000015
Rafael Espindola3ba25732017-05-02 14:04:52 +000016#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)
Michael J. Spencer126973b2013-08-08 22:27:13 +000021
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000022StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
23 uint32_t Type) {
Michael J. Spencer126973b2013-08-08 22:27:13 +000024 switch (Machine) {
25 case ELF::EM_X86_64:
26 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000027#include "llvm/BinaryFormat/ELFRelocs/x86_64.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000028 default:
29 break;
30 }
31 break;
32 case ELF::EM_386:
Michael Kupersteina3b79dd2015-11-04 11:21:50 +000033 case ELF::EM_IAMCU:
Michael J. Spencer126973b2013-08-08 22:27:13 +000034 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000035#include "llvm/BinaryFormat/ELFRelocs/i386.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000036 default:
37 break;
38 }
39 break;
40 case ELF::EM_MIPS:
41 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000042#include "llvm/BinaryFormat/ELFRelocs/Mips.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000043 default:
44 break;
45 }
46 break;
47 case ELF::EM_AARCH64:
48 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000049#include "llvm/BinaryFormat/ELFRelocs/AArch64.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000050 default:
51 break;
52 }
53 break;
54 case ELF::EM_ARM:
55 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000056#include "llvm/BinaryFormat/ELFRelocs/ARM.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000057 default:
58 break;
59 }
60 break;
Leslie Zhai49277d12017-09-13 01:49:49 +000061 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;
Dylan McKay35047ed2016-09-28 13:23:42 +000069 case ELF::EM_AVR:
70 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000071#include "llvm/BinaryFormat/ELFRelocs/AVR.def"
Dylan McKay35047ed2016-09-28 13:23:42 +000072 default:
73 break;
74 }
75 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +000076 case ELF::EM_HEXAGON:
77 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000078#include "llvm/BinaryFormat/ELFRelocs/Hexagon.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000079 default:
80 break;
81 }
82 break;
Jacques Pienaarea9f25a2016-03-01 21:21:42 +000083 case ELF::EM_LANAI:
84 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000085#include "llvm/BinaryFormat/ELFRelocs/Lanai.def"
Jacques Pienaarea9f25a2016-03-01 21:21:42 +000086 default:
87 break;
88 }
89 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +000090 case ELF::EM_PPC:
91 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000092#include "llvm/BinaryFormat/ELFRelocs/PowerPC.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000093 default:
94 break;
95 }
96 break;
97 case ELF::EM_PPC64:
98 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000099#include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +0000100 default:
101 break;
102 }
103 break;
Alex Bradbury1524f622016-11-01 16:59:37 +0000104 case ELF::EM_RISCV:
105 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000106#include "llvm/BinaryFormat/ELFRelocs/RISCV.def"
Alex Bradbury1524f622016-11-01 16:59:37 +0000107 default:
108 break;
109 }
110 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +0000111 case ELF::EM_S390:
112 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000113#include "llvm/BinaryFormat/ELFRelocs/SystemZ.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +0000114 default:
115 break;
116 }
117 break;
Venkatraman Govindarajucdee0ed2014-01-26 03:21:28 +0000118 case ELF::EM_SPARC:
119 case ELF::EM_SPARC32PLUS:
120 case ELF::EM_SPARCV9:
121 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000122#include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
Venkatraman Govindarajucdee0ed2014-01-26 03:21:28 +0000123 default:
124 break;
125 }
126 break;
Dan Gohman46350172016-01-12 20:56:01 +0000127 case ELF::EM_WEBASSEMBLY:
128 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000129#include "llvm/BinaryFormat/ELFRelocs/WebAssembly.def"
Dan Gohman46350172016-01-12 20:56:01 +0000130 default:
131 break;
132 }
133 break;
Tom Stellardf8db61c2016-06-17 22:38:08 +0000134 case ELF::EM_AMDGPU:
135 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000136#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
Tom Stellardf8db61c2016-06-17 22:38:08 +0000137 default:
138 break;
139 }
Alexei Starovoitovcfb51f52016-07-15 22:27:55 +0000140 case ELF::EM_BPF:
141 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000142#include "llvm/BinaryFormat/ELFRelocs/BPF.def"
Alexei Starovoitovcfb51f52016-07-15 22:27:55 +0000143 default:
144 break;
145 }
Tom Stellardf8db61c2016-06-17 22:38:08 +0000146 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +0000147 default:
148 break;
149 }
150 return "Unknown";
151}
152
Tim Northover242785c2014-11-21 20:16:07 +0000153#undef ELF_RELOC
Rafael Espindola3ba25732017-05-02 14:04:52 +0000154
155StringRef 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);
Peter Collingbournef0e26e72017-06-14 18:52:12 +0000203 STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB);
Rafael Espindola3ba25732017-05-02 14:04:52 +0000204 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}