r212425 - Add an AST node for __leave statements, hook it up.

Nico Weber thakis at chromium.org
Sun Jul 6 18:00:41 PDT 2014


I didn't modify AddStmtExprs() in ASTWriter.cpp, since none of the SEH
nodes are in there (and e.g. STMT_CXX_TRY isn't either). Does anyone know
what this function is good for, and if it should be updated with STMTs that
are currently missing from there?


On Sun, Jul 6, 2014 at 5:12 PM, Nico Weber <nicolasweber at gmx.de> wrote:

> Author: nico
> Date: Sun Jul  6 19:12:30 2014
> New Revision: 212425
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212425&view=rev
> Log:
> Add an AST node for __leave statements, hook it up.
>
> Codegen is still missing (and I won't work on that), but __leave is now
> as implemented as __try and friends.
>
> Modified:
>     cfe/trunk/include/clang-c/Index.h
>     cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
>     cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>     cfe/trunk/include/clang/AST/Stmt.h
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Basic/StmtNodes.td
>     cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>     cfe/trunk/lib/AST/StmtPrinter.cpp
>     cfe/trunk/lib/AST/StmtProfile.cpp
>     cfe/trunk/lib/CodeGen/CGException.cpp
>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>     cfe/trunk/lib/Sema/SemaStmt.cpp
>     cfe/trunk/lib/Sema/TreeTransform.h
>     cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>     cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>     cfe/trunk/test/CodeGen/exceptions-seh.c
>     cfe/trunk/test/Sema/__try.c
>     cfe/trunk/tools/libclang/CIndex.cpp
>     cfe/trunk/tools/libclang/CXCursor.cpp
>
> Modified: cfe/trunk/include/clang-c/Index.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang-c/Index.h (original)
> +++ cfe/trunk/include/clang-c/Index.h Sun Jul  6 19:12:30 2014
> @@ -2155,7 +2155,11 @@ enum CXCursorKind {
>     */
>    CXCursor_OMPSingleDirective            = 237,
>
> -  CXCursor_LastStmt                      = CXCursor_OMPSingleDirective,
> +  /** \brief Windows Structured Exception Handling's leave statement.
> +   */
> +  CXCursor_SEHLeaveStmt                  = 238,
> +
> +  CXCursor_LastStmt                      = CXCursor_SEHLeaveStmt,
>
>    /**
>     * \brief Cursor that represents the translation unit itself.
>
> Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Sun Jul  6
> 19:12:30 2014
> @@ -2232,6 +2232,7 @@ DEF_TRAVERSE_STMT(UnresolvedMemberExpr,
>  DEF_TRAVERSE_STMT(SEHTryStmt, {})
>  DEF_TRAVERSE_STMT(SEHExceptStmt, {})
>  DEF_TRAVERSE_STMT(SEHFinallyStmt, {})
> +DEF_TRAVERSE_STMT(SEHLeaveStmt, {})
>  DEF_TRAVERSE_STMT(CapturedStmt, {
> TRY_TO(TraverseDecl(S->getCapturedDecl())); })
>
>  DEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Sun Jul  6 19:12:30
> 2014
> @@ -2254,6 +2254,7 @@ DEF_TRAVERSE_STMT(UnresolvedMemberExpr,
>  DEF_TRAVERSE_STMT(SEHTryStmt, {})
>  DEF_TRAVERSE_STMT(SEHExceptStmt, {})
>  DEF_TRAVERSE_STMT(SEHFinallyStmt, {})
> +DEF_TRAVERSE_STMT(SEHLeaveStmt, {})
>  DEF_TRAVERSE_STMT(CapturedStmt, {
> TRY_TO(TraverseDecl(S->getCapturedDecl())); })
>
>  DEF_TRAVERSE_STMT(CXXOperatorCallExpr, {})
>
> Modified: cfe/trunk/include/clang/AST/Stmt.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Stmt.h (original)
> +++ cfe/trunk/include/clang/AST/Stmt.h Sun Jul  6 19:12:30 2014
> @@ -1936,6 +1936,31 @@ public:
>    }
>  };
>
> +/// Represents a __leave statement.
> +///
> +class SEHLeaveStmt : public Stmt {
> +  SourceLocation LeaveLoc;
> +public:
> +  explicit SEHLeaveStmt(SourceLocation LL)
> +      : Stmt(SEHLeaveStmtClass), LeaveLoc(LL) {}
> +
> +  /// \brief Build an empty __leave statement.
> +  explicit SEHLeaveStmt(EmptyShell Empty) : Stmt(SEHLeaveStmtClass,
> Empty) { }
> +
> +  SourceLocation getLeaveLoc() const { return LeaveLoc; }
> +  void setLeaveLoc(SourceLocation L) { LeaveLoc = L; }
> +
> +  SourceLocation getLocStart() const LLVM_READONLY { return LeaveLoc; }
> +  SourceLocation getLocEnd() const LLVM_READONLY { return LeaveLoc; }
> +
> +  static bool classof(const Stmt *T) {
> +    return T->getStmtClass() == SEHLeaveStmtClass;
> +  }
> +
> +  // Iterators
> +  child_range children() { return child_range(); }
> +};
> +
>  /// \brief This captures a statement into a function. For example, the
> following
>  /// pragma annotated compound statement can be represented as a
> CapturedStmt,
>  /// and this compound statement is the body of an anonymous outlined
> function.
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Jul  6
> 19:12:30 2014
> @@ -5153,8 +5153,6 @@ def err_need_header_before_typeid : Erro
>    "you need to include <typeinfo> before using the 'typeid' operator">;
>  def err_need_header_before_ms_uuidof : Error<
>    "you need to include <guiddef.h> before using the '__uuidof' operator">;
> -def err_ms___leave_unimplemented : Error<
> -  "__leave support not implemented yet">;
>  def err_ms___leave_not_in___try : Error<
>    "'__leave' statement not in __try block">;
>  def err_uuidof_without_guid : Error<
>
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Sun Jul  6 19:12:30 2014
> @@ -170,6 +170,7 @@ def CXXUuidofExpr : DStmt<Expr>;
>  def SEHTryStmt : Stmt;
>  def SEHExceptStmt : Stmt;
>  def SEHFinallyStmt : Stmt;
> +def SEHLeaveStmt : Stmt;
>  def MSDependentExistsStmt : Stmt;
>
>  // OpenCL Extensions.
>
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Sun Jul  6
> 19:12:30 2014
> @@ -1334,6 +1334,7 @@ namespace clang {
>        EXPR_CXX_PROPERTY_REF_EXPR, // MSPropertyRefExpr
>        EXPR_CXX_UUIDOF_EXPR,       // CXXUuidofExpr (of expr).
>        EXPR_CXX_UUIDOF_TYPE,       // CXXUuidofExpr (of type).
> +      STMT_SEH_LEAVE,             // SEHLeaveStmt
>        STMT_SEH_EXCEPT,            // SEHExceptStmt
>        STMT_SEH_FINALLY,           // SEHFinallyStmt
>        STMT_SEH_TRY,               // SEHTryStmt
>
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Sun Jul  6 19:12:30 2014
> @@ -573,6 +573,11 @@ void StmtPrinter::VisitSEHFinallyStmt(SE
>    OS << "\n";
>  }
>
> +void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
> +  Indent() << "__leave;";
> +  if (Policy.IncludeNewlines) OS << "\n";
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  //  OpenMP clauses printing methods
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
> +++ cfe/trunk/lib/AST/StmtProfile.cpp Sun Jul  6 19:12:30 2014
> @@ -214,6 +214,10 @@ void StmtProfiler::VisitSEHExceptStmt(co
>    VisitStmt(S);
>  }
>
> +void StmtProfiler::VisitSEHLeaveStmt(const SEHLeaveStmt *S) {
> +  VisitStmt(S);
> +}
> +
>  void StmtProfiler::VisitCapturedStmt(const CapturedStmt *S) {
>    VisitStmt(S);
>  }
>
> Modified: cfe/trunk/lib/CodeGen/CGException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGException.cpp Sun Jul  6 19:12:30 2014
> @@ -1632,3 +1632,7 @@ llvm::BasicBlock *CodeGenFunction::getEH
>  void CodeGenFunction::EmitSEHTryStmt(const SEHTryStmt &S) {
>    CGM.ErrorUnsupported(&S, "SEH __try");
>  }
> +
> +void CodeGenFunction::EmitSEHLeaveStmt(const SEHLeaveStmt &S) {
> +  CGM.ErrorUnsupported(&S, "SEH __leave");
> +}
>
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Sun Jul  6 19:12:30 2014
> @@ -173,6 +173,9 @@ void CodeGenFunction::EmitStmt(const Stm
>    case Stmt::SEHTryStmtClass:
>      EmitSEHTryStmt(cast<SEHTryStmt>(*S));
>      break;
> +  case Stmt::SEHLeaveStmtClass:
> +    EmitSEHLeaveStmt(cast<SEHLeaveStmt>(*S));
> +    break;
>    case Stmt::OMPParallelDirectiveClass:
>      EmitOMPParallelDirective(cast<OMPParallelDirective>(*S));
>      break;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sun Jul  6 19:12:30 2014
> @@ -1889,6 +1889,7 @@ public:
>
>    void EmitCXXTryStmt(const CXXTryStmt &S);
>    void EmitSEHTryStmt(const SEHTryStmt &S);
> +  void EmitSEHLeaveStmt(const SEHLeaveStmt &S);
>    void EmitCXXForRangeStmt(const CXXForRangeStmt &S,
>                             const ArrayRef<const Attr *> &Attrs = None);
>
>
> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Sun Jul  6 19:12:30 2014
> @@ -3285,7 +3285,7 @@ Sema::ActOnSEHLeaveStmt(SourceLocation L
>    if (!SEHTryParent)
>      return StmtError(Diag(Loc, diag::err_ms___leave_not_in___try));
>
> -  return StmtError(Diag(Loc, diag::err_ms___leave_unimplemented));
> +  return new (Context) SEHLeaveStmt(Loc);
>  }
>
>  StmtResult Sema::BuildMSDependentExistsStmt(SourceLocation KeywordLoc,
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Sun Jul  6 19:12:30 2014
> @@ -6376,6 +6376,12 @@ StmtResult TreeTransform<Derived>::Trans
>      return
> getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
>  }
>
> +template<typename Derived>
> +StmtResult
> +TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
> +  return S;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // OpenMP directive transformation
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Sun Jul  6 19:12:30 2014
> @@ -1609,6 +1609,11 @@ void ASTStmtReader::VisitCXXUuidofExpr(C
>    E->setExprOperand(Reader.ReadSubExpr());
>  }
>
> +void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
> +  VisitStmt(S);
> +  S->setLeaveLoc(ReadSourceLocation(Record, Idx));
> +}
> +
>  void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
>    VisitStmt(S);
>    S->Loc = ReadSourceLocation(Record, Idx);
> @@ -2381,6 +2386,9 @@ Stmt *ASTReader::ReadStmtFromStream(Modu
>      case EXPR_OBJC_BOOL_LITERAL:
>        S = new (Context) ObjCBoolLiteralExpr(Empty);
>        break;
> +    case STMT_SEH_LEAVE:
> +      S = new (Context) SEHLeaveStmt(Empty);
> +      break;
>      case STMT_SEH_EXCEPT:
>        S = new (Context) SEHExceptStmt(Empty);
>        break;
>
> Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Sun Jul  6 19:12:30 2014
> @@ -1650,6 +1650,12 @@ void ASTStmtWriter::VisitSEHTryStmt(SEHT
>    Code = serialization::STMT_SEH_TRY;
>  }
>
> +void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
> +  VisitStmt(S);
> +  Writer.AddSourceLocation(S->getLeaveLoc(), Record);
> +  Code = serialization::STMT_SEH_LEAVE;
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // OpenMP Clauses.
>
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/test/CodeGen/exceptions-seh.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh.c?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/exceptions-seh.c (original)
> +++ cfe/trunk/test/CodeGen/exceptions-seh.c Sun Jul  6 19:12:30 2014
> @@ -7,6 +7,7 @@ int SaveDiv(int numerator, int denominat
>    int myres = 0;
>    __try {
>      myres = numerator / denominator;
> +    __leave;
>    } __except (1) {
>      return 0;
>    }
>
> Modified: cfe/trunk/test/Sema/__try.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/__try.c?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Sema/__try.c (original)
> +++ cfe/trunk/test/Sema/__try.c Sun Jul  6 19:12:30 2014
> @@ -171,21 +171,18 @@ void TEST() {
>    (void)AbnormalTermination();  // expected-error{{only allowed in
> __finally block}}
>  }
>
> -void test___leave() {
> +void test_seh_leave_stmt() {
>    __leave; // expected-error{{'__leave' statement not in __try block}}
>
>    __try {
> -    // FIXME: should be fine
> -    __leave; // expected-error{{not implemented yet}}
> -    // FIXME: should say "expected ';' after __leave statement"
> -    __leave 4; // expected-error{{not implemented yet}}
> expected-warning{{expression result unused}}
> +    __leave;
> +    __leave 4; // expected-error{{expected ';' after __leave statement}}
>    } __except(1) {
>      __leave; // expected-error{{'__leave' statement not in __try block}}
>    }
>
>    __try {
> -    // FIXME: should be fine
> -    __leave; // expected-error{{not implemented yet}}
> +    __leave;
>    } __finally {
>      __leave; // expected-error{{'__leave' statement not in __try block}}
>    }
>
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Sun Jul  6 19:12:30 2014
> @@ -3893,6 +3893,8 @@ CXString clang_getCursorKindSpelling(enu
>        return cxstring::createRef("SEHExceptStmt");
>    case CXCursor_SEHFinallyStmt:
>        return cxstring::createRef("SEHFinallyStmt");
> +  case CXCursor_SEHLeaveStmt:
> +      return cxstring::createRef("SEHLeaveStmt");
>    case CXCursor_NullStmt:
>        return cxstring::createRef("NullStmt");
>    case CXCursor_InvalidFile:
>
> Modified: cfe/trunk/tools/libclang/CXCursor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=212425&r1=212424&r2=212425&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXCursor.cpp (original)
> +++ cfe/trunk/tools/libclang/CXCursor.cpp Sun Jul  6 19:12:30 2014
> @@ -215,6 +215,10 @@ CXCursor cxcursor::MakeCXCursor(const St
>    case Stmt::SEHFinallyStmtClass:
>      K = CXCursor_SEHFinallyStmt;
>      break;
> +
> +  case Stmt::SEHLeaveStmtClass:
> +    K = CXCursor_SEHLeaveStmt;
> +    break;
>
>    case Stmt::ArrayTypeTraitExprClass:
>    case Stmt::AsTypeExprClass:
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140706/ab20490b/attachment.html>


More information about the cfe-commits mailing list