This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] OpenBSD/amd64 support and OpenBSD/i386 cleanup


On Sun, 1 Jan 2012, Mark Kettenis wrote:
> The diff below adds support for OpenBSD/amd64 and cleans up the
> OpenBSD/i386 configury bits such that they can be shared.  The OpenBSD
> ports people have maintained their own set of patches for these
> targets, but this is a re-implementation from scratch to prevent
> copyright issues.  I have a copyright assignment in place for GCC.

I did not see any response to this patch by Mark.  In my experience
it really is preferrable if we can keep such things upstream on our
side (GCC) as opposed to OpenBSD or other distributions carrying their
own.

If anyone wants to approve this, I volunteer to commit the patch.

Gerald


libgcc/:

2011-12-27  Mark Kettenis  <kettenis@openbsd.org>

	* config.host (x86_64-*-openbsd*): New target.

gcc/:

2011-12-27  Mark Kettenis  <kettenis@openbsd.org>

	* config.gcc (x86_64-*-openbsd*): New target.
	* config/openbsd.h (TARGET_C99_FUNCTIONS): Define.
	* config/i386/openbsdelf.h: Remove some superfluous defines and
	group things together in a more logical fashion.
	(DBX_REGISTER_NUMBER): Provide a
	definition that works on both 32-bit and 64-bit targets.
	(WCHAR_TYPE_SIZE): Hardcode as 32.
	(NO_DOLLAR_IN_LABEL): Remove undef.
	(TARGET_DEFAULT): Remove.
	(SET_ASM_OP): Remove.
	(DEFAULT_PCC_STRUCT_RETURN): Undef first to prevent warning.
	(ASM_OUTPUT_MAX_SKIP_ALIGN): Synch with x86-64.h
	(DWARF2_UNWIND_INFO): Remove define.
	(HAVE_ENABLE_EXECUTE_STACK): Define.
	* config/host-openbsd.c: New file.
	* config/t-openbsd (USER_H): Add EXTRA_HEADERS.
	* config/x-openbsd: New file.


Index: libgcc/config.host
===================================================================
--- libgcc/config.host	(revision 182693)
+++ libgcc/config.host	(working copy)
@@ -532,6 +532,8 @@
 	;;
 i[34567]86-*-openbsd*)
 	;;
+x86_64-*-openbsd*)
+	;;
 i[34567]86-*-linux*)
 	extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
 	tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules"
Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc	(revision 182693)
+++ gcc/config.gcc	(working copy)
@@ -1201,6 +1201,13 @@
 	gas=yes
 	gnu_ld=yes
 	;;
+x86_64-*-openbsd*)
+	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h"
+	tm_file="${tm_file} openbsd.h openbsd-stdint.h openbsd-libpthread.h i386/x86-64.h i386/openbsdelf.h"
+	extra_options="${extra_options} openbsd.opt"
+	gas=yes
+	gnu_ld=yes
+	;;
 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
Index: gcc/config.host
===================================================================
--- gcc/config.host	(revision 182693)
+++ gcc/config.host	(working copy)
@@ -296,6 +296,10 @@
     out_host_hook_obj=host-linux.o
     host_xmake_file="${host_xmake_file} x-linux"
     ;;
+  *-*-openbsd*)
+    out_host_hook_obj=host-openbsd.o
+    host_xmake_file="${host_xmake_file} x-openbsd"
+    ;;
   ia64-*-hpux*)
     use_long_long_for_widest_fast_int=yes
     out_host_hook_obj=host-hpux.o
Index: gcc/config/host-openbsd.c
===================================================================
--- gcc/config/host-openbsd.c	(revision 0)
+++ gcc/config/host-openbsd.c	(revision 0)
@@ -0,0 +1,83 @@
+/* OpenBSD host-specific hook definitions.
+   Copyright (C) 2004, 2007, 2008, 2010, 2011 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 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.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "hosthooks.h"
+#include "hosthooks-def.h"
+
+
+#undef HOST_HOOKS_GT_PCH_GET_ADDRESS
+#define HOST_HOOKS_GT_PCH_GET_ADDRESS openbsd_gt_pch_get_address
+#undef HOST_HOOKS_GT_PCH_USE_ADDRESS
+#define HOST_HOOKS_GT_PCH_USE_ADDRESS openbsd_gt_pch_use_address
+
+/* For various ports, try to guess a fixed spot in the vm space
+   that's probably free.  */
+#if defined(__amd64__)
+# define TRY_EMPTY_VM_SPACE	0x400000000000
+#elif defined(__i386__)
+# define TRY_EMPTY_VM_SPACE	0xb0000000
+#else
+# define TRY_EMPTY_VM_SPACE	0
+#endif
+
+/* Determine a location where we might be able to reliably allocate
+   SIZE bytes.  FD is the PCH file, though we should return with the
+   file unmapped.  */
+
+static void *
+openbsd_gt_pch_get_address (size_t size, int fd)
+{
+  void *addr;
+
+  addr = mmap ((void *) TRY_EMPTY_VM_SPACE, size, PROT_READ | PROT_WRITE,
+	       MAP_PRIVATE, fd, 0);
+
+  /* If we failed the map, that means there's *no* free space.  */
+  if (addr == (void *) MAP_FAILED)
+    return NULL;
+  /* Unmap the area before returning.  */
+  munmap (addr, size);
+
+  return addr;
+}
+
+/* Map SIZE bytes of FD+OFFSET at BASE.  Return 1 if we succeeded at 
+   mapping the data at BASE, -1 if we couldn't.  */
+
+static int
+openbsd_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
+{
+  void *addr;
+
+  /* We're called with size == 0 if we're not planning to load a PCH
+     file at all.  This allows the hook to free any static space that
+     we might have allocated at link time.  */
+  if (size == 0)
+    return -1;
+
+  addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
+
+  return addr == base ? 1 : -1;
+}
+
+
+const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;
Index: gcc/config/i386/openbsdelf.h
===================================================================
--- gcc/config/i386/openbsdelf.h	(revision 182693)
+++ gcc/config/i386/openbsdelf.h	(working copy)
@@ -18,24 +18,6 @@
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
-/* This keeps us from using libraries compiled with the native cc, so
-   undef it. */
-#undef NO_DOLLAR_IN_LABEL
-
-/* Override the default comment-starter of "/".  */
-#undef ASM_COMMENT_START
-#define ASM_COMMENT_START "#"
-
-#undef DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(n)  svr4_dbx_register_map[n]
-
-/* This goes away when the math-emulator is fixed */
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT \
-  (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387)
-
-/* Run-time target specifications */
-
 #define TARGET_OS_CPP_BUILTINS()		\
   do						\
     {						\
@@ -43,17 +25,11 @@
     }						\
   while (0)
 
-/* As an elf system, we need crtbegin/crtend stuff.  */
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC "\
-	%{!shared: %{pg:gcrt0%O%s} %{!pg:%{p:gcrt0%O%s} %{!p:crt0%O%s}} \
-	crtbegin%O%s} %{shared:crtbeginS%O%s}"
-#undef ENDFILE_SPEC
-#define ENDFILE_SPEC "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) \
+  (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
 
-/* Layout of source language data types.  */
-
-/* This must agree with <machine/ansi.h> */
+/* This must agree with <machine/_types.h>.  */
 #undef SIZE_TYPE
 #define SIZE_TYPE "long unsigned int"
 
@@ -64,64 +40,57 @@
 #define WCHAR_TYPE "int"
 
 #undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
+#define WCHAR_TYPE_SIZE 32
 
 #undef WINT_TYPE
 #define WINT_TYPE "int"
 
-/* Assembler format: overall framework.  */
+/* Don't default to pcc-struct-return, because gcc is the only compiler, and
+   we want to retain compatibility with older gcc versions.  */
 
+#undef DEFAULT_PCC_STRUCT_RETURN
+#define DEFAULT_PCC_STRUCT_RETURN 0
+
+/* Override the default comment-starter of "/".  */
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START "#"
+
 #undef ASM_APP_ON
 #define ASM_APP_ON "#APP\n"
 
 #undef ASM_APP_OFF
 #define ASM_APP_OFF "#NO_APP\n"
 
-#undef SET_ASM_OP
-#define SET_ASM_OP	"\t.set\t"
+/* A C statement to output to the stdio stream FILE an assembler
+   command to advance the location counter to a multiple of 1<<LOG
+   bytes if it is within MAX_SKIP bytes.
 
-/* The following macros were originally stolen from i386v4.h.
-   These have to be defined to get PIC code correct.  */
+   This is used to align code labels according to Intel recommendations.  */
 
-/* Assembler format: dispatch tables.  */
-
-/* Assembler format: sections.  */
-
-/* Stack & calling: aggregate returns.  */
-
-/* Don't default to pcc-struct-return, because gcc is the only compiler, and
-   we want to retain compatibility with older gcc versions.  */
-#define DEFAULT_PCC_STRUCT_RETURN 0
-
-/* Assembler format: alignment output.  */
-
 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
-#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
-  if ((LOG) != 0) {\
-    if ((MAX_SKIP) == 0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
-    else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
-  }
+#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)			\
+  do {									\
+    if ((LOG) != 0) {							\
+      if ((MAX_SKIP) == 0) fprintf ((FILE), "\t.p2align %d\n", (LOG));	\
+      else {								\
+	fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP));	\
+	/* Make sure that we have at least 8 byte alignment if > 8 byte \
+	   alignment is preferred.  */					\
+	if ((LOG) > 3							\
+	    && (1 << (LOG)) > ((MAX_SKIP) + 1)				\
+	    && (MAX_SKIP) >= 7)						\
+	  fputs ("\t.p2align 3\n", (FILE));				\
+      }									\
+    }									\
+  } while (0)
 #endif
 
-/* Stack & calling: profiling.  */
-
 /* OpenBSD's profiler recovers all information from the stack pointer.
-   The icky part is not here, but in machine/profile.h.  */
+   The icky part is not here, but in <machine/profile.h>.  */
 #undef FUNCTION_PROFILER
 #define FUNCTION_PROFILER(FILE, LABELNO)  \
   fputs (flag_pic ? "\tcall __mcount@PLT\n": "\tcall __mcount\n", FILE);
 
-/* Assembler format: exception region output.  */
-
-/* our configuration still doesn't handle dwarf2 correctly */
-#define DWARF2_UNWIND_INFO 0
-
-/* Assembler format: alignment output.  */
-
-/* Note that we pick up ASM_OUTPUT_MAX_SKIP_ALIGN from i386/gas.h */
-
-/* Note that we pick up ASM_OUTPUT_MI_THUNK from unix.h.  */
-
 #undef LINK_SPEC
 #define LINK_SPEC \
   "%{!shared:%{!nostdlib:%{!r:%{!e*:-e __start}}}} \
@@ -131,4 +100,14 @@
    %{assert*} \
    -dynamic-linker /usr/libexec/ld.so"
 
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "\
+	%{!shared: %{pg:gcrt0%O%s} %{!pg:%{p:gcrt0%O%s} %{!p:crt0%O%s}} \
+	crtbegin%O%s} %{shared:crtbeginS%O%s}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
+
 #define OBSD_HAS_CORRECT_SPECS
+
+#define HAVE_ENABLE_EXECUTE_STACK
Index: gcc/config/t-openbsd
===================================================================
--- gcc/config/t-openbsd	(revision 182693)
+++ gcc/config/t-openbsd	(working copy)
@@ -1,2 +1,2 @@
 # We don't need GCC's own include files.
-USER_H =
+USER_H = $(EXTRA_HEADERS)
Index: gcc/config/x-openbsd
===================================================================
--- gcc/config/x-openbsd	(revision 0)
+++ gcc/config/x-openbsd	(revision 0)
@@ -0,0 +1,4 @@
+host-openbsd.o : $(srcdir)/config/host-openbsd.c $(CONFIG_H) $(SYSTEM_H) \
+  coretypes.h hosthooks.h hosthooks-def.h $(HOOKS_H)
+	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+		$(srcdir)/config/host-openbsd.c
Index: gcc/config/openbsd.h
===================================================================
--- gcc/config/openbsd.h	(revision 182693)
+++ gcc/config/openbsd.h	(working copy)
@@ -145,6 +145,10 @@
 #endif
 
 #define TARGET_POSIX_IO
+
+/* All new versions of OpenBSD have C99 functions.  */
+#define TARGET_C99_FUNCTIONS 1
+
 
 /* Runtime target specification.  */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]