diff options
| author | Simon Atanasyan <simon@atanasyan.com> | 2019-03-06 22:40:28 +0000 |
|---|---|---|
| committer | Simon Atanasyan <simon@atanasyan.com> | 2019-03-06 22:40:28 +0000 |
| commit | 83b88441ad951fe99c30402930ef3cd661f2fd2b (patch) | |
| tree | bd78721dffd2ad902eb215352ad4056f37bc9472 | |
| parent | 3229000f63618107b9eeec6e3032c8570f854972 (diff) | |
| download | bcm5719-llvm-83b88441ad951fe99c30402930ef3cd661f2fd2b.tar.gz bcm5719-llvm-83b88441ad951fe99c30402930ef3cd661f2fd2b.zip | |
[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.
llvm-svn: 355558
| -rw-r--r-- | llvm/lib/Target/Mips/MipsISelLowering.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/frame-address-err.ll | 11 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Mips/return_address_err.ll | 11 |
3 files changed, 32 insertions, 4 deletions
diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index d69effb6224..e0243a0b697 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/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<ConstantSDNode>(Op.getOperand(0))->getZExtValue() == 0) && - "Frame address can only be determined for current frame."); + if (cast<ConstantSDNode>(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<ConstantSDNode>(Op.getOperand(0))->getZExtValue() == 0) && - "Return address can be determined only for current frame."); + if (cast<ConstantSDNode>(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/llvm/test/CodeGen/Mips/frame-address-err.ll b/llvm/test/CodeGen/Mips/frame-address-err.ll new file mode 100644 index 00000000000..086f62876a3 --- /dev/null +++ b/llvm/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/llvm/test/CodeGen/Mips/return_address_err.ll b/llvm/test/CodeGen/Mips/return_address_err.ll new file mode 100644 index 00000000000..b2507656aa1 --- /dev/null +++ b/llvm/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 +} |

