From 93380f63c9f8ae43e4949330e06c5b692cf22c05 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Mon, 3 Sep 2012 20:40:52 +0000 Subject: [PATCH] [ms-inline asm] Use the new GetMCInstOperandNum() interface in the front-end. llvm-svn: 163126 --- clang/lib/Sema/SemaStmtAsm.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index d3d646d246fb..148604d97e88 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -568,14 +568,31 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, // Build the list of clobbers, outputs and inputs. unsigned NumDefs = Desc.getNumDefs(); - for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) { - const llvm::MCOperand &Op = Inst.getOperand(i); + for (unsigned i = 1, e = Operands.size(); i != e; ++i) { + unsigned NumMCOperands; + unsigned MCIdx = TargetParser->GetMCInstOperandNum(Kind, Inst, Operands, i, + NumMCOperands); + assert (NumMCOperands && "Expected at least 1 MCOperand!"); + // If we have a one-to-many mapping, then search for the MCExpr. + if (NumMCOperands > 1) { + bool foundExpr = false; + for (unsigned j = MCIdx, e = MCIdx + NumMCOperands; j != e; ++j) { + if (Inst.getOperand(j).isExpr()) { + foundExpr = true; + MCIdx = j; + break; + } + } + assert (foundExpr && "Expected for find an expression!"); + } + + const llvm::MCOperand &Op = Inst.getOperand(MCIdx); // Immediate. if (Op.isImm() || Op.isFPImm()) continue; - bool isDef = NumDefs && (i < NumDefs); + bool isDef = NumDefs && (MCIdx < NumDefs); // Register/Clobber. if (Op.isReg() && isDef) {