Skip to content

Commit efaf727

Browse files
arsenmaokblast
authored andcommitted
CodeGen: Fix crash when no libcall is available for stackguard (llvm#164211)
Not all the paths appear to be implemented for GlobalISel
1 parent f843fcb commit efaf727

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,15 +1862,19 @@ bool IRTranslator::translateVectorDeinterleave2Intrinsic(
18621862

18631863
void IRTranslator::getStackGuard(Register DstReg,
18641864
MachineIRBuilder &MIRBuilder) {
1865+
Value *Global = TLI->getSDagStackGuard(*MF->getFunction().getParent());
1866+
if (!Global) {
1867+
LLVMContext &Ctx = MIRBuilder.getContext();
1868+
Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
1869+
MIRBuilder.buildUndef(DstReg);
1870+
return;
1871+
}
1872+
18651873
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
18661874
MRI->setRegClass(DstReg, TRI->getPointerRegClass());
18671875
auto MIB =
18681876
MIRBuilder.buildInstr(TargetOpcode::LOAD_STACK_GUARD, {DstReg}, {});
18691877

1870-
Value *Global = TLI->getSDagStackGuard(*MF->getFunction().getParent());
1871-
if (!Global)
1872-
return;
1873-
18741878
unsigned AddrSpace = Global->getType()->getPointerAddressSpace();
18751879
LLT PtrTy = LLT::pointer(AddrSpace, DL->getPointerSizeInBits(AddrSpace));
18761880

llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3131,12 +3131,16 @@ void SelectionDAGBuilder::visitSPDescriptorParent(StackProtectorDescriptor &SPD,
31313131
if (TLI.useLoadStackGuardNode(M)) {
31323132
Guard = getLoadStackGuard(DAG, dl, Chain);
31333133
} else {
3134-
const Value *IRGuard = TLI.getSDagStackGuard(M);
3135-
SDValue GuardPtr = getValue(IRGuard);
3136-
3137-
Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3138-
MachinePointerInfo(IRGuard, 0), Align,
3139-
MachineMemOperand::MOVolatile);
3134+
if (const Value *IRGuard = TLI.getSDagStackGuard(M)) {
3135+
SDValue GuardPtr = getValue(IRGuard);
3136+
Guard = DAG.getLoad(PtrMemTy, dl, Chain, GuardPtr,
3137+
MachinePointerInfo(IRGuard, 0), Align,
3138+
MachineMemOperand::MOVolatile);
3139+
} else {
3140+
LLVMContext &Ctx = *DAG.getContext();
3141+
Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
3142+
Guard = DAG.getPOISON(PtrMemTy);
3143+
}
31403144
}
31413145

31423146
// Perform the comparison via a getsetcc.
@@ -7324,6 +7328,13 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
73247328
Res = DAG.getPtrExtOrTrunc(Res, sdl, PtrTy);
73257329
} else {
73267330
const Value *Global = TLI.getSDagStackGuard(M);
7331+
if (!Global) {
7332+
LLVMContext &Ctx = *DAG.getContext();
7333+
Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
7334+
setValue(&I, DAG.getPOISON(PtrTy));
7335+
return;
7336+
}
7337+
73277338
Align Align = DAG.getDataLayout().getPrefTypeAlign(Global->getType());
73287339
Res = DAG.getLoad(PtrTy, sdl, Chain, getValue(Global),
73297340
MachinePointerInfo(Global, 0), Align,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
; RUN: not llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -filetype=null %s 2>&1 | FileCheck %s
2+
; RUN: not llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -filetype=null %s 2>&1 | FileCheck %s
3+
4+
; FIXME: To actually support stackguard, need to fix intrinsic to
5+
; return pointer in any address space.
6+
7+
; CHECK: error: unable to lower stackguard
8+
define i1 @test_stackguard(ptr %p1) {
9+
%p2 = call ptr @llvm.stackguard()
10+
%res = icmp ne ptr %p2, %p1
11+
ret i1 %res
12+
}
13+
14+
declare ptr @llvm.stackguard()

0 commit comments

Comments
 (0)