Changeset 21ad568


Ignore:
Timestamp:
Dec 14, 2023, 1:55:49 PM (7 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
ca9d65e
Parents:
610354a (diff), 142930b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    r610354a r21ad568  
    5555}
    5656
    57 struct __cfaehm_base_exception_t * __cfaehm_get_current_exception(void) {
    58         return this_exception_context()->current_exception;
    59 }
    6057
    6158// RESUMPTION ================================================================
     
    312309                struct _Unwind_Context * unwind_context)
    313310{
    314         //__cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(context));
     311        //! __cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(unwind_context));
    315312        __cfadbg_print_safe(exception, "Personality function (%d, %x, %llu, %p, %p):",
    316313                        version, actions, exception_class, unwind_exception, unwind_context);
     
    482479// and simply linked from libcfa but there is one problem left, see the exception table for details
    483480__attribute__((noinline))
    484 int __cfaehm_try_terminate(void (*try_block)(),
    485                 __attribute__((unused)) void (*catch_block)(int index, exception_t * except),
     481void __cfaehm_try_terminate(void (*try_block)(),
     482                void (*catch_block)(int index, exception_t * except),
    486483                __attribute__((unused)) int (*match_block)(exception_t * except)) {
    487484        //! volatile int xy = 0;
    488         //! printf("%p %p %p\n", &try_block, &match_block, &xy);
     485        //! printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
    489486
    490487        // Setup the personality routine and exception table.
     
    510507
    511508        // Normal return for when there is no throw.
    512         return 0;
     509        return;
    513510
    514511        // Exceptionnal path
     
    521518        asm volatile (".CATCH:");
    522519
    523         return EXCEPT_TO_NODE( this_exception_context()->current_exception )->handler_index;
     520        // Exception handler
     521        // Note: Saving the exception context on the stack breaks termination exceptions.
     522        catch_block( EXCEPT_TO_NODE( this_exception_context()->current_exception )->handler_index,
     523                     this_exception_context()->current_exception );
    524524}
    525525
  • libcfa/src/exception.h

    r610354a r21ad568  
    4343extern struct __cfavir_type_info __cfatid_exception_t;
    4444
    45 struct __cfaehm_base_exception_t * __cfaehm_get_current_exception(void);
    4645
    4746void __cfaehm_cancel_stack(exception_t * except) __attribute__((noreturn));
     
    5857
    5958// Function catches termination exceptions.
    60 int __cfaehm_try_terminate(
     59void __cfaehm_try_terminate(
    6160        void (*try_block)(),
    6261        void (*catch_block)(int index, exception_t * except),
  • src/ControlStruct/ExceptTranslate.cpp

    r610354a r21ad568  
    482482                ast::FunctionDecl * terminate_catch,
    483483                ast::FunctionDecl * terminate_match ) {
    484         // {
    485         //     int __handler_index = __cfaehm_try_terminate(`try`, `match`);
    486         //     if ( __handler_index ) {
    487         //         `catch`( __handler_index, __cfaehm_get_current_exception() );
    488         //     }
    489         // }
    490 
    491         ast::ObjectDecl * index = new ast::ObjectDecl( loc, "__handler_index",
    492                 new ast::BasicType( ast::BasicType::SignedInt ),
    493                 new ast::SingleInit( loc,
    494                         new ast::UntypedExpr( loc,
    495                                 new ast::NameExpr( loc, "__cfaehm_try_terminate" ),
    496                                 {
    497                                         new ast::VariableExpr( loc, try_wrapper ),
    498                                         new ast::VariableExpr( loc, terminate_catch ),
    499                                         new ast::VariableExpr( loc, terminate_match ),
    500                                 }
    501                         )
    502                 )
    503         );
    504 
    505         return new ast::CompoundStmt( loc, {
    506                 new ast::DeclStmt( loc, index ),
    507                 new ast::IfStmt( loc,
    508                         new ast::VariableExpr( loc, index ),
    509                         new ast::ExprStmt( loc,
    510                                 new ast::UntypedExpr( loc,
    511                                         new ast::VariableExpr( loc, terminate_catch ),
    512                                         {
    513                                                 new ast::VariableExpr( loc, index ),
    514                                                 new ast::UntypedExpr( loc,
    515                                                         new ast::NameExpr( loc, "__cfaehm_get_current_exception" )
    516                                                 ),
    517                                         }
    518                                 )
    519                         )
    520                 ),
    521         } );
     484        // { __cfaehm_try_terminate(`try`, `catch`, `match`); }
     485
     486        ast::UntypedExpr * caller = new ast::UntypedExpr(loc, new ast::NameExpr(loc,
     487                "__cfaehm_try_terminate" ) );
     488        caller->args.push_back( new ast::VariableExpr(loc, try_wrapper ) );
     489        caller->args.push_back( new ast::VariableExpr(loc, terminate_catch ) );
     490        caller->args.push_back( new ast::VariableExpr(loc, terminate_match ) );
     491
     492        ast::CompoundStmt * callStmt = new ast::CompoundStmt(loc);
     493        callStmt->push_back( new ast::ExprStmt( loc, caller ) );
     494        return callStmt;
    522495}
    523496
Note: See TracChangeset for help on using the changeset viewer.