From: Simon Atanasyan Date: Wed, 6 Mar 2019 22:40:28 +0000 (+0000) Subject: [mips] Replace assertion by error message while lowering `RETURNADDR` and `FRAMEADDR` X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6f6ca7612eed9f73728e8f19597c0819ce04cc44;p=llvm [mips] Replace assertion by error message while lowering `RETURNADDR` and `FRAMEADDR` MIPS target supports lowering `RETURNADDR` and `FRAMEADDR` for a current frame only. It's better to show an error message then crash on assertion if `__builtin_return_address` is invoked with non-zero argument. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355558 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index d69effb6224..e0243a0b697 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -2376,8 +2376,11 @@ SDValue MipsTargetLowering::lowerFABS(SDValue Op, SelectionDAG &DAG) const { SDValue MipsTargetLowering:: lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const { // check the depth - assert((cast(Op.getOperand(0))->getZExtValue() == 0) && - "Frame address can only be determined for current frame."); + if (cast(Op.getOperand(0))->getZExtValue() != 0) { + DAG.getContext()->emitError( + "return address can be determined only for current frame"); + return SDValue(); + } MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo(); MFI.setFrameAddressIsTaken(true); @@ -2394,8 +2397,11 @@ SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op, return SDValue(); // check the depth - assert((cast(Op.getOperand(0))->getZExtValue() == 0) && - "Return address can be determined only for current frame."); + if (cast(Op.getOperand(0))->getZExtValue() != 0) { + DAG.getContext()->emitError( + "return address can be determined only for current frame"); + return SDValue(); + } MachineFunction &MF = DAG.getMachineFunction(); MachineFrameInfo &MFI = MF.getFrameInfo(); diff --git a/test/CodeGen/Mips/frame-address-err.ll b/test/CodeGen/Mips/frame-address-err.ll new file mode 100644 index 00000000000..086f62876a3 --- /dev/null +++ b/test/CodeGen/Mips/frame-address-err.ll @@ -0,0 +1,11 @@ +; RUN: not llc -march=mips < %s 2>&1 | FileCheck %s + +declare i8* @llvm.frameaddress(i32) nounwind readnone + +define i8* @f() nounwind { +entry: + %0 = call i8* @llvm.frameaddress(i32 1) + ret i8* %0 + +; CHECK: error: return address can be determined only for current frame +} diff --git a/test/CodeGen/Mips/return_address_err.ll b/test/CodeGen/Mips/return_address_err.ll new file mode 100644 index 00000000000..b2507656aa1 --- /dev/null +++ b/test/CodeGen/Mips/return_address_err.ll @@ -0,0 +1,11 @@ +; RUN: not llc -march=mips < %s 2>&1 | FileCheck %s + +declare i8* @llvm.returnaddress(i32) nounwind readnone + +define i8* @f() nounwind { +entry: + %0 = call i8* @llvm.returnaddress(i32 1) + ret i8* %0 + +; CHECK: error: return address can be determined only for current frame +}