]> granicus.if.org Git - clang/commitdiff
[ms-inline asm] Use the new GetMCInstOperandNum() interface in the front-end.
authorChad Rosier <mcrosier@apple.com>
Mon, 3 Sep 2012 20:40:52 +0000 (20:40 +0000)
committerChad Rosier <mcrosier@apple.com>
Mon, 3 Sep 2012 20:40:52 +0000 (20:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163126 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmtAsm.cpp

index d3d646d246fb7d5cb6b61ff2fb15700a9b7a6117..148604d97e8873a6ea19c3e8851e48521e5d40d2 100644 (file)
@@ -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) {