Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    red395761 r8f910430  
    2727#include "stdhdr/assert.h"
    2828#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
    2940#include "lsda.h"
    3041
     
    256267        // the whole stack.
    257268
    258 #if defined( __x86_64 ) || defined( __i386 )
    259269        // We did not simply reach the end of the stack without finding a handler. This is an error.
    260270        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
    266271                printf("UNWIND ERROR %d after raise exception\n", ret);
    267272                abort();
     
    296301}
    297302
    298 #if defined( __x86_64 ) || defined( __i386 ) || defined( __ARM_ARCH )
     303#if defined( __x86_64 ) || defined( __i386 )
    299304// This is our personality routine. For every stack frame annotated with
    300305// ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
     
    414419                                    _Unwind_GetCFA(unwind_context) + 24;
    415420#                               elif defined( __ARM_ARCH )
    416                                     _Unwind_GetCFA(unwind_context) + 40;
     421#                                   warning FIX ME: check if anything needed for ARM
     422                                    42;
    417423#                               endif
    418424                                int (*matcher)(exception_t *) = *(int(**)(exception_t *))match_pos;
     
    531537        // HEADER
    532538        ".LFECFA1:\n"
    533 #if defined( __x86_64 ) || defined( __i386 )
    534539        "       .globl  __gcfa_personality_v0\n"
    535 #else // defined( __ARM_ARCH )
    536         "       .global __gcfa_personality_v0\n"
    537 #endif
    538540        "       .section        .gcc_except_table,\"a\",@progbits\n"
    539541        // TABLE HEADER (important field is the BODY length at the end)
     
    567569        // No clue what this does specifically
    568570        "       .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 )
    570571        "       .align 8\n"
    571 #else // defined( __ARM_ARCH )
    572         "       .align 3\n"
    573 #endif
    574572        "       .type CFA.ref.__gcfa_personality_v0, @object\n"
    575573        "       .size CFA.ref.__gcfa_personality_v0, 8\n"
     
    577575#if defined( __x86_64 )
    578576        "       .quad __gcfa_personality_v0\n"
    579 #elif defined( __i386 )
     577#else // then __i386
    580578        "       .long __gcfa_personality_v0\n"
    581 #else // defined( __ARM_ARCH )
    582         "       .xword __gcfa_personality_v0\n"
    583579#endif
    584580);
     
    587583        // HEADER
    588584        ".LFECFA1:\n"
    589 #if defined( __x86_64 ) || defined( __i386 )
    590585        "       .globl  __gcfa_personality_v0\n"
    591 #else // defined( __ARM_ARCH )
    592         "       .global __gcfa_personality_v0\n"
    593 #endif
    594586        "       .section        .gcc_except_table,\"a\",@progbits\n"
    595587        // TABLE HEADER (important field is the BODY length at the end)
     
    620612#pragma GCC pop_options
    621613
     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))
     625void __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}
    622629#else
    623630        #error unsupported hardware architecture
    624 #endif // __x86_64 || __i386 || __ARM_ARCH
     631#endif // __x86_64 || __i386
Note: See TracChangeset for help on using the changeset viewer.