[PATCH] D75044: [AArch64] __builtin_return_address for PAuth.
Momchil Velikov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 21 15:43:56 PDT 2020
chill added a comment.
I'm afraid the patch does not work yet. For example, when the following program
void *f() {
void g();
g();
return __builtin_return_address(0);
}
is compiled with
./bin/clang -target aarch64-eabi -march=armv8.3-a -mbranch-protection=pac-ret -S -O2 h.c
The issue is that the definition of the instructions `XPAC{D,I}` is incorrect: it does not mention at all the operand to those insns.
Another problem is that the patch does not work with `-O0`. When compiling without optimisations, AArch64 backend used GlobalISel.
I have patches for these two issues. I'll post the one for XPAC{D,O} tomorrow and perhaps in a couple of days the GlobalISel one and we're good to go.
================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:6119
+ SDValue Reg =
+ DAG.getCopyToReg(DAG.getEntryNode(), DL, AArch64::X0, ReturnAddress);
+ SDNode *St = DAG.getMachineNode(AArch64::XPACI, DL, VT, Reg);
----------------
We shouldn't be hardcoding the `X0` register here. We already have the encoded return address in `ReturnAddress`
can simply do:
SDNode *St = DAG.getMachineNode(AArch64::XPACI, DL, VT, ReturnAddress);
================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:6124
+ // XPACLRI operates on LR therefore we must move the operand accordingly.
+ SDValue Reg =
+ DAG.getCopyToReg(DAG.getEntryNode(), DL, AArch64::LR, ReturnAddress);
----------------
Rename `Reg` to `Chain`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75044/new/
https://reviews.llvm.org/D75044
More information about the llvm-commits
mailing list