Changeset 695571c for src/libcfa/interpose.c
- Timestamp:
- Feb 7, 2018, 9:59:03 AM (6 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/interpose.c
r10f8142 r695571c 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 5 23:40:04201813 // Update Count : 1712 // Last Modified On : Wed Feb 7 09:05:18 2018 13 // Update Count : 59 14 14 // 15 15 … … 88 88 89 89 void sigHandler_segv ( __CFA_SIGPARMS__ ); 90 void sigHandler_ill ( __CFA_SIGPARMS__ ); 91 void sigHandler_fpe ( __CFA_SIGPARMS__ ); 90 92 void sigHandler_abort( __CFA_SIGPARMS__ ); 91 93 … … 98 100 INIT_REALRTN( exit, version ); 99 101 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 103 107 } 104 108 } … … 118 122 } 119 123 120 void abort( const char *fmt, va_list argp ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 124 void abort( const char fmt[], ... ) __attribute__ ((__nothrow__, __leaf__, __noreturn__)) { 125 va_list argp; 126 va_start( argp, fmt ); 121 127 abortf( fmt, argp ); 128 va_end( argp ); 122 129 } 123 130 124 131 void * kernel_abort ( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return NULL; } 125 132 void kernel_abort_msg( void * data, char * buffer, int size ) __attribute__ ((__nothrow__, __leaf__, __weak__)) {} 133 int kernel_abort_lastframe( void ) __attribute__ ((__nothrow__, __leaf__, __weak__)) { return 4; } 126 134 127 135 enum { abort_text_size = 1024 }; 128 136 static char abort_text[ abort_text_size ]; 137 static int abort_lastframe; 129 138 130 139 extern "C" { 131 140 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 134 142 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 ); 135 147 136 148 if ( fmt ) { … … 139 151 140 152 len = vsnprintf( abort_text, abort_text_size, fmt, args ); 141 142 153 va_end( args ); 143 144 154 __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 } 151 160 152 161 kernel_abort_msg( kernel_data, abort_text, abort_text_size ); 153 154 162 libc_abort(); 155 163 } 156 164 } 157 165 158 // skip first 6 stack frames by default 159 static void __kernel_backtrace(){160 // skip first Nstack frames161 int start = 6;162 163 enum { Frames = 50 }; 166 static void __cfaabi_backtrace() { 167 enum { 168 Frames = 50, // maximum number of stack frames 169 Start = 8, // skip first N stack frames 170 }; 171 164 172 void * array[Frames]; 165 173 size_t size = backtrace( array, Frames ); … … 170 178 __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]); 171 179 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 ) { 179 184 //__cfaabi_dbg_bits_print_nolock( "X %s\n", p); 180 185 // find parantheses and +offset … … 192 197 193 198 // if line contains symbol print it 194 int frameNo = i - start;199 int frameNo = i - Start; 195 200 if ( name && offset_begin && offset_end && name < offset_begin ) { 196 201 // delimit strings … … 206 211 } 207 212 } 208 209 213 free( messages ); 210 214 } 211 215 212 216 void 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 222 void 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 228 void 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 ); 215 240 } 216 241 217 242 void sigHandler_abort( __CFA_SIGPARMS__ ) { 218 __ kernel_backtrace();243 __cfaabi_backtrace(); 219 244 220 245 // reset default signal handler 221 __ kernel_sigdefault( SIGABRT );246 __cfaabi_sigdefault( SIGABRT ); 222 247 223 248 raise( SIGABRT );
Note: See TracChangeset
for help on using the changeset viewer.