diff options
author | Alexander Musman <alexander.musman@gmail.com> | 2015-09-21 14:41:00 +0000 |
---|---|---|
committer | Alexander Musman <alexander.musman@gmail.com> | 2015-09-21 14:41:00 +0000 |
commit | 8e261be911060e834c5e37b965e85415c8fb8b54 (patch) | |
tree | 0a7ab139be9dbc38d4de59c6f9fac07d6c064af6 /clang/lib/Sema/SemaStmtAsm.cpp | |
parent | ef3a04aae7a4b19f57be950824a37ec10e67fad6 (diff) | |
download | bcm5719-llvm-8e261be911060e834c5e37b965e85415c8fb8b54.tar.gz bcm5719-llvm-8e261be911060e834c5e37b965e85415c8fb8b54.zip |
Fix assertion in inline assembler IR gen
Several inputs may not refer to one output constraint in inline assembler
insertions, clang was failing on assertion on such test case.
llvm-svn: 248158
Diffstat (limited to 'clang/lib/Sema/SemaStmtAsm.cpp')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index b148cc9c761..79c06367e07 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -420,6 +420,8 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, diag::err_asm_unexpected_constraint_alternatives) << NumAlternatives << AltCount); } + SmallVector<size_t, 4> InputMatchedToOutput(OutputConstraintInfos.size(), + ~0U); for (unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) { TargetInfo::ConstraintInfo &Info = InputConstraintInfos[i]; StringRef ConstraintStr = Info.getConstraintStr(); @@ -441,6 +443,19 @@ StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, Expr *OutputExpr = Exprs[TiedTo]; Expr *InputExpr = Exprs[InputOpNo]; + // Make sure no more than one input constraint matches each output. + assert(TiedTo < InputMatchedToOutput.size() && "TiedTo value out of range"); + if (InputMatchedToOutput[TiedTo] != ~0U) { + Diag(NS->getInputExpr(i)->getLocStart(), + diag::err_asm_input_duplicate_match) + << TiedTo; + Diag(NS->getInputExpr(InputMatchedToOutput[TiedTo])->getLocStart(), + diag::note_asm_input_duplicate_first) + << TiedTo; + return StmtError(); + } + InputMatchedToOutput[TiedTo] = i; + if (OutputExpr->isTypeDependent() || InputExpr->isTypeDependent()) continue; |