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:
parent
866eeb52d1
commit
a8cf55d334
@ -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;
|
||||
}
|
||||
|
||||
|
11
test/CodeGen/AArch64/read-pc.ll
Normal file
11
test/CodeGen/AArch64/read-pc.ll
Normal 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"}
|
Loading…
Reference in New Issue
Block a user