Commit abe92a04 by Richard Sandiford Committed by Richard Sandiford

config.gcc (m68k-*-uclinux*): Add flat.h to $tm_file.

gcc/
	* config.gcc (m68k-*-uclinux*): Add flat.h to $tm_file.
	* config/flat.h: New file.
	* crtstuff.c (USE_PT_GNU_EH_FRAME): Don't define if
	OBJECT_FORMAT_FLAT.
	* config/m68k/m68k.h (ASM_PREFERRED_EH_DATA_FORMAT): Do not use
	indirect references for -msep-data or -mid-shared-library.
	Do not use PC-relative code addresses either.
	* config/m68k/m68k.c (override_options): Restrict -fPIC error
	to -mpcrel.
	* config/m68k/uclinux.h (STARTFILE_SPEC): Define.  Use Scrt1.o
	for shared libraries and crt1.o for executables.  Use crti.o and
	crtbegin.o.
	(ENDFILE_SPEC): Use crtend.o and crtn.o.
	(LIB_SPEC): Suppress -Rlibc.gdb if -static-libc is given.
	Do not add -elf2flt or -shared-lib-id options here.
	(LINK_SPEC): Define.  Pass -elf2flt if no -elf2flt option is given.
	Pass -shared-lib-id if -mid-shared-library, taking the library
	identifier from -mshared-library-id if given, otherwise
	defaulting to 0.
	(EH_FRAME_IN_DATA_SECTION): Do not undefine.
	(INIT_SECTION_ASM_OP, FINI_SECTION_ASM_OP): Likewise.
	(TARGET_OS_CPP_BUILTINS): Define __GXX_MERGED_TYPEINFO_NAMES=0
	and __GXX_TYPEINFO_EQUALITY_INLINE=0 if -mid-shared-library.
	(DRIVER_SELF_SPECS): Map unadorned PIC options to -msep-data.
	* config/m68k/t-uclinux (EXTRA_MULTILIB_PARTS): Add crtbegin.o
	and crtend.o.
	* config/m68k/lb1sf68.asm (PICCALL): Use an lea and pc-relative
	jump sequence for ISA A and ISA A+.
	(PICJUMP): Likewise.

From-SVN: r120912
parent 78218d89
2007-01-18 Richard Sandiford <richard@codesourcery.com> 2007-01-18 Richard Sandiford <richard@codesourcery.com>
* config.gcc (m68k-*-uclinux*): Add flat.h to $tm_file.
* config/flat.h: New file.
* crtstuff.c (USE_PT_GNU_EH_FRAME): Don't define if
OBJECT_FORMAT_FLAT.
* config/m68k/m68k.h (ASM_PREFERRED_EH_DATA_FORMAT): Do not use
indirect references for -msep-data or -mid-shared-library.
Do not use PC-relative code addresses either.
* config/m68k/m68k.c (override_options): Restrict -fPIC error
to -mpcrel.
* config/m68k/uclinux.h (STARTFILE_SPEC): Define. Use Scrt1.o
for shared libraries and crt1.o for executables. Use crti.o and
crtbegin.o.
(ENDFILE_SPEC): Use crtend.o and crtn.o.
(LIB_SPEC): Suppress -Rlibc.gdb if -static-libc is given.
Do not add -elf2flt or -shared-lib-id options here.
(LINK_SPEC): Define. Pass -elf2flt if no -elf2flt option is given.
Pass -shared-lib-id if -mid-shared-library, taking the library
identifier from -mshared-library-id if given, otherwise
defaulting to 0.
(EH_FRAME_IN_DATA_SECTION): Do not undefine.
(INIT_SECTION_ASM_OP, FINI_SECTION_ASM_OP): Likewise.
(TARGET_OS_CPP_BUILTINS): Define __GXX_MERGED_TYPEINFO_NAMES=0
and __GXX_TYPEINFO_EQUALITY_INLINE=0 if -mid-shared-library.
(DRIVER_SELF_SPECS): Map unadorned PIC options to -msep-data.
* config/m68k/t-uclinux (EXTRA_MULTILIB_PARTS): Add crtbegin.o
and crtend.o.
* config/m68k/lb1sf68.asm (PICCALL): Use an lea and pc-relative
jump sequence for ISA A and ISA A+.
(PICJUMP): Likewise.
2007-01-18 Richard Sandiford <richard@codesourcery.com>
* config.gcc (m68k-*-uclinux*): Base the port on the common * config.gcc (m68k-*-uclinux*): Base the port on the common
and m68k GNU/Linux files rather than on the generic ELF ones. and m68k GNU/Linux files rather than on the generic ELF ones.
* config/m68k/uclinux.h (TARGET_VERSION): Override. * config/m68k/uclinux.h (TARGET_VERSION): Override.
......
...@@ -1523,7 +1523,7 @@ m68k-*-uclinux*) # Motorola m68k/ColdFire running uClinux ...@@ -1523,7 +1523,7 @@ m68k-*-uclinux*) # Motorola m68k/ColdFire running uClinux
# with uClibc, using the new GNU/Linux-style # with uClibc, using the new GNU/Linux-style
# ABI. # ABI.
default_m68k_cpu=68020 default_m68k_cpu=68020
tm_file="m68k/m68k.h dbxelf.h elfos.h svr4.h linux.h m68k/linux.h m68k/uclinux.h" tm_file="m68k/m68k.h dbxelf.h elfos.h svr4.h linux.h flat.h m68k/linux.h m68k/uclinux.h"
tm_defines="${tm_defines} MOTOROLA USE_GAS UCLIBC_DEFAULT=1" tm_defines="${tm_defines} MOTOROLA USE_GAS UCLIBC_DEFAULT=1"
extra_options="${extra_options} linux.opt" extra_options="${extra_options} linux.opt"
tmake_file=m68k/t-uclinux tmake_file=m68k/t-uclinux
......
/* Defines to be used for targets that support flat executables.
Copyright (C) 2006 Free Software Foundation, Inc.
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 2, 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.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
/* This macro applies on top of OBJECT_FORMAT_ELF and indicates that
we want to support both flat and ELF output. */
#define OBJECT_FORMAT_FLAT
...@@ -120,11 +120,21 @@ Boston, MA 02110-1301, USA. */ ...@@ -120,11 +120,21 @@ Boston, MA 02110-1301, USA. */
/* Common for -mid-shared-libary and -msep-data */ /* Common for -mid-shared-libary and -msep-data */
.macro PICCALL addr .macro PICCALL addr
#if defined (__mcoldfire__) && !defined (__mcfisab__)
lea \addr-.-8,a0
jsr pc@(a0)
#else
bsr \addr bsr \addr
#endif
.endm .endm
.macro PICJUMP addr .macro PICJUMP addr
#if defined (__mcoldfire__) && !defined (__mcfisab__)
lea \addr-.-8,a0
jmp pc@(a0)
#else
bra \addr bra \addr
#endif
.endm .endm
# if defined(__ID_SHARED_LIBRARY__) # if defined(__ID_SHARED_LIBRARY__)
......
...@@ -519,10 +519,10 @@ override_options (void) ...@@ -519,10 +519,10 @@ override_options (void)
if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY) if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY)
flag_pic = 2; flag_pic = 2;
/* -fPIC uses 32-bit pc-relative displacements, which don't exist /* -mpcrel -fPIC uses 32-bit pc-relative displacements. Raise an
until the 68020. */ error if the target does not support them. */
if (!TARGET_68020 && !TARGET_COLDFIRE && (flag_pic == 2)) if (TARGET_PCREL && !TARGET_68020 && flag_pic == 2)
error ("-fPIC is not currently supported on the 68000 or 68010"); error ("-mpcrel -fPIC is not currently supported on selected cpu");
/* ??? A historic way of turning on pic, or is this intended to /* ??? A historic way of turning on pic, or is this intended to
be an embedded thing that doesn't have the same name binding be an embedded thing that doesn't have the same name binding
......
...@@ -1090,9 +1090,34 @@ do { if (cc_prev_status.flags & CC_IN_68881) \ ...@@ -1090,9 +1090,34 @@ do { if (cc_prev_status.flags & CC_IN_68881) \
/* Select a format to encode pointers in exception handling data. CODE /* Select a format to encode pointers in exception handling data. CODE
is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
true if the symbol may be affected by dynamic relocations. */ true if the symbol may be affected by dynamic relocations.
TARGET_ID_SHARED_LIBRARY and TARGET_SEP_DATA are designed to support
a read-only text segment without imposing a fixed gap between the
text and data segments. As a result, the text segment cannot refer
to anything in the data segment, even in PC-relative form. Because
.eh_frame refers to both code and data, it follows that .eh_frame
must be in the data segment itself, and that the offset between
.eh_frame and code will not be a link-time constant.
In theory, we could create a read-only .eh_frame by using DW_EH_PE_pcrel
| DW_EH_PE_indirect for all code references. However, gcc currently
handles indirect references using a per-TU constant pool. This means
that if a function and its eh_frame are removed by the linker, the
eh_frame's indirect references to the removed function will not be
removed, leading to an unresolved symbol error.
It isn't clear that any -msep-data or -mid-shared-library target
would benefit from a read-only .eh_frame anyway. In particular,
no known target that supports these options has a feature like
PT_GNU_RELRO. Without any such feature to motivate them, indirect
references would be unnecessary bloat, so we simply use an absolute
pointer for code and global references. We still use pc-relative
references to data, as this avoids a relocation. */
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
(flag_pic \ (flag_pic \
&& !((TARGET_ID_SHARED_LIBRARY || TARGET_SEP_DATA) \
&& ((GLOBAL) || (CODE))) \
? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4 \ ? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4 \
: DW_EH_PE_absptr) : DW_EH_PE_absptr)
......
# crti and crtn are provided by uClibc.
EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o
LIB1ASMSRC = m68k/lb1sf68.asm LIB1ASMSRC = m68k/lb1sf68.asm
LIB1ASMFUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \ LIB1ASMFUNCS = _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
_double _float _floatex \ _double _float _floatex \
...@@ -19,6 +22,3 @@ MULTILIB_EXCEPTIONS = m68000/msep-data* m68000/mid-shared-library* msep-data* mi ...@@ -19,6 +22,3 @@ MULTILIB_EXCEPTIONS = m68000/msep-data* m68000/mid-shared-library* msep-data* mi
LIBGCC = stmp-multilib LIBGCC = stmp-multilib
INSTALL_LIBGCC = install-multilib INSTALL_LIBGCC = install-multilib
# We don't use crtbegin.o and crtend.o
EXTRA_MULTILIB_PARTS=
...@@ -24,29 +24,27 @@ Boston, MA 02110-1301, USA. */ ...@@ -24,29 +24,27 @@ Boston, MA 02110-1301, USA. */
#undef TARGET_VERSION #undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (68k uClinux)"); #define TARGET_VERSION fprintf (stderr, " (68k uClinux)");
/* Undo the definition of STARTFILE_SPEC from m68kelf.h so we'll #undef STARTFILE_SPEC
pick the default from gcc.c (just link crt0.o from multilib dir). */ #define STARTFILE_SPEC \
#undef STARTFILE_SPEC "%{mshared-library-id=0|!mshared-library-id=*: crt1.o%s ;: Scrt1.o%s} \
crti.o%s crtbegin.o%s"
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
/* Override the default LIB_SPEC from gcc.c. We don't currently support /* Override the default LIB_SPEC from gcc.c. We don't currently support
profiling, or libg.a. */ profiling, or libg.a. */
#undef LIB_SPEC #undef LIB_SPEC
#define LIB_SPEC "\ #define LIB_SPEC \
%{mid-shared-library:-R libc.gdb%s -elf2flt -shared-lib-id 0} -lc \ "%{mid-shared-library:%{!static-libc:-R libc.gdb%s}} -lc"
"
/* Default to using -elf2flt with no options. */
/* we don't want a .eh_frame section. */ #undef LINK_SPEC
#define EH_FRAME_IN_DATA_SECTION #define LINK_SPEC \
"%{!elf2flt*:-elf2flt} \
/* ??? Quick hack to get constructors working. Make this look more like a %{mid-shared-library: \
COFF target, so the existing dejagnu/libgloss support works. A better %{mshared-library-id=*:-shared-lib-id %*;:-shared-lib-id 0}}"
solution would be to make the necessary dejagnu and libgloss changes so
that we can use normal the ELF constructor mechanism. */
#undef INIT_SECTION_ASM_OP
#undef FINI_SECTION_ASM_OP
#undef ENDFILE_SPEC
#define ENDFILE_SPEC ""
#undef TARGET_OS_CPP_BUILTINS #undef TARGET_OS_CPP_BUILTINS
#define TARGET_OS_CPP_BUILTINS() \ #define TARGET_OS_CPP_BUILTINS() \
do \ do \
...@@ -54,7 +52,16 @@ Boston, MA 02110-1301, USA. */ ...@@ -54,7 +52,16 @@ Boston, MA 02110-1301, USA. */
LINUX_TARGET_OS_CPP_BUILTINS (); \ LINUX_TARGET_OS_CPP_BUILTINS (); \
builtin_define ("__uClinux__"); \ builtin_define ("__uClinux__"); \
if (TARGET_ID_SHARED_LIBRARY) \ if (TARGET_ID_SHARED_LIBRARY) \
builtin_define ("__ID_SHARED_LIBRARY__"); \ { \
builtin_define ("__ID_SHARED_LIBRARY__"); \
/* Shared libraries and executables do not share \
typeinfo names. */ \
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \
builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \
} \
} \ } \
while (0) while (0)
/* -msep-data is the default PIC mode on this target. */
#define DRIVER_SELF_SPECS \
"%{fpie|fPIE|fpic|fPIC:%{!msep-data:%{!mid-shared-library: -msep-data}}}"
...@@ -86,7 +86,9 @@ call_ ## FUNC (void) \ ...@@ -86,7 +86,9 @@ call_ ## FUNC (void) \
} }
#endif #endif
#if defined(OBJECT_FORMAT_ELF) && defined(HAVE_LD_EH_FRAME_HDR) \ #if defined(OBJECT_FORMAT_ELF) \
&& !defined(OBJECT_FORMAT_FLAT) \
&& defined(HAVE_LD_EH_FRAME_HDR) \
&& !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \ && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
&& defined(__GLIBC__) && __GLIBC__ >= 2 && defined(__GLIBC__) && __GLIBC__ >= 2
#include <link.h> #include <link.h>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment