kernel/eka/compsupp/aehabi/unwind_env.h
changeset 9 96e5fb8b040d
equal deleted inserted replaced
-1:000000000000 9:96e5fb8b040d
       
     1 /* unwind_env.h
       
     2  *
       
     3  * Copyright 2003 ARM Limited.
       
     4  */
       
     5 /*
       
     6   Licence
       
     7   
       
     8   1. Subject to the provisions of clause 2, ARM hereby grants to LICENSEE a 
       
     9   perpetual, non-exclusive, nontransferable, royalty free, worldwide licence 
       
    10   to use this Example Implementation of Exception Handling solely for the 
       
    11   purpose of developing, having developed, manufacturing, having 
       
    12   manufactured, offering to sell, selling, supplying or otherwise 
       
    13   distributing products which comply with the Exception Handling ABI for the 
       
    14   ARM Architecture specification. All other rights are reserved to ARM or its 
       
    15   licensors.
       
    16   
       
    17   2. THIS EXAMPLE IMPLEMENTATION OF EXCEPTION HANDLING  IS PROVIDED "AS IS" 
       
    18   WITH NO WARRANTIES EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED 
       
    19   TO ANY WARRANTY OF SATISFACTORY QUALITY, MERCHANTABILITY, NONINFRINGEMENT 
       
    20   OR FITNESS FOR A PARTICULAR PURPOSE.
       
    21 */
       
    22 /*
       
    23  * RCS $Revision: 1.3 $
       
    24  * Checkin $Date: 2003/10/23 13:57:32 $
       
    25  * Revising $Author: agrant $
       
    26  */
       
    27 
       
    28 /* Environment definition - abstractions and requirements - to aid
       
    29  * portability of the ARM exceptions code.
       
    30  */
       
    31 
       
    32 #ifndef UNWINDENV_H
       
    33 #define UNWINDENV_H
       
    34 
       
    35 /* ---------------------------------------------------------------------- */
       
    36 
       
    37 /* Source language
       
    38  *
       
    39  * The compiler is expected to define preprocessor symbols as follows:
       
    40  * __cplusplus when compiling in C++ mode.
       
    41  * __thumb when compiling to Thumb code.
       
    42  *
       
    43  * Some use is made of embedded assembly language, introduced by __asm.
       
    44  * This is described in ARM's toolchain documentation. Some edits may be
       
    45  * required for other compilers. The compiler should define one or more of:
       
    46  * __TARGET_ARCH_4T __TARGET_ARCH_4TXM __TARGET_ARCH_5T __TARGET_ARCH_5TXM
       
    47  * __TARGET_ARCH_5TE __TARGET_ARCH_6
       
    48  * so the correct assembly wrappers are generated for certain functions.
       
    49  *
       
    50  * __APCS_INTERWORK should be defined if ARM/Thumb interworking is required.
       
    51  *
       
    52  * For all the above symbols, if your compiler does not provide appropriate
       
    53  * definitions, add them here.
       
    54  *
       
    55  * Some source language extensions are also used.
       
    56  */
       
    57 
       
    58 /* ---------------------------------------------------------------------- */
       
    59 
       
    60 /* Library structure
       
    61  *
       
    62  * ARM's private make system contains an automated facility for compiling
       
    63  * source files multiple times to create multiple object files. The source
       
    64  * regions intended to constitute object file xxx.o are delimited by
       
    65  * #ifdef xxx_c / #endif directives. The exact preprocessor symbols used
       
    66  * for this conditionalisation are described in a comment at the start of
       
    67  * each file. When porting to a different system, compilations must be
       
    68  * performed with these preprocessor symbols appropriately defined
       
    69  * (or remove the conditionalisation).
       
    70  *
       
    71  * ARM declares (or redeclares) some routines as weak in order that
       
    72  * references to them are weak, so that the static linker will not load
       
    73  * unwanted code. This is achieved by decorating routine declarations
       
    74  * with appropriate language extensions. Note that compilers supporting
       
    75  * similar features but via a different syntax may require edits to
       
    76  * the library source.
       
    77  *
       
    78  * Define those decorations here (define as empty if not required):
       
    79  */
       
    80 
       
    81 #define WEAKDECL __weak        /* token in C and C++ */
       
    82 #define WEAKASMDECL [WEAK]     /* token in assembler */
       
    83 
       
    84 /* ---------------------------------------------------------------------- */
       
    85 
       
    86 /* Source language support and language extensions */
       
    87 
       
    88 /* It is possible to compile the C++ semantics code using a compiler
       
    89  * which does not support C++ exceptions; this was useful to ARM whilst
       
    90  * ARM's compiler was being developed, and the facility has not been
       
    91  * removed. C++ exceptions syntax is conditionalised by
       
    92  * #ifdef ARM_EXCEPTIONS_ENABLED / #endif. Define ARM_EXCEPTIONS_ENABLED
       
    93  * by some means here if you want a usable library:
       
    94  */
       
    95 
       
    96 #ifdef __cplusplus
       
    97 extern "C" {
       
    98   /* For conditionalisation, specifically on ARM_EXCEPTIONS_ENABLED */
       
    99 #include "basics.h"
       
   100 }
       
   101 #endif
       
   102 
       
   103 /* The following definitions of syntax decoration may be empty if the
       
   104  * facility is not required. Note that compilers supporting similar
       
   105  * features but via a different syntax may require edits to the library
       
   106  * source.
       
   107  * 
       
   108  * Define the decorations here (define as empty if not required):
       
   109  */
       
   110   
       
   111 /* If the compiler understands noreturn functions: */
       
   112 #define NORETURNDECL __declspec(noreturn)
       
   113 
       
   114 /* ---------------------------------------------------------------------- */
       
   115 
       
   116 /* Types */
       
   117 
       
   118 /* The implementation requires types uint8_t, uint16_t, uint32_t and
       
   119  * uint64_t to be defined as unsigned integers of the appropriate number
       
   120  * of bits.
       
   121  *
       
   122  * Do that here:
       
   123  */
       
   124 
       
   125 #include <stdint.h>
       
   126 
       
   127 /* The C++ semantics support requires definition of the RTTI object
       
   128  * layout. We use the same structures and names as the generic C++
       
   129  * ABI for Itanium.
       
   130  *
       
   131  * Define those structures here:
       
   132  */
       
   133 
       
   134 #ifdef __cplusplus
       
   135 extern "C" {
       
   136 #include "cxxabi.h"
       
   137 }
       
   138 #endif
       
   139 
       
   140 /* ---------------------------------------------------------------------- */
       
   141 
       
   142 /* External requirements */
       
   143 
       
   144 /* The C++ exception-handling 'globals' should be allocated per-thread.
       
   145  * The Exceptions ABI does not specify how this happens, but it is
       
   146  * intended that the details are localised to __cxa_get_globals.
       
   147  *
       
   148  * In the ARM implementation of __cxa_get_globals, it is assumed that a
       
   149  * zero-initialised location in a known per-thread place is somehow
       
   150  * obtainable, and can be assigned (by __cxa_get_globals) a pointer to
       
   151  * the allocated globals data structure. The macro EH_GLOBALS should be
       
   152  * defined here to yield a suitable address of type void*. This is used
       
   153  * only in __cxa_get_globals.
       
   154  *
       
   155  * Define it here:
       
   156  */
       
   157 
       
   158 #ifdef __cplusplus
       
   159 extern "C" {
       
   160   /* for __user_libspace() machinery */
       
   161 #include <interns.h>
       
   162 #define EH_GLOBALS libspace.eh_globals
       
   163 }
       
   164 #endif
       
   165 
       
   166 
       
   167 /* A routine is required for C++ derived class to base class conversion.
       
   168  * This is used once, in __cxa_type_match. It is likely that suitable
       
   169  * code exists as part of the RTTI support code. Therefore access it
       
   170  * via a macro:
       
   171  * DERIVED_TO_BASE_CONVERSION(PTR, P_NEW_PTR, CLASS_INFO, BASE_INFO)
       
   172  *   Convert PTR from a pointer to a derived class (described by
       
   173  *   CLASS_INFO) to a pointer to a base class (described by BASE_INFO)
       
   174  *   and store the resulting pointer in P_NEW_PTR. Return true (or
       
   175  *   non-zero) if the base class was found and the conversion was done,
       
   176  *   otherwise return false (or zero).
       
   177  *
       
   178  * Define the macro here:
       
   179  */
       
   180 
       
   181 #ifdef __cplusplus
       
   182 /* In the ARM implementation, a suitable routine exists elsewhere in the
       
   183  * C++ runtime library, where it is part of the dynamic_cast mechanism.
       
   184  */
       
   185 extern "C" int __derived_to_base_conversion(void** p_ptr, void** p_new_ptr,
       
   186                                             const std::type_info * class_info,
       
   187                                             const std::type_info * base_info,
       
   188                                             char** access_flags, int use_access_flags);
       
   189 
       
   190 #define DERIVED_TO_BASE_CONVERSION(PTR, P_NEW_PTR, CLASS_INFO, BASE_INFO) \
       
   191   __derived_to_base_conversion(&(PTR), (P_NEW_PTR), (CLASS_INFO), (BASE_INFO), NULL, 0)
       
   192 #endif
       
   193 
       
   194 
       
   195 /* ---------------------------------------------------------------------- */
       
   196 
       
   197 /* Runtime debug support
       
   198  *
       
   199  * Here we define the interface to a "bottleneck function" to be called
       
   200  * by exception handling code at 'interesting' points during execution,
       
   201  * and breakpointable by a debugger.
       
   202  *
       
   203  * This is not part of the Exceptions ABI but is expected to be
       
   204  * standardised elsewhere, probably in a Debug ABI.
       
   205  *
       
   206  * If you don't want this, define DEBUGGER_BOTTLENECK as a dummy, e.g.
       
   207  * #define DEBUGGER_BOTTLENECK(UCBP,LANG,ACTIVITY,ARG) (void)0
       
   208  */
       
   209 
       
   210 #ifdef __cplusplus
       
   211 extern "C" {
       
   212 #endif
       
   213 
       
   214   struct _Unwind_Control_Block;
       
   215 
       
   216   typedef enum {
       
   217     _UASUBSYS_CPP      = 0x00,
       
   218     _UASUBSYS_UNWINDER = 0xff
       
   219   } _Unwind_Activity_subsystem;
       
   220 
       
   221   typedef enum {
       
   222     _UAACT_STARTING     = 0x0,
       
   223     _UAACT_ENDING       = 0x1,
       
   224     _UAACT_BARRIERFOUND = 0x2,
       
   225     _UAACT_PADENTRY     = 0x3,
       
   226     _UAACT_CPP_TYPEINFO = 0x80
       
   227   } _Unwind_Activity_activity;
       
   228 
       
   229   typedef enum {
       
   230     _UAARG_ENDING_UNSPECIFIED           = 0x0,
       
   231     _UAARG_ENDING_TABLECORRUPT          = 0x1,
       
   232     _UAARG_ENDING_NOUNWIND              = 0x2,
       
   233     _UAARG_ENDING_VRSFAILED             = 0x3,
       
   234     /* C++ only: */
       
   235     _UAARG_ENDING_CPP_BADOPCODE         = 0x4,
       
   236     /* Unwinder only: */
       
   237     _UAARG_ENDING_UNWINDER_LOOKUPFAILED = 0x4,
       
   238     _UAARG_ENDING_UNWINDER_BUFFERFAILED = 0x5
       
   239   } _Unwind_Activity_arg;
       
   240 
       
   241   void _Unwind_Activity(struct _Unwind_Control_Block *ucbp, uint32_t reason, uint32_t arg);
       
   242 #define DEBUGGER_BOTTLENECK(UCBP,LANG,ACTIVITY,ARG) \
       
   243   _Unwind_Activity((UCBP),(((LANG)<<24)|ACTIVITY),(uint32_t)(ARG))
       
   244 
       
   245 #ifdef __cplusplus
       
   246 }
       
   247 #endif
       
   248 
       
   249 
       
   250 /* ---------------------------------------------------------------------- */
       
   251 
       
   252 /* Printed diagnostics
       
   253  *
       
   254  * These may be useful for debugging purposes during development, provided
       
   255  * the execution environment supports diagnostics via printf.
       
   256  *
       
   257  * #define PR_DIAGNOSTICS for printed diagnostics from the personality routine.
       
   258  * #define VRS_DIAGNOSTICS for printed diagnostics about VRS operations.
       
   259  * #define UNWIND_ACTIVITY_DIAGNOSTICS for printed information from _Unwind_Activity.
       
   260  */
       
   261 
       
   262 /* ---------------------------------------------------------------------- */
       
   263 
       
   264 #endif /* defined UNWINDENV_H */