mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
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:
parent
a9badd250c
commit
9d812a2805
@ -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)
|
||||
|
@ -530,16 +530,10 @@ void RAFast::allocVirtReg(MachineInstr *MI, LiveRegEntry &LRE, unsigned Hint) {
|
||||
return assignVirtToPhysReg(LRE, BestReg);
|
||||
}
|
||||
|
||||
// Nothing we can do.
|
||||
std::string msg;
|
||||
raw_string_ostream Msg(msg);
|
||||
Msg << "Ran out of registers during register allocation!";
|
||||
if (MI->isInlineAsm()) {
|
||||
Msg << "\nPlease check your inline asm statement for "
|
||||
<< "invalid constraints:\n";
|
||||
MI->print(Msg, TM);
|
||||
}
|
||||
report_fatal_error(Msg.str());
|
||||
// Nothing we can do. Report an error and keep going with a bad allocation.
|
||||
MI->emitError("ran out of registers during register allocation");
|
||||
definePhysReg(MI, *AO.begin(), regFree);
|
||||
assignVirtToPhysReg(LRE, *AO.begin());
|
||||
}
|
||||
|
||||
/// defineVirtReg - Allocate a register for VirtReg and mark it as dirty.
|
||||
|
@ -5,10 +5,8 @@
|
||||
; RUN: FileCheck %s < %t2
|
||||
; RUN: FileCheck %s < %t3
|
||||
|
||||
; The register allocator must fail on this function, and it should print the
|
||||
; inline asm in the diagnostic.
|
||||
; CHECK: LLVM ERROR: Ran out of registers during register allocation!
|
||||
; CHECK: INLINEASM <es:hello world>
|
||||
; The register allocator must fail on this function.
|
||||
; CHECK: error: ran out of registers during register allocation
|
||||
|
||||
define void @f(i32 %x0, i32 %x1, i32 %x2, i32 %x3, i32 %x4, i32 %x5, i32 %x6, i32 %x7, i32 %x8, i32 %x9) nounwind ssp {
|
||||
entry:
|
||||
|
Loading…
Reference in New Issue
Block a user