Skip to content

Commit

Permalink
[ELF2/AArch64] Add support for R_AARCH64_CALL26 and R_AARCH64_JUMP26.
Browse files Browse the repository at this point in the history
This patch covers only the case where no DSO is involved.

Differential Revision: http://reviews.llvm.org/D14606

llvm-svn: 253007
  • Loading branch information
Igor Kudrin committed Nov 13, 2015
1 parent 12fa3b5 commit b34115b
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
11 changes: 11 additions & 0 deletions lld/ELF/Target.cpp
Expand Up @@ -665,6 +665,17 @@ void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd,
updateAArch64Adr(Loc, (X >> 12) & 0x1FFFFF); // X[32:12]
break;
}
case R_AARCH64_JUMP26:
case R_AARCH64_CALL26: {
uint64_t X = SA - P;
if (!isInt<28>(X)) {
if (Type == R_AARCH64_JUMP26)
error("Relocation R_AARCH64_JUMP26 out of range");
error("Relocation R_AARCH64_CALL26 out of range");
}
or32le(Loc, (X & 0x0FFFFFFC) >> 2);
break;
}
case R_AARCH64_LDST64_ABS_LO12_NC:
// No overflow check needed.
or32le(Loc, (SA & 0xFF8) << 7);
Expand Down
9 changes: 9 additions & 0 deletions lld/test/elf2/aarch64-call26-error.s
@@ -0,0 +1,9 @@
// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-freebsd %S/Inputs/abs.s -o %tabs
// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-freebsd %s -o %t
// RUN: not ld.lld2 -shared %t %tabs -o %t2 2>&1 | FileCheck %s
// REQUIRES: aarch64

.text
bl big

// CHECK: R_AARCH64_CALL26 out of range
9 changes: 9 additions & 0 deletions lld/test/elf2/aarch64-jump26-error.s
@@ -0,0 +1,9 @@
// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-freebsd %S/Inputs/abs.s -o %tabs
// RUN: llvm-mc -filetype=obj -triple=aarch64-pc-freebsd %s -o %t
// RUN: not ld.lld2 -shared %t %tabs -o %t2 2>&1 | FileCheck %s
// REQUIRES: aarch64

.text
b big

// CHECK: R_AARCH64_JUMP26 out of range
35 changes: 35 additions & 0 deletions lld/test/elf2/aarch64-relocs.s
Expand Up @@ -57,3 +57,38 @@ foo:
# CHECK: Disassembly of section .R_AARCH64_LDST64_ABS_LO12_NC:
# CHECK-NEXT: $x.6:
# CHECK-NEXT: 11024: 7c 17 40 f9 ldr x28, [x27, #40]

.section .SUB,"ax",@progbits
nop
sub:
nop

# CHECK: Disassembly of section .SUB:
# CHECK-NEXT: $x.8:
# CHECK-NEXT: 1102c: 1f 20 03 d5 nop
# CHECK: sub:
# CHECK-NEXT: 11030: 1f 20 03 d5 nop

.section .R_AARCH64_CALL26,"ax",@progbits
call26:
bl sub

# S = 0x1102c, A = 0x4, P = 0x11034
# R = S + A - P = -0x4 = 0xfffffffc
# (R & 0x0ffffffc) >> 2 = 0x03ffffff
# 0x94000000 | 0x03ffffff = 0x97ffffff
# CHECK: Disassembly of section .R_AARCH64_CALL26:
# CHECK-NEXT: call26:
# CHECK-NEXT: 11034: ff ff ff 97 bl #-4

.section .R_AARCH64_JUMP26,"ax",@progbits
jump26:
b sub

# S = 0x1102c, A = 0x4, P = 0x11038
# R = S + A - P = -0x8 = 0xfffffff8
# (R & 0x0ffffffc) >> 2 = 0x03fffffe
# 0x14000000 | 0x03fffffe = 0x17fffffe
# CHECK: Disassembly of section .R_AARCH64_JUMP26:
# CHECK-NEXT: jump26:
# CHECK-NEXT: 11038: fe ff ff 17 b #-8

0 comments on commit b34115b

Please sign in to comment.