Changes in / [2c6c893:a4683611]


Ignore:
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • doc/working/exception/impl/except.c

    r2c6c893 ra4683611  
    44
    55#include "lsda.h"
    6 
    7 // This macro should be the only thing that needs to change across machines.
    8 // struct _Unwind_Context * -> _Unwind_Reason_Code(*)()
    9 #define MATCHER_FROM_CONTEXT(ptr_to_context) \
    10         (*(_Unwind_Reason_Code(**)())(_Unwind_GetCFA(ptr_to_context) + 8))
    11 
    126
    137//Global which defines the current exception
     
    2317                     struct _Unwind_Exception* unwind_exception, struct _Unwind_Context* context)
    2418{
    25         printf("CFA: 0x%lx\n", _Unwind_GetCFA(context));
    26 
    2719        //DEBUG
    2820        printf("Personality function (%d, %x, %llu, %p, %p):", version, actions, exceptionClass, unwind_exception, context);
     
    119111
    120112                                        //Get a function pointer from the relative offset and call it
    121                                         // _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;                                   
    122 
    123                                         _Unwind_Reason_Code (*matcher)() =
    124                                                 MATCHER_FROM_CONTEXT(context);
     113                                        _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;                                     
    125114                                        _Unwind_Reason_Code ret = matcher();
    126115
  • doc/working/exception/impl/main.c

    r2c6c893 ra4683611  
    11#include <stdio.h>
    22#include "except.h"
    3 
    4 // Requires -fexceptions to work.
    53
    64#define EXCEPTION 2
     
    2826extern int this_exception;
    2927_Unwind_Reason_Code foo_try_match() {
    30         printf(" (foo_try_match called)");
    31         return this_exception == EXCEPTION ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
     28        return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
    3229}
    3330
     
    3734//for details
    3835__attribute__((noinline))
    39 void try( void (*try_block)(), void (*catch_block)(),
    40           _Unwind_Reason_Code (*match_block)() )
     36void try( void (*try_block)(), void (*catch_block)() )
    4137{
    42         volatile int xy = 0;
    43         printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
    44 
    4538        //Setup statments
    4639        //These 2 statments won't actually result in any code,
     
    10295        "       .uleb128 .CATCH-try\n"                          //Hanlder landing pad adress  (relative to start of function)
    10396        "       .uleb128 1\n"                                           //Action code, gcc seems to use always 0
     97        //Beyond this point we don't match gcc data'
     98        "       .uleb128 foo_try_match-try\n"                   //Handler routine to check if the exception is matched
    10499        ".LLSDACSECFA2:\n"                                              //BODY end
    105100        "       .text\n"                                                        //TABLE footer
     
    127122
    128123        //Actual call to the try block
    129         try( foo_try_block, foo_catch_block, foo_try_match );
     124        try( foo_try_block, foo_catch_block );
    130125
    131126        printf( "Foo exited normally\n" );
    132127}
    133128
    134 // Not in main.cfa
    135 void fy() {
    136         // Currently not destroyed if the exception is caught in fee.
    137         raii_t a = { "Fy dtor" };
    138 
    139         void fy_try_block() {
    140                 raii_t b = { "Fy try dtor" };
    141 
    142                 throw( 3 );
    143         }
    144 
    145         void fy_catch_block() {
    146                 printf("Fy caught exception\n");
    147         }
    148 
    149         _Unwind_Reason_Code fy_match_block() {
    150                 return this_exception == 2 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
    151         }
    152 
    153         try(fy_try_block, fy_catch_block, fy_match_block);
    154 
    155         printf( "Fy exited normally\n" );
    156 }
    157 
    158 void fee() {
    159         raii_t a = { "Fee dtor" };
    160 
    161         void fee_try_block() {
    162                 raii_t b = { "Fee try dtor" };
    163 
    164                 fy();
    165 
    166                 printf("fy returned\n");
    167         }
    168 
    169         void fee_catch_block() {
    170                 printf("Fee caught exception\n");
    171         }
    172 
    173         _Unwind_Reason_Code fee_match_block() {
    174                 return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
    175         }
    176 
    177         try(fee_try_block, fee_catch_block, fee_match_block);
    178 
    179         printf( "Fee exited normally\n" );
    180 }
    181 // End not in main.cfa
    182 
    183129int main() {
    184130        raii_t a = { "Main dtor" };
    185131
    186         //for (unsigned int i = 0 ; i < 100000000 ; ++i)
    187         foo();
    188         fee();
     132        for (unsigned int i = 0 ; i < 100000000 ; ++i) foo();
    189133
    190134        printf("End of program reached\n");
  • doc/working/exception/reference.c

    r2c6c893 ra4683611  
    114114// __builtin_eh_return_data_regno(^) ^=[0..3]? gives index.
    115115
    116 // Locally we also seem to have:
    117 _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
    118116
    119117// GCC (Dwarf2 ?) Frame Layout Macros
    120 // See: https://gcc.gnu.org/onlinedocs/gccint/Frame-Layout.html
    121 // Include from: ???
     118// https://gcc.gnu.org/onlinedocs/gccint/Frame-Layout.html
    122119
    123120FIRST_PARAM_OFFSET(fundecl)
  • src/Common/PassVisitor.impl.h

    r2c6c893 ra4683611  
    11#pragma once
    2 
    3 #define VISIT_START( node )  \
    4         call_previsit( node ); \
    5 
    6 #define VISIT_END( node )                \
    7         return call_postvisit( node ); \
    82
    93#define MUTATE_START( node )  \
    104        call_premutate( node ); \
    115
     6
    127#define MUTATE_END( type, node )                \
    138        return call_postmutate< type * >( node ); \
     
    1510
    1611#define VISIT_BODY( node )    \
    17         VISIT_START( node );  \
     12        call_previsit( node );  \
    1813        Visitor::visit( node ); \
    19         VISIT_END( node ); \
     14        call_postvisit( node ); \
    2015
    2116
     
    4439                if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
    4540                try {
    46                         (*i)->accept( *this );
     41                        *i = (*i)->accept( *this );
    4742                } catch ( SemanticError &e ) {
    4843                        errors.append( e );
     
    8378        ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
    8479
    85         maybeAccept( stmt, *this );
     80        Statement *newStmt = maybeVisit( stmt, *this );
    8681
    8782        StmtList_t* beforeStmts = get_beforeStmts();
    8883        StmtList_t* afterStmts  = get_afterStmts();
    8984
    90         if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; }
     85        if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; }
    9186
    9287        CompoundStmt *compound = new CompoundStmt( noLabels );
    9388        if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
    94         compound->get_kids().push_back( stmt );
     89        compound->get_kids().push_back( newStmt );
    9590        if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
    9691        return compound;
     
    192187}
    193188
    194 //--------------------------------------------------------------------------
    195 // CompoundStmt
    196189template< typename pass_type >
    197190void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
    198         VISIT_START( node );
    199         call_beginScope();
    200 
    201         visitStatementList( node->get_kids() );
    202 
    203         call_endScope();
    204         VISIT_END( node );
     191        VISIT_BODY( node );
    205192}
    206193
     
    216203}
    217204
    218 //--------------------------------------------------------------------------
    219 // ExprStmt
    220205template< typename pass_type >
    221206void PassVisitor< pass_type >::visit( ExprStmt * node ) {
    222         VISIT_START( node );
    223         call_beginScope();
    224 
    225         visitExpression( node->get_expr() );
    226 
    227         call_endScope();
    228         VISIT_END( node );
     207        VISIT_BODY( node );
    229208}
    230209
     
    243222}
    244223
    245 //--------------------------------------------------------------------------
    246 // IfStmt
    247224template< typename pass_type >
    248225void PassVisitor< pass_type >::visit( IfStmt * node ) {
    249         VISIT_START( node );
    250 
    251         visitExpression( node->get_condition() );
    252         node->set_thenPart ( visitStatement( node->get_thenPart() ) );
    253         node->set_elsePart ( visitStatement( node->get_elsePart() ) );
    254 
    255         VISIT_END( node );
     226        VISIT_BODY( node );
    256227}
    257228
     
    267238}
    268239
    269 //--------------------------------------------------------------------------
    270 // WhileStmt
    271240template< typename pass_type >
    272241void PassVisitor< pass_type >::visit( WhileStmt * node ) {
    273         VISIT_START( node );
    274 
    275         visitExpression( node->get_condition() );
    276         node->set_body( visitStatement( node->get_body() ) );
    277 
    278         VISIT_END( node );
     242        VISIT_BODY( node );
    279243}
    280244
     
    289253}
    290254
    291 //--------------------------------------------------------------------------
    292 // WhileStmt
     255
    293256template< typename pass_type >
    294257void PassVisitor< pass_type >::visit( ForStmt * node ) {
    295         VISIT_START( node );
    296 
    297         acceptAll( node->get_initialization(), *this );
    298         visitExpression( node->get_condition() );
    299         visitExpression( node->get_increment() );
    300         node->set_body( visitStatement( node->get_body() ) );
    301 
    302         VISIT_END( node );
     258        VISIT_BODY( node );
    303259}
    304260
     
    308264
    309265        mutateAll( node->get_initialization(), *this );
    310         node->set_condition( mutateExpression( node->get_condition() ) );
    311         node->set_increment( mutateExpression( node->get_increment() ) );
    312         node->set_body( mutateStatement( node->get_body() ) );
     266        node->set_condition(  mutateExpression( node->get_condition() ) );
     267        node->set_increment(  mutateExpression( node->get_increment() ) );
     268        node->set_body(  mutateStatement( node->get_body() ) );
    313269
    314270        MUTATE_END( Statement, node );
    315271}
    316272
    317 //--------------------------------------------------------------------------
    318 // SwitchStmt
    319273template< typename pass_type >
    320274void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
    321         VISIT_START( node );
    322 
    323         visitExpression( node->get_condition() );
    324         visitStatementList( node->get_statements() );
    325 
    326         VISIT_END( node );
     275        VISIT_BODY( node );
    327276}
    328277
     
    337286}
    338287
    339 //--------------------------------------------------------------------------
    340 // SwitchStmt
    341288template< typename pass_type >
    342289void PassVisitor< pass_type >::visit( CaseStmt * node ) {
    343         VISIT_START( node );
    344        
    345         visitExpression( node->get_condition() );
    346         visitStatementList( node->get_statements() );
    347        
    348         VISIT_END( node );
     290        VISIT_BODY( node );
    349291}
    350292
     
    364306}
    365307
    366 //--------------------------------------------------------------------------
    367 // ReturnStmt
    368308template< typename pass_type >
    369309void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
    370         VISIT_START( node );
    371 
    372         visitExpression( node->get_expr() );
    373 
    374         VISIT_END( node );
     310        VISIT_BODY( node );
    375311}
    376312
     
    384320}
    385321
    386 //--------------------------------------------------------------------------
    387 // TryStmt
    388322template< typename pass_type >
    389323void PassVisitor< pass_type >::visit( TryStmt * node ) {
    390         VISIT_START( node );
    391 
    392         maybeAccept( node->get_block(), *this );
    393         acceptAll( node->get_catchers(), *this );
    394 
    395         VISIT_END( node );
     324        VISIT_BODY( node );
    396325}
    397326
     
    406335}
    407336
    408 //--------------------------------------------------------------------------
    409 // CatchStmt
    410337template< typename pass_type >
    411338void PassVisitor< pass_type >::visit( CatchStmt * node ) {
    412         VISIT_START( node );
    413 
    414         node->set_body( visitStatement( node->get_body() ) );
    415         maybeAccept( node->get_decl(), *this );
    416 
    417         VISIT_END( node );
     339        VISIT_BODY( node );
    418340}
    419341
     
    453375}
    454376
    455 //--------------------------------------------------------------------------
    456 // UntypedExpr
    457377template< typename pass_type >
    458378void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
    459         VISIT_START( node );
    460 
    461         for ( auto expr : node->get_args() ) {
    462                 visitExpression( expr );
    463         }
    464 
    465         VISIT_END( node );
     379        VISIT_BODY( node );
    466380}
    467381
     
    622536}
    623537
    624 //--------------------------------------------------------------------------
    625 // UntypedExpr
    626538template< typename pass_type >
    627539void PassVisitor< pass_type >::visit( StmtExpr * node ) {
    628         VISIT_START( node );
    629 
    630         // don't want statements from outer CompoundStmts to be added to this StmtExpr
    631         ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
    632         ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
    633         ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
    634 
    635         Visitor::visit( node );
    636 
    637         VISIT_END( node );
     540        VISIT_BODY( node );
    638541}
    639542
     
    737640}
    738641
    739 //--------------------------------------------------------------------------
    740 // UntypedExpr
    741642template< typename pass_type >
    742643void PassVisitor< pass_type >::visit( SingleInit * node ) {
    743         VISIT_START( node );
    744 
    745         visitExpression( node->get_value() );
    746 
    747         VISIT_END( node );
     644        VISIT_BODY( node );
    748645}
    749646
  • src/Makefile.am

    r2c6c893 ra4683611  
    4343driver_cfa_cpp_SOURCES = ${SRC}
    4444driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
    45 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
     45driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Werror -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    4646driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
    4747
  • src/Makefile.in

    r2c6c893 ra4683611  
    447447driver_cfa_cpp_SOURCES = ${SRC}
    448448driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
    449 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
     449driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Werror -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    450450driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
    451451all: $(BUILT_SOURCES)
Note: See TracChangeset for help on using the changeset viewer.