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:
Jerome Lambourg 2019-11-14 15:53:23 +00:00 committed by Olivier Hainque
parent ebcdba9c9f
commit 78e49fb1bc
7 changed files with 204 additions and 10 deletions

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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*)

View 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
View 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