| /* This file is part of GCC. | 
 |  | 
 | GCC is free software; you can redistribute it and/or modify it under | 
 | the terms of the GNU General Public License as published by the Free | 
 | Software Foundation; either version 3, or (at your option) any later | 
 | version. | 
 |  | 
 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | 
 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
 | FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
 | for more details. | 
 |  | 
 | Under Section 7 of GPL version 3, you are granted additional | 
 | permissions described in the GCC Runtime Library Exception, version | 
 | 3.1, as published by the Free Software Foundation. | 
 |  | 
 | You should have received a copy of the GNU General Public License and | 
 | a copy of the GCC Runtime Library Exception along with this program; | 
 | see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see | 
 | <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | /* The essential point of the crtbegin/crtend files on VxWorks is to handle | 
 |    the eh frames registration thanks to dedicated constructors and | 
 |    destructors.  What needs to be done depends on the VxWorks version and the | 
 |    kind of module (rtp, dkm, ...) one is building.  */ | 
 |  | 
 | #define IN_LIBGCC2 | 
 |  | 
 | #include "auto-host.h" | 
 | #include "tconfig.h" | 
 | #include "tsystem.h" | 
 | #include "coretypes.h" | 
 | #include "tm.h" | 
 | #include "libgcc_tm.h" | 
 | #include "unwind-dw2-fde.h" | 
 |  | 
 | /* If we are entitled/requested to use init/fini arrays, we'll rely on that. | 
 |    Otherwise, we may rely on ctors/dtors sections for RTPs or expect munch to | 
 |    be involved for kernel modules.  */ | 
 |  | 
 | #if !defined(USE_INITFINI_ARRAY) && defined(__RTP__) | 
 | #define USE_CDTORS_SECTIONS | 
 | #endif | 
 |  | 
 | /*  ------------------------------ crtbegin -------------------------------  */ | 
 |  | 
 | #ifdef CRT_BEGIN | 
 |  | 
 | /* Stick a label at the beginning of the frame unwind info so we can register | 
 |    and deregister it with the exception handling library code.  */ | 
 | static const char __EH_FRAME_BEGIN__[] | 
 | __attribute__((section(__LIBGCC_EH_FRAME_SECTION_NAME__), aligned(4))) | 
 |   = { }; | 
 |  | 
 | /* Determine what names to use for the constructor/destructor functions.  */ | 
 |  | 
 | #if defined(USE_CDTORS_SECTIONS) || defined(USE_INITFINI_ARRAY) | 
 |  | 
 | #define EH_CTOR_NAME _crtbe_register_frame | 
 | #define EH_DTOR_NAME _ctrbe_deregister_frame | 
 |  | 
 | #else | 
 |  | 
 | /* No specific sections for constructors or destructors: we thus use a | 
 |    symbol naming convention so that the constructors are then recognized | 
 |    by munch or whatever tool is used for the final link phase.  */ | 
 | #define EH_CTOR_NAME _GLOBAL__I_00101_0__crtbe_register_frame | 
 | #define EH_DTOR_NAME _GLOBAL__D_00101_1__crtbe_deregister_frame | 
 |  | 
 | #endif | 
 |  | 
 | #ifdef USE_INITFINI_ARRAY | 
 | /* .init_array and .fini_array is supported starting VxWorks 7.2 in all | 
 |    cases. The compiler is then configured to always support priorities in | 
 |    constructors, so we can rely on the constructor and destructor attributes | 
 |    to generate the proper sections.  */ | 
 | #define EH_CTOR_ATTRIBUTE __attribute__((constructor (101))) | 
 | #define EH_DTOR_ATTRIBUTE __attribute__((destructor (101))) | 
 |  | 
 | #else /* !USE_INITFINI_ARRAY  */ | 
 |  | 
 | /* Note: Even in case of .ctors/.dtors sections, we can't use the attribute | 
 |    (constructor (15)) here as gcc may have been configured with constructors | 
 |    priority disabled.  We will instead craft an explicit section name for this | 
 |    purpose.  */ | 
 | #define EH_CTOR_ATTRIBUTE | 
 | #define EH_DTOR_ATTRIBUTE | 
 |  | 
 | #endif /* USE_INITFINI_ARRAY  */ | 
 |  | 
 | void EH_CTOR_NAME (void); | 
 | void EH_DTOR_NAME (void); | 
 |  | 
 | EH_CTOR_ATTRIBUTE void EH_CTOR_NAME (void) | 
 | { | 
 |   static struct object object; | 
 |   __register_frame_info (__EH_FRAME_BEGIN__, &object); | 
 | } | 
 |  | 
 | EH_DTOR_ATTRIBUTE void EH_DTOR_NAME (void) | 
 | { | 
 |   __deregister_frame_info (__EH_FRAME_BEGIN__); | 
 | } | 
 |  | 
 | #ifdef USE_CDTORS_SECTIONS | 
 | /* As explained above, we need to manually build the sections here as the | 
 |    compiler may not have support for constructors priority enabled.  */ | 
 | static void (* volatile eh_registration_ctors[])() | 
 |   __attribute__((section (".ctors.101"))) | 
 | = { &EH_CTOR_NAME }; | 
 | static void (* volatile eh_registration_dtors[])() | 
 |   __attribute__((section (".dtors.65434"))) | 
 | = { &EH_DTOR_NAME }; | 
 | #endif | 
 |  | 
 | /*  ------------------------------ crtend ---------------------------------  */ | 
 |  | 
 | #elif defined (CRT_END) /* ! CRT_BEGIN */ | 
 |  | 
 | /* Terminate the frame unwind info section with a 4byte 0 as a sentinel; | 
 |    this would be the 'length' field in a real FDE.  */ | 
 |  | 
 | static const char __FRAME_END__[] | 
 |      __attribute__ ((used, section(__LIBGCC_EH_FRAME_SECTION_NAME__), | 
 | 		     aligned(4))) | 
 |   = { 0, 0, 0, 0 }; | 
 |  | 
 | #else /* ! CRT_BEGIN & ! CRT_END */ | 
 |  | 
 | #error "One of CRT_BEGIN or CRT_END must be defined." | 
 |  | 
 | #endif |