From 12da1698391f3fc0359a0413e616978a20443c16 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Thu, 22 Mar 2012 01:33:51 +0000 Subject: [PATCH] In erroneous inline assembly we could mistakenly try to access the metadata operand as an actual operand, leading to an assert. Error out in this case. rdar://11007633 llvm-svn: 153234 --- llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp index 8eda889155a2..d60585465be0 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -326,7 +326,11 @@ void AsmPrinter::EmitInlineAsm(const MachineInstr *MI) const { OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; } - if (OpNo >= MI->getNumOperands()) { + // We may have a location metadata attached to the end of the + // instruction, and at no point should see metadata at any + // other point while processing. It's an error if so. + if (OpNo >= MI->getNumOperands() || + MI->getOperand(OpNo).isMetadata()) { Error = true; } else { unsigned OpFlags = MI->getOperand(OpNo).getImm();