16 #ifndef LLVM_OBJECT_RELOCVISITOR_H
17 #define LLVM_OBJECT_RELOCVISITOR_H
45 : FileFormat(FileFormat), HasError(
false) {}
52 if (FileFormat ==
"ELF64-x86-64") {
55 return visitELF_X86_64_NONE(R);
57 return visitELF_X86_64_64(R,
Value);
59 return visitELF_X86_64_PC32(R,
Value, SecAddr);
61 return visitELF_X86_64_32(R,
Value);
63 return visitELF_X86_64_32S(R,
Value);
68 }
else if (FileFormat ==
"ELF32-i386") {
71 return visitELF_386_NONE(R);
73 return visitELF_386_32(R,
Value);
75 return visitELF_386_PC32(R,
Value, SecAddr);
80 }
else if (FileFormat ==
"ELF64-ppc64") {
83 return visitELF_PPC64_ADDR32(R,
Value);
85 return visitELF_PPC64_ADDR64(R,
Value);
90 }
else if (FileFormat ==
"ELF32-ppc") {
93 return visitELF_PPC_ADDR32(R,
Value);
98 }
else if (FileFormat ==
"ELF32-mips") {
101 return visitELF_MIPS_32(R,
Value);
106 }
else if (FileFormat ==
"ELF64-aarch64") {
109 return visitELF_AARCH64_ABS32(R,
Value);
111 return visitELF_AARCH64_ABS64(R,
Value);
116 }
else if (FileFormat ==
"ELF64-s390") {
119 return visitELF_390_32(R,
Value);
121 return visitELF_390_64(R,
Value);
153 int64_t getAddend32BE(RelocationRef R) {
155 DataRefImpl DRI = R.getRawDataRefImpl();
161 int64_t getAddend64BE(RelocationRef R) {
163 DataRefImpl DRI = R.getRawDataRefImpl();
165 Obj->getRelocationAddend(DRI, Addend);
171 RelocToApply visitELF_386_NONE(RelocationRef R) {
172 return RelocToApply(0, 0);
177 RelocToApply visitELF_386_32(RelocationRef R, uint64_t Value) {
178 int64_t Addend = getAddend32LE(R);
179 return RelocToApply(Value + Addend, 4);
182 RelocToApply visitELF_386_PC32(RelocationRef R, uint64_t Value,
184 int64_t Addend = getAddend32LE(R);
186 R.getOffset(Address);
187 return RelocToApply(Value + Addend - Address, 4);
191 RelocToApply visitELF_X86_64_NONE(RelocationRef R) {
192 return RelocToApply(0, 0);
194 RelocToApply visitELF_X86_64_64(RelocationRef R, uint64_t Value) {
195 int64_t Addend = getAddend64LE(R);
196 return RelocToApply(Value + Addend, 8);
198 RelocToApply visitELF_X86_64_PC32(RelocationRef R, uint64_t Value,
200 int64_t Addend = getAddend64LE(R);
202 R.getOffset(Address);
203 return RelocToApply(Value + Addend - Address, 4);
205 RelocToApply visitELF_X86_64_32(RelocationRef R, uint64_t Value) {
206 int64_t Addend = getAddend64LE(R);
207 uint32_t Res = (Value + Addend) & 0xFFFFFFFF;
208 return RelocToApply(Res, 4);
210 RelocToApply visitELF_X86_64_32S(RelocationRef R, uint64_t Value) {
211 int64_t Addend = getAddend64LE(R);
212 int32_t Res = (Value + Addend) & 0xFFFFFFFF;
213 return RelocToApply(Res, 4);
217 RelocToApply visitELF_PPC64_ADDR32(RelocationRef R, uint64_t Value) {
218 int64_t Addend = getAddend64BE(R);
219 uint32_t Res = (Value + Addend) & 0xFFFFFFFF;
220 return RelocToApply(Res, 4);
222 RelocToApply visitELF_PPC64_ADDR64(RelocationRef R, uint64_t Value) {
223 int64_t Addend = getAddend64BE(R);
224 return RelocToApply(Value + Addend, 8);
228 RelocToApply visitELF_PPC_ADDR32(RelocationRef R, uint64_t Value) {
229 int64_t Addend = getAddend32BE(R);
230 uint32_t Res = (Value + Addend) & 0xFFFFFFFF;
231 return RelocToApply(Res, 4);
235 RelocToApply visitELF_MIPS_32(RelocationRef R, uint64_t Value) {
238 uint32_t Res = (Value + Addend) & 0xFFFFFFFF;
239 return RelocToApply(Res, 4);
243 RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) {
244 int64_t Addend = getAddend64LE(R);
245 int64_t Res = Value + Addend;
248 if (Res < INT32_MIN || Res > UINT32_MAX)
251 return RelocToApply(static_cast<uint32_t>(Res), 4);
254 RelocToApply visitELF_AARCH64_ABS64(RelocationRef R, uint64_t Value) {
255 int64_t Addend = getAddend64LE(R);
256 return RelocToApply(Value + Addend, 8);
260 RelocToApply visitELF_390_32(RelocationRef R, uint64_t Value) {
261 int64_t Addend = getAddend64BE(R);
262 int64_t Res = Value + Addend;
265 if (Res < INT32_MIN || Res > UINT32_MAX)
268 return RelocToApply(static_cast<uint32_t>(Res), 4);
271 RelocToApply visitELF_390_64(RelocationRef R, uint64_t Value) {
272 int64_t Addend = getAddend64BE(R);
273 return RelocToApply(Value + Addend, 8);
RelocToApply visit(uint32_t RelocType, RelocationRef R, uint64_t SecAddr=0, uint64_t Value=0)
RelocVisitor(StringRef FileFormat)
static error_code getELFRelocationAddend(const RelocationRef R, int64_t &Addend)
ELFObjectFile< ELFType< support::big, 2, true > > ELF64BEObjectFile
RelocToApply(const RelocToApply &In)
ELFObjectFile< ELFType< support::big, 2, false > > ELF32BEObjectFile
LLVM Value Representation.
RelocToApply(int64_t Value, char Width)
const ObjectFile * getObjectFile() const
error_code getRelocationAddend(DataRefImpl Rel, int64_t &Res) const
Base class for object file relocation visitors.
DataRefImpl getRawDataRefImpl() const