Introduce vxworks specific crtstuff support
2019-11-06 Jerome Lambourg <lambourg@adacore.com> Olivier Hainque <hainque@adacore.com> libgcc/ * config/vxcrtstuff.c: New file. * config/t-vxcrtstuff: New Makefile fragment. * config.host: Append t-vxcrtstuff to the tmake_file list on all VxWorks ports using dwarf for table based EH. gcc/ * config/vx-common.h (USE_TM_CLONE_REGISTRY): Remove definition, pointless with a VxWorks specific version of crtstuff. (DWARF2_UNWIND_INFO): Conditionalize on !ARM_UNWIND_INFO. * config/vxworks.h (VX_CRTBEGIN_SPEC, VX_CRTEND_SPEC): New local macros, controlling the addition of vxworks specific crtstuff objects depending on the EH mechanism and kind of module being linked. (VXWORKS_STARTFILE_SPEC, VXWORKS_ENDFILE_SPEC): Use them. Co-Authored-By: Olivier Hainque <hainque@adacore.com> From-SVN: r278248
This commit is contained in:
parent
ebcdba9c9f
commit
78e49fb1bc
@ -1,3 +1,16 @@
|
||||
2019-11-06 Jerome Lambourg <lambourg@adacore.com>
|
||||
Olivier Hainque <hainque@adacore.com>
|
||||
|
||||
* config/vx-common.h (USE_TM_CLONE_REGISTRY): Remove
|
||||
definition, pointless with a VxWorks specific version
|
||||
of crtstuff.
|
||||
(DWARF2_UNWIND_INFO): Conditionalize on !ARM_UNWIND_INFO.
|
||||
* config/vxworks.h (VX_CRTBEGIN_SPEC, VX_CRTEND_SPEC):
|
||||
New local macros, controlling the addition of vxworks specific
|
||||
crtstuff objects depending on the EH mechanism and kind of
|
||||
module being linked.
|
||||
(VXWORKS_STARTFILE_SPEC, VXWORKS_ENDFILE_SPEC): Use them.
|
||||
|
||||
2019-11-06 Pat Bernardi <bernardi@adacore.com>
|
||||
Jerome Lambourg <lambourg@adacore.com>
|
||||
Olivier Hainque <hainque@adacore.com>
|
||||
|
@ -58,9 +58,21 @@ along with GCC; see the file COPYING3. If not see
|
||||
#undef WINT_TYPE_SIZE
|
||||
#define WINT_TYPE_SIZE 16
|
||||
|
||||
/* Dwarf2 unwind info is supported. */
|
||||
/* Dwarf2 unwind info is supported, unless overriden by a request for a target
|
||||
specific format.
|
||||
|
||||
Taking care of this here allows using DWARF2_UNWIND_INFO in #if conditions
|
||||
from the common config/vxworks.h files, included before the cpu
|
||||
specializations. Unlike with conditions used in C expressions, where the
|
||||
definitions which matter are those at the expression expansion point, use
|
||||
in #if constructs requires an accurate definition of the operands at the
|
||||
#if point. Since <cpu>/vxworks.h. is typically included after
|
||||
config/vxworks.h, #if expressions in the latter can't rely on possible
|
||||
redefinitions in the former. */
|
||||
#if !ARM_UNWIND_INFO
|
||||
#undef DWARF2_UNWIND_INFO
|
||||
#define DWARF2_UNWIND_INFO 1
|
||||
#endif
|
||||
|
||||
/* VxWorks uses DWARF2 debugging info. */
|
||||
#define DWARF2_DEBUGGING_INFO 1
|
||||
@ -87,10 +99,3 @@ along with GCC; see the file COPYING3. If not see
|
||||
/* We occasionally need to distinguish between the VxWorks variants. */
|
||||
#define VXWORKS_KIND_NORMAL 1
|
||||
#define VXWORKS_KIND_AE 2
|
||||
|
||||
/*
|
||||
* libitm is not supported on VxWorks. Rather than providing stub
|
||||
* no-op _ITM_registerTMCloneTable/_ITM_deregisterTMCloneTable
|
||||
* functions, simply prevent crtstuff from even referring to those.
|
||||
*/
|
||||
#define USE_TM_CLONE_REGISTRY 0
|
||||
|
@ -143,9 +143,23 @@ along with GCC; see the file COPYING3. If not see
|
||||
#undef VXWORKS_LIBGCC_SPEC
|
||||
#define VXWORKS_LIBGCC_SPEC "-lgcc"
|
||||
|
||||
/* Setup the crtstuff begin/end we might need for dwarf EH registration. */
|
||||
|
||||
#if !defined(CONFIG_SJLJ_EXCEPTIONS) && DWARF2_UNWIND_INFO
|
||||
#define VX_CRTBEGIN_SPEC \
|
||||
"%{!mrtp:vx_crtbegin-kernel.o%s} %{mrtp:vx_crtbegin-rtp.o%s}"
|
||||
#define VX_CRTEND_SPEC "-l:vx_crtend.o"
|
||||
#else
|
||||
#define VX_CRTBEGIN_SPEC ""
|
||||
#define VX_CRTEND_SPEC ""
|
||||
#endif
|
||||
|
||||
#undef VXWORKS_STARTFILE_SPEC
|
||||
#define VXWORKS_STARTFILE_SPEC "%{mrtp:%{!shared:-l:crt0.o}}"
|
||||
#define VXWORKS_ENDFILE_SPEC ""
|
||||
#define VXWORKS_STARTFILE_SPEC \
|
||||
VX_CRTBEGIN_SPEC " %{mrtp:%{!shared:-l:crt0.o}}"
|
||||
|
||||
#undef VXWORKS_ENDFILE_SPEC
|
||||
#define VXWORKS_ENDFILE_SPEC VX_CRTEND_SPEC
|
||||
|
||||
#undef VXWORKS_CC1_SPEC
|
||||
#if TARGET_VXWORKS7
|
||||
|
@ -1,3 +1,11 @@
|
||||
2019-11-06 Jerome Lambourg <lambourg@adacore.com>
|
||||
Olivier Hainque <hainque@adacore.com>
|
||||
|
||||
* config/vxcrtstuff.c: New file.
|
||||
* config/t-vxcrtstuff: New Makefile fragment.
|
||||
* config.host: Append t-vxcrtstuff to the tmake_file list
|
||||
on all VxWorks ports using dwarf for table based EH.
|
||||
|
||||
2019-11-07 Georg-Johann Lay <avr@gjlay.de>
|
||||
|
||||
Support 64-bit double and 64-bit long double configurations.
|
||||
|
@ -329,6 +329,16 @@ case ${host} in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Except on ARM where we do not use DWARF, table based EH on VxWorks
|
||||
# relies on specially crafted crtstuff files
|
||||
case ${host} in
|
||||
arm-*-vxworks*)
|
||||
;;
|
||||
*-*-vxworks*)
|
||||
tmake_file="${tmake_file} t-vxcrtstuff"
|
||||
;;
|
||||
esac
|
||||
|
||||
case ${host} in
|
||||
*-*-darwin* | *-*-dragonfly* | *-*-freebsd* | *-*-netbsd* | *-*-openbsd* | \
|
||||
*-*-solaris2*)
|
||||
|
12
libgcc/config/t-vxcrtstuff
Normal file
12
libgcc/config/t-vxcrtstuff
Normal file
@ -0,0 +1,12 @@
|
||||
# crtbegin/crtend for VxWorks (DKM or RTP)
|
||||
|
||||
vx_crtbegin-kernel.o: $(srcdir)/config/vxcrtstuff.c
|
||||
$(crt_compile) $(CRTSTUFF_T_CFLAGS) -DCRT_BEGIN -c $<
|
||||
|
||||
vx_crtbegin-rtp.o: $(srcdir)/config/vxcrtstuff.c
|
||||
$(crt_compile) $(CRTSTUFF_T_CFLAGS) -DCRT_BEGIN -c $< -mrtp
|
||||
|
||||
vx_crtend.o: $(srcdir)/config/vxcrtstuff.c
|
||||
$(crt_compile) $(CRTSTUFF_T_CFLAGS) -DCRT_END -c $<
|
||||
|
||||
EXTRA_PARTS += vx_crtbegin-kernel.o vx_crtbegin-rtp.o vx_crtend.o
|
132
libgcc/config/vxcrtstuff.c
Normal file
132
libgcc/config/vxcrtstuff.c
Normal file
@ -0,0 +1,132 @@
|
||||
/* 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_INIT_FINI_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
|
Loading…
Reference in New Issue
Block a user