diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-08-22 22:10:51 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-08-22 22:10:51 +0000 |
commit | fd5e56e35404cb44130b17546b6b5c1b33709d23 (patch) | |
tree | 0e0283a074231f3002ca495ff188452f20fd24e7 /lib/Sema/SemaStmtAsm.cpp | |
parent | 1becab2120142b1be87d684a68d3bea98f5abfb5 (diff) |
[ms-inline asm] Refactor code so that we can begin computing the Inputs/Outputs.
No functional change intended.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162403 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaStmtAsm.cpp')
-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(), |