]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Object/ELF.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r302069, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Object / ELF.cpp
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/Support/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/Support/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/Support/ELFRelocs/i386.def"
36     default:
37       break;
38     }
39     break;
40   case ELF::EM_MIPS:
41     switch (Type) {
42 #include "llvm/Support/ELFRelocs/Mips.def"
43     default:
44       break;
45     }
46     break;
47   case ELF::EM_AARCH64:
48     switch (Type) {
49 #include "llvm/Support/ELFRelocs/AArch64.def"
50     default:
51       break;
52     }
53     break;
54   case ELF::EM_ARM:
55     switch (Type) {
56 #include "llvm/Support/ELFRelocs/ARM.def"
57     default:
58       break;
59     }
60     break;
61   case ELF::EM_AVR:
62     switch (Type) {
63 #include "llvm/Support/ELFRelocs/AVR.def"
64     default:
65       break;
66     }
67     break;
68   case ELF::EM_HEXAGON:
69     switch (Type) {
70 #include "llvm/Support/ELFRelocs/Hexagon.def"
71     default:
72       break;
73     }
74     break;
75   case ELF::EM_LANAI:
76     switch (Type) {
77 #include "llvm/Support/ELFRelocs/Lanai.def"
78     default:
79       break;
80     }
81     break;
82   case ELF::EM_PPC:
83     switch (Type) {
84 #include "llvm/Support/ELFRelocs/PowerPC.def"
85     default:
86       break;
87     }
88     break;
89   case ELF::EM_PPC64:
90     switch (Type) {
91 #include "llvm/Support/ELFRelocs/PowerPC64.def"
92     default:
93       break;
94     }
95     break;
96   case ELF::EM_RISCV:
97     switch (Type) {
98 #include "llvm/Support/ELFRelocs/RISCV.def"
99     default:
100       break;
101     }
102     break;
103   case ELF::EM_S390:
104     switch (Type) {
105 #include "llvm/Support/ELFRelocs/SystemZ.def"
106     default:
107       break;
108     }
109     break;
110   case ELF::EM_SPARC:
111   case ELF::EM_SPARC32PLUS:
112   case ELF::EM_SPARCV9:
113     switch (Type) {
114 #include "llvm/Support/ELFRelocs/Sparc.def"
115     default:
116       break;
117     }
118     break;
119   case ELF::EM_WEBASSEMBLY:
120     switch (Type) {
121 #include "llvm/Support/ELFRelocs/WebAssembly.def"
122     default:
123       break;
124     }
125     break;
126   case ELF::EM_AMDGPU:
127     switch (Type) {
128 #include "llvm/Support/ELFRelocs/AMDGPU.def"
129     default:
130       break;
131     }
132   case ELF::EM_BPF:
133     switch (Type) {
134 #include "llvm/Support/ELFRelocs/BPF.def"
135     default:
136       break;
137     }
138     break;
139   default:
140     break;
141   }
142   return "Unknown";
143 }
144
145 #undef ELF_RELOC
146
147 StringRef 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 }