diff options
-rw-r--r-- | lib/Sema/SemaStmtAsm.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index ac22f1346d..ff5c5b3b73 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -546,20 +546,28 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, TheTarget->createMCInstPrinter(1, *MAI, *MII, *MRI, *STI); // Build the list of clobbers. - for (unsigned i = 0, e = Desc.getNumDefs(); i != e; ++i) { - const llvm::MCOperand &Op = Inst.getOperand(i); - if (!Op.isReg()) + unsigned NumDefs = Desc.getNumDefs(); + for (unsigned j = 0, e = Inst.getNumOperands(); j != e; ++j) { + const llvm::MCOperand &Op = Inst.getOperand(j); + + // Immediate. + if (Op.isImm() || Op.isFPImm()) continue; - std::string Reg; - llvm::raw_string_ostream OS(Reg); - IP->printRegName(OS, Op.getReg()); + bool isDef = NumDefs && (j < NumDefs); + + // Register/Clobber. + if (Op.isReg() && isDef) { + std::string Reg; + llvm::raw_string_ostream OS(Reg); + IP->printRegName(OS, Op.getReg()); - StringRef Clobber(OS.str()); - if (!Context.getTargetInfo().isValidClobber(Clobber)) - return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) << - Clobber); - ClobberRegs.insert(Reg); + StringRef Clobber(OS.str()); + if (!Context.getTargetInfo().isValidClobber(Clobber)) + return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) << + Clobber); + ClobberRegs.insert(Reg); + } } } for (std::set<std::string>::iterator I = ClobberRegs.begin(), |