summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2019-03-06 22:40:28 +0000
committerSimon Atanasyan <simon@atanasyan.com>2019-03-06 22:40:28 +0000
commit83b88441ad951fe99c30402930ef3cd661f2fd2b (patch)
treebd78721dffd2ad902eb215352ad4056f37bc9472
parent3229000f63618107b9eeec6e3032c8570f854972 (diff)
downloadbcm5719-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.cpp14
-rw-r--r--llvm/test/CodeGen/Mips/frame-address-err.ll11
-rw-r--r--llvm/test/CodeGen/Mips/return_address_err.ll11
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
+}
OpenPOWER on IntegriCloud