Better diagnostics when inline asm fails to allocate.

asm.c:2:7: error: ran out of registers during register allocation
  asm(""::"r"(0), "r"(1), "r"(2), "r"(3), "r"(4), "r"(5), "r"(6), "r"(7), "r"(8), "r"(9));
        ^

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134310 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2011-07-02 07:17:37 +00:00
parent a9badd250c
commit 9d812a2805
3 changed files with 20 additions and 26 deletions

View File

@ -324,19 +324,21 @@ void RegAllocBase::allocatePhysRegs() {
if (AvailablePhysReg == ~0u) {
// selectOrSplit failed to find a register!
std::string msg;
raw_string_ostream Msg(msg);
Msg << "Ran out of registers during register allocation!"
"\nCannot allocate: " << *VirtReg;
const char *Msg = "ran out of registers during register allocation";
// Probably caused by an inline asm.
MachineInstr *MI;
for (MachineRegisterInfo::reg_iterator I = MRI->reg_begin(VirtReg->reg);
MachineInstr *MI = I.skipInstruction();) {
if (!MI->isInlineAsm())
continue;
Msg << "\nPlease check your inline asm statement for "
"invalid constraints:\n";
MI->print(Msg, &VRM->getMachineFunction().getTarget());
}
report_fatal_error(Msg.str());
(MI = I.skipInstruction());)
if (MI->isInlineAsm())
break;
if (MI)
MI->emitError(Msg);
else
report_fatal_error(Msg);
// Keep going after reporting the error.
VRM->assignVirt2Phys(VirtReg->reg,
RegClassInfo.getOrder(MRI->getRegClass(VirtReg->reg)).front());
continue;
}
if (AvailablePhysReg)