diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-01-24 05:50:09 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-01-24 05:50:09 +0000 | 
| commit | aaeef07280fef8a8d86be631c4c817ef3e59902b (patch) | |
| tree | 310a230631f488fbca6322912f38803ab1d55db2 /clang/lib | |
| parent | b9999fdc673d80217a83fc86e373a5c416b5678c (diff) | |
| download | bcm5719-llvm-aaeef07280fef8a8d86be631c4c817ef3e59902b.tar.gz bcm5719-llvm-aaeef07280fef8a8d86be631c4c817ef3e59902b.zip | |
Implement instantiation of AsmStmts (Crazy, I know)
llvm-svn: 94361
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/Stmt.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Frontend/PrintParserCallbacks.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.h | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 87 | 
5 files changed, 92 insertions, 7 deletions
| diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index 104e3361892..821bcb51061 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -338,7 +338,7 @@ unsigned AsmStmt::AnalyzeAsmString(llvm::SmallVectorImpl<AsmStringPiece>&Pieces,  AsmStmt::AsmStmt(SourceLocation asmloc, bool issimple, bool isvolatile,                   bool msasm, unsigned numoutputs, unsigned numinputs, -                 std::string *names, StringLiteral **constraints, +                 const std::string *names, StringLiteral **constraints,                   Expr **exprs, StringLiteral *asmstr, unsigned numclobbers,                   StringLiteral **clobbers, SourceLocation rparenloc)    : Stmt(AsmStmtClass), AsmLoc(asmloc), RParenLoc(rparenloc), AsmStr(asmstr) diff --git a/clang/lib/Frontend/PrintParserCallbacks.cpp b/clang/lib/Frontend/PrintParserCallbacks.cpp index a91dd8d55e9..8f706e0371e 100644 --- a/clang/lib/Frontend/PrintParserCallbacks.cpp +++ b/clang/lib/Frontend/PrintParserCallbacks.cpp @@ -391,7 +391,7 @@ namespace {                                            bool IsVolatile,                                            unsigned NumOutputs,                                            unsigned NumInputs, -                                          std::string *Names, +                                          const std::string *Names,                                            MultiExprArg Constraints,                                            MultiExprArg Exprs,                                            ExprArg AsmString, diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index ead9feb48e3..874eabf9b73 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1418,7 +1418,7 @@ public:                                          bool IsVolatile,                                          unsigned NumOutputs,                                          unsigned NumInputs, -                                        std::string *Names, +                                        const std::string *Names,                                          MultiExprArg Constraints,                                          MultiExprArg Exprs,                                          ExprArg AsmString, diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 4653c77c86a..ca15de2cf2a 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -1131,6 +1131,10 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, ExprArg rex) {  /// This method checks to see if the argument is an acceptable l-value and  /// returns false if it is a case we can handle.  static bool CheckAsmLValue(const Expr *E, Sema &S) { +  // Type dependent expressions will be checked during instantiation. +  if (E->isTypeDependent()) +    return false; +      if (E->isLvalue(S.Context) == Expr::LV_Valid)      return false;  // Cool, this is an lvalue. @@ -1158,7 +1162,7 @@ Sema::OwningStmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,                                            bool IsVolatile,                                            unsigned NumOutputs,                                            unsigned NumInputs, -                                          std::string *Names, +                                          const std::string *Names,                                            MultiExprArg constraints,                                            MultiExprArg exprs,                                            ExprArg asmString, diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index b2102afdfc4..0158a08eb79 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -776,6 +776,28 @@ public:                                                StartLoc, EndLoc));    } +  /// \brief Build a new inline asm statement. +  /// +  /// By default, performs semantic analysis to build the new statement. +  /// Subclasses may override this routine to provide different behavior. +  OwningStmtResult RebuildAsmStmt(SourceLocation AsmLoc, +                                  bool IsSimple, +                                  bool IsVolatile, +                                  unsigned NumOutputs, +                                  unsigned NumInputs, +                                  const std::string *Names, +                                  MultiExprArg Constraints, +                                  MultiExprArg Exprs, +                                  ExprArg AsmString, +                                  MultiExprArg Clobbers, +                                  SourceLocation RParenLoc, +                                  bool MSAsm) { +    return getSema().ActOnAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,  +                                  NumInputs, Names, move(Constraints), +                                  move(Exprs), move(AsmString), move(Clobbers), +                                  RParenLoc, MSAsm); +  } +      /// \brief Build a new C++ exception declaration.    ///    /// By default, performs semantic analysis to build the new decaration. @@ -3327,9 +3349,68 @@ TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {  template<typename Derived>  Sema::OwningStmtResult  TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { -  // FIXME: Implement! -  assert(false && "Inline assembly cannot be transformed"); -  return SemaRef.Owned(S->Retain()); +   +  ASTOwningVector<&ActionBase::DeleteExpr> Constraints(getSema()); +  ASTOwningVector<&ActionBase::DeleteExpr> Exprs(getSema()); +  OwningExprResult AsmString(SemaRef); +  ASTOwningVector<&ActionBase::DeleteExpr> Clobbers(getSema()); + +  bool ExprsChanged = false; +   +  // Go through the outputs. +  for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { +    // No need to transform the constraint literal. +    Constraints.push_back(S->getOutputConstraintLiteral(I)->Retain()); +     +    // Transform the output expr. +    Expr *OutputExpr = S->getOutputExpr(I); +    OwningExprResult Result = getDerived().TransformExpr(OutputExpr); +    if (Result.isInvalid()) +      return SemaRef.StmtError(); +     +    ExprsChanged |= Result.get() != OutputExpr; +     +    Exprs.push_back(Result.takeAs<Expr>()); +  } +   +  // Go through the inputs. +  for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { +    // No need to transform the constraint literal. +    Constraints.push_back(S->getInputConstraintLiteral(I)->Retain()); +     +    // Transform the input expr. +    Expr *InputExpr = S->getInputExpr(I); +    OwningExprResult Result = getDerived().TransformExpr(InputExpr); +    if (Result.isInvalid()) +      return SemaRef.StmtError(); +     +    ExprsChanged |= Result.get() != InputExpr; +     +    Exprs.push_back(Result.takeAs<Expr>()); +  } +   +  if (!getDerived().AlwaysRebuild() && !ExprsChanged) +    return SemaRef.Owned(S->Retain()); + +  // Go through the clobbers. +  for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) +    Clobbers.push_back(S->getClobber(I)->Retain()); + +  // No need to transform the asm string literal. +  AsmString = SemaRef.Owned(S->getAsmString()); + +  return getDerived().RebuildAsmStmt(S->getAsmLoc(), +                                     S->isSimple(), +                                     S->isVolatile(), +                                     S->getNumOutputs(), +                                     S->getNumInputs(), +                                     S->begin_output_names(), +                                     move_arg(Constraints), +                                     move_arg(Exprs), +                                     move(AsmString), +                                     move_arg(Clobbers), +                                     S->getRParenLoc(), +                                     S->isMSAsm());  } | 

