[PATCH] D129505: [GISel] Check useLoadStackGuardNode() before generating LOAD_STACK_GUARD
Kai Nacke via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 11 11:42:12 PDT 2022
Kai created this revision.
Kai added reviewers: arsenm, nemanjai, petpav01, aemerson.
Herald added subscribers: kbarton, hiraditya.
Herald added a project: All.
Kai requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.
When lowering `llvm::stackprotect` intrinsic, the SDAG implementation
checks function `useLoadStackGuardNode()` to either create a
`LOAD_STACK_GUARD` node or use the first argument of the intrinsic.
This check is not present in the IRTranslator, which results in always
generating a LOAD_STACK_GUARD even if the target does not support it.
https://reviews.llvm.org/D129505
Files:
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/test/CodeGen/PowerPC/GlobalISel/ppc-irtranslator-stackprotect.ll
Index: llvm/test/CodeGen/PowerPC/GlobalISel/ppc-irtranslator-stackprotect.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/GlobalISel/ppc-irtranslator-stackprotect.ll
@@ -0,0 +1,49 @@
+; RUN: llc -verify-machineinstrs -mtriple=ppc64le-linux %s -global-isel -stop-after=irtranslator -o - | FileCheck %s --check-prefix=LINUX
+; RUN: llc -verify-machineinstrs -mtriple=ppc64le-openbsd %s -global-isel -stop-after=irtranslator -o - | FileCheck %s --check-prefix=OPENBSD
+
+
+; The stack guard on Linux
+ at __stack_chk_guard = external global ptr
+
+; The stack guard on OpenBSD
+ at __guard_local = external hidden global ptr
+
+declare void @llvm.stackprotector(ptr, ptr)
+
+; LINUX-LABEL: name: test_stack_guard_linux
+
+; LINUX: frameInfo:
+; LINUX: stackProtector: '%stack.0.StackGuardSlot'
+
+; LINUX: stack:
+; LINUX: - { id: 0, name: StackGuardSlot, type: default, offset: 0, size: 8, alignment: 8,
+; LINUX-NOT: id: 1
+
+; LINUX: [[GUARD_SLOT:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.StackGuardSlot
+; LINUX: [[GUARD:%[0-9]+]]:g8rc(p0) = LOAD_STACK_GUARD :: (dereferenceable invariant load (p0) from @__stack_chk_guard)
+; LINUX: G_STORE [[GUARD]](p0), [[GUARD_SLOT]](p0) :: (volatile store (p0) into %stack.0.StackGuardSlot)
+define void @test_stack_guard_linux() {
+ %StackGuardSlot = alloca ptr
+ call void @llvm.stackprotector(ptr undef, ptr %StackGuardSlot)
+ ret void
+}
+
+; OPENBSD-LABEL: name: test_stack_guard_openbsd
+
+; OPENBSD: frameInfo:
+; OPENBSD: stackProtector: '%stack.0.StackGuardSlot'
+
+; OPENBSD: stack:
+; OPENBSD: - { id: 0, name: StackGuardSlot, type: default, offset: 0, size: 8, alignment: 8,
+; OPENBSD-NOT: id: 1
+
+; OPENBSD: [[GUARD_LOCAL:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @__guard_local
+; OPENBSD: [[GUARD_SLOT:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.StackGuardSlot
+; OPENBSD: [[GUARD:%[0-9]+]]:_(p0) = G_LOAD [[GUARD_LOCAL]](p0) :: (dereferenceable load (p0) from @__guard_local)
+; OPENBSD: G_STORE [[GUARD]](p0), [[GUARD_SLOT]](p0) :: (volatile store (p0) into %stack.0.StackGuardSlot)
+define void @test_stack_guard_openbsd() {
+ %StackGuardSlot = alloca i8*
+ %StackGuard = load ptr, ptr @__guard_local
+ call void @llvm.stackprotector(ptr %StackGuard, ptr %StackGuardSlot)
+ ret void
+}
Index: llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -2076,9 +2076,14 @@
getStackGuard(getOrCreateVReg(CI), MIRBuilder);
return true;
case Intrinsic::stackprotector: {
+ const TargetLowering &TLI = *MF->getSubtarget().getTargetLowering();
LLT PtrTy = getLLTForType(*CI.getArgOperand(0)->getType(), *DL);
- Register GuardVal = MRI->createGenericVirtualRegister(PtrTy);
- getStackGuard(GuardVal, MIRBuilder);
+ Register GuardVal;
+ if (TLI.useLoadStackGuardNode()) {
+ GuardVal = MRI->createGenericVirtualRegister(PtrTy);
+ getStackGuard(GuardVal, MIRBuilder);
+ } else
+ GuardVal = getOrCreateVReg(*CI.getArgOperand(0)); // The guard's value.
AllocaInst *Slot = cast<AllocaInst>(CI.getArgOperand(1));
int FI = getOrCreateFrameIndex(*Slot);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129505.443700.patch
Type: text/x-patch
Size: 3277 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220711/16241bbb/attachment.bin>
More information about the llvm-commits
mailing list