Skip to content

Commit d9ad530

Browse files
committed
[PAC][lld] Use braa instr in PAC PLT sequence with valid PAuth core info
Assume PAC instructions being supported with PAuth core info different from (0,0). Given that, `autia1716; br x17` can be replaced with `braa x17, x16; nop`.
1 parent ac30a0f commit d9ad530

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

lld/ELF/Arch/AArch64.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,9 @@ class AArch64BtiPac final : public AArch64 {
999999

10001000
private:
10011001
bool btiHeader; // bti instruction needed in PLT Header and Entry
1002-
bool pacEntry; // autia1716 instruction needed in PLT Entry
1002+
bool pacEntry; // Authenticated branch needed in PLT Entry
1003+
bool pacUseHint =
1004+
true; // Use hint space instructions for authenticated branch in PLT entry
10031005
};
10041006
} // namespace
10051007

@@ -1016,6 +1018,10 @@ AArch64BtiPac::AArch64BtiPac(Ctx &ctx) : AArch64(ctx) {
10161018
// from properties in the objects, so we use the command line flag.
10171019
pacEntry = ctx.arg.zPacPlt;
10181020

1021+
if (llvm::any_of(ctx.aarch64PauthAbiCoreInfo,
1022+
[](uint8_t c) { return c != 0; }))
1023+
pacUseHint = false;
1024+
10191025
if (btiHeader || pacEntry) {
10201026
pltEntrySize = 24;
10211027
ipltEntrySize = 24;
@@ -1066,9 +1072,13 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym,
10661072
0x11, 0x02, 0x40, 0xf9, // ldr x17, [x16, Offset(&(.got.plt[n]))]
10671073
0x10, 0x02, 0x00, 0x91 // add x16, x16, Offset(&(.got.plt[n]))
10681074
};
1075+
const uint8_t pacHintBr[] = {
1076+
0x9f, 0x21, 0x03, 0xd5, // autia1716
1077+
0x20, 0x02, 0x1f, 0xd6 // br x17
1078+
};
10691079
const uint8_t pacBr[] = {
1070-
0x9f, 0x21, 0x03, 0xd5, // autia1716
1071-
0x20, 0x02, 0x1f, 0xd6 // br x17
1080+
0x30, 0x0a, 0x1f, 0xd7, // braa x17, x16
1081+
0x1f, 0x20, 0x03, 0xd5 // nop
10721082
};
10731083
const uint8_t stdBr[] = {
10741084
0x20, 0x02, 0x1f, 0xd6, // br x17
@@ -1097,7 +1107,8 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym,
10971107
relocateNoSym(buf + 8, R_AARCH64_ADD_ABS_LO12_NC, gotPltEntryAddr);
10981108

10991109
if (pacEntry)
1100-
memcpy(buf + sizeof(addrInst), pacBr, sizeof(pacBr));
1110+
memcpy(buf + sizeof(addrInst), (pacUseHint ? pacHintBr : pacBr),
1111+
sizeof(pacUseHint ? pacHintBr : pacBr));
11011112
else
11021113
memcpy(buf + sizeof(addrInst), stdBr, sizeof(stdBr));
11031114
if (!hasBti)

lld/test/ELF/aarch64-feature-pauth.s

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656

5757
# PACPLTTAG: 0x0000000070000003 (AARCH64_PAC_PLT)
5858

59-
# RUN: llvm-objdump -d pacplt-nowarn | FileCheck --check-prefix PACPLT -DA=10380 -DB=478 -DC=480 %s
60-
# RUN: llvm-objdump -d pacplt-warn | FileCheck --check-prefix PACPLT -DA=10390 -DB=488 -DC=490 %s
59+
# RUN: llvm-objdump -d pacplt-nowarn | FileCheck --check-prefixes=PACPLT,NOHINT -DA=10380 -DB=478 -DC=480 %s
60+
# RUN: llvm-objdump -d pacplt-warn | FileCheck --check-prefixes=PACPLT,HINT -DA=10390 -DB=488 -DC=490 %s
6161

6262
# PACPLT: Disassembly of section .text:
6363
# PACPLT: <func2>:
@@ -77,8 +77,10 @@
7777
# PACPLT-NEXT: adrp x16, 0x30000 <func3+0x30000>
7878
# PACPLT-NEXT: ldr x17, [x16, #0x[[C]]]
7979
# PACPLT-NEXT: add x16, x16, #0x[[C]]
80-
# PACPLT-NEXT: autia1716
81-
# PACPLT-NEXT: br x17
80+
# NOHINT-NEXT: braa x17, x16
81+
# NOHINT-NEXT: nop
82+
# HINT-NEXT: autia1716
83+
# HINT-NEXT: br x17
8284
# PACPLT-NEXT: nop
8385

8486
#--- abi-tag-short.s

0 commit comments

Comments
 (0)