[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro updated this revision to Diff 442677. pscoro added a comment. patch fix Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 Files: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Basic/Targets/PPC.cpp clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c llvm/include/llvm/Debuginfod/Debuginfod.h 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,77 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-aix \ +; RUN: --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=AIX +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux \ +; RUN: --ppc-asm-full-reg-names < %s | FileCheck %s -check-prefix=LINUX + +declare void @llvm.ppc.kill.canary() +define dso_local void @test_kill_canary() { +; AIX-LABEL: test_kill_canary: +; AIX: # %bb.0: # %entry +; AIX-NEXT:blr +; +; LINUX-LABEL: test_kill_canary: +; LINUX: # %bb.0: # %entry +; LINUX-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 { +; AIX-LABEL: test_kill_canary_ssp: +; AIX: # %bb.0: # %entry +; AIX-NEXT:mflr r0 +; AIX-NEXT:std r0, 16(r1) +; AIX-NEXT:stdu r1, -128(r1) +; AIX-NEXT:ld r3, L..C0(r2) # @__ssp_canary_word +; AIX-NEXT:ld r4, 0(r3) +; AIX-NEXT:std r4, 120(r1) +; AIX-NEXT:ld r4, 0(r3) +; AIX-NEXT:xori r4, r4, 65535 +; AIX-NEXT:xoris r4, r4, 65535 +; AIX-NEXT:std r4, 0(r3) +; AIX-NEXT:ld r3, 0(r3) +; AIX-NEXT:ld r4, 120(r1) +; AIX-NEXT:cmpld r3, r4 +; AIX-NEXT:bne cr0, L..BB1_2 +; AIX-NEXT: # %bb.1: # %entry +; AIX-NEXT:addi r1, r1, 128 +; AIX-NEXT:ld r0, 16(r1) +; AIX-NEXT:mtlr r0 +; AIX-NEXT:blr +; AIX-NEXT: L..BB1_2: # %entry +; AIX-NEXT:bl .__stack_chk_fail[PR] +; AIX-NEXT:nop +; +; LINUX-LABEL: test_kill_canary_ssp: +; LINUX: # %bb.0: # %entry +; LINUX-NEXT:mflr r0 +; LINUX-NEXT:std r0, 16(r1) +; LINUX-NEXT:stdu r1, -128(r1) +; LINUX-NEXT:.cfi_def_cfa_offset 128 +; LINUX-NEXT:.cfi_offset lr, 16 +; LINUX-NEXT:ld r3, -28688(r13) +; LINUX-NEXT:std r3, 120(r1) +; LINUX-NEXT:ld r3, -28688(r13) +; LINUX-NEXT:xori r3, r3, 65535 +; LINUX-NEXT:xoris r3, r3, 65535 +; LINUX-NEXT:std r3, 120(r1) +; LINUX-NEXT:ld r3, 120(r1) +; LINUX-NEXT:ld r4, -28688(r13) +; LINUX-NEXT:cmpld r4, r3 +; LINUX-NEXT:bne cr0, .LBB1_2 +; LINUX-NEXT: # %bb.1: # %entry +; LINUX-NEXT:addi r1, r1, 128 +; LINUX-NEXT:ld r0, 16(r1) +; LINUX-NEXT:mtlr r0 +; LINUX-NEXT:blr +; LINUX-NEXT: .LBB1_2: # %entry +; LINUX-NEXT:bl __stack_chk_fail +; LINUX-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,72 @@ 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 not supported */ +if (MF.getFunction().hasFnAttribute(Attribute::SafeStack) || +!MF.getFunction().hasStackProtectorFnAttr()) { + DAG.ReplaceAllUsesOfValueWith( + SDValue(Op.getNode(), 0), + Op->getOperand(0)); // prepare node for deletion + break; +} + +EVT VT = DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout()); + +SDValue Load; +SDValue Store; + +const uint64_t XORWord = +0x; // XORing with 0b111...111 will never +// result in the original word + +if (useLoadStackGuardNode()) { // linux uses LOAD_STACK_GUARD node instead + // of having a canary word global value + 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 */ + MachineFrameInfo &MFI = MF.getFrameInfo(); + int SPI = MFI.getStackProtectorIndex(); // should return -1 + PPCFunctionInfo *FuncInfo = MF.getInfo(); + SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), VT); + + // XOR canary word and store back + Store = DA
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro abandoned this revision. pscoro added inline comments. Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11136 +MachineFrameInfo &MFI = MF.getFrameInfo(); +int SPI = MFI.getStackProtectorIndex(); // should return -1 + shchenz wrote: > Why should return -1? The source code for getStackProtectorIndex just returns StackProtectorIndex which is initialized to -1, it makes sense as the stack protector byte should be right before the stack frame begins Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11144 + +unsigned int deadBird = 0x4C6C566D; // replaces canary word + shchenz wrote: > nit: the first letter should be upper for `deadBird` according to LLVM coding > style. > > And how can we make sure `0x4C6C566D` is not the same with the canary word > load with `TargetOpcode::LOAD_STACK_GUARD`? What would you suggest for this? I'm not sure exactly how the canary word is created, is it worth loading the canary word first, manipulating it to make sure that we store something different? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
shchenz added inline comments. Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11136 +MachineFrameInfo &MFI = MF.getFrameInfo(); +int SPI = MFI.getStackProtectorIndex(); // should return -1 + Why should return -1? Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11144 + +unsigned int deadBird = 0x4C6C566D; // replaces canary word + nit: the first letter should be upper for `deadBird` according to LLVM coding style. And how can we make sure `0x4C6C566D` is not the same with the canary word load with `TargetOpcode::LOAD_STACK_GUARD`? Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11146 + +SDValue Store = DAG.getStore( // create store instr, stores (deadBird + 0) into addr (frame index + stack protector) +Op->getOperand(0), Need to run clang-format for the new codes. Comment at: llvm/lib/Target/PowerPC/PPCISelLowering.cpp:11160 +return Store; +break; + } nit: no need for the break after a return Comment at: llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll:3 +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | \ +; RUN: FileCheck %s + We may also need to add test cases for AIX 32/64 bit too as stack protector is also supported on AIX. Comment at: llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll:13 +; CHECK-NEXT:stw 3, -17(1) +; CHECK-NEXT:blr +entry: This seems wrong. When there is no stack protector related instructions in the function, we should not generate the killed store to the stack slot for canary word. The store instruction now will store a word to the caller unexpectedly. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro added a comment. @shchenz I have added the test cases. This intrinsic is defined in order to test the stackprotect functionality on xlf. Use the -qdebug=smashstack flag to use it, make sure that -qstackprotect=all is also set Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro updated this revision to Diff 438988. pscoro added a comment. [PowerPC] Removed commented change Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 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,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | \ +; RUN: FileCheck %s + + +declare void @llvm.ppc.kill.canary() +define dso_local void @test_kill_canary() { +; CHECK-LABEL: test_kill_canary: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:lis 3, 19564 +; CHECK-NEXT:ori 3, 3, 22125 +; CHECK-NEXT:stw 3, -17(1) +; CHECK-NEXT:blr +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 @@ -11127,6 +11127,38 @@ } break; } + case Intrinsic::ppc_kill_canary: { +MachineFunction &MF = DAG.getMachineFunction(); +if (MF.getFunction().hasFnAttribute(Attribute::SafeStack)) { + break; +} +MachineFrameInfo &MFI = MF.getFrameInfo(); +int SPI = MFI.getStackProtectorIndex(); // should return -1 + +PPCFunctionInfo *FuncInfo = MF.getInfo(); +EVT PtrVT = getPointerTy(MF.getDataLayout()); + +MFI.CreateStackObject(16, Align(16), false); +SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT); // frame index + +unsigned int deadBird = 0x4C6C566D; // replaces canary word + +SDValue Store = DAG.getStore( // create store instr, stores (deadBird + 0) into addr (frame index + stack protector) +Op->getOperand(0), +DL, + DAG.getConstant(deadBird, DL, MVT::i32), +DAG.getNode( // add frame index, stack protector index, return node result +ISD::ADD, +DL, +PtrVT, +FIN, +DAG.getConstant(SPI, DL, PtrVT) +), +MachinePointerInfo() +); +return Store; +break; + } default: break; } Index: llvm/include/llvm/IR/IntrinsicsPowerPC.td === --- llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -217,6 +217,11 @@ : Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty], [IntrNoMem]>; + def int_ppc_kill_canary + : GCCBuiltin<"__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 -O2 -triple powerpc64-unknown-linux-gnu \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -triple powerpc64le-unknown-linux-gnu \ +// RUN: -emit-llvm %s -o - -target-cpu pwr8 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -triple powerpc-unknown-aix \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -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("__lwar
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro updated this revision to Diff 438987. pscoro added a comment. [PowerPC] Removed accidental patch files Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 Files: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Basic/Targets/PPC.cpp clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c clang/test/CodeGen/PowerPC/builtins-ppc.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,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | \ +; RUN: FileCheck %s + + +declare void @llvm.ppc.kill.canary() +define dso_local void @test_kill_canary() { +; CHECK-LABEL: test_kill_canary: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:lis 3, 19564 +; CHECK-NEXT:ori 3, 3, 22125 +; CHECK-NEXT:stw 3, -17(1) +; CHECK-NEXT:blr +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 @@ -11127,6 +11127,38 @@ } break; } + case Intrinsic::ppc_kill_canary: { +MachineFunction &MF = DAG.getMachineFunction(); +if (MF.getFunction().hasFnAttribute(Attribute::SafeStack)) { + break; +} +MachineFrameInfo &MFI = MF.getFrameInfo(); +int SPI = MFI.getStackProtectorIndex(); // should return -1 + +PPCFunctionInfo *FuncInfo = MF.getInfo(); +EVT PtrVT = getPointerTy(MF.getDataLayout()); + +MFI.CreateStackObject(16, Align(16), false); +SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT); // frame index + +unsigned int deadBird = 0x4C6C566D; // replaces canary word + +SDValue Store = DAG.getStore( // create store instr, stores (deadBird + 0) into addr (frame index + stack protector) +Op->getOperand(0), +DL, + DAG.getConstant(deadBird, DL, MVT::i32), +DAG.getNode( // add frame index, stack protector index, return node result +ISD::ADD, +DL, +PtrVT, +FIN, +DAG.getConstant(SPI, DL, PtrVT) +), +MachinePointerInfo() +); +return Store; +break; + } default: break; } Index: llvm/include/llvm/IR/IntrinsicsPowerPC.td === --- llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -217,6 +217,11 @@ : Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty], [IntrNoMem]>; + def int_ppc_kill_canary + : GCCBuiltin<"__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.c === --- clang/test/CodeGen/PowerPC/builtins-ppc.c +++ clang/test/CodeGen/PowerPC/builtins-ppc.c @@ -74,3 +74,13 @@ // CHECK: call float (float, float, float, ...) @llvm.ppc.minfs(float %5, float %6, float %7, float %8) res = __builtin_ppc_minfs(a, b, c, d); } +/* +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/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 -O2 -triple powerpc64-unknown-linux-gnu \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -triple powerpc64le-unknown-linux-gnu \ +// RUN: -emit-llvm %s -o - -target-cpu pwr8 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -triple powerpc-unknown-aix \ +// RUN: -emit-llvm %s -o - -target-cpu pwr7 | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -O2 -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() { +
[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic
pscoro updated this revision to Diff 438985. pscoro added a comment. Herald added a project: clang. Herald added a subscriber: cfe-commits. [PowerPC] implemented kill_canary intrinsic and tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125916/new/ https://reviews.llvm.org/D125916 Files: clang/include/clang/Basic/BuiltinsPPC.def clang/lib/Basic/Targets/PPC.cpp clang/test/CodeGen/PowerPC/builtins-ppc-stackprotect.c clang/test/CodeGen/PowerPC/builtins-ppc.c final.patch llvm/include/llvm/IR/IntrinsicsPowerPC.td llvm/lib/Target/PowerPC/PPCISelLowering.cpp llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll mypatch.patch Index: mypatch.patch === --- /dev/null +++ mypatch.patch @@ -0,0 +1,14 @@ +commit f11c8790cad5554c4dad7a14c0d177bacd99eb22 +Author: Paul Scoropan +Date: Tue Jun 21 13:57:35 2022 -0400 + +finished + +diff --git a/AIX-OS-headers b/AIX-OS-headers +deleted file mode 12 +index c2adefef9991.. +--- a/AIX-OS-headers /dev/null +@@ -1 +0,0 @@ +-/home/pauls/llvm/dev_3105/AIX-OS-headers +\ No newline at end of file Index: llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll === --- /dev/null +++ llvm/test/CodeGen/PowerPC/kill-canary-intrinsic.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | \ +; RUN: FileCheck %s + + +declare void @llvm.ppc.kill.canary() +define dso_local void @test_kill_canary() { +; CHECK-LABEL: test_kill_canary: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT:lis 3, 19564 +; CHECK-NEXT:ori 3, 3, 22125 +; CHECK-NEXT:stw 3, -17(1) +; CHECK-NEXT:blr +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 @@ -11127,6 +11127,38 @@ } break; } + case Intrinsic::ppc_kill_canary: { +MachineFunction &MF = DAG.getMachineFunction(); +if (MF.getFunction().hasFnAttribute(Attribute::SafeStack)) { + break; +} +MachineFrameInfo &MFI = MF.getFrameInfo(); +int SPI = MFI.getStackProtectorIndex(); // should return -1 + +PPCFunctionInfo *FuncInfo = MF.getInfo(); +EVT PtrVT = getPointerTy(MF.getDataLayout()); + +MFI.CreateStackObject(16, Align(16), false); +SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT); // frame index + +unsigned int deadBird = 0x4C6C566D; // replaces canary word + +SDValue Store = DAG.getStore( // create store instr, stores (deadBird + 0) into addr (frame index + stack protector) +Op->getOperand(0), +DL, + DAG.getConstant(deadBird, DL, MVT::i32), +DAG.getNode( // add frame index, stack protector index, return node result +ISD::ADD, +DL, +PtrVT, +FIN, +DAG.getConstant(SPI, DL, PtrVT) +), +MachinePointerInfo() +); +return Store; +break; + } default: break; } Index: llvm/include/llvm/IR/IntrinsicsPowerPC.td === --- llvm/include/llvm/IR/IntrinsicsPowerPC.td +++ llvm/include/llvm/IR/IntrinsicsPowerPC.td @@ -217,6 +217,11 @@ : Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty, llvm_vararg_ty], [IntrNoMem]>; + def int_ppc_kill_canary + : GCCBuiltin<"__builtin_ppc_kill_canary">, +Intrinsic<[], + [], + [IntrWriteMem, IntrHasSideEffects]>; } let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.". Index: final.patch === --- /dev/null +++ final.patch @@ -0,0 +1,14 @@ +commit f11c8790cad5554c4dad7a14c0d177bacd99eb22 +Author: Paul Scoropan +Date: Tue Jun 21 13:57:35 2022 -0400 + +finished + +diff --git a/AIX-OS-headers b/AIX-OS-headers +deleted file mode 12 +index c2adefef9991.. +--- a/AIX-OS-headers /dev/null +@@ -1 +0,0 @@ +-/home/pauls/llvm/dev_3105/AIX-OS-headers +\ No newline at end of file Index: clang/test/CodeGen/PowerPC/builtins-ppc.c === --- clang/test/CodeGen/PowerPC/builtins-ppc.c +++ clang/test/CodeGen/PowerPC/builtins-ppc.c @@ -74,3 +74,13 @@ // CHECK: call float (float, float, float, ...) @llvm.ppc.minfs(float %5, float %6, float %7, float %8) res = __builtin_ppc_minfs(a, b, c, d); } +/* +void test_builtin_ppc_kill_canary() { + // CHECK: call void