Changes in libcfa/src/exception.c [8f910430:ed395761]
- File:
-
- 1 edited
-
libcfa/src/exception.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/exception.c
r8f910430 red395761 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 working32 #ifndef _URC_FATAL_PHASE1_ERROR33 #define _URC_FATAL_PHASE1_ERROR 334 #endif // ! _URC_FATAL_PHASE1_ERROR35 #ifndef _URC_FATAL_PHASE2_ERROR36 #define _URC_FATAL_PHASE2_ERROR 237 #endif // ! _URC_FATAL_PHASE2_ERROR38 #endif // __ARM_ARCH39 40 29 #include "lsda.h" 41 30 … … 267 256 // the whole stack. 268 257 258 #if defined( __x86_64 ) || defined( __i386 ) 269 259 // We did not simply reach the end of the stack without finding a handler. This is an error. 270 260 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 #endif 271 266 printf("UNWIND ERROR %d after raise exception\n", ret); 272 267 abort(); … … 301 296 } 302 297 303 #if defined( __x86_64 ) || defined( __i386 ) 298 #if defined( __x86_64 ) || defined( __i386 ) || defined( __ARM_ARCH ) 304 299 // This is our personality routine. For every stack frame annotated with 305 300 // ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding. … … 419 414 _Unwind_GetCFA(unwind_context) + 24; 420 415 # elif defined( __ARM_ARCH ) 421 # warning FIX ME: check if anything needed for ARM 422 42; 416 _Unwind_GetCFA(unwind_context) + 40; 423 417 # endif 424 418 int (*matcher)(exception_t *) = *(int(**)(exception_t *))match_pos; … … 537 531 // HEADER 538 532 ".LFECFA1:\n" 533 #if defined( __x86_64 ) || defined( __i386 ) 539 534 " .globl __gcfa_personality_v0\n" 535 #else // defined( __ARM_ARCH ) 536 " .global __gcfa_personality_v0\n" 537 #endif 540 538 " .section .gcc_except_table,\"a\",@progbits\n" 541 539 // TABLE HEADER (important field is the BODY length at the end) … … 569 567 // No clue what this does specifically 570 568 " .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 ) 571 570 " .align 8\n" 571 #else // defined( __ARM_ARCH ) 572 " .align 3\n" 573 #endif 572 574 " .type CFA.ref.__gcfa_personality_v0, @object\n" 573 575 " .size CFA.ref.__gcfa_personality_v0, 8\n" … … 575 577 #if defined( __x86_64 ) 576 578 " .quad __gcfa_personality_v0\n" 577 #el se // then __i386579 #elif defined( __i386 ) 578 580 " .long __gcfa_personality_v0\n" 581 #else // defined( __ARM_ARCH ) 582 " .xword __gcfa_personality_v0\n" 579 583 #endif 580 584 ); … … 583 587 // HEADER 584 588 ".LFECFA1:\n" 589 #if defined( __x86_64 ) || defined( __i386 ) 585 590 " .globl __gcfa_personality_v0\n" 591 #else // defined( __ARM_ARCH ) 592 " .global __gcfa_personality_v0\n" 593 #endif 586 594 " .section .gcc_except_table,\"a\",@progbits\n" 587 595 // TABLE HEADER (important field is the BODY length at the end) … … 612 620 #pragma GCC pop_options 613 621 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 }629 622 #else 630 623 #error unsupported hardware architecture 631 #endif // __x86_64 || __i386 624 #endif // __x86_64 || __i386 || __ARM_ARCH
Note:
See TracChangeset
for help on using the changeset viewer.