From 51796b3a74363840f1ac04c96fcdb9544ebe7f5e Mon Sep 17 00:00:00 2001 From: gerald Date: Sun, 2 Sep 2012 14:13:21 +0000 Subject: [PATCH] libgcc/ * config.host (x86_64-*-openbsd*): New target. gcc/ * config.gcc (x86_64-*-openbsd*): New target. * config.host (*-*-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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190863 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 21 +++++++++ gcc/config.gcc | 7 +++ gcc/config.host | 4 ++ gcc/config/host-openbsd.c | 83 ++++++++++++++++++++++++++++++++ gcc/config/i386/openbsdelf.h | 109 +++++++++++++++++-------------------------- gcc/config/openbsd.h | 4 ++ gcc/config/t-openbsd | 2 +- gcc/config/x-openbsd | 4 ++ libgcc/ChangeLog | 4 ++ libgcc/config.host | 2 + 10 files changed, 174 insertions(+), 66 deletions(-) create mode 100644 gcc/config/host-openbsd.c create mode 100644 gcc/config/x-openbsd diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ebf53e..b1f8c50 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2012-09-02 Mark Kettenis + + * config.gcc (x86_64-*-openbsd*): New target. + * config.host (*-*-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. + 2012-09-02 Oleg Endo * config/sh/sh.md (*extendsi2_compact_mem_disp): Pass iterated diff --git a/gcc/config.gcc b/gcc/config.gcc index 9ec8a41..514f672 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1183,6 +1183,13 @@ i[34567]86-*-openbsd*) 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 diff --git a/gcc/config.host b/gcc/config.host index aa2a672..dfc5ac8 100644 --- a/gcc/config.host +++ b/gcc/config.host @@ -268,6 +268,10 @@ case ${host} in 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 diff --git a/gcc/config/host-openbsd.c b/gcc/config/host-openbsd.c new file mode 100644 index 0000000..955dedd --- /dev/null +++ b/gcc/config/host-openbsd.c @@ -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 + . */ + +#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; diff --git a/gcc/config/i386/openbsdelf.h b/gcc/config/i386/openbsdelf.h index 53949e8..6ea473d 100644 --- a/gcc/config/i386/openbsdelf.h +++ b/gcc/config/i386/openbsdelf.h @@ -18,24 +18,6 @@ You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ -/* 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 @@ along with GCC; see the file COPYING3. If not see } \ 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}" - -/* Layout of source language data types. */ +#undef DBX_REGISTER_NUMBER +#define DBX_REGISTER_NUMBER(n) \ + (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n]) -/* This must agree with */ +/* This must agree with . */ #undef SIZE_TYPE #define SIZE_TYPE "long unsigned int" @@ -64,12 +40,20 @@ along with GCC; see the file COPYING3. If not see #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" @@ -77,51 +61,36 @@ along with GCC; see the file COPYING3. If not see #undef ASM_APP_OFF #define ASM_APP_OFF "#NO_APP\n" -#undef SET_ASM_OP -#define SET_ASM_OP "\t.set\t" - -/* The following macros were originally stolen from i386v4.h. - These have to be defined to get PIC code correct. */ - -/* 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 +/* A C statement to output to the stdio stream FILE an assembler + command to advance the location counter to a multiple of 1< 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 . */ #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 @@ along with GCC; see the file COPYING3. If not see %{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 diff --git a/gcc/config/openbsd.h b/gcc/config/openbsd.h index fad2915..87c4ce2 100644 --- a/gcc/config/openbsd.h +++ b/gcc/config/openbsd.h @@ -145,6 +145,10 @@ while (0) #endif #define TARGET_POSIX_IO + +/* All new versions of OpenBSD have C99 functions. */ +#define TARGET_C99_FUNCTIONS 1 + /* Runtime target specification. */ diff --git a/gcc/config/t-openbsd b/gcc/config/t-openbsd index 2289f15..7637da0 100644 --- a/gcc/config/t-openbsd +++ b/gcc/config/t-openbsd @@ -1,2 +1,2 @@ # We don't need GCC's own include files. -USER_H = +USER_H = $(EXTRA_HEADERS) diff --git a/gcc/config/x-openbsd b/gcc/config/x-openbsd new file mode 100644 index 0000000..18e3f65 --- /dev/null +++ b/gcc/config/x-openbsd @@ -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 diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 14c7087..463b872 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,7 @@ +2012-09-01 Mark Kettenis + + * config.host (x86_64-*-openbsd*): New target. + 2012-08-29 Chung-Lin Tang * config/mips/crtfastmath.c (set_fast_math): Add 'nomips16' diff --git a/libgcc/config.host b/libgcc/config.host index d7259a7..f9bab01 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -527,6 +527,8 @@ i[34567]86-*-openbsd2.*|i[34567]86-*openbsd3.[0123]) ;; 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" -- 2.7.4