From ff93dbd887e40588ed55d135037bb9287488b285 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 30 Jan 2010 22:25:16 +0000 Subject: [PATCH] Use IdentifierInfo * instead of std::string for the AsmStmt names. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94925 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Stmt.h | 25 +++++++++++++++++++------ include/clang/Parse/Action.h | 2 +- include/clang/Parse/Parser.h | 6 +++--- lib/AST/Stmt.cpp | 4 ++-- lib/Frontend/PCHReaderStmt.cpp | 4 ++-- lib/Frontend/PCHWriterStmt.cpp | 6 +++--- lib/Frontend/PrintParserCallbacks.cpp | 2 +- lib/Parse/ParseStmt.cpp | 15 +++++++-------- lib/Sema/Sema.h | 2 +- lib/Sema/SemaStmt.cpp | 14 +++++++++++--- lib/Sema/TreeTransform.h | 8 ++++---- 11 files changed, 54 insertions(+), 34 deletions(-) diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index c94fe15116..7a251b10b9 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -1121,7 +1121,7 @@ class AsmStmt : public Stmt { unsigned NumOutputs; unsigned NumInputs; - llvm::SmallVector Names; + llvm::SmallVector Names; llvm::SmallVector Constraints; llvm::SmallVector Exprs; @@ -1129,7 +1129,7 @@ class AsmStmt : public Stmt { public: AsmStmt(SourceLocation asmloc, bool issimple, bool isvolatile, bool msasm, unsigned numoutputs, unsigned numinputs, - const std::string *names, StringLiteral **constraints, + IdentifierInfo **names, StringLiteral **constraints, Expr **exprs, StringLiteral *asmstr, unsigned numclobbers, StringLiteral **clobbers, SourceLocation rparenloc); @@ -1208,10 +1208,17 @@ public: unsigned getNumOutputs() const { return NumOutputs; } - const std::string &getOutputName(unsigned i) const { + IdentifierInfo *getOutputIdentifier(unsigned i) const { return Names[i]; } + llvm::StringRef getOutputName(unsigned i) const { + if (IdentifierInfo *II = getOutputIdentifier(i)) + return II->getName(); + + return llvm::StringRef(); + } + /// getOutputConstraint - Return the constraint string for the specified /// output operand. All output constraints are known to be non-empty (either /// '=' or '+'). @@ -1224,7 +1231,6 @@ public: return Constraints[i]; } - Expr *getOutputExpr(unsigned i); const Expr *getOutputExpr(unsigned i) const { @@ -1246,10 +1252,17 @@ public: unsigned getNumInputs() const { return NumInputs; } - const std::string &getInputName(unsigned i) const { + IdentifierInfo *getInputIdentifier(unsigned i) const { return Names[i + NumOutputs]; } + llvm::StringRef getInputName(unsigned i) const { + if (IdentifierInfo *II = getInputIdentifier(i)) + return II->getName(); + + return llvm::StringRef(); + } + /// getInputConstraint - Return the specified input constraint. Unlike output /// constraints, these can be empty. llvm::StringRef getInputConstraint(unsigned i) const; @@ -1268,7 +1281,7 @@ public: } void setOutputsAndInputsAndClobbers(ASTContext &C, - const std::string *Names, + IdentifierInfo **Names, StringLiteral **Constraints, Stmt **Exprs, unsigned NumOutputs, diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 4854fe66d4..3d470e6244 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -902,7 +902,7 @@ public: bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, - const std::string *Names, + IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, ExprArg AsmString, diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index e7cb0a2493..33f653d8f9 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -1009,9 +1009,9 @@ private: OwningStmtResult ParseReturnStatement(AttributeList *Attr); OwningStmtResult ParseAsmStatement(bool &msAsm); OwningStmtResult FuzzyParseMicrosoftAsmStatement(); - bool ParseAsmOperandsOpt(llvm::SmallVectorImpl &Names, - llvm::SmallVectorImpl &Constraints, - llvm::SmallVectorImpl &Exprs); + bool ParseAsmOperandsOpt(llvm::SmallVectorImpl &Names, + llvm::SmallVectorImpl &Constraints, + llvm::SmallVectorImpl &Exprs); //===--------------------------------------------------------------------===// // C++ 6: Statements and Blocks diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 28f7371b09..c2c2f0a409 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -158,7 +158,7 @@ llvm::StringRef AsmStmt::getInputConstraint(unsigned i) const { void AsmStmt::setOutputsAndInputsAndClobbers(ASTContext &C, - const std::string *Names, + IdentifierInfo **Names, StringLiteral **Constraints, Stmt **Exprs, unsigned NumOutputs, @@ -335,7 +335,7 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl&Pieces, AsmStmt::AsmStmt(SourceLocation asmloc, bool issimple, bool isvolatile, bool msasm, unsigned numoutputs, unsigned numinputs, - const std::string *names, StringLiteral **constraints, + IdentifierInfo **names, StringLiteral **constraints, Expr **exprs, StringLiteral *asmstr, unsigned numclobbers, StringLiteral **clobbers, SourceLocation rparenloc) : Stmt(AsmStmtClass), AsmLoc(asmloc), RParenLoc(rparenloc), AsmStr(asmstr) diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp index 4c80c87f19..aa80b362a5 100644 --- a/lib/Frontend/PCHReaderStmt.cpp +++ b/lib/Frontend/PCHReaderStmt.cpp @@ -317,11 +317,11 @@ unsigned PCHStmtReader::VisitAsmStmt(AsmStmt *S) { S->setAsmString(cast_or_null(StmtStack[StackIdx++])); // Outputs and inputs - llvm::SmallVector Names; + llvm::SmallVector Names; llvm::SmallVector Constraints; llvm::SmallVector Exprs; for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { - Names.push_back(Reader.ReadString(Record, Idx)); + Names.push_back(Reader.GetIdentifierInfo(Record, Idx)); Constraints.push_back(cast_or_null(StmtStack[StackIdx++])); Exprs.push_back(StmtStack[StackIdx++]); } diff --git a/lib/Frontend/PCHWriterStmt.cpp b/lib/Frontend/PCHWriterStmt.cpp index fdfdfefe08..13ca8cdd9f 100644 --- a/lib/Frontend/PCHWriterStmt.cpp +++ b/lib/Frontend/PCHWriterStmt.cpp @@ -287,15 +287,15 @@ void PCHStmtWriter::VisitAsmStmt(AsmStmt *S) { Writer.WriteSubStmt(S->getAsmString()); // Outputs - for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) { - Writer.AddString(S->getOutputName(I), Record); + for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) { + Writer.AddIdentifierRef(S->getOutputIdentifier(I), Record); Writer.WriteSubStmt(S->getOutputConstraintLiteral(I)); Writer.WriteSubStmt(S->getOutputExpr(I)); } // Inputs for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) { - Writer.AddString(S->getInputName(I), Record); + Writer.AddIdentifierRef(S->getInputIdentifier(I), Record); Writer.WriteSubStmt(S->getInputConstraintLiteral(I)); Writer.WriteSubStmt(S->getInputExpr(I)); } diff --git a/lib/Frontend/PrintParserCallbacks.cpp b/lib/Frontend/PrintParserCallbacks.cpp index 8f706e0371..6af33c20a6 100644 --- a/lib/Frontend/PrintParserCallbacks.cpp +++ b/lib/Frontend/PrintParserCallbacks.cpp @@ -391,7 +391,7 @@ namespace { bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, - const std::string *Names, + IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, ExprArg AsmString, diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index 88481e8b06..157e8b1a45 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1171,7 +1171,6 @@ Parser::OwningStmtResult Parser::FuzzyParseMicrosoftAsmStatement() { Tok.isNot(tok::r_brace) && Tok.isNot(tok::semi) && Tok.isNot(tok::eof)); } - llvm::SmallVector Names; Token t; t.setKind(tok::string_literal); t.setLiteralData("\"FIXME: not done\""); @@ -1181,7 +1180,7 @@ Parser::OwningStmtResult Parser::FuzzyParseMicrosoftAsmStatement() { ExprVector Constraints(Actions); ExprVector Exprs(Actions); ExprVector Clobbers(Actions); - return Actions.ActOnAsmStmt(Tok.getLocation(), true, true, 0, 0, Names.data(), + return Actions.ActOnAsmStmt(Tok.getLocation(), true, true, 0, 0, 0, move_arg(Constraints), move_arg(Exprs), move(AsmString), move_arg(Clobbers), Tok.getLocation(), true); @@ -1245,7 +1244,7 @@ Parser::OwningStmtResult Parser::ParseAsmStatement(bool &msAsm) { if (AsmString.isInvalid()) return StmtError(); - llvm::SmallVector Names; + llvm::SmallVector Names; ExprVector Constraints(Actions); ExprVector Exprs(Actions); ExprVector Clobbers(Actions); @@ -1336,9 +1335,9 @@ Parser::OwningStmtResult Parser::ParseAsmStatement(bool &msAsm) { /// // // FIXME: Avoid unnecessary std::string trashing. -bool Parser::ParseAsmOperandsOpt(llvm::SmallVectorImpl &Names, - llvm::SmallVectorImpl &Constraints, - llvm::SmallVectorImpl &Exprs) { +bool Parser::ParseAsmOperandsOpt(llvm::SmallVectorImpl &Names, + llvm::SmallVectorImpl &Constraints, + llvm::SmallVectorImpl &Exprs) { // 'asm-operands' isn't present? if (!isTokenStringLiteral() && Tok.isNot(tok::l_square)) return false; @@ -1357,10 +1356,10 @@ bool Parser::ParseAsmOperandsOpt(llvm::SmallVectorImpl &Names, IdentifierInfo *II = Tok.getIdentifierInfo(); ConsumeToken(); - Names.push_back(II->getName()); + Names.push_back(II); MatchRHSPunctuation(tok::r_square, Loc); } else - Names.push_back(std::string()); + Names.push_back(0); OwningExprResult Constraint(ParseAsmStringLiteral()); if (Constraint.isInvalid()) { diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index b6f477f648..86dbff3037 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1478,7 +1478,7 @@ public: bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, - const std::string *Names, + IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, ExprArg AsmString, diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 1662360052..fc0fc4f9b2 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1170,7 +1170,7 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, - const std::string *Names, + IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg exprs, ExprArg asmString, @@ -1197,7 +1197,11 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, return StmtError(Diag(Literal->getLocStart(),diag::err_asm_wide_character) << Literal->getSourceRange()); - TargetInfo::ConstraintInfo Info(Literal->getString(), Names[i]); + llvm::StringRef OutputName; + if (Names[i]) + OutputName = Names[i]->getName(); + + TargetInfo::ConstraintInfo Info(Literal->getString(), OutputName); if (!Context.Target.validateOutputConstraint(Info)) return StmtError(Diag(Literal->getLocStart(), diag::err_asm_invalid_output_constraint) @@ -1222,7 +1226,11 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc, return StmtError(Diag(Literal->getLocStart(),diag::err_asm_wide_character) << Literal->getSourceRange()); - TargetInfo::ConstraintInfo Info(Literal->getString(), Names[i]); + llvm::StringRef InputName; + if (Names[i]) + InputName = Names[i]->getName(); + + TargetInfo::ConstraintInfo Info(Literal->getString(), InputName); if (!Context.Target.validateInputConstraint(OutputConstraintInfos.data(), NumOutputs, Info)) { return StmtError(Diag(Literal->getLocStart(), diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 90b5365f04..b23a69860b 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -785,7 +785,7 @@ public: bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, - const std::string *Names, + IdentifierInfo **Names, MultiExprArg Constraints, MultiExprArg Exprs, ExprArg AsmString, @@ -3352,7 +3352,7 @@ TreeTransform::TransformAsmStmt(AsmStmt *S) { ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema()); ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema()); - llvm::SmallVector Names; + llvm::SmallVector Names; OwningExprResult AsmString(SemaRef); ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema()); @@ -3361,7 +3361,7 @@ TreeTransform::TransformAsmStmt(AsmStmt *S) { // Go through the outputs. for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { - Names.push_back(S->getOutputName(I)); + Names.push_back(S->getOutputIdentifier(I)); // No need to transform the constraint literal. Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain()); @@ -3379,7 +3379,7 @@ TreeTransform::TransformAsmStmt(AsmStmt *S) { // Go through the inputs. for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { - Names.push_back(S->getInputName(I)); + Names.push_back(S->getInputIdentifier(I)); // No need to transform the constraint literal. Constraints.push_back(S->getInputConstraintLiteral(I)->Retain()); -- 2.50.1