pscoro updated this revision to Diff 449683.
pscoro added a comment.
removed comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129016/new/
https://reviews.llvm.org/D129016
Files:
clang/include/clang/Basic/BuiltinsPPC.def
clang/lib/Basic/Targets/PPC.cpp
clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c
llvm/include/llvm/IR/IntrinsicsPowerPC.td
llvm/lib/Target/PowerPC/PPCISelLowering.cpp
llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll
Index: llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll
@@ -0,0 +1,142 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-aix -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr7 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-AIX
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr7 --ppc-asm-full-reg-names < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-aix -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr7 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-AIX64
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr7 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-LINUX-LE
+
+; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-aix -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr8 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-AIX
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr8 --ppc-asm-full-reg-names < %s | FileCheck %s
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-aix -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr8 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-AIX64
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -ppc-vsr-nums-as-vr \
+; RUN: -mcpu=pwr8 --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=CHECK-LINUX-LE
+
+attributes #1 = { nounwind }
+declare void @llvm.ppc.kill.canary()
+define dso_local void @test_kill_canary() #1 {
+; CHECK-AIX-LABEL: test_kill_canary:
+; CHECK-AIX: # %bb.0: # %entry
+; CHECK-AIX-NEXT: blr
+;
+; CHECK-LABEL: test_kill_canary:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: blr
+;
+; CHECK-AIX64-LABEL: test_kill_canary:
+; CHECK-AIX64: # %bb.0: # %entry
+; CHECK-AIX64-NEXT: blr
+;
+; CHECK-LINUX-LE-LABEL: test_kill_canary:
+; CHECK-LINUX-LE: # %bb.0: # %entry
+; CHECK-LINUX-LE-NEXT: blr
+entry:
+ call void @llvm.ppc.kill.canary()
+ ret void
+}
+
+attributes #0 = { sspreq }
+; Function Attrs: sspreq
+define dso_local void @test_kill_canary_ssp() #0 #1 {
+; CHECK-AIX-LABEL: test_kill_canary_ssp:
+; CHECK-AIX: # %bb.0: # %entry
+; CHECK-AIX-NEXT: mflr r0
+; CHECK-AIX-NEXT: stw r0, 8(r1)
+; CHECK-AIX-NEXT: stwu r1, -64(r1)
+; CHECK-AIX-NEXT: lwz r3, L..C0(r2) # @__ssp_canary_word
+; CHECK-AIX-NEXT: lwz r4, 0(r3)
+; CHECK-AIX-NEXT: stw r4, 60(r1)
+; CHECK-AIX-NEXT: lwz r4, 0(r3)
+; CHECK-AIX-NEXT: not r4, r4
+; CHECK-AIX-NEXT: stw r4, 60(r1)
+; CHECK-AIX-NEXT: lwz r3, 0(r3)
+; CHECK-AIX-NEXT: lwz r4, 60(r1)
+; CHECK-AIX-NEXT: cmplw r3, r4
+; CHECK-AIX-NEXT: bne cr0, L..BB1_2
+; CHECK-AIX-NEXT: # %bb.1: # %entry
+; CHECK-AIX-NEXT: addi r1, r1, 64
+; CHECK-AIX-NEXT: lwz r0, 8(r1)
+; CHECK-AIX-NEXT: mtlr r0
+; CHECK-AIX-NEXT: blr
+; CHECK-AIX-NEXT: L..BB1_2: # %entry
+; CHECK-AIX-NEXT: bl .__stack_chk_fail[PR]
+; CHECK-AIX-NEXT: nop
+;
+; CHECK-LABEL: test_kill_canary_ssp:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: mflr r0
+; CHECK-NEXT: std r0, 16(r1)
+; CHECK-NEXT: stdu r1, -128(r1)
+; CHECK-NEXT: ld r3, -28688(r13)
+; CHECK-NEXT: std r3, 120(r1)
+; CHECK-NEXT: ld r3, -28688(r13)
+; CHECK-NEXT: not r3, r3
+; CHECK-NEXT: std r3, 120(r1)
+; CHECK-NEXT: ld r3, 120(r1)
+; CHECK-NEXT: ld r4, -28688(r13)
+; CHECK-NEXT: cmpld r4, r3
+; CHECK-NEXT: bne cr0, .LBB1_2
+; CHECK-NEXT: # %bb.1: # %entry
+; CHECK-NEXT: addi r1, r1, 128
+; CHECK-NEXT: ld r0, 16(r1)
+; CHECK-NEXT: mtlr r0
+; CHECK-NEXT: blr
+; CHECK-NEXT: .LBB1_2: # %entry
+; CHECK-NEXT: bl __stack_chk_fail
+; CHECK-NEXT: nop
+;
+; CHECK-AIX64-LABEL: test_kill_canary_ssp:
+; CHECK-AIX64: # %bb.0: # %entry
+; CHECK-AIX64-NEXT: mflr r0
+; CHECK-AIX64-NEXT: std r0, 16(r1)
+; CHECK-AIX64-NEXT: stdu r1, -128(r1)
+; CHECK-AIX64-NEXT: ld r3, L..C0(r2) # @__ssp_canary_word
+; CHECK-AIX64-NEXT: ld r4, 0(r3)
+; CHECK-AIX64-NEXT: std r4, 120(r1)
+; CHECK-AIX64-NEXT: ld r4, 0(r3)
+; CHECK-AIX64-NEXT: not r4, r4
+; CHECK-AIX64-NEXT: std r4, 120(r1)
+; CHECK-AIX64-NEXT: ld r3, 0(r3)
+; CHECK-AIX64-NEXT: ld r4, 120(r1)
+; CHECK-AIX64-NEXT: cmpld r3, r4
+; CHECK-AIX64-NEXT: bne cr0, L..BB1_2
+; CHECK-AIX64-NEXT: # %bb.1: # %entry
+; CHECK-AIX64-NEXT: addi r1, r1, 128
+; CHECK-AIX64-NEXT: ld r0, 16(r1)
+; CHECK-AIX64-NEXT: mtlr r0
+; CHECK-AIX64-NEXT: blr
+; CHECK-AIX64-NEXT: L..BB1_2: # %entry
+; CHECK-AIX64-NEXT: bl .__stack_chk_fail[PR]
+; CHECK-AIX64-NEXT: nop
+;
+; CHECK-LINUX-LE-LABEL: test_kill_canary_ssp:
+; CHECK-LINUX-LE: # %bb.0: # %entry
+; CHECK-LINUX-LE-NEXT: mflr r0
+; CHECK-LINUX-LE-NEXT: std r0, 16(r1)
+; CHECK-LINUX-LE-NEXT: stdu r1, -48(r1)
+; CHECK-LINUX-LE-NEXT: ld r3, -28688(r13)
+; CHECK-LINUX-LE-NEXT: std r3, 40(r1)
+; CHECK-LINUX-LE-NEXT: ld r3, -28688(r13)
+; CHECK-LINUX-LE-NEXT: not r3, r3
+; CHECK-LINUX-LE-NEXT: std r3, 40(r1)
+; CHECK-LINUX-LE-NEXT: ld r3, 40(r1)
+; CHECK-LINUX-LE-NEXT: ld r4, -28688(r13)
+; CHECK-LINUX-LE-NEXT: cmpld r4, r3
+; CHECK-LINUX-LE-NEXT: bne cr0, .LBB1_2
+; CHECK-LINUX-LE-NEXT: # %bb.1: # %entry
+; CHECK-LINUX-LE-NEXT: addi r1, r1, 48
+; CHECK-LINUX-LE-NEXT: ld r0, 16(r1)
+; CHECK-LINUX-LE-NEXT: mtlr r0
+; CHECK-LINUX-LE-NEXT: blr
+; CHECK-LINUX-LE-NEXT: .LBB1_2: # %entry
+; CHECK-LINUX-LE-NEXT: bl __stack_chk_fail
+; CHECK-LINUX-LE-NEXT: nop
+entry:
+ call void @llvm.ppc.kill.canary()
+ ret void
+}
Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -10695,6 +10695,62 @@
Op.getOperand(0)),
0);
}
+ case Intrinsic::ppc_kill_canary: {
+ MachineFunction &MF = DAG.getMachineFunction();
+ const Module *M = MF.getMMI().getModule();
+
+ // If SafeStack or !StackProtector, kill_canary is not supported.
+ if (MF.getFunction().hasFnAttribute(Attribute::SafeStack) ||
+ !MF.getFunction().hasStackProtectorFnAttr()) {
+ DAG.ReplaceAllUsesOfValueWith(
+ SDValue(Op.getNode(), 0),
+ Op->getOperand(0));
+ break;
+ }
+
+ EVT VT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout());
+ SDValue Load;
+ SDValue Store;
+ MachineFrameInfo &MFI = MF.getFrameInfo();
+ int SPI = MFI.getStackProtectorIndex();
+ PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
+ SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), VT);
+
+ // Linux uses LOAD_STACK_GUARD node instead of a canary global value.
+ if (useLoadStackGuardNode()) {
+ MachineSDNode *LSG =
+ DAG.getMachineNode(PPC::LOAD_STACK_GUARD, DL, VT, Op->getOperand(0));
+ Load = SDValue(LSG, 0);
+
+ // Frame index used to determine stack guard location if
+ // LOAD_STACK_GUARD is used.
+ Store = DAG.getStore(
+ Op->getOperand(0), DL,
+ DAG.getNode(ISD::XOR, DL, VT, Load, DAG.getAllOnesConstant(DL, VT)),
+ DAG.getNode(ISD::ADD, DL, VT, FIN, DAG.getConstant(SPI, DL, VT)),
+ MachinePointerInfo());
+
+ } else if (Value *GV = getSDagStackGuard(*M)) {
+ // AIX load from global value.
+ VT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(),
+ GV->getType(), true);
+ SDValue CanaryLoc =
+ DAG.getGlobalAddress(dyn_cast<GlobalValue>(GV), DL, VT);
+
+ Load = DAG.getLoad(VT, DL, Op->getOperand(0), CanaryLoc,
+ MachinePointerInfo());
+
+ Store = DAG.getStore(
+ Op->getOperand(0), DL,
+ DAG.getNode(ISD::XOR, DL, VT, Load, DAG.getAllOnesConstant(DL, VT)),
+ DAG.getNode(ISD::ADD, DL, VT, FIN, DAG.getConstant(SPI, DL, VT)),
+ MachinePointerInfo());
+ } else {
+ llvm_unreachable("Unhandled stack guard case");
+ }
+
+ return Store;
+ }
default:
break;
}
Index: llvm/include/llvm/IR/IntrinsicsPowerPC.td
===================================================================
--- llvm/include/llvm/IR/IntrinsicsPowerPC.td
+++ llvm/include/llvm/IR/IntrinsicsPowerPC.td
@@ -194,6 +194,11 @@
: Intrinsic<[llvm_float_ty],
[llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty],
[IntrNoMem]>;
+ def int_ppc_kill_canary
+ : ClangBuiltin<"__builtin_ppc_kill_canary">,
+ Intrinsic<[],
+ [],
+ [IntrWriteMem, IntrHasSideEffects]>;
}
let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.".
Index: clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c
===================================================================
--- /dev/null
+++ clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c
@@ -0,0 +1,23 @@
+// REQUIRES: powerpc-registered-target
+// RUN: %clang_cc1 -triple powerpc64-unknown-linux-gnu \
+// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \
+// RUN: FileCheck %s
+// RUN: %clang_cc1 -triple powerpc64le-unknown-linux-gnu \
+// RUN: -emit-llvm %s -o - -target-cpu pwr8 | \
+// RUN: FileCheck %s
+// RUN: %clang_cc1 -triple powerpc-unknown-aix \
+// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \
+// RUN: FileCheck %s
+// RUN: %clang_cc1 -triple powerpc64-unknown-aix \
+// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \
+// RUN: FileCheck %s
+
+void test_builtin_ppc_kill_canary() {
+ // CHECK: call void @llvm.ppc.kill.canary()
+ __builtin_ppc_kill_canary();
+}
+
+void test_kill_canary() {
+ // CHECK: call void @llvm.ppc.kill.canary()
+ __kill_canary();
+}
Index: clang/lib/Basic/Targets/PPC.cpp
===================================================================
--- clang/lib/Basic/Targets/PPC.cpp
+++ clang/lib/Basic/Targets/PPC.cpp
@@ -122,6 +122,7 @@
Builder.defineMacro("__fetch_and_orlp", "__builtin_ppc_fetch_and_orlp");
Builder.defineMacro("__fetch_and_swap", "__builtin_ppc_fetch_and_swap");
Builder.defineMacro("__fetch_and_swaplp", "__builtin_ppc_fetch_and_swaplp");
+ Builder.defineMacro("__kill_canary", "__builtin_ppc_kill_canary");
Builder.defineMacro("__ldarx", "__builtin_ppc_ldarx");
Builder.defineMacro("__lwarx", "__builtin_ppc_lwarx");
Builder.defineMacro("__lharx", "__builtin_ppc_lharx");
Index: clang/include/clang/Basic/BuiltinsPPC.def
===================================================================
--- clang/include/clang/Basic/BuiltinsPPC.def
+++ clang/include/clang/Basic/BuiltinsPPC.def
@@ -72,6 +72,7 @@
BUILTIN(__builtin_ppc_fetch_and_orlp, "ULiULiD*ULi", "")
BUILTIN(__builtin_ppc_fetch_and_swap, "UiUiD*Ui", "")
BUILTIN(__builtin_ppc_fetch_and_swaplp, "ULiULiD*ULi", "")
+BUILTIN(__builtin_ppc_kill_canary, "v", "")
BUILTIN(__builtin_ppc_ldarx, "LiLiD*", "")
BUILTIN(__builtin_ppc_lwarx, "iiD*", "")
BUILTIN(__builtin_ppc_lharx, "ssD*", "")
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits