summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-08-22 22:10:51 +0000
committerChad Rosier <mcrosier@apple.com>2012-08-22 22:10:51 +0000
commitdc5311aab6505357c46c098364b13388afced8c2 (patch)
treef6b4ab88964b53cd0a35f08d83f762ad2df8ffae /clang
parentdf38adae0f8c09f14706267bde4ecc6f667eaf61 (diff)
downloadbcm5719-llvm-dc5311aab6505357c46c098364b13388afced8c2.tar.gz
bcm5719-llvm-dc5311aab6505357c46c098364b13388afced8c2.zip
[ms-inline asm] Refactor code so that we can begin computing the Inputs/Outputs.
No functional change intended. llvm-svn: 162403
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaStmtAsm.cpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index ac22f1346d1..ff5c5b3b735 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/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(),
OpenPOWER on IntegriCloud