diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Stmt.cpp | 23 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 6 |
3 files changed, 21 insertions, 12 deletions
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 749b677d91..682a9b1ee4 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -130,17 +130,28 @@ bool Stmt::hasImplicitControlFlow() const { } } -const Expr* AsmStmt::getOutputExpr(unsigned i) const { +Expr *AsmStmt::getOutputExpr(unsigned i) { return cast<Expr>(Exprs[i]); } -Expr* AsmStmt::getOutputExpr(unsigned i) { - return cast<Expr>(Exprs[i]); + +/// getOutputConstraint - Return the constraint string for the specified +/// output operand. All output constraints are known to be non-empty (either +/// '=' or '+'). +std::string AsmStmt::getOutputConstraint(unsigned i) const { + return std::string(Constraints[i]->getStrData(), + Constraints[i]->getByteLength()); } -Expr* AsmStmt::getInputExpr(unsigned i) { + + +Expr *AsmStmt::getInputExpr(unsigned i) { return cast<Expr>(Exprs[i + NumOutputs]); } -const Expr* AsmStmt::getInputExpr(unsigned i) const { - return cast<Expr>(Exprs[i + NumOutputs]); + +/// getInputConstraint - Return the specified input constraint. Unlike output +/// constraints, these can be empty. +std::string AsmStmt::getInputConstraint(unsigned i) const { + return std::string(Constraints[i + NumOutputs]->getStrData(), + Constraints[i + NumOutputs]->getByteLength()); } //===----------------------------------------------------------------------===// diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index e6ac310b83..bcd1a86ca6 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -397,7 +397,7 @@ void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { OS << "] "; } - VisitStringLiteral(Node->getOutputConstraint(i)); + VisitStringLiteral(Node->getOutputConstraintLiteral(i)); OS << " "; Visit(Node->getOutputExpr(i)); } @@ -416,7 +416,7 @@ void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { OS << "] "; } - VisitStringLiteral(Node->getInputConstraint(i)); + VisitStringLiteral(Node->getInputConstraintLiteral(i)); OS << " "; Visit(Node->getInputExpr(i)); } diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 69ed0803c3..3fd6526777 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -919,8 +919,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { llvm::SmallVector<TargetInfo::ConstraintInfo, 4> OutputConstraintInfos; for (unsigned i = 0, e = S.getNumOutputs(); i != e; i++) { - std::string OutputConstraint(S.getOutputConstraint(i)->getStrData(), - S.getOutputConstraint(i)->getByteLength()); + std::string OutputConstraint(S.getOutputConstraint(i)); TargetInfo::ConstraintInfo Info; bool result = Target.validateOutputConstraint(OutputConstraint.c_str(), @@ -973,8 +972,7 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { for (unsigned i = 0, e = S.getNumInputs(); i != e; i++) { const Expr *InputExpr = S.getInputExpr(i); - std::string InputConstraint(S.getInputConstraint(i)->getStrData(), - S.getInputConstraint(i)->getByteLength()); + std::string InputConstraint(S.getInputConstraint(i)); TargetInfo::ConstraintInfo Info; bool result = Target.validateInputConstraint(InputConstraint.c_str(), |