Changes in libcfa/src/exception.c [ed395761:8f910430]
- File:
-
- 1 edited
-
libcfa/src/exception.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/exception.c
red395761 r8f910430 27 27 #include "stdhdr/assert.h" 28 28 #include "virtual.h" 29 30 #if defined( __ARM_ARCH ) 31 #warning FIX ME: temporary hack to keep ARM build working 32 #ifndef _URC_FATAL_PHASE1_ERROR 33 #define _URC_FATAL_PHASE1_ERROR 3 34 #endif // ! _URC_FATAL_PHASE1_ERROR 35 #ifndef _URC_FATAL_PHASE2_ERROR 36 #define _URC_FATAL_PHASE2_ERROR 2 37 #endif // ! _URC_FATAL_PHASE2_ERROR 38 #endif // __ARM_ARCH 39 29 40 #include "lsda.h" 30 41 … … 256 267 // the whole stack. 257 268 258 #if defined( __x86_64 ) || defined( __i386 )259 269 // We did not simply reach the end of the stack without finding a handler. This is an error. 260 270 if ( ret != _URC_END_OF_STACK ) { 261 #else // defined( __ARM_ARCH )262 // The return code from _Unwind_RaiseException seems to be corrupt on ARM at end of stack.263 // This workaround tries to keep default exception handling working.264 if ( ret == _URC_FATAL_PHASE1_ERROR || ret == _URC_FATAL_PHASE2_ERROR ) {265 #endif266 271 printf("UNWIND ERROR %d after raise exception\n", ret); 267 272 abort(); … … 296 301 } 297 302 298 #if defined( __x86_64 ) || defined( __i386 ) || defined( __ARM_ARCH )303 #if defined( __x86_64 ) || defined( __i386 ) 299 304 // This is our personality routine. For every stack frame annotated with 300 305 // ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding. … … 414 419 _Unwind_GetCFA(unwind_context) + 24; 415 420 # elif defined( __ARM_ARCH ) 416 _Unwind_GetCFA(unwind_context) + 40; 421 # warning FIX ME: check if anything needed for ARM 422 42; 417 423 # endif 418 424 int (*matcher)(exception_t *) = *(int(**)(exception_t *))match_pos; … … 531 537 // HEADER 532 538 ".LFECFA1:\n" 533 #if defined( __x86_64 ) || defined( __i386 )534 539 " .globl __gcfa_personality_v0\n" 535 #else // defined( __ARM_ARCH )536 " .global __gcfa_personality_v0\n"537 #endif538 540 " .section .gcc_except_table,\"a\",@progbits\n" 539 541 // TABLE HEADER (important field is the BODY length at the end) … … 567 569 // No clue what this does specifically 568 570 " .section .data.rel.local.CFA.ref.__gcfa_personality_v0,\"awG\",@progbits,CFA.ref.__gcfa_personality_v0,comdat\n" 569 #if defined( __x86_64 ) || defined( __i386 )570 571 " .align 8\n" 571 #else // defined( __ARM_ARCH )572 " .align 3\n"573 #endif574 572 " .type CFA.ref.__gcfa_personality_v0, @object\n" 575 573 " .size CFA.ref.__gcfa_personality_v0, 8\n" … … 577 575 #if defined( __x86_64 ) 578 576 " .quad __gcfa_personality_v0\n" 579 #el if defined( __i386 )577 #else // then __i386 580 578 " .long __gcfa_personality_v0\n" 581 #else // defined( __ARM_ARCH )582 " .xword __gcfa_personality_v0\n"583 579 #endif 584 580 ); … … 587 583 // HEADER 588 584 ".LFECFA1:\n" 589 #if defined( __x86_64 ) || defined( __i386 )590 585 " .globl __gcfa_personality_v0\n" 591 #else // defined( __ARM_ARCH )592 " .global __gcfa_personality_v0\n"593 #endif594 586 " .section .gcc_except_table,\"a\",@progbits\n" 595 587 // TABLE HEADER (important field is the BODY length at the end) … … 620 612 #pragma GCC pop_options 621 613 614 #elif defined( __ARM_ARCH ) 615 _Unwind_Reason_Code __gcfa_personality_v0( 616 int version, 617 _Unwind_Action actions, 618 unsigned long long exception_class, 619 struct _Unwind_Exception * unwind_exception, 620 struct _Unwind_Context * unwind_context) { 621 return _URC_CONTINUE_UNWIND; 622 } 623 624 __attribute__((noinline)) 625 void __cfaehm_try_terminate(void (*try_block)(), 626 void (*catch_block)(int index, exception_t * except), 627 __attribute__((unused)) int (*match_block)(exception_t * except)) { 628 } 622 629 #else 623 630 #error unsupported hardware architecture 624 #endif // __x86_64 || __i386 || __ARM_ARCH631 #endif // __x86_64 || __i386
Note:
See TracChangeset
for help on using the changeset viewer.