diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-06-08 18:00:47 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-06-08 18:00:47 +0000 |
| commit | 8f8b5e4631835f1ea074add53ded8a9374144153 (patch) | |
| tree | a07e0c38eec7c22e1c5340da51b3425283d88b6c /llvm/lib/CodeGen | |
| parent | 5e91c03fa9d6d9035cb0ee6481392c97d6dbd773 (diff) | |
| download | bcm5719-llvm-8f8b5e4631835f1ea074add53ded8a9374144153.tar.gz bcm5719-llvm-8f8b5e4631835f1ea074add53ded8a9374144153.zip | |
Fix an assert-on-inline-inline-asm bug.
llvm-svn: 28727
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter.cpp index bd25a1e8931..269b9586070 100644 --- a/llvm/lib/CodeGen/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter.cpp @@ -656,24 +656,30 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { // operand! if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { unsigned OpNo = 1; - + + bool Error = false; + // Scan to find the machine operand number for the operand. for (; Val; --Val) { + if (OpNo >= MI->getNumOperands()) break; unsigned OpFlags = MI->getOperand(OpNo).getImmedValue(); OpNo += (OpFlags >> 3) + 1; } - - unsigned OpFlags = MI->getOperand(OpNo).getImmedValue(); - ++OpNo; // Skip over the ID number. - - bool Error; - AsmPrinter *AP = const_cast<AsmPrinter*>(this); - if ((OpFlags & 7) == 4 /*ADDR MODE*/) { - Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, - Modifier[0] ? Modifier : 0); + + if (OpNo >= MI->getNumOperands()) { + Error = true; } else { - Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, - Modifier[0] ? Modifier : 0); + unsigned OpFlags = MI->getOperand(OpNo).getImmedValue(); + ++OpNo; // Skip over the ID number. + + AsmPrinter *AP = const_cast<AsmPrinter*>(this); + if ((OpFlags & 7) == 4 /*ADDR MODE*/) { + Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, + Modifier[0] ? Modifier : 0); + } else { + Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, + Modifier[0] ? Modifier : 0); + } } if (Error) { std::cerr << "Invalid operand found in inline asm: '" |

