Skip to content

Commit

Permalink
[SystemZ] Implement llvm.get.dynamic.area.offset
Browse files Browse the repository at this point in the history
To be used for AddressSanitizer.

Differential Revision: http://reviews.llvm.org/D19817

llvm-svn: 268572
  • Loading branch information
mwkmwkmwk committed May 4, 2016
1 parent 835d927 commit 9de88d9
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp
Expand Up @@ -554,6 +554,10 @@ bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
expandDisp(AM, true, SDValue(),
cast<ConstantSDNode>(Addr)->getSExtValue()))
;
// Also see if it's a bare ADJDYNALLOC.
else if (Addr.getOpcode() == SystemZISD::ADJDYNALLOC &&
expandAdjDynAlloc(AM, true, SDValue()))
;
else
// Otherwise try expanding each component.
while (expandAddress(AM, true) ||
Expand Down
10 changes: 10 additions & 0 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Expand Up @@ -253,6 +253,7 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
// We need to handle dynamic allocations specially because of the
// 160-byte area at the bottom of the stack.
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
// a frame pointer.
Expand Down Expand Up @@ -2900,6 +2901,13 @@ lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const {
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,
SelectionDAG &DAG) const {
EVT VT = Op.getValueType();
Expand Down Expand Up @@ -4487,6 +4495,8 @@ SDValue SystemZTargetLowering::LowerOperation(SDValue Op,
return lowerVACOPY(Op, DAG);
case ISD::DYNAMIC_STACKALLOC:
return lowerDYNAMIC_STACKALLOC(Op, DAG);
case ISD::GET_DYNAMIC_AREA_OFFSET:
return lowerGET_DYNAMIC_AREA_OFFSET(Op, DAG);
case ISD::SMUL_LOHI:
return lowerSMUL_LOHI(Op, DAG);
case ISD::UMUL_LOHI:
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Target/SystemZ/SystemZISelLowering.h
Expand Up @@ -487,6 +487,7 @@ class SystemZTargetLowering : public TargetLowering {
SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerVACOPY(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 lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
Expand Down
42 changes: 42 additions & 0 deletions llvm/test/CodeGen/SystemZ/dyn-alloca-offset.ll
@@ -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
}

0 comments on commit 9de88d9

Please sign in to comment.