mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
Emit an error message if the value passed to __builtin_returnaddress isn't a constant
__builtin_returnaddress requires that the value passed into is be a constant. However, at -O0 even a constant expression may not be converted to a constant. Emit an error message intead of crashing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198531 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e43a0f8015
commit
4a816471f5
@ -26,6 +26,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -2131,6 +2132,12 @@ SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) co
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc dl(Op);
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
@ -3752,6 +3753,12 @@ SDValue ARMTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const{
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc dl(Op);
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -981,6 +982,12 @@ HexagonTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const {
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc dl(Op);
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "llvm/IR/GlobalAlias.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -1047,6 +1048,12 @@ SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc dl(Op);
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -1844,6 +1845,12 @@ lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
// check the depth
|
||||
assert((cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue() == 0) &&
|
||||
"Return address can be determined only for current frame.");
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
@ -7795,6 +7796,12 @@ SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDLoc dl(Op);
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
using namespace llvm;
|
||||
@ -2470,6 +2471,12 @@ static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG,
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
EVT VT = Op.getValueType();
|
||||
SDLoc dl(Op);
|
||||
uint64_t depth = Op.getConstantOperandVal(0);
|
||||
|
@ -12180,6 +12180,12 @@ SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op,
|
||||
MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
|
||||
MFI->setReturnAddressIsTaken(true);
|
||||
|
||||
if (!isa<ConstantSDNode>(Op.getOperand(0))) {
|
||||
DAG.getContext()->emitError("argument to '__builtin_return_address' must "
|
||||
"be a constant integer");
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc dl(Op);
|
||||
EVT PtrVT = getPointerTy();
|
||||
|
27
test/CodeGen/Generic/builtin-returnaddress-error.ll
Normal file
27
test/CodeGen/Generic/builtin-returnaddress-error.ll
Normal file
@ -0,0 +1,27 @@
|
||||
; RUN: not llc < %s -O0 2> %t1
|
||||
; RUN: FileCheck %s < %t1
|
||||
|
||||
; CHECK: argument to '__builtin_return_address' must be a constant integer
|
||||
|
||||
define i32* @foo() {
|
||||
entry:
|
||||
%t1 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 0, i32 0)
|
||||
%t2 = extractvalue { i32, i1 } %t1, 0
|
||||
%t3 = extractvalue { i32, i1 } %t1, 1
|
||||
br i1 %t3, label %cont, label %trap
|
||||
|
||||
trap:
|
||||
call void @llvm.trap()
|
||||
unreachable
|
||||
|
||||
cont:
|
||||
%t5 = call i8* @llvm.returnaddress(i32 %t2)
|
||||
%t6 = bitcast i8* %t5 to i32*
|
||||
ret i32* %t6
|
||||
}
|
||||
|
||||
declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32)
|
||||
|
||||
declare void @llvm.trap()
|
||||
|
||||
declare i8* @llvm.returnaddress(i32)
|
Loading…
x
Reference in New Issue
Block a user