os/kernelhwsrv/kernel/eka/compsupp/aehabi/unwind_env.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 */