diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fa4516546d..b68936b2126 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-09-19 Mark Kettenis + + * config.gcc (hppa*-*-openbsd*): New target. + * config/pa/pa-openbsd.h: New file. + * config/pa/pa32-openbsd.h: New file. + * config/host-openbsd.c: Update copyright year. + (TRY_EXCEPT_VM_SPACE): Define for OpenBSD/hppa. + 2012-09-19 Martin Jambor * ipa-prop.c (prune_expression_for_jf): New function. diff --git a/gcc/config.gcc b/gcc/config.gcc index dfce1e8b8d1..d6c81534c59 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1017,10 +1017,15 @@ hppa*-*-linux*) tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h pa/pa-linux.h \ pa/pa32-regs.h pa/pa32-linux.h" ;; -# port not yet contributed. -#hppa*-*-openbsd*) -# target_cpu_default="MASK_PA_11" -# ;; +hppa*-*-openbsd*) + target_cpu_default="MASK_PA_11" + tm_file="${tm_file} dbxelf.h elfos.h openbsd.h openbsd-stdint.h openbsd-libpthread.h \ + pa/pa-openbsd.h pa/pa32-regs.h pa/pa32-openbsd.h" + tmake_file="${tmake_file} pa/t-openbsd" + extra_options="${extra_options} openbsd.opt" + gas=yes + gnu_ld=yes + ;; hppa[12]*-*-hpux10*) case ${target} in hppa1.1-*-* | hppa2*-*-*) diff --git a/gcc/config/host-openbsd.c b/gcc/config/host-openbsd.c index 955deddc8b5..16c140e5006 100644 --- a/gcc/config/host-openbsd.c +++ b/gcc/config/host-openbsd.c @@ -1,5 +1,6 @@ /* OpenBSD host-specific hook definitions. - Copyright (C) 2004, 2007, 2008, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2004, 2007, 2008, 2010, 2011, 2012 + Free Software Foundation, Inc. This file is part of GCC. @@ -33,6 +34,8 @@ that's probably free. */ #if defined(__amd64__) # define TRY_EMPTY_VM_SPACE 0x400000000000 +#elif defined(__hppa__) +# define TRY_EMPTY_VM_SPACE 0xb0000000 #elif defined(__i386__) # define TRY_EMPTY_VM_SPACE 0xb0000000 #else diff --git a/gcc/config/pa/pa-openbsd.h b/gcc/config/pa/pa-openbsd.h new file mode 100644 index 00000000000..785409cf780 --- /dev/null +++ b/gcc/config/pa/pa-openbsd.h @@ -0,0 +1,162 @@ +/* Definitions for PA_RISC with ELF format + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, + 2011, 2012 + 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 +. */ + + +#undef TARGET_OS_CPP_BUILTINS +#define TARGET_OS_CPP_BUILTINS() \ + do \ + { \ + OPENBSD_OS_CPP_BUILTINS(); \ + builtin_assert ("machine=bigendian"); \ + } \ + while (0) + +/* Our profiling scheme doesn't LP labels and counter words. */ +#define NO_DEFERRED_PROFILE_COUNTERS 1 + +#undef STRING_ASM_OP +#define STRING_ASM_OP "\t.stringz\t" + +#define TEXT_SECTION_ASM_OP "\t.text" +#define DATA_SECTION_ASM_OP "\t.data" +#define BSS_SECTION_ASM_OP "\t.section\t.bss" + +/* We want local labels to start with period if made with asm_fprintf. */ +#undef LOCAL_LABEL_PREFIX +#define LOCAL_LABEL_PREFIX "." + +/* Define these to generate the Linux/ELF/SysV style of internal + labels all the time - i.e. to be compatible with + ASM_GENERATE_INTERNAL_LABEL in . Compare these with the + ones in pa.h and note the lack of dollar signs in these. FIXME: + shouldn't we fix pa.h to use ASM_GENERATE_INTERNAL_LABEL instead? */ + +#undef ASM_OUTPUT_ADDR_VEC_ELT +#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ + if (TARGET_BIG_SWITCH) \ + fprintf (FILE, "\t.word .L%d\n", VALUE); \ + else \ + fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE) + +#undef ASM_OUTPUT_ADDR_DIFF_ELT +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ + if (TARGET_BIG_SWITCH) \ + fprintf (FILE, "\t.word .L%d-.L%d\n", VALUE, REL); \ + else \ + fprintf (FILE, "\tb .L%d\n\tnop\n", VALUE) + +/* Use the default. */ +#undef ASM_OUTPUT_LABEL + +/* NOTE: (*targetm.asm_out.internal_label)() is defined for us by elfos.h, and + does what we want (i.e. uses colons). It must be compatible with + ASM_GENERATE_INTERNAL_LABEL(), so do not define it here. */ + +/* Use the default. */ +#undef ASM_OUTPUT_INTERNAL_LABEL + +/* Use the default. */ +#undef TARGET_ASM_GLOBALIZE_LABEL + +/* FIXME: Hacked from the one so that we avoid multiple + labels in a function declaration (since pa.c seems determined to do + it differently) */ + +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ + do \ + { \ + ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ + ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ + } \ + while (0) + +/* As well as globalizing the label, we need to encode the label + to ensure a plabel is generated in an indirect call. */ + +#undef ASM_OUTPUT_EXTERNAL_LIBCALL +#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ + do \ + { \ + if (!FUNCTION_NAME_P (XSTR (FUN, 0))) \ + pa_encode_label (FUN); \ + (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0)); \ + } \ + while (0) + +/* This says how to output an assembler line to define a global common symbol + with size SIZE (in bytes) and alignment ALIGN (in bits). */ + +#undef ASM_OUTPUT_ALIGNED_COMMON +#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ + pa_asm_output_aligned_common (FILE, NAME, SIZE, ALIGN) + +/* This says how to output an assembler line to define a local common symbol + with size SIZE (in bytes) and alignment ALIGN (in bits). This macro + controls how the assembler definitions of uninitialized static variables + are output. */ + +#undef ASM_OUTPUT_ALIGNED_LOCAL +#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ + pa_asm_output_aligned_local (FILE, NAME, SIZE, ALIGN) + +/* OpenBSD always uses gas. */ +#undef TARGET_GAS +#define TARGET_GAS 1 + +/* Layout of source language data types. */ + +/* This must agree with */ +#undef SIZE_TYPE +#define SIZE_TYPE "long unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "long int" + +#undef WCHAR_TYPE +#define WCHAR_TYPE "int" + +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 32 + +#undef WINT_TYPE +#define WINT_TYPE "int" + +#undef LINK_SPEC +#define LINK_SPEC \ + "%{!shared:%{!nostdlib:%{!r:%{!e*:-e __start}}}} \ + %{shared:-shared} %{R*} \ + %{static:-Bstatic} \ + %{!static:-Bdynamic} \ + %{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/pa/pa32-openbsd.h b/gcc/config/pa/pa32-openbsd.h new file mode 100644 index 00000000000..af8db1cc9cb --- /dev/null +++ b/gcc/config/pa/pa32-openbsd.h @@ -0,0 +1,23 @@ +/* Definitions for PA_RISC with ELF-32 format + Copyright (C) 2000, 2002, 2004, 2006, 2007, 2010, 2011, 2012 + 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 +. */ + +/* Turn off various SOM crap we don't want. */ +#undef TARGET_ELF32 +#define TARGET_ELF32 1 diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 2045aac2803..42308dba755 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,8 @@ +2012-09-19 Mark Kettenis + + * config.host (hppa-*-openbsd*): New target. + * config/pa/t-openbsd: New file. + 2012-09-15 Georg-Johann Lay PR target/54222 diff --git a/libgcc/config.host b/libgcc/config.host index 486b7152551..368902467fb 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -499,6 +499,9 @@ hppa[12]*-*-hpux11*) extra_parts="libgcc_stub.a" md_unwind_header=pa/hpux-unwind.h ;; +hppa*-*-openbsd*) + tmake_file="$tmake_file pa/t-openbsd" + ;; i[34567]86-*-darwin*) tmake_file="$tmake_file i386/t-crtpc i386/t-crtfm" tm_file="$tm_file i386/darwin-lib.h" diff --git a/libgcc/config/pa/t-openbsd b/libgcc/config/pa/t-openbsd new file mode 100644 index 00000000000..8b99068ce42 --- /dev/null +++ b/libgcc/config/pa/t-openbsd @@ -0,0 +1,9 @@ +#Plug millicode routines into libgcc.a We want these on both native and +#cross compiles. We use the "64-bit" routines because the "32-bit" code +#is broken for certain corner cases. +LIB1ASMSRC = pa/milli64.S +LIB1ASMFUNCS = _divI _divU _remI _remU _div_const _mulI _dyncall + +HOST_LIBGCC2_CFLAGS += -DELF=1 -DLINUX=1 + +LIB2ADD = $(srcdir)/config/pa/fptr.c