[PATCH] D125916: [PowerPC] Defined and lowered llvm.ppc.kill.canary intrinsic

2022-07-06 Thread Paul Scoropan via Phabricator via cfe-commits
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

2022-06-27 Thread Paul Scoropan via Phabricator via cfe-commits
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

2022-06-22 Thread ChenZheng via Phabricator via cfe-commits
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

2022-06-22 Thread Paul Scoropan via Phabricator via cfe-commits
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

2022-06-22 Thread Paul Scoropan via Phabricator via cfe-commits
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

2022-06-22 Thread Paul Scoropan via Phabricator via cfe-commits
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

2022-06-22 Thread Paul Scoropan via Phabricator via cfe-commits
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