Patchwork Don't use linux.h for non-Linux targets

login
register
mail settings
Submitter Joseph S. Myers
Date April 12, 2011, 6:37 p.m.
Message ID <Pine.LNX.4.64.1104121836210.24956@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/90846/
State New
Headers show

Comments

Joseph S. Myers - April 12, 2011, 6:37 p.m.
This patch stops targets not using the Linux kernel from using
linux*.h config headers.

gnu-user.h has TARGET_C99_FUNCTIONS and TARGET_HAS_SINCOS added
(defined to 1, overridden in linux.h) so that the non-Linux targets do
not need to have any libc-choice-related definitions from linux.h and
config.gcc does not need to define SINGLE_LIBC for them.  Non-Linux
x86 targets no longer inherit an MD_UNWIND_SUPPORT definition they
need to override, and REG_NAME is obsolete now linux-unwind.h is used
only for Linux, so is removed.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Also
tested building cc1 and xgcc for crosses to: i686-pc-linux-gnu
i686-gnu i686-kfreebsd-gnu i686-knetbsd-gnu i686-kopensolaris-gnu
x86_64-kfreebsd-gnu.  OK to commit?

The remaining issue in this area (linux*.h or gnu-user*.h not being
used for the right sets of targets) is that neither config/linux.h nor
config/gnu-user.h is used by the following targets: alpha*-*-linux*
arm*-*-uclinux* powerpc-*-linux* powerpc64-*-linux*.  I have no
current plans to work on this, but guess that it shouldn't be too hard
to make the Alpha and ARM targets use those headers (for Alpha it
might be necessary to move various Alpha ELF targets to using elfos.h;
I don't know if config/gnu-user.h and config/linux.h will work without
elfos.h or not, but certainly they are normally used with elfos.h; the
division between alpha/linux.h and alpha/linux-elf.h is also no longer
useful).  The Power targets are probably harder to convert, because
the -mcall-* mechanism for using one target's specs with another
target's compiler (that complicates lots of many-target patches by
making targets using rs6000/sysv4.h inconveniently different from
other targets) is liable to get in the way and should probably be
removed first.

(If anyone does a port of one of the non-Linux-kernel GNU-userspace
OSes to a non-x86 architecture, they should start by separating that
architecture's <arch>/linux*.h headers into gnu-user*.h and linux*.h
parts, as on x86, rather than creating new configurations using
linux*.h on inappropriate OSes.)

2011-04-12  Joseph Myers  <joseph@codesourcery.com>

	* config.gcc (*-*-kfreebsd*-gnu | *-*-knetbsd*-gnu | *-*-gnu* |
	*-*-kopensolaris*-gnu): Don't define SINGLE_LIBC.
	(i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu |
	i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu,
	x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu): Don't use
	linux*.h headers.
	* config/gnu-user.h (TARGET_C99_FUNCTIONS, TARGET_HAS_SINCOS):
	Define.
	* config/i386/gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
	* config/i386/kfreebsd-gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
	* config/i386/knetbsd-gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
	* config/i386/kopensolaris-gnu.h (MD_UNWIND_SUPPORT): Don't
	undefine.
	* config/i386/linux-unwind.h (x86_fallback_frame_state): Don't use
	REG_NAME.
	* config/i386/linux.h (REG_NAME): Don't define.
	* config/i386/linux64.h (REG_NAME): Don't define.
	* config/linux.h (TARGET_C99_FUNCTIONS, TARGET_HAS_SINCOS):
	Undefine before defining.
Joseph S. Myers - April 20, 2011, 9:10 p.m.
Ping.  This patch 
<http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00919.html> is pending 
review.
Thomas Schwinge - April 26, 2011, 10:30 p.m.
Hallo!

First, Joseph, thanks for working on this clean-up!  I'm sorry for the
delay, but I have now reviewed all these patches (including those you
have committed by now); looks all good.


On Tue, 12 Apr 2011 18:37:50 +0000 (UTC), "Joseph S. Myers" <joseph@codesourcery.com> wrote:
> This patch stops targets not using the Linux kernel from using
> linux*.h config headers.  [...]

> 2011-04-12  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* config.gcc (*-*-kfreebsd*-gnu | *-*-knetbsd*-gnu | *-*-gnu* |
> 	*-*-kopensolaris*-gnu): Don't define SINGLE_LIBC.
> 	(i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu |
> 	i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu,
> 	x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu): Don't use
> 	linux*.h headers.
> 	* config/gnu-user.h (TARGET_C99_FUNCTIONS, TARGET_HAS_SINCOS):
> 	Define.
> 	* config/i386/gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
> 	* config/i386/kfreebsd-gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
> 	* config/i386/knetbsd-gnu.h (MD_UNWIND_SUPPORT): Don't undefine.
> 	* config/i386/kopensolaris-gnu.h (MD_UNWIND_SUPPORT): Don't
> 	undefine.
> 	* config/i386/linux-unwind.h (x86_fallback_frame_state): Don't use
> 	REG_NAME.
> 	* config/i386/linux.h (REG_NAME): Don't define.
> 	* config/i386/linux64.h (REG_NAME): Don't define.
> 	* config/linux.h (TARGET_C99_FUNCTIONS, TARGET_HAS_SINCOS):
> 	Undefine before defining.

Looks good, too.  I have not yet built-tested this (and it's too late by
now), but I'll do that in the next days.


One (minor) additional idea: for clarity, shouldn't it now be possible to
remove any #undef GNU_USER_TARGET_OS_CPP_BUILTINS, #undef
GNU_USER_DYNAMIC_LINKER, #undef GNU_USER_LINK_EMULATION, etc. from
*gnu.h?  I don't expect you to test this; I'll have a look later on.

I'll also test whether gnu.h:LIB_SPEC is still needed, or if the
gnu-user.h definition contains all we need.


Grüße,
 Thomas
Joseph S. Myers - April 27, 2011, 10:04 a.m.
On Wed, 27 Apr 2011, Thomas Schwinge wrote:

> One (minor) additional idea: for clarity, shouldn't it now be possible to
> remove any #undef GNU_USER_TARGET_OS_CPP_BUILTINS, #undef
> GNU_USER_DYNAMIC_LINKER, #undef GNU_USER_LINK_EMULATION, etc. from
> *gnu.h?  I don't expect you to test this; I'll have a look later on.

Yes, if those were only to undefine macros defined in linux.h.  In general 
there is no consistent rule about whether headers use #undef in cases 
where it is not needed.
Joseph S. Myers - April 27, 2011, 7:16 p.m.
Ping^2.  This patch 
<http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00919.html> is still pending 
review (except insofar as it relates to GNU Hurd).
Richard Henderson - April 28, 2011, 3:53 p.m.
On 04/27/2011 12:16 PM, Joseph S. Myers wrote:
> Ping^2.  This patch 
> <http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00919.html> is still pending 
> review (except insofar as it relates to GNU Hurd).
> 

Ok.

r~

Patch

Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc	(revision 172279)
+++ gcc/config.gcc	(working copy)
@@ -565,8 +565,6 @@  case ${target} in
   case $target in
     *linux*)
       extra_options="$extra_options linux.opt";;
-    *)
-      tm_defines="$tm_defines SINGLE_LIBC";;
   esac
   case $target in
     *-*-*android*)
@@ -1201,9 +1199,10 @@  i[34567]86-*-openbsd*)
 i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu)
 			# Intel 80386's running GNU/*
 			# with ELF format using glibc 2
-	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h"
+	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h glibc-stdint.h"
 	case ${target} in
 	i[34567]86-*-linux*)
+		tm_file="${tm_file} linux.h"
 		# Assume modern glibc
 		default_gnu_indirect_function=yes
 		if test x$enable_targets = xall; then
@@ -1230,18 +1229,19 @@  i[34567]86-*-linux* | i[34567]86-*-kfree
 			tm_file="${tm_file} i386/gnu-user.h i386/linux.h"
 		fi
 		;;
-	i[34567]86-*-knetbsd*-gnu) tm_file="${tm_file} i386/gnu-user.h i386/linux.h knetbsd-gnu.h i386/knetbsd-gnu.h" ;;
-	i[34567]86-*-kfreebsd*-gnu) tm_file="${tm_file} i386/gnu-user.h i386/linux.h kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;;
-	i[34567]86-*-kopensolaris*-gnu) tm_file="${tm_file} i386/gnu-user.h i386/linux.h kopensolaris-gnu.h i386/kopensolaris-gnu.h" ;;
-	i[34567]86-*-gnu*) tm_file="$tm_file i386/gnu-user.h i386/linux.h gnu.h i386/gnu.h";;
+	i[34567]86-*-knetbsd*-gnu) tm_file="${tm_file} i386/gnu-user.h knetbsd-gnu.h i386/knetbsd-gnu.h" ;;
+	i[34567]86-*-kfreebsd*-gnu) tm_file="${tm_file} i386/gnu-user.h kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;;
+	i[34567]86-*-kopensolaris*-gnu) tm_file="${tm_file} i386/gnu-user.h kopensolaris-gnu.h i386/kopensolaris-gnu.h" ;;
+	i[34567]86-*-gnu*) tm_file="$tm_file i386/gnu-user.h gnu.h i386/gnu.h";;
 	esac
 	tmake_file="${tmake_file} i386/t-crtstuff i386/t-crtpc i386/t-crtfm t-dfprules"
 	;;
 x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu)
-	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h \
-		 i386/x86-64.h i386/gnu-user64.h i386/linux64.h"
+	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h glibc-stdint.h \
+		 i386/x86-64.h i386/gnu-user64.h"
 	case ${target} in
 	x86_64-*-linux*)
+	  tm_file="${tm_file} linux.h i386/linux64.h"
 	  default_gnu_indirect_function=glibc-2011 ;;
 	x86_64-*-kfreebsd*-gnu) tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu.h" ;;
 	x86_64-*-knetbsd*-gnu) tm_file="${tm_file} knetbsd-gnu.h" ;;
Index: gcc/config/linux.h
===================================================================
--- gcc/config/linux.h	(revision 172279)
+++ gcc/config/linux.h	(working copy)
@@ -93,7 +93,9 @@  see the files COPYING3 and COPYING.RUNTI
 
 /* Determine whether the entire c99 runtime
    is present in the runtime library.  */
+#undef TARGET_C99_FUNCTIONS
 #define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
 
 /* Whether we have sincos that follows the GNU extension.  */
+#undef TARGET_HAS_SINCOS
 #define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC)
Index: gcc/config/i386/linux.h
===================================================================
--- gcc/config/i386/linux.h	(revision 172279)
+++ gcc/config/i386/linux.h	(working copy)
@@ -24,5 +24,3 @@  along with GCC; see the file COPYING3.  
 #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
 
 #define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
-
-#define REG_NAME(reg) reg
Index: gcc/config/i386/kopensolaris-gnu.h
===================================================================
--- gcc/config/i386/kopensolaris-gnu.h	(revision 172279)
+++ gcc/config/i386/kopensolaris-gnu.h	(working copy)
@@ -20,5 +20,3 @@  along with GCC; see the file COPYING3.  
 <http://www.gnu.org/licenses/>.  */
 
 #define GNU_USER_LINK_EMULATION "elf_i386"
-
-#undef MD_UNWIND_SUPPORT
Index: gcc/config/i386/kfreebsd-gnu.h
===================================================================
--- gcc/config/i386/kfreebsd-gnu.h	(revision 172279)
+++ gcc/config/i386/kfreebsd-gnu.h	(working copy)
@@ -27,5 +27,3 @@  along with GCC; see the file COPYING3.  
 
 #undef GNU_USER_DYNAMIC_LINKER64
 #define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-kfreebsd-x86-64.so.1"
-
-#undef MD_UNWIND_SUPPORT
Index: gcc/config/i386/gnu.h
===================================================================
--- gcc/config/i386/gnu.h	(revision 172279)
+++ gcc/config/i386/gnu.h	(working copy)
@@ -36,9 +36,6 @@  along with GCC.  If not, see <http://www
    crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
 #endif
 
-/* FIXME: Is a Hurd-specific fallback mechanism necessary?  */
-#undef MD_UNWIND_SUPPORT
-
 #ifdef TARGET_LIBC_PROVIDES_SSP
 /* Not supported yet.  */
 #undef TARGET_THREAD_SSP_OFFSET
Index: gcc/config/i386/linux64.h
===================================================================
--- gcc/config/i386/linux64.h	(revision 172279)
+++ gcc/config/i386/linux64.h	(working copy)
@@ -28,5 +28,3 @@  see the files COPYING3 and COPYING.RUNTI
 #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2"
 
 #define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
-
-#define REG_NAME(reg) reg
Index: gcc/config/i386/linux-unwind.h
===================================================================
--- gcc/config/i386/linux-unwind.h	(revision 172279)
+++ gcc/config/i386/linux-unwind.h	(working copy)
@@ -1,5 +1,6 @@ 
 /* DWARF2 EH unwinding support for AMD x86-64 and x86.
-   Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2006, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -146,28 +147,28 @@  x86_fallback_frame_state (struct _Unwind
   else
     return _URC_END_OF_STACK;
 
-  new_cfa = sc->REG_NAME(esp);
+  new_cfa = sc->esp;
   fs->regs.cfa_how = CFA_REG_OFFSET;
   fs->regs.cfa_reg = 4;
   fs->regs.cfa_offset = new_cfa - (long) context->cfa;
 
   /* The SVR4 register numbering macros aren't usable in libgcc.  */
   fs->regs.reg[0].how = REG_SAVED_OFFSET;
-  fs->regs.reg[0].loc.offset = (long)&sc->REG_NAME(eax) - new_cfa;
+  fs->regs.reg[0].loc.offset = (long)&sc->eax - new_cfa;
   fs->regs.reg[3].how = REG_SAVED_OFFSET;
-  fs->regs.reg[3].loc.offset = (long)&sc->REG_NAME(ebx) - new_cfa;
+  fs->regs.reg[3].loc.offset = (long)&sc->ebx - new_cfa;
   fs->regs.reg[1].how = REG_SAVED_OFFSET;
-  fs->regs.reg[1].loc.offset = (long)&sc->REG_NAME(ecx) - new_cfa;
+  fs->regs.reg[1].loc.offset = (long)&sc->ecx - new_cfa;
   fs->regs.reg[2].how = REG_SAVED_OFFSET;
-  fs->regs.reg[2].loc.offset = (long)&sc->REG_NAME(edx) - new_cfa;
+  fs->regs.reg[2].loc.offset = (long)&sc->edx - new_cfa;
   fs->regs.reg[6].how = REG_SAVED_OFFSET;
-  fs->regs.reg[6].loc.offset = (long)&sc->REG_NAME(esi) - new_cfa;
+  fs->regs.reg[6].loc.offset = (long)&sc->esi - new_cfa;
   fs->regs.reg[7].how = REG_SAVED_OFFSET;
-  fs->regs.reg[7].loc.offset = (long)&sc->REG_NAME(edi) - new_cfa;
+  fs->regs.reg[7].loc.offset = (long)&sc->edi - new_cfa;
   fs->regs.reg[5].how = REG_SAVED_OFFSET;
-  fs->regs.reg[5].loc.offset = (long)&sc->REG_NAME(ebp) - new_cfa;
+  fs->regs.reg[5].loc.offset = (long)&sc->ebp - new_cfa;
   fs->regs.reg[8].how = REG_SAVED_OFFSET;
-  fs->regs.reg[8].loc.offset = (long)&sc->REG_NAME(eip) - new_cfa;
+  fs->regs.reg[8].loc.offset = (long)&sc->eip - new_cfa;
   fs->retaddr_column = 8;
   fs->signal_frame = 1;
   return _URC_NO_REASON;
Index: gcc/config/i386/knetbsd-gnu.h
===================================================================
--- gcc/config/i386/knetbsd-gnu.h	(revision 172279)
+++ gcc/config/i386/knetbsd-gnu.h	(working copy)
@@ -20,5 +20,3 @@  along with GCC; see the file COPYING3.  
 <http://www.gnu.org/licenses/>.  */
 
 #define GNU_USER_LINK_EMULATION "elf_i386"
-
-#undef MD_UNWIND_SUPPORT
Index: gcc/config/gnu-user.h
===================================================================
--- gcc/config/gnu-user.h	(revision 172279)
+++ gcc/config/gnu-user.h	(working copy)
@@ -95,3 +95,6 @@  see the files COPYING3 and COPYING.RUNTI
 #endif
 
 #define TARGET_POSIX_IO
+
+#define TARGET_C99_FUNCTIONS 1
+#define TARGET_HAS_SINCOS 1