Report errors correctly for unselected target intrinsics.

llvm-svn: 84193
This commit is contained in:
Jakob Stoklund Olesen 2009-10-15 18:50:03 +00:00
parent 923b5aa973
commit e4197250cc
3 changed files with 21 additions and 8 deletions

View File

@ -30,6 +30,7 @@
#include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
@ -5404,14 +5405,16 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::EH_RETURN: return "EH_RETURN"; case ISD::EH_RETURN: return "EH_RETURN";
case ISD::ConstantPool: return "ConstantPool"; case ISD::ConstantPool: return "ConstantPool";
case ISD::ExternalSymbol: return "ExternalSymbol"; case ISD::ExternalSymbol: return "ExternalSymbol";
case ISD::INTRINSIC_WO_CHAIN: { case ISD::INTRINSIC_WO_CHAIN:
unsigned IID = cast<ConstantSDNode>(getOperand(0))->getZExtValue();
return Intrinsic::getName((Intrinsic::ID)IID);
}
case ISD::INTRINSIC_VOID: case ISD::INTRINSIC_VOID:
case ISD::INTRINSIC_W_CHAIN: { case ISD::INTRINSIC_W_CHAIN: {
unsigned IID = cast<ConstantSDNode>(getOperand(1))->getZExtValue(); unsigned OpNo = getOpcode() == ISD::INTRINSIC_WO_CHAIN ? 0 : 1;
unsigned IID = cast<ConstantSDNode>(getOperand(OpNo))->getZExtValue();
if (IID < Intrinsic::num_intrinsics)
return Intrinsic::getName((Intrinsic::ID)IID); return Intrinsic::getName((Intrinsic::ID)IID);
else if (const TargetIntrinsicInfo *TII = G->getTarget().getIntrinsicInfo())
return TII->getName(IID);
llvm_unreachable("Invalid intrinsic ID");
} }
case ISD::BUILD_VECTOR: return "BUILD_VECTOR"; case ISD::BUILD_VECTOR: return "BUILD_VECTOR";

View File

@ -584,6 +584,8 @@ public:
return intrinsic_wo_chain_sdnode; return intrinsic_wo_chain_sdnode;
} }
bool hasTargetIntrinsics() { return !TgtIntrinsics.empty(); }
private: private:
void ParseNodeInfo(); void ParseNodeInfo();
void ParseNodeTransforms(); void ParseNodeTransforms();

View File

@ -2067,8 +2067,16 @@ void DAGISelEmitter::EmitInstructionSelector(raw_ostream &OS) {
<< " errs() << \"Cannot yet select: \";\n" << " errs() << \"Cannot yet select: \";\n"
<< " unsigned iid = cast<ConstantSDNode>(N.getOperand(" << " unsigned iid = cast<ConstantSDNode>(N.getOperand("
<< "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n" << "N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();\n"
<< " llvm_report_error(\"Cannot yet select: intrinsic %\" +\n" << " if (iid < Intrinsic::num_intrinsics)\n"
<< "Intrinsic::getName((Intrinsic::ID)iid));\n" << " llvm_report_error(\"Cannot yet select: intrinsic %\" + "
<< "Intrinsic::getName((Intrinsic::ID)iid));\n";
if (CGP.hasTargetIntrinsics()) {
OS << " else if (const TargetIntrinsicInfo *tii = TM.getIntrinsicInfo())\n"
<< " llvm_report_error(Twine(\"Cannot yet select: target intrinsic "
<< "%\") + tii->getName(iid));\n";
}
OS << " else\n"
<< " llvm_report_error(\"Cannot yet select: invalid intrinsic\");\n"
<< "}\n\n"; << "}\n\n";
} }