blob: 9bc28dc14a296edb0de2e1f9cbca909dd8c67eae [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;
Dylan McKay35047ed2016-09-28 13:23:42 +000061 case ELF::EM_AVR:
62 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000063#include "llvm/BinaryFormat/ELFRelocs/AVR.def"
Dylan McKay35047ed2016-09-28 13:23:42 +000064 default:
65 break;
66 }
67 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +000068 case ELF::EM_HEXAGON:
69 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000070#include "llvm/BinaryFormat/ELFRelocs/Hexagon.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000071 default:
72 break;
73 }
74 break;
Jacques Pienaarea9f25a2016-03-01 21:21:42 +000075 case ELF::EM_LANAI:
76 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000077#include "llvm/BinaryFormat/ELFRelocs/Lanai.def"
Jacques Pienaarea9f25a2016-03-01 21:21:42 +000078 default:
79 break;
80 }
81 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +000082 case ELF::EM_PPC:
83 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000084#include "llvm/BinaryFormat/ELFRelocs/PowerPC.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000085 default:
86 break;
87 }
88 break;
89 case ELF::EM_PPC64:
90 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000091#include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +000092 default:
93 break;
94 }
95 break;
Alex Bradbury1524f622016-11-01 16:59:37 +000096 case ELF::EM_RISCV:
97 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +000098#include "llvm/BinaryFormat/ELFRelocs/RISCV.def"
Alex Bradbury1524f622016-11-01 16:59:37 +000099 default:
100 break;
101 }
102 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +0000103 case ELF::EM_S390:
104 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000105#include "llvm/BinaryFormat/ELFRelocs/SystemZ.def"
Michael J. Spencer126973b2013-08-08 22:27:13 +0000106 default:
107 break;
108 }
109 break;
Venkatraman Govindarajucdee0ed2014-01-26 03:21:28 +0000110 case ELF::EM_SPARC:
111 case ELF::EM_SPARC32PLUS:
112 case ELF::EM_SPARCV9:
113 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000114#include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
Venkatraman Govindarajucdee0ed2014-01-26 03:21:28 +0000115 default:
116 break;
117 }
118 break;
Dan Gohman46350172016-01-12 20:56:01 +0000119 case ELF::EM_WEBASSEMBLY:
120 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000121#include "llvm/BinaryFormat/ELFRelocs/WebAssembly.def"
Dan Gohman46350172016-01-12 20:56:01 +0000122 default:
123 break;
124 }
125 break;
Tom Stellardf8db61c2016-06-17 22:38:08 +0000126 case ELF::EM_AMDGPU:
127 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000128#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def"
Tom Stellardf8db61c2016-06-17 22:38:08 +0000129 default:
130 break;
131 }
Alexei Starovoitovcfb51f52016-07-15 22:27:55 +0000132 case ELF::EM_BPF:
133 switch (Type) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000134#include "llvm/BinaryFormat/ELFRelocs/BPF.def"
Alexei Starovoitovcfb51f52016-07-15 22:27:55 +0000135 default:
136 break;
137 }
Tom Stellardf8db61c2016-06-17 22:38:08 +0000138 break;
Michael J. Spencer126973b2013-08-08 22:27:13 +0000139 default:
140 break;
141 }
142 return "Unknown";
143}
144
Tim Northover242785c2014-11-21 20:16:07 +0000145#undef ELF_RELOC
Rafael Espindola3ba25732017-05-02 14:04:52 +0000146
147StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
148 switch (Machine) {
149 case ELF::EM_ARM:
150 switch (Type) {
151 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_EXIDX);
152 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP);
153 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES);
154 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY);
155 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION);
156 }
157 break;
158 case ELF::EM_HEXAGON:
159 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
160 break;
161 case ELF::EM_X86_64:
162 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
163 break;
164 case ELF::EM_MIPS:
165 case ELF::EM_MIPS_RS3_LE:
166 switch (Type) {
167 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_REGINFO);
168 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_OPTIONS);
169 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
170 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_DWARF);
171 }
172 break;
173 default:
174 break;
175 }
176
177 switch (Type) {
178 STRINGIFY_ENUM_CASE(ELF, SHT_NULL);
179 STRINGIFY_ENUM_CASE(ELF, SHT_PROGBITS);
180 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB);
181 STRINGIFY_ENUM_CASE(ELF, SHT_STRTAB);
182 STRINGIFY_ENUM_CASE(ELF, SHT_RELA);
183 STRINGIFY_ENUM_CASE(ELF, SHT_HASH);
184 STRINGIFY_ENUM_CASE(ELF, SHT_DYNAMIC);
185 STRINGIFY_ENUM_CASE(ELF, SHT_NOTE);
186 STRINGIFY_ENUM_CASE(ELF, SHT_NOBITS);
187 STRINGIFY_ENUM_CASE(ELF, SHT_REL);
188 STRINGIFY_ENUM_CASE(ELF, SHT_SHLIB);
189 STRINGIFY_ENUM_CASE(ELF, SHT_DYNSYM);
190 STRINGIFY_ENUM_CASE(ELF, SHT_INIT_ARRAY);
191 STRINGIFY_ENUM_CASE(ELF, SHT_FINI_ARRAY);
192 STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY);
193 STRINGIFY_ENUM_CASE(ELF, SHT_GROUP);
194 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX);
195 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES);
196 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH);
197 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef);
198 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verneed);
199 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_versym);
200 default:
201 return "Unknown";
202 }
203}