ExecutionEngine: add R_AARCH64_ABS{16,32}

Add support for the R_AARCH64_ABS{16,32} relocations in the execution
engine.  This is primarily used for DWARF debug information relocations
and needed by the LLVM JIT to support JITing for lldb.

Patch by Alex Langford!

llvm-svn: 313654
This commit is contained in:
Saleem Abdulrasool 2017-09-19 18:00:50 +00:00
parent 51ed367a16
commit fac72de1b5
2 changed files with 25 additions and 0 deletions

View File

@ -354,6 +354,18 @@ void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section,
default:
llvm_unreachable("Relocation type not implemented yet!");
break;
case ELF::R_AARCH64_ABS16: {
uint64_t Result = Value + Addend;
assert(static_cast<int64_t>(Result) >= INT16_MIN && Result < UINT16_MAX);
write(isBE, TargetPtr, static_cast<uint16_t>(Result & 0xffffU));
break;
}
case ELF::R_AARCH64_ABS32: {
uint64_t Result = Value + Addend;
assert(static_cast<int64_t>(Result) >= INT32_MIN && Result < UINT32_MAX);
write(isBE, TargetPtr, static_cast<uint32_t>(Result & 0xffffffffU));
break;
}
case ELF::R_AARCH64_ABS64:
write(isBE, TargetPtr, Value + Addend);
break;

View File

@ -82,3 +82,16 @@ r:
## f & 0xFFF = 0xdef (bits 11:0 of f)
## 0xdef << 10 = 0x37bc00
# rtdyld-check: *{4}(a) = 0x9137bc00
.data
laser:
.asciz "laser"
ABS16:
.short laser
# rtdyld-check: (*{2}ABS16) = laser[15:0]
ABS32:
.long laser
# rtdyld-check: (*{4}ABS32) = laser[31:0]
ABS64:
.xword laser
# rtdyld-check: (*{8}ABS64) = laser