summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-08-15 18:09:18 +0000
committerChad Rosier <mcrosier@apple.com>2012-08-15 18:09:18 +0000
commitad34aef449fe5057966193ef45345aa713b7c039 (patch)
treef7a21ce9f5f6685287b4d0ef62523a391793dfb7 /clang
parent70a0bbcad25eaccb51fefc187144f60dc1c51a52 (diff)
downloadbcm5719-llvm-ad34aef449fe5057966193ef45345aa713b7c039.tar.gz
bcm5719-llvm-ad34aef449fe5057966193ef45345aa713b7c039.zip
[ms-inline asm] Capturing loop-scoped (std::string)Reg with a StringRef is bad.
llvm-svn: 161966
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaStmt.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 74e8cfed2e5..e176e38dc2f 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -2857,7 +2857,9 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
SourceLocation EndLoc) {
// MS-style inline assembly is not fully supported, so emit a warning.
Diag(AsmLoc, diag::warn_unsupported_msasm);
+ unsigned NumClobberRegs = 0;
SmallVector<StringRef,4> Clobbers;
+ SmallVector<std::string,4> ClobberRegs;
// Empty asm statements don't need to instantiate the AsmParser, etc.
if (AsmToks.empty()) {
@@ -2962,13 +2964,13 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
TheTarget->createMCInstPrinter(1, *MAI, *MII, *MRI, *STI);
// Build the list of clobbers.
+ ClobberRegs.resize(NumClobberRegs + Desc.getNumDefs());
for (unsigned i = 0, e = Desc.getNumDefs(); i != e; ++i) {
const llvm::MCOperand &Op = Inst.getOperand(i);
if (!Op.isReg())
continue;
- std::string Reg;
- llvm::raw_string_ostream OS(Reg);
+ llvm::raw_string_ostream OS(ClobberRegs[NumClobberRegs]);
IP->printRegName(OS, Op.getReg());
StringRef Clobber(OS.str());
@@ -2976,7 +2978,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) <<
Clobber);
// FIXME: Asm blocks may result in redundant clobbers.
- Clobbers.push_back(Reg);
+ Clobbers.push_back(ClobberRegs[NumClobberRegs++]);
}
}
OpenPOWER on IntegriCloud