Skip to content

Commit 7605a9a

Browse files
committed
[ELF] Support aarch64_be
This patch adds * Big-endian values for `R_AARCH64_{ABS,PREL}{16,32,64}` and `R_AARCH64_PLT32` * aarch64elfb & aarch64linuxb BFD emulations * elf64-bigaarch64 output format (bfdname) Link: ClangBuiltLinux/linux#1288 Differential Revision: https://reviews.llvm.org/D96188
1 parent 157ac42 commit 7605a9a

13 files changed

+100
-7
lines changed

lld/ELF/Arch/AArch64.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ RelType AArch64::getDynRel(RelType type) const {
195195
}
196196

197197
void AArch64::writeGotPlt(uint8_t *buf, const Symbol &) const {
198-
write64le(buf, in.plt->getVA());
198+
write64(buf, in.plt->getVA());
199199
}
200200

201201
void AArch64::writePltHeader(uint8_t *buf) const {
@@ -323,20 +323,20 @@ void AArch64::relocate(uint8_t *loc, const Relocation &rel,
323323
case R_AARCH64_ABS16:
324324
case R_AARCH64_PREL16:
325325
checkIntUInt(loc, val, 16, rel);
326-
write16le(loc, val);
326+
write16(loc, val);
327327
break;
328328
case R_AARCH64_ABS32:
329329
case R_AARCH64_PREL32:
330330
checkIntUInt(loc, val, 32, rel);
331-
write32le(loc, val);
331+
write32(loc, val);
332332
break;
333333
case R_AARCH64_PLT32:
334334
checkInt(loc, val, 32, rel);
335-
write32le(loc, val);
335+
write32(loc, val);
336336
break;
337337
case R_AARCH64_ABS64:
338338
case R_AARCH64_PREL64:
339-
write64le(loc, val);
339+
write64(loc, val);
340340
break;
341341
case R_AARCH64_ADD_ABS_LO12_NC:
342342
or32AArch64Imm(loc, val);

lld/ELF/Driver.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ static std::tuple<ELFKind, uint16_t, uint8_t> parseEmulation(StringRef emul) {
146146
StringSwitch<std::pair<ELFKind, uint16_t>>(s)
147147
.Cases("aarch64elf", "aarch64linux", "aarch64_elf64_le_vec",
148148
{ELF64LEKind, EM_AARCH64})
149+
.Cases("aarch64elfb", "aarch64linuxb", {ELF64BEKind, EM_AARCH64})
149150
.Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM})
150151
.Case("elf32_x86_64", {ELF32LEKind, EM_X86_64})
151152
.Cases("elf32btsmip", "elf32btsmipn32", {ELF32BEKind, EM_MIPS})

lld/ELF/InputFiles.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1608,6 +1608,7 @@ static ELFKind getBitcodeELFKind(const Triple &t) {
16081608
static uint16_t getBitcodeMachineKind(StringRef path, const Triple &t) {
16091609
switch (t.getArch()) {
16101610
case Triple::aarch64:
1611+
case Triple::aarch64_be:
16111612
return EM_AARCH64;
16121613
case Triple::amdgcn:
16131614
case Triple::r600:

lld/ELF/ScriptParser.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ static std::pair<ELFKind, uint16_t> parseBfdName(StringRef s) {
412412
.Case("elf32-x86-64", {ELF32LEKind, EM_X86_64})
413413
.Case("elf64-aarch64", {ELF64LEKind, EM_AARCH64})
414414
.Case("elf64-littleaarch64", {ELF64LEKind, EM_AARCH64})
415+
.Case("elf64-bigaarch64", {ELF64BEKind, EM_AARCH64})
415416
.Case("elf32-powerpc", {ELF32BEKind, EM_PPC})
416417
.Case("elf32-powerpcle", {ELF32LEKind, EM_PPC})
417418
.Case("elf64-powerpc", {ELF64BEKind, EM_PPC64})

lld/test/ELF/aarch64-abs16.s

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o
44
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o
55
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o
6+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
68

79
.globl _start
810
_start:
@@ -12,13 +14,16 @@ _start:
1214

1315
// RUN: ld.lld %t.o %t256.o -o %t
1416
// RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE
17+
// RUN: ld.lld %t.be.o %t256.be.o -o %t.be
18+
// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE
1519

1620
// CHECK: Contents of section .data:
1721
// 220158: S = 0x100, A = 0xfeff
1822
// S + A = 0xffff
1923
// 22015c: S = 0x100, A = -0x8100
2024
// S + A = 0x8000
2125
// LE-NEXT: 220158 ffff0080
26+
// BE-NEXT: 220158 ffff8000
2227

2328
// RUN: not ld.lld %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1
2429
// OVERFLOW1: relocation R_AARCH64_ABS16 out of range: -32769 is not in [-32768, 65535]; references foo

lld/test/ELF/aarch64-abs32.s

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o
44
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o
55
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o
6+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
68

79
.globl _start
810
_start:
@@ -12,13 +14,16 @@ _start:
1214

1315
// RUN: ld.lld %t.o %t256.o -o %t
1416
// RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE
17+
// RUN: ld.lld %t.be.o %t256.be.o -o %t.be
18+
// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE
1519

1620
// CHECK: Contents of section .data:
1721
// 220158: S = 0x100, A = 0xfffffeff
1822
// S + A = 0xffffffff
1923
// 22015c: S = 0x100, A = -0x80000100
2024
// S + A = 0x80000000
2125
// LE-NEXT: 220158 ffffffff 00000080
26+
// BE-NEXT: 220158 ffffffff 80000000
2227

2328
// RUN: not ld.lld %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1
2429
// OVERFLOW1: relocation R_AARCH64_ABS32 out of range: -2147483649 is not in [-2147483648, 4294967295]; references foo

lld/test/ELF/aarch64-data-relocs.s

+7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
// RUN: ld.lld %t.o %t256.o -o %t
55
// RUN: llvm-objdump -s %t | FileCheck %s --check-prefixes=CHECK,LE
66

7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
8+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
9+
// RUN: ld.lld %t.be.o %t256.be.o -o %t.be
10+
// RUN: llvm-objdump -s %t.be | FileCheck %s --check-prefixes=CHECK,BE
11+
712
.globl _start
813
_start:
914
.section .R_AARCH64_ABS64, "ax",@progbits
@@ -13,10 +18,12 @@ _start:
1318
// S + A = 0x124
1419
// CHECK: Contents of section .R_AARCH64_ABS64:
1520
// LE-NEXT: 210120 24010000 00000000
21+
// BE-NEXT: 210120 00000000 00000124
1622

1723
.section .R_AARCH64_PREL64, "ax",@progbits
1824
.xword foo - . + 0x24
1925

2026
// S + A - P = 0x100 + 0x24 - 0x210128 = 0xffffffffffdefffc
2127
// CHECK: Contents of section .R_AARCH64_PREL64:
2228
// LE-NEXT: 210128 fcffdeff ffffffff
29+
// BE-NEXT: 210128 ffffffff ffdefffc

lld/test/ELF/aarch64-gnu-ifunc-plt.s

+14
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
// RUN: llvm-objdump -s %tout | FileCheck %s --check-prefix=GOTPLT
88
// RUN: llvm-readobj --dynamic-table -r %tout | FileCheck %s
99

10+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/shared2.s -o %t1.be.o
11+
// RUN: ld.lld %t1.be.o --shared --soname=t.so -o %t.be.so
12+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
13+
// RUN: ld.lld --hash-style=sysv %t.be.so %t.be.o -o %t.be
14+
// RUN: llvm-objdump -d --no-show-raw-insn %t.be | FileCheck %s --check-prefix=DISASM
15+
// RUN: llvm-objdump -s %t.be | FileCheck %s --check-prefix=GOTPLT_BE
16+
// RUN: llvm-readobj --dynamic-table -r %t.be | FileCheck %s
17+
1018
// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
1119
// CHECK: DynamicSection [
1220
// CHECK: 0x0000000000000008 RELASZ 48 (bytes)
@@ -31,6 +39,12 @@
3139
// GOTPLT-NEXT: 230460 f0022100 00000000 00000000 00000000
3240
// GOTPLT-NEXT: 230470 00000000 00000000
3341

42+
// GOTPLT_BE: Contents of section .got.plt:
43+
// GOTPLT_BE-NEXT: 230440 00000000 00000000 00000000 00000000
44+
// GOTPLT_BE-NEXT: 230450 00000000 00000000 00000000 002102f0
45+
// GOTPLT_BE-NEXT: 230460 00000000 002102f0 00000000 00000000
46+
// GOTPLT_BE-NEXT: 230470 00000000 00000000
47+
3448
// Check that a PLT header is written and the ifunc entries appear last
3549
// DISASM: Disassembly of section .text:
3650
// DISASM-EMPTY:

lld/test/ELF/aarch64-prel16.s

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o
44
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o
55
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o
6+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
68

79
.globl _start
810
_start:
@@ -16,6 +18,8 @@ _start:
1618
// if it is already fixed. Then, update addends accordingly.
1719
// RUN: ld.lld -z max-page-size=4096 %t.o %t256.o -o %t
1820
// RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE
21+
// RUN: ld.lld -z max-page-size=4096 %t.be.o %t256.be.o -o %t.be
22+
// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE
1923

2024
// CHECK: Contents of section .data:
2125
// 202158: S = 0x100, A = 0x212157, P = 0x202158

lld/test/ELF/aarch64-prel32.s

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o
44
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o
55
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o
6+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
68

79
.globl _start
810
_start:
@@ -16,13 +18,16 @@ _start:
1618
// if it is already fixed. Then, update addends accordingly.
1719
// RUN: ld.lld -z max-page-size=4096 %t.o %t256.o -o %t
1820
// RUN: llvm-objdump -s --section=.data %t | FileCheck %s --check-prefixes=CHECK,LE
21+
// RUN: ld.lld -z max-page-size=4096 %t.be.o %t256.be.o -o %t.be
22+
// RUN: llvm-objdump -s --section=.data %t.be | FileCheck %s --check-prefixes=CHECK,BE
1923

2024
// CHECK: Contents of section .data:
2125
// 202158: S = 0x100, A = 0x100202057, P = 0x202158
2226
// S + A - P = 0xffffffff
2327
// 20215c: S = 0x100, A = -0x7fdfdfa4, P = 0x20215c
2428
// S + A - P = 0x80000000
2529
// LE-NEXT: 202158 ffffffff 00000080
30+
// BE-NEXT: 202158 ffffffff 80000000
2631

2732
// RUN: not ld.lld -z max-page-size=4096 %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1
2833
// OVERFLOW1: relocation R_AARCH64_PREL32 out of range: -2147483649 is not in [-2147483648, 4294967295]; references foo

lld/test/ELF/aarch64-reloc-plt32.s

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs255.s -o %t255.o
44
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs256.s -o %t256.o
55
// RUN: llvm-mc -filetype=obj -triple=aarch64 %S/Inputs/abs257.s -o %t257.o
6+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
7+
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/abs256.s -o %t256.be.o
68

79
/// Check for overflow with a R_AACH64_PLT32 relocation.
810

911
// RUN: ld.lld -z max-page-size=4096 %t.o %t256.o -o %t2
10-
// RUN: llvm-objdump -s --section=.data %t2 | FileCheck %s
12+
// RUN: llvm-objdump -s --section=.data %t2 | FileCheck %s --check-prefixes=CHECK,LE
13+
// RUN: ld.lld -z max-page-size=4096 %t.be.o %t256.be.o -o %t2.be
14+
// RUN: llvm-objdump -s --section=.data %t2.be | FileCheck %s --check-prefixes=CHECK,BE
1115

1216
// CHECK: Contents of section .data:
1317
/// 202158: S = 0x100, A = 0x80202057, P = 0x202158
@@ -16,7 +20,8 @@
1620
/// S + A - P = 0x80000000
1721
/// 202160: S = 0x100, A = 0, P = 0x202160
1822
/// S + A - P = 0xffdfdfa0
19-
// CHECK-NEXT: 202158 ffffff7f 00000080 a0dfdfff
23+
// LE-NEXT: 202158 ffffff7f 00000080 a0dfdfff
24+
// BE-NEXT: 202158 7fffffff 80000000 ffdfdfa0
2025

2126
// RUN: not ld.lld -z max-page-size=4096 %t.o %t255.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=OVERFLOW1
2227
// OVERFLOW1: relocation R_AARCH64_PLT32 out of range: -2147483649 is not in [-2147483648, 2147483647]; references foo

lld/test/ELF/emulation-aarch64.s

+12
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,23 @@
1212
# RUN: ld.lld -m aarch64_elf64_le_vec %t.o -o %taosp
1313
# RUN: llvm-readobj --file-headers %taosp | FileCheck --check-prefixes=AARCH64,LE %s
1414

15+
# RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
16+
# RUN: ld.lld %t.be.o -o %t
17+
# RUN: llvm-readobj --file-headers %t | FileCheck --check-prefixes=AARCH64,BE %s
18+
# RUN: ld.lld -m aarch64linuxb %t.be.o -o %t1.be
19+
# RUN: llvm-readobj --file-headers %t1.be | FileCheck --check-prefixes=AARCH64,BE %s
20+
# RUN: ld.lld -m aarch64elfb %t.be.o -o %t2.be
21+
# RUN: llvm-readobj --file-headers %t2.be | FileCheck --check-prefixes=AARCH64,BE %s
22+
# RUN: echo 'OUTPUT_FORMAT(elf64-bigaarch64)' > %t.script
23+
# RUN: ld.lld %t.script %t.be.o -o %t3.be
24+
# RUN: llvm-readobj --file-headers %t3.be | FileCheck --check-prefixes=AARCH64,BE %s
25+
1526
# AARCH64: ElfHeader {
1627
# AARCH64-NEXT: Ident {
1728
# AARCH64-NEXT: Magic: (7F 45 4C 46)
1829
# AARCH64-NEXT: Class: 64-bit (0x2)
1930
# LE-NEXT: DataEncoding: LittleEndian (0x1)
31+
# BE-NEXT: DataEncoding: BigEndian (0x2)
2032
# AARCH64-NEXT: FileVersion: 1
2133
# AARCH64-NEXT: OS/ABI: SystemV (0x0)
2234
# AARCH64-NEXT: ABIVersion: 0

lld/test/ELF/lto/aarch64.ll

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
; REQUIRES: aarch64
2+
;; Test we can infer the e_machine value EM_AARCH64 from a bitcode file.
3+
4+
; RUN: split-file %s %t
5+
; RUN: llvm-as %t/le.s -o %t/le.o
6+
; RUN: ld.lld %t/le.o -o %t/le
7+
; RUN: llvm-readobj -h %t/le | FileCheck %s --check-prefixes=CHECK,LE
8+
9+
; RUN: llvm-as %t/be.s -o %t/be.o
10+
; RUN: ld.lld %t/be.o -o %t/be
11+
; RUN: llvm-readobj -h %t/be | FileCheck %s --check-prefixes=CHECK,BE
12+
13+
; LE: DataEncoding: LittleEndian
14+
; BE: DataEncoding: BigEndian
15+
; CHECK: Machine: EM_AARCH64
16+
17+
;--- le.s
18+
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
19+
target triple = "aarch64-unknown-linux-gnu"
20+
21+
define void @_start() {
22+
entry:
23+
ret void
24+
}
25+
26+
;--- be.s
27+
target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
28+
target triple = "aarch64_be-unknown-linux-gnu"
29+
30+
define void @_start() {
31+
entry:
32+
ret void
33+
}

0 commit comments

Comments
 (0)