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
