diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index e6917b74e7d..c8351b7c5ef 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -2164,6 +2164,10 @@ public: return 0; } + + bool verifyReturnAddressArgumentIsConstant(SDValue Op, + SelectionDAG &DAG) const; + //===--------------------------------------------------------------------===// // Inline Asm Support hooks // diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 82b068d25c8..96bc044602d 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -22,6 +22,7 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/LLVMContext.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCExpr.h" #include "llvm/Support/CommandLine.h" @@ -2663,3 +2664,14 @@ BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, DAG.getConstant(magics.s-1, getShiftAmountTy(NPQ.getValueType()))); } } + +bool TargetLowering:: +verifyReturnAddressArgumentIsConstant(SDValue Op, SelectionDAG &DAG) const { + if (!isa(Op.getOperand(0))) { + DAG.getContext()->emitError("argument to '__builtin_return_address' must " + "be a constant integer"); + return true; + } + + return false; +} diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index b4bd0194ee4..c8bd5923711 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -2132,11 +2132,8 @@ SDValue AArch64TargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) co MachineFrameInfo *MFI = MF.getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } EVT VT = Op.getValueType(); SDLoc dl(Op); diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index ef165dc06e2..841b2ab2fdf 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -3753,11 +3753,8 @@ SDValue ARMTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const{ MachineFrameInfo *MFI = MF.getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } EVT VT = Op.getValueType(); SDLoc dl(Op); diff --git a/lib/Target/Hexagon/HexagonISelLowering.cpp b/lib/Target/Hexagon/HexagonISelLowering.cpp index e1e954afc51..1d82285317e 100644 --- a/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -982,11 +982,8 @@ HexagonTargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const { MachineFrameInfo *MFI = MF.getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } EVT VT = Op.getValueType(); SDLoc dl(Op); diff --git a/lib/Target/MSP430/MSP430ISelLowering.cpp b/lib/Target/MSP430/MSP430ISelLowering.cpp index a1a7c5e08ef..3a9d2698aa4 100644 --- a/lib/Target/MSP430/MSP430ISelLowering.cpp +++ b/lib/Target/MSP430/MSP430ISelLowering.cpp @@ -1048,11 +1048,8 @@ SDValue MSP430TargetLowering::LowerRETURNADDR(SDValue Op, MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } unsigned Depth = cast(Op.getOperand(0))->getZExtValue(); SDLoc dl(Op); diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index 220b1c4a350..40d385e46b2 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -1845,11 +1845,8 @@ lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const { SDValue MipsTargetLowering::lowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const { - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } // check the depth assert((cast(Op.getOperand(0))->getZExtValue() == 0) && diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 630385cc7c0..2e87681ab91 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -7796,11 +7796,8 @@ SDValue PPCTargetLowering::LowerRETURNADDR(SDValue Op, MachineFrameInfo *MFI = MF.getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } SDLoc dl(Op); unsigned Depth = cast(Op.getOperand(0))->getZExtValue(); diff --git a/lib/Target/Sparc/SparcISelLowering.cpp b/lib/Target/Sparc/SparcISelLowering.cpp index 5442e5704c1..9c83787395a 100644 --- a/lib/Target/Sparc/SparcISelLowering.cpp +++ b/lib/Target/Sparc/SparcISelLowering.cpp @@ -2471,11 +2471,8 @@ static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, MachineFrameInfo *MFI = MF.getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (TLI.verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } EVT VT = Op.getValueType(); SDLoc dl(Op); diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 005efbb60db..38d7cb678d6 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -12173,11 +12173,8 @@ SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op, MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); MFI->setReturnAddressIsTaken(true); - if (!isa(Op.getOperand(0))) { - DAG.getContext()->emitError("argument to '__builtin_return_address' must " - "be a constant integer"); + if (verifyReturnAddressArgumentIsConstant(Op, DAG)) return SDValue(); - } unsigned Depth = cast(Op.getOperand(0))->getZExtValue(); SDLoc dl(Op);