Thanks for checking that out. Good to know that it's up to date. --Sean Silva
On Sun, Sep 2, 2012 at 10:18 AM, João Matos <[email protected]> wrote: > Thanks, all the major things should be accurate. > > Just a minor thing: > - I didn't create a BuildXXX function, and followed the existing style of > the other SEH nodes by creating the node in ActOnXXX. > > If that is an issue I can fix it. And of course point 5., it's still missing > code-gen support, but I will handle that separately for all __try contructs. > > > On Sun, Sep 2, 2012 at 5:32 AM, Sean Silva <[email protected]> wrote: >> >> Since you just implemented a new Stmt, could you take a look at >> <http://clang.llvm.org/docs/InternalsManual.html#AddingExprStmt> and >> make sure that it is accurate? >> >> Thanks >> --Sean Silva >> >> On Sat, Sep 1, 2012 at 11:45 PM, Joao Matos <[email protected]> >> wrote: >> > Author: triton >> > Date: Sat Sep 1 22:45:41 2012 >> > New Revision: 163083 >> > >> > URL: http://llvm.org/viewvc/llvm-project?rev=163083&view=rev >> > Log: >> > Implemented parsing and AST support for the MS __leave exception >> > statement. Also a minor fix to __except printing in StmtPrinter.cpp. Thanks >> > to Aaron Ballman for review. >> > >> > Modified: >> > cfe/trunk/include/clang/AST/RecursiveASTVisitor.h >> > cfe/trunk/include/clang/AST/Stmt.h >> > cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >> > cfe/trunk/include/clang/Basic/StmtNodes.td >> > cfe/trunk/include/clang/Sema/Scope.h >> > cfe/trunk/include/clang/Sema/Sema.h >> > cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> > cfe/trunk/lib/AST/Stmt.cpp >> > cfe/trunk/lib/AST/StmtPrinter.cpp >> > cfe/trunk/lib/AST/StmtProfile.cpp >> > cfe/trunk/lib/CodeGen/CGStmt.cpp >> > cfe/trunk/lib/Parse/ParseStmt.cpp >> > 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/lib/StaticAnalyzer/Core/ExprEngine.cpp >> > cfe/trunk/test/Parser/MicrosoftExtensions.c >> > cfe/trunk/tools/libclang/RecursiveASTVisitor.h >> > >> > Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) >> > +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Sat Sep 1 >> > 22:45:41 2012 >> > @@ -2202,6 +2202,7 @@ >> > }) >> > >> > DEF_TRAVERSE_STMT(SEHTryStmt, {}) >> > +DEF_TRAVERSE_STMT(SEHLeaveStmt, {}) >> > DEF_TRAVERSE_STMT(SEHExceptStmt, {}) >> > DEF_TRAVERSE_STMT(SEHFinallyStmt,{}) >> > >> > >> > Modified: cfe/trunk/include/clang/AST/Stmt.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/AST/Stmt.h (original) >> > +++ cfe/trunk/include/clang/AST/Stmt.h Sat Sep 1 22:45:41 2012 >> > @@ -1889,6 +1889,34 @@ >> > static bool classof(SEHTryStmt *) { return true; } >> > }; >> > >> > +class SEHLeaveStmt : public Stmt { >> > + SourceLocation LeaveLoc; >> > + >> > + SEHLeaveStmt(SourceLocation LeaveLoc); >> > + >> > + friend class ASTReader; >> > + friend class ASTStmtReader; >> > + explicit SEHLeaveStmt(EmptyShell E) : Stmt(SEHLeaveStmtClass, E) { } >> > + >> > +public: >> > + static SEHLeaveStmt* Create(ASTContext &C, >> > + SourceLocation LeaveLoc); >> > + >> > + SourceRange getSourceRange() const LLVM_READONLY { >> > + return SourceRange(getLeaveLoc()); >> > + } >> > + >> > + SourceLocation getLeaveLoc() const { return LeaveLoc; } >> > + >> > + child_range children() { return child_range(); } >> > + >> > + static bool classof(const Stmt *T) { >> > + return T->getStmtClass() == SEHLeaveStmtClass; >> > + } >> > + >> > + static bool classof(SEHLeaveStmt *) { return true; } >> > +}; >> > + >> > } // end namespace clang >> > >> > #endif >> > >> > Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) >> > +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Sat Sep 1 >> > 22:45:41 2012 >> > @@ -740,6 +740,9 @@ >> > >> > def err_seh___finally_block : Error< >> > "%0 only allowed in __finally block">; >> > + >> > +def err_seh___try_block : Error< >> > + "%0 only allowed in __try block">; >> > >> > } // end of Parse Issue category. >> > >> > >> > Modified: cfe/trunk/include/clang/Basic/StmtNodes.td >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Basic/StmtNodes.td (original) >> > +++ cfe/trunk/include/clang/Basic/StmtNodes.td Sat Sep 1 22:45:41 2012 >> > @@ -164,6 +164,7 @@ >> > // Microsoft Extensions. >> > def CXXUuidofExpr : DStmt<Expr>; >> > def SEHTryStmt : Stmt; >> > +def SEHLeaveStmt : Stmt; >> > def SEHExceptStmt : Stmt; >> > def SEHFinallyStmt : Stmt; >> > def MSDependentExistsStmt : Stmt; >> > >> > Modified: cfe/trunk/include/clang/Sema/Scope.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Scope.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Sema/Scope.h (original) >> > +++ cfe/trunk/include/clang/Sema/Scope.h Sat Sep 1 22:45:41 2012 >> > @@ -82,7 +82,10 @@ >> > SwitchScope = 0x800, >> > >> > /// TryScope - This is the scope of a C++ try statement. >> > - TryScope = 0x1000 >> > + TryScope = 0x1000, >> > + >> > + /// SEHTryScope - This is scope of a Microsoft SEH try statement. >> > + SEHTryScope = 0x2000 >> > }; >> > private: >> > /// The parent scope for this scope. This is null for the >> > translation-unit >> > @@ -292,6 +295,9 @@ >> > /// \brief Determine whether this scope is a C++ 'try' block. >> > bool isTryScope() const { return getFlags() & Scope::TryScope; } >> > >> > + /// \brief Determine whether this scope is a MS SEH 'try' block. >> > + bool isSEHTryScope() const { return getFlags() & Scope::SEHTryScope; >> > } >> > + >> > /// containedInPrototypeScope - Return true if this or a parent scope >> > /// is a FunctionPrototypeScope. >> > bool containedInPrototypeScope() const; >> > >> > Modified: cfe/trunk/include/clang/Sema/Sema.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Sema/Sema.h (original) >> > +++ cfe/trunk/include/clang/Sema/Sema.h Sat Sep 1 22:45:41 2012 >> > @@ -2622,6 +2622,8 @@ >> > Stmt *TryBlock, >> > Stmt *Handler); >> > >> > + StmtResult ActOnSEHLeaveStmt(SourceLocation LeaveLoc); >> > + >> > StmtResult ActOnSEHExceptBlock(SourceLocation Loc, >> > Expr *FilterExpr, >> > Stmt *Block); >> > >> > Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original) >> > +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Sat Sep 1 >> > 22:45:41 2012 >> > @@ -1204,6 +1204,7 @@ >> > STMT_SEH_EXCEPT, // SEHExceptStmt >> > STMT_SEH_FINALLY, // SEHFinallyStmt >> > STMT_SEH_TRY, // SEHTryStmt >> > + STMT_SEH_LEAVE, // SEHLeaveStmt >> > >> > // ARC >> > EXPR_OBJC_BRIDGED_CAST, // ObjCBridgedCastExpr >> > >> > Modified: cfe/trunk/lib/AST/Stmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/AST/Stmt.cpp (original) >> > +++ cfe/trunk/lib/AST/Stmt.cpp Sat Sep 1 22:45:41 2012 >> > @@ -1006,6 +1006,17 @@ >> > return dyn_cast<SEHFinallyStmt>(getHandler()); >> > } >> > >> > +SEHLeaveStmt::SEHLeaveStmt(SourceLocation LeaveLoc) >> > + : Stmt(SEHLeaveStmtClass), >> > + LeaveLoc(LeaveLoc) >> > +{ >> > +} >> > + >> > +SEHLeaveStmt* SEHLeaveStmt::Create(ASTContext &C, >> > + SourceLocation LeaveLoc) { >> > + return new(C) SEHLeaveStmt(LeaveLoc); >> > +} >> > + >> > SEHExceptStmt::SEHExceptStmt(SourceLocation Loc, >> > Expr *FilterExpr, >> > Stmt *Block) >> > >> > Modified: cfe/trunk/lib/AST/StmtPrinter.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/AST/StmtPrinter.cpp (original) >> > +++ cfe/trunk/lib/AST/StmtPrinter.cpp Sat Sep 1 22:45:41 2012 >> > @@ -537,6 +537,11 @@ >> > OS << "\n"; >> > } >> > >> > +void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) { >> > + Indent() << "__leave;"; >> > + OS << "\n"; >> > +} >> > + >> > void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { >> > OS << "__finally "; >> > PrintRawCompoundStmt(Node->getBlock()); >> > @@ -546,7 +551,7 @@ >> > void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { >> > OS << "__except ("; >> > VisitExpr(Node->getFilterExpr()); >> > - OS << ")\n"; >> > + OS << ") "; >> > PrintRawCompoundStmt(Node->getBlock()); >> > OS << "\n"; >> > } >> > >> > Modified: cfe/trunk/lib/AST/StmtProfile.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/AST/StmtProfile.cpp (original) >> > +++ cfe/trunk/lib/AST/StmtProfile.cpp Sat Sep 1 22:45:41 2012 >> > @@ -215,6 +215,10 @@ >> > VisitStmt(S); >> > } >> > >> > +void StmtProfiler::VisitSEHLeaveStmt(const SEHLeaveStmt *S) { >> > + VisitStmt(S); >> > +} >> > + >> > void StmtProfiler::VisitObjCForCollectionStmt(const >> > ObjCForCollectionStmt *S) { >> > VisitStmt(S); >> > } >> > >> > Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original) >> > +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Sat Sep 1 22:45:41 2012 >> > @@ -163,6 +163,7 @@ >> > case Stmt::CXXForRangeStmtClass: >> > EmitCXXForRangeStmt(cast<CXXForRangeStmt>(*S)); >> > case Stmt::SEHTryStmtClass: >> > + case Stmt::SEHLeaveStmtClass: >> > // FIXME Not yet implemented >> > break; >> > } >> > >> > Modified: cfe/trunk/lib/Parse/ParseStmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Parse/ParseStmt.cpp (original) >> > +++ cfe/trunk/lib/Parse/ParseStmt.cpp Sat Sep 1 22:45:41 2012 >> > @@ -183,6 +183,19 @@ >> > >> > return ParseExprStatement(); >> > } >> > + >> > + case tok::kw___leave: { >> > + Token LeaveTok = Tok; >> > + ConsumeToken(); >> > + if (getCurScope()->isSEHTryScope()) { >> > + Res = Actions.ActOnSEHLeaveStmt(LeaveTok.getLocation()); >> > + } else { >> > + Diag(LeaveTok, diag::err_seh___try_block) >> > + << LeaveTok.getIdentifierInfo()->getName(); >> > + Res = StmtError(); >> > + } >> > + break; >> > + } >> > >> > case tok::kw_case: // C99 6.8.1: labeled-statement >> > return ParseCaseStatement(); >> > @@ -322,7 +335,9 @@ >> > if(Tok.isNot(tok::l_brace)) >> > return StmtError(Diag(Tok,diag::err_expected_lbrace)); >> > >> > - StmtResult TryBlock(ParseCompoundStatement()); >> > + // Use the SEHTryScope to handle __leave as a statement. >> > + unsigned ScopeFlags = Scope::DeclScope | Scope::SEHTryScope; >> > + StmtResult TryBlock(ParseCompoundStatement(false /*isStmtExpr*/, >> > ScopeFlags)); >> > if(TryBlock.isInvalid()) >> > return TryBlock; >> > >> > >> > Modified: cfe/trunk/lib/Sema/SemaStmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) >> > +++ cfe/trunk/lib/Sema/SemaStmt.cpp Sat Sep 1 22:45:41 2012 >> > @@ -2746,6 +2746,12 @@ >> > } >> > >> > StmtResult >> > +Sema::ActOnSEHLeaveStmt(SourceLocation LeaveLoc) >> > +{ >> > + return Owned(SEHLeaveStmt::Create(Context, LeaveLoc)); >> > +} >> > + >> > +StmtResult >> > Sema::ActOnSEHExceptBlock(SourceLocation Loc, >> > Expr *FilterExpr, >> > Stmt *Block) { >> > >> > Modified: cfe/trunk/lib/Sema/TreeTransform.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Sema/TreeTransform.h (original) >> > +++ cfe/trunk/lib/Sema/TreeTransform.h Sat Sep 1 22:45:41 2012 >> > @@ -1361,6 +1361,10 @@ >> > return >> > getSema().ActOnSEHTryBlock(IsCXXTry,TryLoc,TryBlock,Handler); >> > } >> > >> > + StmtResult RebuildSEHLeaveStmt(SourceLocation LeaveLoc) { >> > + return getSema().ActOnSEHLeaveStmt(LeaveLoc); >> > + } >> > + >> > StmtResult RebuildSEHExceptStmt(SourceLocation Loc, >> > Expr *FilterExpr, >> > Stmt *Block) { >> > @@ -6001,6 +6005,12 @@ >> > >> > template<typename Derived> >> > StmtResult >> > +TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { >> > + return getDerived().RebuildSEHLeaveStmt(S->getLeaveLoc()); >> > +} >> > + >> > +template<typename Derived> >> > +StmtResult >> > TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { >> > StmtResult Block; // = >> > getDerived().TransformCompoundStatement(S->getBlock()); >> > if(Block.isInvalid()) return StmtError(); >> > >> > Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original) >> > +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Sat Sep 1 22:45:41 >> > 2012 >> > @@ -1516,6 +1516,11 @@ >> > S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); >> > } >> > >> > +void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) { >> > + VisitStmt(S); >> > + S->LeaveLoc = ReadSourceLocation(Record, Idx); >> > +} >> > + >> > >> > //===----------------------------------------------------------------------===// >> > // CUDA Expressions and Statements >> > >> > //===----------------------------------------------------------------------===// >> > @@ -1986,6 +1991,9 @@ >> > case STMT_SEH_TRY: >> > S = new (Context) SEHTryStmt(Empty); >> > break; >> > + case STMT_SEH_LEAVE: >> > + S = new (Context) SEHLeaveStmt(Empty); >> > + break; >> > case STMT_CXX_CATCH: >> > S = new (Context) CXXCatchStmt(Empty); >> > break; >> > >> > Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original) >> > +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Sat Sep 1 22:45:41 >> > 2012 >> > @@ -1554,6 +1554,12 @@ >> > Code = serialization::STMT_SEH_TRY; >> > } >> > >> > +void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) { >> > + VisitStmt(S); >> > + Writer.AddSourceLocation(S->getLeaveLoc(), Record); >> > + Code = serialization::STMT_SEH_LEAVE; >> > +} >> > + >> > >> > //===----------------------------------------------------------------------===// >> > // ASTWriter Implementation >> > >> > //===----------------------------------------------------------------------===// >> > >> > Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original) >> > +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Sat Sep 1 22:45:41 >> > 2012 >> > @@ -527,6 +527,7 @@ >> > case Stmt::PackExpansionExprClass: >> > case Stmt::SubstNonTypeTemplateParmPackExprClass: >> > case Stmt::SEHTryStmtClass: >> > + case Stmt::SEHLeaveStmtClass: >> > case Stmt::SEHExceptStmtClass: >> > case Stmt::LambdaExprClass: >> > case Stmt::SEHFinallyStmtClass: { >> > >> > Modified: cfe/trunk/test/Parser/MicrosoftExtensions.c >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/MicrosoftExtensions.c?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/test/Parser/MicrosoftExtensions.c (original) >> > +++ cfe/trunk/test/Parser/MicrosoftExtensions.c Sat Sep 1 22:45:41 2012 >> > @@ -102,3 +102,9 @@ >> > struct S7 s; >> > int i = s.t; /* expected-warning {{'t' is deprecated}} */ >> > } >> > + >> > +void SEH() { >> > + __try { __leave; } __except (0) {} >> > + __try { } __except (0) { __leave; } // expected-error {{__leave only >> > allowed in __try block}} >> > + __try { } __finally { __leave; } // expected-error {{__leave only >> > allowed in __try block}} >> > +} >> > \ No newline at end of file >> > >> > Modified: cfe/trunk/tools/libclang/RecursiveASTVisitor.h >> > URL: >> > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/RecursiveASTVisitor.h?rev=163083&r1=163082&r2=163083&view=diff >> > >> > ============================================================================== >> > --- cfe/trunk/tools/libclang/RecursiveASTVisitor.h (original) >> > +++ cfe/trunk/tools/libclang/RecursiveASTVisitor.h Sat Sep 1 22:45:41 >> > 2012 >> > @@ -2122,6 +2122,7 @@ >> > }) >> > >> > DEF_TRAVERSE_STMT(SEHTryStmt, {}) >> > +DEF_TRAVERSE_STMT(SEHLeaveStmt, {}) >> > DEF_TRAVERSE_STMT(SEHExceptStmt, {}) >> > DEF_TRAVERSE_STMT(SEHFinallyStmt,{}) >> > >> > >> > >> > _______________________________________________ >> > cfe-commits mailing list >> > [email protected] >> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > > > -- > João Matos _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
