Ignore:
Timestamp:
Feb 7, 2018, 9:59:03 AM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
0723a57, 5f4f31f
Parents:
10f8142 (diff), a424315d (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:/u/cforall/software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/interpose.c

    r10f8142 r695571c  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Feb  5 23:40:04 2018
    13 // Update Count     : 17
     12// Last Modified On : Wed Feb  7 09:05:18 2018
     13// Update Count     : 59
    1414//
    1515
     
    8888
    8989void sigHandler_segv ( __CFA_SIGPARMS__ );
     90void sigHandler_ill  ( __CFA_SIGPARMS__ );
     91void sigHandler_fpe  ( __CFA_SIGPARMS__ );
    9092void sigHandler_abort( __CFA_SIGPARMS__ );
    9193
     
    98100                INIT_REALRTN( exit, version );
    99101
    100                 __kernel_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
    101                 __kernel_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
    102                 __kernel_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
     102                __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
     103                __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
     104                __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO ); // Failure handler
     105                __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
     106                __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
    103107        }
    104108}
     
    118122}
    119123
    120 void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
     124void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
     125        va_list argp;
     126        va_start( argp, fmt );
    121127        abortf( fmt, argp );
     128        va_end( argp );
    122129}
    123130
    124131void * kernel_abort    ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; }
    125132void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {}
     133int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return 4; }
    126134
    127135enum { abort_text_size = 1024 };
    128136static char abort_text[ abort_text_size ];
     137static int abort_lastframe;
    129138
    130139extern "C" {
    131140        void abortf( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) {
    132                 void * kernel_data = kernel_abort();
    133 
     141                void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
    134142                int len;
     143
     144                abort_lastframe = kernel_abort_lastframe();
     145                len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
     146                __cfaabi_dbg_bits_write( abort_text, len );
    135147
    136148                if ( fmt ) {
     
    139151
    140152                        len = vsnprintf( abort_text, abort_text_size, fmt, args );
    141 
    142153                        va_end( args );
    143 
    144154                        __cfaabi_dbg_bits_write( abort_text, len );
    145                         //__cfaabi_dbg_bits_write( "\n", 1 );
    146                 }
    147 
    148                 len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld)\n", (long int)getpid() ); // use UNIX pid (versus getPid)
    149                 __cfaabi_dbg_bits_write( abort_text, len );
    150 
     155
     156                        if ( fmt[strlen( fmt ) - 1] != '\n' ) {         // add optional newline if missing at the end of the format text
     157                                __cfaabi_dbg_bits_write( "\n", 1 );
     158                        }
     159                }
    151160
    152161                kernel_abort_msg( kernel_data, abort_text, abort_text_size );
    153 
    154162                libc_abort();
    155163        }
    156164}
    157165
    158 // skip first 6 stack frames by default
    159 static void __kernel_backtrace() {
    160         // skip first N stack frames
    161         int start = 6;
    162 
    163         enum { Frames = 50 };
     166static void __cfaabi_backtrace() {
     167        enum {
     168                Frames = 50,                                                                    // maximum number of stack frames
     169                Start = 8,                                                                              // skip first N stack frames
     170        };
     171
    164172        void * array[Frames];
    165173        size_t size = backtrace( array, Frames );
     
    170178        __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
    171179
    172         // skip last 2 stack frames after main
    173         for ( int i = start; i < size && messages != NULL; i += 1 ) {
    174                 char * name = NULL;
    175                 char * offset_begin = NULL;
    176                 char * offset_end = NULL;
    177 
    178                 for ( char *p = messages[i]; *p; ++p ) {
     180        for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
     181                char * name = NULL, * offset_begin = NULL, * offset_end = NULL;
     182
     183                for ( char * p = messages[i]; *p; ++p ) {
    179184                        //__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
    180185                        // find parantheses and +offset
     
    192197
    193198                // if line contains symbol print it
    194                 int frameNo = i - start;
     199                int frameNo = i - Start;
    195200                if ( name && offset_begin && offset_end && name < offset_begin ) {
    196201                        // delimit strings
     
    206211                }
    207212        }
    208 
    209213        free( messages );
    210214}
    211215
    212216void sigHandler_segv( __CFA_SIGPARMS__ ) {
    213         // skip first only 1 stack frames in case of segfault.
    214         abortf( "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." );
     217        abortf( "Addressing invalid memory at location %p\n"
     218                        "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
     219                        sfp->si_addr );
     220}
     221
     222void sigHandler_ill( __CFA_SIGPARMS__ ) {
     223        abortf( "Executing illegal instruction at location %p.\n"
     224                        "Possible cause is stack corruption.\n",
     225                        sfp->si_addr );
     226}
     227
     228void sigHandler_fpe( __CFA_SIGPARMS__ ) {
     229        const char * msg;
     230
     231        choose( sfp->si_code ) {
     232          case FPE_INTDIV, FPE_FLTDIV: msg = "divide by zero";
     233          case FPE_FLTOVF: msg = "overflow";
     234          case FPE_FLTUND: msg = "underflow";
     235          case FPE_FLTRES: msg = "inexact result";
     236          case FPE_FLTINV: msg = "invalid operation";
     237          default: msg = "unknown";
     238        } // choose
     239        abortf( "Computation error %s at location %p.\n", msg, sfp->si_addr );
    215240}
    216241
    217242void sigHandler_abort( __CFA_SIGPARMS__ ) {
    218         __kernel_backtrace();
     243        __cfaabi_backtrace();
    219244
    220245        // reset default signal handler
    221         __kernel_sigdefault( SIGABRT );
     246        __cfaabi_sigdefault( SIGABRT );
    222247
    223248        raise( SIGABRT );
Note: See TracChangeset for help on using the changeset viewer.