Ignore:
Timestamp:
May 15, 2018, 4:17:15 PM (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, with_gc
Children:
2e5fa345
Parents:
7d0a3ba (diff), a61fa0bb (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

    r7d0a3ba r358cba0  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May  1 15:05:35 2018
    13 // Update Count     : 83
    14 //
    15 
    16 #include <stdarg.h>
    17 #include <stddef.h>
    18 
    19 extern "C" {
    20 #include <stdio.h>
    21 #include <string.h>
    22 #include <dlfcn.h>
    23 #include <unistd.h>
     12// Last Modified On : Sat May  5 11:37:35 2018
     13// Update Count     : 111
     14//
     15
     16#include <stdarg.h>                                                                             // va_start, va_end
     17#include <string.h>                                                                             // strlen
     18#include <unistd.h>                                                                             // _exit, getpid
    2419#define __USE_GNU
    2520#include <signal.h>
    2621#undef __USE_GNU
    27 #include <execinfo.h>
     22extern "C" {
     23#include <dlfcn.h>                                                                              // dlopen, dlsym
     24#include <execinfo.h>                                                                   // backtrace, messages
    2825}
    2926
    3027#include "bits/debug.h"
    3128#include "bits/defs.h"
    32 #include "bits/signal.h"
    33 #include "startup.h"
     29#include "bits/signal.h"                                                                // sigHandler_?
     30#include "startup.h"                                                                    // STARTUP_PRIORITY_CORE
    3431
    3532//=============================================================================================
     
    3734//=============================================================================================
    3835
    39 typedef void (*generic_fptr_t)(void);
    40 generic_fptr_t interpose_symbol( const char* symbol, const char *version ) {
     36typedef void (* generic_fptr_t)(void);
     37generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
    4138        const char * error;
    4239
     
    5552        } // if
    5653
    57         union { generic_fptr_t fptr; void* ptr; } originalFunc;
     54        union { generic_fptr_t fptr; void * ptr; } originalFunc;
    5855
    5956        #if defined( _GNU_SOURCE )
     
    7370}
    7471
    75 forall(dtype T)
    76 static inline void ptr_from_symbol( T** symbol_ptr, const char * symbol_name, const char * version) {
    77         union {
    78                 generic_fptr_t gp;
    79                 T* tp;
    80         } u;
    81 
    82         u.gp = interpose_symbol( symbol_name, version );
    83 
    84         *symbol_ptr = u.tp;
    85 }
    86 
    87 #define INTERPOSE_LIBC( x, ver ) ptr_from_symbol( (void**)&__cabi_libc.x, #x, ver)
    88 
    89 //=============================================================================================
    90 // Terminating Signals logic
     72#define INTERPOSE_LIBC( x, ver ) __cabi_libc.x = (typeof(__cabi_libc.x))interpose_symbol( #x, ver )
     73
     74//=============================================================================================
     75// Interposition Startup logic
    9176//=============================================================================================
    9277
     
    9883
    9984struct {
    100         void (* exit)( int ) __attribute__ (( __noreturn__ ));
    101         void (* abort)( void ) __attribute__ (( __noreturn__ ));
     85        void (* exit)( int ) __attribute__(( __noreturn__ ));
     86        void (* abort)( void ) __attribute__(( __noreturn__ ));
    10287} __cabi_libc;
    10388
     
    10792                const char *version = NULL;
    10893
     94#pragma GCC diagnostic push
     95#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
    10996                INTERPOSE_LIBC( abort, version );
    11097                INTERPOSE_LIBC( exit , version );
    111 
    112                 __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO ); // Failure handler
    113                 __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO ); // Failure handler
    114                 __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO ); // Failure handler
    115                 __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO ); // Failure handler
    116                 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler
    117                 __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); // Failure handler
    118                 __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); // Failure handler
     98#pragma GCC diagnostic pop
     99
     100                // Failure handler
     101                __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO );
     102                __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO );
     103                __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO );
     104                __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO );
     105                __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO | SA_RESETHAND);
     106                __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO );
     107                __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO );
    119108        }
    120109}
     
    125114
    126115// Forward declare abort after the __typeof__ call to avoid ambiguities
    127 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
    128 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
     116void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
     117void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    129118
    130119extern "C" {
    131         void abort( void ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
     120        void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
    132121                abort( NULL );
    133122        }
    134123
    135         void __cabi_abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     124        void __cabi_abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    136125                va_list argp;
    137126                va_start( argp, fmt );
     
    140129        }
    141130
    142         void exit( int status ) __attribute__ (( __nothrow__, __leaf__, __noreturn__ )) {
     131        void exit( int status ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
    143132                __cabi_libc.exit( status );
    144133        }
    145134}
    146135
    147 void * kernel_abort    ( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return NULL; }
    148 void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) {}
    149 int kernel_abort_lastframe( void ) __attribute__ (( __nothrow__, __leaf__, __weak__ )) { return 4; }
     136void * kernel_abort    ( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return NULL; }
     137void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}
     138int kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; }
    150139
    151140enum { abort_text_size = 1024 };
     
    153142static int abort_lastframe;
    154143
    155 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
     144void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
    156145    va_list args;
    157146    va_start( args, fmt );
     
    161150}
    162151
    163 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     152void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
    164153        void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
    165154        int len;
Note: See TracChangeset for help on using the changeset viewer.