Turn a few more inline asm errors into "emitErrors" instead of fatal errors.

Before we'd get:

$ clang t.c 
fatal error: error in backend: Invalid operand for inline asm constraint 'i'!

Now we get:

$ clang t.c
t.c:16:5: error: invalid operand for inline asm constraint 'i'!
    "movq         (%4), %%mm0\n"
    ^

Which at least gets us the inline asm that is the problem.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147502 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2012-01-03 23:51:01 +00:00
parent 3a4c60ca3b
commit fcd7090063

View File

@ -6138,9 +6138,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
// Copy the output from the appropriate register. Find a register that // Copy the output from the appropriate register. Find a register that
// we can use. // we can use.
if (OpInfo.AssignedRegs.Regs.empty()) if (OpInfo.AssignedRegs.Regs.empty()) {
report_fatal_error("Couldn't allocate output reg for constraint '" + LLVMContext &Ctx = *DAG.getContext();
Twine(OpInfo.ConstraintCode) + "'!"); Ctx.emitError(CS.getInstruction(),
"couldn't allocate output register for constraint '" +
Twine(OpInfo.ConstraintCode) + "'");
break;
}
// If this is an indirect operand, store through the pointer after the // If this is an indirect operand, store through the pointer after the
// asm. // asm.
@ -6240,9 +6244,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
std::vector<SDValue> Ops; std::vector<SDValue> Ops;
TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode, TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
Ops, DAG); Ops, DAG);
if (Ops.empty()) if (Ops.empty()) {
report_fatal_error("Invalid operand for inline asm constraint '" + LLVMContext &Ctx = *DAG.getContext();
Twine(OpInfo.ConstraintCode) + "'!"); Ctx.emitError(CS.getInstruction(),
"invalid operand for inline asm constraint '" +
Twine(OpInfo.ConstraintCode) + "'");
break;
}
// Add information to the INLINEASM node to know about this input. // Add information to the INLINEASM node to know about this input.
unsigned ResOpType = unsigned ResOpType =
@ -6273,9 +6281,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
"Don't know how to handle indirect register inputs yet!"); "Don't know how to handle indirect register inputs yet!");
// Copy the input into the appropriate registers. // Copy the input into the appropriate registers.
if (OpInfo.AssignedRegs.Regs.empty()) if (OpInfo.AssignedRegs.Regs.empty()) {
report_fatal_error("Couldn't allocate input reg for constraint '" + LLVMContext &Ctx = *DAG.getContext();
Twine(OpInfo.ConstraintCode) + "'!"); Ctx.emitError(CS.getInstruction(),
"couldn't allocate input reg for constraint '" +
Twine(OpInfo.ConstraintCode) + "'");
break;
}
OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, getCurDebugLoc(), OpInfo.AssignedRegs.getCopyToRegs(InOperandVal, DAG, getCurDebugLoc(),
Chain, &Flag); Chain, &Flag);