1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

AArch64: Add support for reading pc using llvm.read_register.

This is useful for allowing code to efficiently take an address
that can be later mapped onto debug info. Currently the hwasan
pass achieves this by taking the address of the current function:
http://llvm-cs.pcc.me.uk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp#921

but this costs two instructions (plus a GOT entry in PIC code) per function
with stack variables. This will allow the cost to be reduced to a single
instruction.

Differential Revision: https://reviews.llvm.org/D63471

llvm-svn: 364126
This commit is contained in:
Peter Collingbourne 2019-06-22 03:03:25 +00:00
parent 866eeb52d1
commit a8cf55d334
2 changed files with 19 additions and 0 deletions

View File

@ -2678,6 +2678,14 @@ bool AArch64DAGToDAGISel::tryReadRegister(SDNode *N) {
return true;
}
if (RegString->getString() == "pc") {
ReplaceNode(N, CurDAG->getMachineNode(
AArch64::ADR, DL, N->getSimpleValueType(0), MVT::Other,
CurDAG->getTargetConstant(0, DL, MVT::i32),
N->getOperand(0)));
return true;
}
return false;
}

View File

@ -0,0 +1,11 @@
; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s
define i64 @read_pc() {
; CHECK: adr x0, #0
%pc = call i64 @llvm.read_register.i64(metadata !0)
ret i64 %pc
}
declare i64 @llvm.read_register.i64(metadata) nounwind
!0 = !{!"pc"}