Changeset a201f7b


Ignore:
Timestamp:
Apr 8, 2020, 4:06:51 PM (18 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
arm-eh, jacob/cs343-translation, master, new-ast, new-ast-unique-expr
Children:
cb20dcd
Parents:
72828a8
Message:

Added verify tests to the unwinding personality and stop functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.c

    r72828a8 ra201f7b  
    1010// Created On       : Mon Jun 26 15:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Apr 06 14:40:00 2020
    13 // Update Count     : 15
     12// Last Modified On : Wed Apr 08 15:45:00 2020
     13// Update Count     : 16
    1414//
    1515
     
    2828#include <unwind.h>
    2929#include <bits/debug.hfa>
     30#include "stdhdr/assert.h"
    3031
    3132// FIX ME: temporary hack to keep ARM build working
     
    216217                struct _Unwind_Context * unwind_context,
    217218                void * stop_param) {
    218         if ( actions & _UA_END_OF_STACK  ) exit(1);
    219         if ( actions & _UA_CLEANUP_PHASE ) return _URC_NO_REASON;
    220 
    221         return _URC_FATAL_PHASE2_ERROR;
     219        // Verify actions follow the rules we expect.
     220        verify((actions & _UA_CLEANUP_PHASE) && actions & (_UA_FORCE_UNWIND));
     221        verify(!(actions & (_UA_SEARCH_PHASE | _UA_HANDER_FRAME)));
     222
     223        if ( actions & _UA_END_OF_STACK ) {
     224                exit(1);
     225        } else {
     226                return _URC_NO_REASON;
     227        }
    222228}
    223229
     
    282288                        version, actions, exception_class, unwind_exception, unwind_context);
    283289
    284         // If we've reached the end of the stack then there is nothing much we can do...
    285         if (actions & _UA_END_OF_STACK) return _URC_END_OF_STACK;
    286 
     290        // Verify that actions follow the rules we expect.
     291        // This function should never be called at the end of the stack.
     292        verify(!(actions & _UA_END_OF_STACK));
     293        // Either only the search phase flag is set or...
    287294        if (actions & _UA_SEARCH_PHASE) {
     295                verify(actions == _UA_SEARCH_PHASE);
    288296                __cfaabi_dbg_print_safe(" lookup phase");
    289         }
    290         else if (actions & _UA_CLEANUP_PHASE) {
     297        // ... we are in clean-up phase.
     298        } else {
     299                verify(actions & _UA_CLEANUP_PHASE);
    291300                __cfaabi_dbg_print_safe(" cleanup phase");
    292         }
    293         // Just in case, probably can't actually happen
    294         else {
    295                 printf(" error\n");
    296                 return _URC_FATAL_PHASE1_ERROR;
     301                // We shouldn't be the handler frame during forced unwind.
     302                if (actions & _UA_HANDLER_FRAME) {
     303                        verify(!(actions & _UA_FORCE_UNWIND));
     304                        __cfaabi_dbg_print_safe(" (handler frame)");
     305                } else if (actions & _UA_FORCE_UNWIND) {
     306                        __cfaabi_dbg_print_safe(" (force unwind)");
     307                }
    297308        }
    298309
     
    396407                        // This is only a cleanup handler, ignore it
    397408                        __cfaabi_dbg_print_safe(" no action");
    398                 } else if (actions & _UA_CLEANUP_PHASE) {
     409                } else {
    399410                        // In clean-up phase, no destructors here but this could be the handler.
    400411
Note: See TracChangeset for help on using the changeset viewer.