mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-06 17:47:37 +00:00
[SystemZ] Implement llvm.get.dynamic.area.offset
To be used for AddressSanitizer. Differential Revision: http://reviews.llvm.org/D19817 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268572 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b4420ea315
commit
c4002d716b
@ -554,6 +554,10 @@ bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
|
|||||||
expandDisp(AM, true, SDValue(),
|
expandDisp(AM, true, SDValue(),
|
||||||
cast<ConstantSDNode>(Addr)->getSExtValue()))
|
cast<ConstantSDNode>(Addr)->getSExtValue()))
|
||||||
;
|
;
|
||||||
|
// Also see if it's a bare ADJDYNALLOC.
|
||||||
|
else if (Addr.getOpcode() == SystemZISD::ADJDYNALLOC &&
|
||||||
|
expandAdjDynAlloc(AM, true, SDValue()))
|
||||||
|
;
|
||||||
else
|
else
|
||||||
// Otherwise try expanding each component.
|
// Otherwise try expanding each component.
|
||||||
while (expandAddress(AM, true) ||
|
while (expandAddress(AM, true) ||
|
||||||
|
@ -253,6 +253,7 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
|
|||||||
// We need to handle dynamic allocations specially because of the
|
// We need to handle dynamic allocations specially because of the
|
||||||
// 160-byte area at the bottom of the stack.
|
// 160-byte area at the bottom of the stack.
|
||||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, PtrVT, Custom);
|
setOperationAction(ISD::DYNAMIC_STACKALLOC, PtrVT, Custom);
|
||||||
|
setOperationAction(ISD::GET_DYNAMIC_AREA_OFFSET, PtrVT, Custom);
|
||||||
|
|
||||||
// Use custom expanders so that we can force the function to use
|
// Use custom expanders so that we can force the function to use
|
||||||
// a frame pointer.
|
// a frame pointer.
|
||||||
@ -2900,6 +2901,13 @@ lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
return DAG.getMergeValues(Ops, DL);
|
return DAG.getMergeValues(Ops, DL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDValue SystemZTargetLowering::lowerGET_DYNAMIC_AREA_OFFSET(
|
||||||
|
SDValue Op, SelectionDAG &DAG) const {
|
||||||
|
SDLoc DL(Op);
|
||||||
|
|
||||||
|
return DAG.getNode(SystemZISD::ADJDYNALLOC, DL, MVT::i64);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue SystemZTargetLowering::lowerSMUL_LOHI(SDValue Op,
|
SDValue SystemZTargetLowering::lowerSMUL_LOHI(SDValue Op,
|
||||||
SelectionDAG &DAG) const {
|
SelectionDAG &DAG) const {
|
||||||
EVT VT = Op.getValueType();
|
EVT VT = Op.getValueType();
|
||||||
@ -4487,6 +4495,8 @@ SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
|
|||||||
return lowerVACOPY(Op, DAG);
|
return lowerVACOPY(Op, DAG);
|
||||||
case ISD::DYNAMIC_STACKALLOC:
|
case ISD::DYNAMIC_STACKALLOC:
|
||||||
return lowerDYNAMIC_STACKALLOC(Op, DAG);
|
return lowerDYNAMIC_STACKALLOC(Op, DAG);
|
||||||
|
case ISD::GET_DYNAMIC_AREA_OFFSET:
|
||||||
|
return lowerGET_DYNAMIC_AREA_OFFSET(Op, DAG);
|
||||||
case ISD::SMUL_LOHI:
|
case ISD::SMUL_LOHI:
|
||||||
return lowerSMUL_LOHI(Op, DAG);
|
return lowerSMUL_LOHI(Op, DAG);
|
||||||
case ISD::UMUL_LOHI:
|
case ISD::UMUL_LOHI:
|
||||||
|
@ -487,6 +487,7 @@ private:
|
|||||||
SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
42
test/CodeGen/SystemZ/dyn-alloca-offset.ll
Normal file
42
test/CodeGen/SystemZ/dyn-alloca-offset.ll
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
|
||||||
|
|
||||||
|
declare i64 @llvm.get.dynamic.area.offset.i64()
|
||||||
|
|
||||||
|
declare void @use(i64)
|
||||||
|
|
||||||
|
define void @f1() {
|
||||||
|
; CHECK-LABEL: f1
|
||||||
|
; CHECK: la %r2, 160
|
||||||
|
; CHECK: brasl %r14, use
|
||||||
|
; CHECK: br %r14
|
||||||
|
%tmp = alloca i64, align 32
|
||||||
|
%dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
|
||||||
|
call void @use(i64 %dynamic_area_offset)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define void @f2(i64 %arg) {
|
||||||
|
; CHECK-LABEL: f2
|
||||||
|
; CHECK: la %r2, 160(%r2)
|
||||||
|
; CHECK: brasl %r14, use
|
||||||
|
; CHECK: br %r14
|
||||||
|
%tmp = alloca i64, align 32
|
||||||
|
%dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
|
||||||
|
%param = add i64 %dynamic_area_offset, %arg
|
||||||
|
call void @use(i64 %param)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @eatsalot(i64, i64, i64, i64, i64, i64)
|
||||||
|
|
||||||
|
define void @f3() {
|
||||||
|
; CHECK-LABEL: f3
|
||||||
|
; CHECK: la %r2, 168
|
||||||
|
; CHECK: brasl %r14, use
|
||||||
|
; CHECK: br %r14
|
||||||
|
%tmp = alloca i64, align 32
|
||||||
|
call void @eatsalot(i64 0, i64 0, i64 0, i64 0, i64 0, i64 0)
|
||||||
|
%dynamic_area_offset = call i64 @llvm.get.dynamic.area.offset.i64()
|
||||||
|
call void @use(i64 %dynamic_area_offset)
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user