2007-06-14 04:38:37 +02:00
|
|
|
/* crtbegin object for windows32 targets.
|
2016-01-04 15:30:50 +01:00
|
|
|
Copyright (C) 2007-2016 Free Software Foundation, Inc.
|
2007-06-14 04:38:37 +02:00
|
|
|
|
|
|
|
Contributed by Danny Smith <dannysmith@users.sourceforge.net>
|
|
|
|
|
|
|
|
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
|
2009-04-09 17:00:19 +02:00
|
|
|
Software Foundation; either version 3, or (at your option) any later
|
2007-06-14 04:38:37 +02:00
|
|
|
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.
|
|
|
|
|
2009-04-09 17:00:19 +02:00
|
|
|
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/>. */
|
2007-06-14 04:38:37 +02:00
|
|
|
|
|
|
|
/* Target machine header files require this define. */
|
|
|
|
#define IN_LIBGCC2
|
|
|
|
|
|
|
|
#include "auto-host.h"
|
|
|
|
#include "tconfig.h"
|
|
|
|
#include "tsystem.h"
|
|
|
|
#include "coretypes.h"
|
|
|
|
#include "tm.h"
|
Move libgcc_tm_file to toplevel libgcc
gcc:
* configure.ac (libgcc_tm_file_list, libgcc_tm_include_list):
Remove.
* configure: Regenerate.
* Makefile.in (libgcc_tm_file_list, libgcc_tm_include_list): Remove.
(TM_H): Remove libgcc_tm.h, $(libgcc_tm_file_list).
(libgcc_tm.h, cs-libgcc_tm.h): Remove.
(clean): Remove libgcc_tm.h
* mkconfig.sh: Don't include libgcc_tm.h in tm.h.
* config.gcc (libgcc_tm_file): Remove.
(arm*-*-linux*): Remove libgcc_tm_file for arm*-*-linux-*eabi.
(arm*-*-uclinux*): Remove libgcc_tm_file for arm*-*-uclinux*eabi.
(arm*-*-eabi*, arm*-*-symbianelf*): Remove libgcc_tm_file.
(avr-*-rtems*): Likewise.
(avr-*-*): Likewise.
(frv-*-elf): Likewise.
(frv-*-*linux*): Likewise.
(h8300-*-rtems*): Likewise.
(h8300-*-elf*): Likewise.
(i[34567]86-*-darwin*): Likewise.
(x86_64-*-darwin*): Likewise.
(rx-*-elf*): Likewise.
(tic6x-*-elf): Likewise.
(tic6x-*-uclinux): Likewise.
(i[34567]86-*-linux*, x86_64-*-linux*): Likewise.
libgcc:
* configure.ac (tm_file_): New variable.
Determine from tm_file.
(tm_file, tm_defines): Substitute.
* configure: Regenerate.
* mkheader.sh: New file.
* Makefile.in (clean): Remove libgcc_tm.h.
($(objects)): Depend on libgcc_tm.h.
(libgcc_tm_defines, libgcc_tm_file): New variables.
(libgcc_tm.h, libgcc_tm.stamp): New targets.
($(libgcc-objects), $(libgcc-s-objects), $(libgcc-eh-objects))
($(libgcov-objects), $(libunwind-objects), $(libunwind-s-objects))
($(extra-parts)): Depend on libgcc_tm.h.
* config.host (tm_defines, tm_file): New variable.
(arm*-*-linux*): Set tm_file for arm*-*-linux-*eabi.
(arm*-*-uclinux*): Set tm_file for arm*-*-uclinux*eabi.
(arm*-*-eabi*, arm*-*-symbianelf*): Set tm_file.
(avr-*-rtems*): Likewise.
(avr-*-*): Likewise.
(frv-*-elf): Likewise.
(frv-*-*linux*): Likewise.
(h8300-*-rtems*): Likewise.
(h8300-*-elf*): Likewise.
(i[34567]86-*-darwin*): Likewise.
(x86_64-*-darwin*): Likewise.
(rx-*-elf): Likewise.
(tic6x-*-uclinux): Likewise.
(tic6x-*-elf): Likewise.
(i[34567]86-*-linux*, x86_64-*-linux*): Likewise.
* config/alpha/gthr-posix.c: Include libgcc_tm.h.
* config/i386/cygming-crtbegin.c: Likewise.
* config/i386/cygming-crtend.c: Likewise.
* config/ia64/fde-vms.c: Likewise.
* config/ia64/unwind-ia64.c: Likewise.
* config/libbid/bid_gcc_intrinsics.h: Likewise.
* config/rs6000/darwin-fallback.c: Likewise.
* config/stormy16/lib2funcs.c: Likewise.
* config/xtensa/unwind-dw2-xtensa.c: Likewise.
* crtstuff.c: Likewise.
* dfp-bit.h: Likewise.
* emutls.c: Likewise.
* fixed-bit.c: Likewise.
* fp-bit.c: Likewise.
* generic-morestack-thread.c: Likewise.
* generic-morestack.c: Likewise.
* libgcc2.c: Likewise.
* libgcov.c: Likewise.
* unwind-dw2-fde-dip.c: Likewise.
* unwind-dw2-fde.c: Likewise.
* unwind-dw2.c: Likewise.
* unwind-sjlj.c: Likewise.
Co-Authored-By: Paolo Bonzini <bonzini@gnu.org>
From-SVN: r180775
2011-11-02 16:26:35 +01:00
|
|
|
#include "libgcc_tm.h"
|
2007-06-14 04:38:37 +02:00
|
|
|
#include "unwind-dw2-fde.h"
|
|
|
|
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
#ifndef LIBGCC_SONAME
|
|
|
|
#define LIBGCC_SONAME "libgcc_s.dll"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef LIBGCJ_SONAME
|
|
|
|
#define LIBGCJ_SONAME "libgcj_s.dll"
|
|
|
|
#endif
|
|
|
|
|
2013-05-08 20:33:52 +02:00
|
|
|
#if DWARF2_UNWIND_INFO
|
2007-06-14 04:38:37 +02:00
|
|
|
/* Make the declarations weak. This is critical for
|
|
|
|
_Jv_RegisterClasses because it lives in libgcj.a */
|
2013-05-08 20:33:52 +02:00
|
|
|
extern void __register_frame_info (__attribute__((unused)) const void *,
|
|
|
|
__attribute__((unused)) struct object *)
|
2007-06-14 04:38:37 +02:00
|
|
|
TARGET_ATTRIBUTE_WEAK;
|
2013-05-08 20:33:52 +02:00
|
|
|
extern void *__deregister_frame_info (__attribute__((unused)) const void *)
|
2007-06-14 04:38:37 +02:00
|
|
|
TARGET_ATTRIBUTE_WEAK;
|
2014-04-30 18:53:51 +02:00
|
|
|
|
|
|
|
/* Work around for current cygwin32 build problems (Bug gas/16858).
|
|
|
|
Compile weak default functions only for 64-bit systems,
|
|
|
|
when absolutely necessary. */
|
|
|
|
#ifdef __x86_64__
|
2013-05-08 20:33:52 +02:00
|
|
|
TARGET_ATTRIBUTE_WEAK void
|
|
|
|
__register_frame_info (__attribute__((unused)) const void *p,
|
|
|
|
__attribute__((unused)) struct object *o)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
TARGET_ATTRIBUTE_WEAK void *
|
|
|
|
__deregister_frame_info (__attribute__((unused)) const void *p)
|
|
|
|
{
|
|
|
|
return (void*) 0;
|
|
|
|
}
|
2014-04-30 18:53:51 +02:00
|
|
|
#endif
|
2013-05-08 20:33:52 +02:00
|
|
|
#endif /* DWARF2_UNWIND_INFO */
|
|
|
|
|
2007-06-14 04:38:37 +02:00
|
|
|
#if defined(HAVE_LD_RO_RW_SECTION_MIXING)
|
|
|
|
# define EH_FRAME_SECTION_CONST const
|
|
|
|
#else
|
|
|
|
# define EH_FRAME_SECTION_CONST
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Stick a label at the beginning of the frame unwind info so we can
|
|
|
|
register/deregister it with the exception handling library code. */
|
|
|
|
#if DWARF2_UNWIND_INFO
|
|
|
|
static EH_FRAME_SECTION_CONST char __EH_FRAME_BEGIN__[]
|
Use -fbuilding-libgcc for more target macros used in libgcc.
gcc/c-family:
* c-cppbuiltin.c (c_cpp_builtins): Also define
__LIBGCC_EH_TABLES_CAN_BE_READ_ONLY__,
__LIBGCC_EH_FRAME_SECTION_NAME__, __LIBGCC_JCR_SECTION_NAME__,
__LIBGCC_CTORS_SECTION_ASM_OP__, __LIBGCC_DTORS_SECTION_ASM_OP__,
__LIBGCC_TEXT_SECTION_ASM_OP__, __LIBGCC_INIT_SECTION_ASM_OP__,
__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__,
__LIBGCC_STACK_GROWS_DOWNWARD__,
__LIBGCC_DONT_USE_BUILTIN_SETJMP__,
__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__,
__LIBGCC_DWARF_FRAME_REGISTERS__,
__LIBGCC_EH_RETURN_STACKADJ_RTX__, __LIBGCC_JMP_BUF_SIZE__,
__LIBGCC_STACK_POINTER_REGNUM__ and
__LIBGCC_VTABLE_USES_DESCRIPTORS__ for -fbuilding-libgcc.
(builtin_define_with_value): Handle backslash-escaping in string
macro values.
libgcc:
* Makefile.in (CRTSTUFF_CFLAGS): Add -fbuilding-libgcc.
* config/aarch64/linux-unwind.h (STACK_POINTER_REGNUM): Change all
uses to __LIBGCC_STACK_POINTER_REGNUM__.
(DWARF_ALT_FRAME_RETURN_COLUMN): Change all uses to
__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
* config/alpha/vms-unwind.h (DWARF_ALT_FRAME_RETURN_COLUMN):
Change use to __LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
* config/cr16/unwind-cr16.c (STACK_GROWS_DOWNWARD): Change all
uses to __LIBGCC_STACK_GROWS_DOWNWARD__.
(DWARF_FRAME_REGISTERS): Change all uses to
__LIBGCC_DWARF_FRAME_REGISTERS__.
(EH_RETURN_STACKADJ_RTX): Change all uses to
__LIBGCC_EH_RETURN_STACKADJ_RTX__.
* config/cr16/unwind-dw2.h (DWARF_FRAME_REGISTERS): Change use to
__LIBGCC_DWARF_FRAME_REGISTERS__. Remove conditional definition.
* config/i386/cygming-crtbegin.c (EH_FRAME_SECTION_NAME): Change
use to __LIBGCC_EH_FRAME_SECTION_NAME__.
(JCR_SECTION_NAME): Change use to __LIBGCC_JCR_SECTION_NAME__.
* config/i386/cygming-crtend.c (EH_FRAME_SECTION_NAME): Change use
to __LIBGCC_EH_FRAME_SECTION_NAME__.
(JCR_SECTION_NAME): Change use to __LIBGCC_JCR_SECTION_NAME__
* config/mips/linux-unwind.h (STACK_POINTER_REGNUM): Change use to
__LIBGCC_STACK_POINTER_REGNUM__.
(DWARF_ALT_FRAME_RETURN_COLUMN): Change all uses to
__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
* config/nios2/linux-unwind.h (STACK_POINTER_REGNUM): Change use
to __LIBGCC_STACK_POINTER_REGNUM__.
* config/pa/hpux-unwind.h (DWARF_ALT_FRAME_RETURN_COLUMN): Change
all uses to __LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
* config/pa/linux-unwind.h (DWARF_ALT_FRAME_RETURN_COLUMN): Change
all uses to __LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
* config/rs6000/aix-unwind.h (DWARF_ALT_FRAME_RETURN_COLUMN):
Change all uses to __LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__.
(STACK_POINTER_REGNUM): Change all uses to
__LIBGCC_STACK_POINTER_REGNUM__.
* config/rs6000/darwin-fallback.c (STACK_POINTER_REGNUM): Change
use to __LIBGCC_STACK_POINTER_REGNUM__.
* config/rs6000/linux-unwind.h (STACK_POINTER_REGNUM): Change all
uses to __LIBGCC_STACK_POINTER_REGNUM__.
* config/sparc/linux-unwind.h (DWARF_FRAME_REGISTERS): Change use
to __LIBGCC_DWARF_FRAME_REGISTERS__.
* config/sparc/sol2-unwind.h (DWARF_FRAME_REGISTERS): Change use
to __LIBGCC_DWARF_FRAME_REGISTERS__.
* config/tilepro/linux-unwind.h (STACK_POINTER_REGNUM): Change use
to __LIBGCC_STACK_POINTER_REGNUM__.
* config/xtensa/unwind-dw2-xtensa.h (DWARF_FRAME_REGISTERS):
Remove conditional definition.
* crtstuff.c (TEXT_SECTION_ASM_OP): Change all uses to
__LIBGCC_TEXT_SECTION_ASM_OP__.
(EH_FRAME_SECTION_NAME): Change all uses to
__LIBGCC_EH_FRAME_SECTION_NAME__.
(EH_TABLES_CAN_BE_READ_ONLY): Change all uses to
__LIBGCC_EH_TABLES_CAN_BE_READ_ONLY__.
(CTORS_SECTION_ASM_OP): Change all uses to
__LIBGCC_CTORS_SECTION_ASM_OP__.
(DTORS_SECTION_ASM_OP): Change all uses to
__LIBGCC_DTORS_SECTION_ASM_OP__.
(JCR_SECTION_NAME): Change all uses to
__LIBGCC_JCR_SECTION_NAME__.
(INIT_SECTION_ASM_OP): Change all uses to
__LIBGCC_INIT_SECTION_ASM_OP__.
(INIT_ARRAY_SECTION_ASM_OP): Change all uses to
__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__.
* generic-morestack.c (STACK_GROWS_DOWNWARD): Change all uses to
__LIBGCC_STACK_GROWS_DOWNWARD__.
* libgcc2.c (INIT_SECTION_ASM_OP): Change all uses to
__LIBGCC_INIT_SECTION_ASM_OP__.
(INIT_ARRAY_SECTION_ASM_OP): Change all uses to
__LIBGCC_INIT_ARRAY_SECTION_ASM_OP__.
(EH_FRAME_SECTION_NAME): Change all uses to
__LIBGCC_EH_FRAME_SECTION_NAME__.
* libgcov-profiler.c (VTABLE_USES_DESCRIPTORS): Remove conditional
definitions. Change all uses to
__LIBGCC_VTABLE_USES_DESCRIPTORS__.
* unwind-dw2.c (STACK_GROWS_DOWNWARD): Change all uses to
__LIBGCC_STACK_GROWS_DOWNWARD__.
(DWARF_FRAME_REGISTERS): Change all uses to
__LIBGCC_DWARF_FRAME_REGISTERS__.
(EH_RETURN_STACKADJ_RTX): Change all uses to
__LIBGCC_EH_RETURN_STACKADJ_RTX__.
* unwind-dw2.h (DWARF_FRAME_REGISTERS): Remove conditional
definition. Change use to __LIBGCC_DWARF_FRAME_REGISTERS__.
* unwind-sjlj.c (DONT_USE_BUILTIN_SETJMP): Change all uses to
__LIBGCC_DONT_USE_BUILTIN_SETJMP__.
(JMP_BUF_SIZE): Change use to __LIBGCC_JMP_BUF_SIZE__.
From-SVN: r214954
2014-09-05 14:03:46 +02:00
|
|
|
__attribute__((used, section(__LIBGCC_EH_FRAME_SECTION_NAME__), aligned(4)))
|
2007-06-14 04:38:37 +02:00
|
|
|
= { };
|
|
|
|
|
|
|
|
static struct object obj;
|
2013-11-10 12:47:18 +01:00
|
|
|
|
|
|
|
/* Handle of libgcc's DLL reference. */
|
|
|
|
HANDLE hmod_libgcc;
|
2014-08-19 16:52:17 +02:00
|
|
|
static void * (*deregister_frame_fn) (const void *) = NULL;
|
2007-06-14 04:38:37 +02:00
|
|
|
#endif
|
|
|
|
|
2014-08-19 17:22:59 +02:00
|
|
|
#ifdef __CYGWIN__
|
|
|
|
/* Declare the __dso_handle variable. It should have a unique value
|
|
|
|
in every shared-object; in a main program its value is zero. The
|
|
|
|
object should in any case be protected. This means the instance
|
|
|
|
in one DSO or the main program is not used in another object. The
|
|
|
|
dynamic linker takes care of this. */
|
|
|
|
|
|
|
|
#ifdef CRTSTUFFS_O
|
|
|
|
extern void *__ImageBase;
|
|
|
|
void *__dso_handle = &__ImageBase;
|
|
|
|
#else
|
|
|
|
void *__dso_handle = 0;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __CYGWIN__ */
|
|
|
|
|
|
|
|
|
2007-06-14 04:38:37 +02:00
|
|
|
/* Pull in references from libgcc.a(unwind-dw2-fde.o) in the
|
|
|
|
startfile. These are referenced by a ctor and dtor in crtend.o. */
|
|
|
|
extern void __gcc_register_frame (void);
|
|
|
|
extern void __gcc_deregister_frame (void);
|
|
|
|
|
|
|
|
void
|
|
|
|
__gcc_register_frame (void)
|
|
|
|
{
|
|
|
|
#if DWARF2_UNWIND_INFO
|
|
|
|
/* Weak undefined symbols won't be pulled in from dlls; hence
|
|
|
|
we first test if the dll is already loaded and, if so,
|
|
|
|
get the symbol's address at run-time. If the dll is not loaded,
|
|
|
|
fallback to weak linkage to static archive. */
|
|
|
|
|
|
|
|
void (*register_frame_fn) (const void *, struct object *);
|
|
|
|
HANDLE h = GetModuleHandle (LIBGCC_SONAME);
|
2013-11-10 12:47:18 +01:00
|
|
|
|
2007-06-14 04:38:37 +02:00
|
|
|
if (h)
|
2013-11-10 12:47:18 +01:00
|
|
|
{
|
|
|
|
/* Increasing the load-count of LIBGCC_SONAME DLL. */
|
|
|
|
hmod_libgcc = LoadLibrary (LIBGCC_SONAME);
|
|
|
|
register_frame_fn = (void (*) (const void *, struct object *))
|
|
|
|
GetProcAddress (h, "__register_frame_info");
|
2014-07-24 18:41:01 +02:00
|
|
|
deregister_frame_fn = (void* (*) (const void *))
|
|
|
|
GetProcAddress (h, "__deregister_frame_info");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
register_frame_fn = __register_frame_info;
|
|
|
|
deregister_frame_fn = __deregister_frame_info;
|
2013-11-10 12:47:18 +01:00
|
|
|
}
|
2007-06-14 04:38:37 +02:00
|
|
|
if (register_frame_fn)
|
|
|
|
register_frame_fn (__EH_FRAME_BEGIN__, &obj);
|
|
|
|
#endif
|
|
|
|
|
2014-08-19 17:22:59 +02:00
|
|
|
#if DEFAULT_USE_CXA_ATEXIT
|
|
|
|
/* If we use the __cxa_atexit method to register C++ dtors
|
|
|
|
at object construction, also use atexit to register eh frame
|
|
|
|
info cleanup. */
|
|
|
|
atexit(__gcc_deregister_frame);
|
|
|
|
#endif /* DEFAULT_USE_CXA_ATEXIT */
|
2007-06-14 04:38:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
__gcc_deregister_frame (void)
|
|
|
|
{
|
|
|
|
#if DWARF2_UNWIND_INFO
|
|
|
|
if (deregister_frame_fn)
|
|
|
|
deregister_frame_fn (__EH_FRAME_BEGIN__);
|
2013-11-10 12:47:18 +01:00
|
|
|
if (hmod_libgcc)
|
|
|
|
FreeLibrary (hmod_libgcc);
|
2007-06-14 04:38:37 +02:00
|
|
|
#endif
|
|
|
|
}
|