diff --git a/configure b/configure index 4cc938ebb7d..1af7c8b7219 100755 --- a/configure +++ b/configure @@ -3789,6 +3789,18 @@ case "${target}" in ;; *-*-vxworks*) ;; + aarch64*-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + aarch64*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; alpha*-dec-osf*) # ld works, but does not support shared libraries. # gas doesn't generate exception information. @@ -3797,6 +3809,18 @@ case "${target}" in alpha*-*-*vms*) noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss" ;; + alpha*-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + alpha*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; alpha*-*-*) # newlib is not 64 bit ready noconfigdirs="$noconfigdirs target-newlib target-libgloss" @@ -3953,6 +3977,18 @@ case "${target}" in powerpc-*-beos*) noconfigdirs="$noconfigdirs gdb" ;; + riscv64-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + riscv*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; rs6000-*-lynxos*) noconfigdirs="$noconfigdirs gprof" ;; diff --git a/configure.ac b/configure.ac index c78d9cbea62..5621814f675 100644 --- a/configure.ac +++ b/configure.ac @@ -1064,6 +1064,18 @@ case "${target}" in ;; *-*-vxworks*) ;; + aarch64*-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + aarch64*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; alpha*-dec-osf*) # ld works, but does not support shared libraries. # gas doesn't generate exception information. @@ -1072,6 +1084,18 @@ case "${target}" in alpha*-*-*vms*) noconfigdirs="$noconfigdirs gdb target-newlib target-libgloss" ;; + alpha*-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + alpha*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; alpha*-*-*) # newlib is not 64 bit ready noconfigdirs="$noconfigdirs target-newlib target-libgloss" @@ -1228,6 +1252,18 @@ case "${target}" in powerpc-*-beos*) noconfigdirs="$noconfigdirs gdb" ;; + riscv64-*-solaris2*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}" + noconfigdirs="$noconfigdirs target-libiberty" + noconfigdirs="$noconfigdirs target-libmudflap target-libgomp target-libitm" + case "${host}" in + riscv*-*-solaris2*) + ;; + *) + noconfigdirs="$noconfigdirs target-libstdc++-v3" + ;; + esac + ;; rs6000-*-lynxos*) noconfigdirs="$noconfigdirs gprof" ;; diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 543b477ff18..f1023bbb54a 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2928,11 +2928,11 @@ s-omp-device-properties-h: @omp_device_property_deps@ # any system header is included. gengtype-lex.c : gengtype-lex.l -$(FLEX) $(FLEXFLAGS) -o$@ $< && { \ - echo '#ifdef HOST_GENERATOR_FILE' > $@.tmp; \ - echo '#include "config.h"' >> $@.tmp; \ - echo '#else' >> $@.tmp; \ - echo '#include "bconfig.h"' >> $@.tmp; \ - echo '#endif' >> $@.tmp; \ + echo '#ifdef GENERATOR_FILE' > $@.tmp; \ + echo '#include "bconfig.h"' >> $@.tmp; \ + echo '#else' >> $@.tmp; \ + echo '#include "config.h"' >> $@.tmp; \ + echo '#endif' >> $@.tmp; \ cat $@ >> $@.tmp; \ mv $@.tmp $@; \ } diff --git a/gcc/config.gcc b/gcc/config.gcc index cf1a87e2efd..c69579b9bd1 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1111,6 +1111,10 @@ aarch64*-*-linux*) done TM_MULTILIB_CONFIG=`echo $TM_MULTILIB_CONFIG | sed 's/^,//'` ;; +aarch64*-*-solaris2*) + tm_file="${tm_file} elfos.h sol2.h aarch64/aarch64-elf.h aarch64/sol2.h" + tmake_file="${tmake_file} aarch64/t-aarch64 aarch64/t-sol2" + ;; aarch64*-wrs-vxworks*) tm_file="${tm_file} elfos.h aarch64/aarch64-elf.h" tm_file="${tm_file} vx-common.h vxworks.h aarch64/aarch64-vxworks.h" @@ -1121,6 +1125,11 @@ alpha*-*-linux*) tmake_file="${tmake_file} alpha/t-linux alpha/t-alpha" extra_options="${extra_options} alpha/elf.opt" ;; +alpha*-*-solaris2*) + tm_file="elfos.h ${tm_file} alpha/elf.h sol2.h alpha/sol2.h" + extra_options="${extra_options} alpha/elf.opt" + tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee alpha/t-sol2" + ;; alpha*-*-netbsd*) tm_file="elfos.h ${tm_file} ${nbsd_tm_file} alpha/elf.h alpha/netbsd.h" tmake_file="${tmake_file} alpha/t-alpha" @@ -2428,6 +2437,18 @@ microblaze*-*-elf) cxx_target_objs="${cxx_target_objs} microblaze-c.o" tmake_file="${tmake_file} microblaze/t-microblaze" ;; +riscv64-*-solaris2*) + tm_file="${tm_file} elfos.h sol2.h riscv/sol2.h" + case "x${enable_multilib}" in + xno) ;; + xyes) tmake_file="${tmake_file} riscv/t-sol2-multilib" ;; + *) echo "Unknown value for enable_multilib"; exit 1 + esac + tmake_file="${tmake_file} riscv/t-riscv riscv/t-sol2" + gnu_ld=yes + gas=yes + gcc_cv_initfini_array=yes + ;; riscv*-*-linux*) tm_file="elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} riscv/linux.h" case "x${enable_multilib}" in diff --git a/gcc/config.host b/gcc/config.host index 84f0433e2ad..9eb5cc50293 100644 --- a/gcc/config.host +++ b/gcc/config.host @@ -99,7 +99,7 @@ case ${host} in esac case ${host} in - aarch64*-*-freebsd* | aarch64*-*-linux* | aarch64*-*-fuchsia*) + aarch64*-*-freebsd* | aarch64*-*-linux* | aarch64*-*-fuchsia* | aarch64*-*-solaris*) case ${target} in aarch64*-*-*) host_extra_gcc_objs="driver-aarch64.o" diff --git a/gcc/config/aarch64/aarch64-c.c b/gcc/config/aarch64/aarch64-c.c index e1c1cd415dc..6657483bc2a 100644 --- a/gcc/config/aarch64/aarch64-c.c +++ b/gcc/config/aarch64/aarch64-c.c @@ -53,6 +53,7 @@ static void aarch64_define_unconditional_macros (cpp_reader *pfile) { builtin_define ("__aarch64__"); + builtin_define ("__aarch64"); builtin_define ("__ARM_64BIT_STATE"); builtin_define ("__ARM_ARCH_ISA_A64"); diff --git a/gcc/config/aarch64/aarch64-elf.h b/gcc/config/aarch64/aarch64-elf.h index 07685657c5e..044b29257ad 100644 --- a/gcc/config/aarch64/aarch64-elf.h +++ b/gcc/config/aarch64/aarch64-elf.h @@ -108,6 +108,7 @@ #define ENDIAN_SPEC "-mlittle-endian" #endif +#undef MULTILIB_DEFAULTS #if TARGET_DATA_MODEL == 1 #define ABI_SPEC "-mabi=lp64" #define MULTILIB_DEFAULTS { "mabi=lp64" } diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 9e43adb7db0..a408f470777 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -743,6 +743,8 @@ extern bool aarch64_classify_address (struct aarch64_address_info *, rtx, machine_mode, bool, aarch64_addr_query_type = ADDR_QUERY_M); +extern void aarch64_print_operand (FILE *f, rtx x, int code); + /* Defined in common/config/aarch64-common.c. */ bool aarch64_handle_option (struct gcc_options *, struct gcc_options *, const struct cl_decoded_option *, location_t); diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 409ca8d9519..c60111273f3 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -1424,6 +1424,7 @@ static const struct attribute_spec aarch64_attribute_table[] = { /* { name, min_len, max_len, decl_req, type_req, fn_type_req, affects_type_identity, handler, exclude } */ + SUBTARGET_ATTRIBUTE_TABLE, { "aarch64_vector_pcs", 0, 0, false, true, true, true, handle_aarch64_vector_pcs_attribute, NULL }, { "arm_sve_vector_bits", 1, 1, false, true, false, true, @@ -9953,7 +9954,7 @@ sizetochar (int size) pattern (so the mode needs to be adjusted). 'z': Output address of a typical LDP or STP. */ -static void +void aarch64_print_operand (FILE *f, rtx x, int code) { rtx elt; @@ -23230,6 +23231,16 @@ aarch64_libgcc_floating_mode_supported_p #define TARGET_PREFERRED_ELSE_VALUE \ aarch64_preferred_else_value +#ifdef SUBTARGET_INSERT_ATTRIBUTES +#undef TARGET_INSERT_ATTRIBUTES +#define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES +#endif + +#ifdef SUBTARGET_ATTRIBUTE_TABLE +#undef TARGET_ATTRIBUTE_TABLE +#define TARGET_ATTRIBUTE_TABLE aarch64_attribute_table +#endif + #undef TARGET_INIT_LIBFUNCS #define TARGET_INIT_LIBFUNCS aarch64_init_libfuncs diff --git a/gcc/config/aarch64/sol2.h b/gcc/config/aarch64/sol2.h new file mode 100644 index 00000000000..b7df9fbecbb --- /dev/null +++ b/gcc/config/aarch64/sol2.h @@ -0,0 +1,109 @@ +/* Definitions of target machine for GCC, for SPARC running Solaris 2 + Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, + 2006, 2007, 2008, 2010 Free Software Foundation, Inc. + Contributed by Ron Guilmette (rfg@netcom.com). + Additional changes by David V. Henkel-Wallace (gumby@cygnus.com). + +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 +. */ + +#define CPP_SPEC "%{pthread:-D_REENTRANT}" +#define GNU_USER_DYNAMIC_LINKER "/lib/ld.so.1" + +#ifdef TARGET_FIX_ERR_A53_835769_DEFAULT +#define CA53_ERR_835769_SPEC \ + " %{!mno-fix-cortex-a53-835769:--fix-cortex-a53-835769}" +#else +#define CA53_ERR_835769_SPEC \ + " %{mfix-cortex-a53-835769:--fix-cortex-a53-835769}" +#endif + +#ifdef TARGET_FIX_ERR_A53_843419_DEFAULT +#define CA53_ERR_843419_SPEC \ + " %{!mno-fix-cortex-a53-843419:--fix-cortex-a53-843419}" +#else +#define CA53_ERR_843419_SPEC \ + " %{mfix-cortex-a53-843419:--fix-cortex-a53-843419}" +#endif + +#undef LINK_SPEC +#define LINK_SPEC "%{G*} %{R*} %{h*} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{!static:%{rdynamic:-export-dynamic}} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER " \ + %{mbig-endian:-EB} %{mlittle-endian:-EL} -X \ + -maarch64elf%{mabi=ilp32*:32}%{mbig-endian:b}" \ + CA53_ERR_835769_SPEC \ + CA53_ERR_843419_SPEC + +#undef TARGET_SUN_TLS +#define TARGET_SUN_TLS 1 + +#define ASM_OUTPUT_CALL(FILE, FN) \ + do \ + { \ + fprintf (FILE, "\tbl\t"); \ + aarch64_print_operand (FILE, XEXP (DECL_RTL (FN), 0), 0); \ + fprintf (FILE, "\n"); \ + } \ + while (0) + +#undef DEFAULT_SIGNED_CHAR +#define DEFAULT_SIGNED_CHAR 1 + +#undef WCHAR_TYPE +#define WCHAR_TYPE "int" +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 32 + +#undef WINT_TYPE +#define WINT_TYPE "int" +#undef WINT_TYPE_SIZE +#define WINT_TYPE_SIZE 32 + +#undef CC1_SPEC +#define CC1_SPEC "%{!fno-PIC: -fPIC}%{!moutline-atomics: -mno-outline-atomics}" + +#undef LIB_SPEC +#define LIB_SPEC "%{shared:-lc -lgcc}%{!shared:%{profile:-lc -lgcc}%{!profile:-lc -lgcc}} " + +#define SUBTARGET_CPU_EXTRA_SPECS + +/* Register the Solaris-specific #pragma directives. */ +#undef REGISTER_TARGET_PRAGMAS +#define REGISTER_TARGET_PRAGMAS() do { solaris_register_pragmas (); } while (0) + +#undef INIT_SECTION_ASM_OP +#define INIT_SECTION_ASM_OP "\t.section\t.init, \"ax\"" + +#undef FINI_SECTION_ASM_OP +#define FINI_SECTION_ASM_OP "\t.section\t.fini, \"ax\"" + +#undef EXTRA_SPECS +#define EXTRA_SPECS \ + { "asm_cpu_spec", ASM_CPU_SPEC }, \ + { "startfile_arch", STARTFILE_ARCH_SPEC }, \ + { "startfile_crtbegin", STARTFILE_CRTBEGIN_SPEC }, \ + { "endfile_arch", ENDFILE_ARCH_SPEC }, \ + { "endfile_crtend", ENDFILE_CRTEND_SPEC }, \ + SUBTARGET_CPU_EXTRA_SPECS + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS +#define ENDFILE_ARCH_SPEC "" + diff --git a/gcc/config/aarch64/t-sol2 b/gcc/config/aarch64/t-sol2 new file mode 100644 index 00000000000..5aa36dffda0 --- /dev/null +++ b/gcc/config/aarch64/t-sol2 @@ -0,0 +1,25 @@ +# Copyright (C) 2000, 2001, 2003, 2004, 2005 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 +# . + +# Compile crtbeginS.o and crtendS.o with pic. +CRTSTUFF_T_CFLAGS_S = -fPIC + +# Compile libgcc2.a with pic. +TARGET_LIBGCC2_CFLAGS += -fPIC + +EXTRA_MULTILIB_PARTS = diff --git a/gcc/config/alpha/alpha-protos.h b/gcc/config/alpha/alpha-protos.h index ba4cb3bf9cd..1ffa4cd32c7 100644 --- a/gcc/config/alpha/alpha-protos.h +++ b/gcc/config/alpha/alpha-protos.h @@ -117,3 +117,6 @@ class rtl_opt_pass; extern rtl_opt_pass *make_pass_handle_trap_shadows (gcc::context *); extern rtl_opt_pass *make_pass_align_insns (gcc::context *); + +extern void alpha_print_operand (FILE *file, rtx x, int code); + diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 7e5d1cbb0c4..c50f163ebe5 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -5057,7 +5057,7 @@ alpha_print_operand_punct_valid_p (unsigned char code) /* Implement TARGET_PRINT_OPERAND. The alpha-specific operand codes are documented below. */ -static void +void alpha_print_operand (FILE *file, rtx x, int code) { int i; @@ -9847,6 +9847,27 @@ alpha_can_change_mode_class (machine_mode from, machine_mode to, } /* Initialize the GCC target structure. */ +#ifdef SUBTARGET_ATTRIBUTE_TABLE +/* Table of valid machine attributes. */ +static const struct attribute_spec alpha_attribute_table[] = +{ + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, + affects_type_identity, handler, exclude } */ + SUBTARGET_ATTRIBUTE_TABLE, + { NULL, 0, 0, false, false, false, false, NULL, NULL } +}; +#endif + +#ifdef SUBTARGET_INSERT_ATTRIBUTES +#undef TARGET_INSERT_ATTRIBUTES +#define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES +#endif + +#ifdef SUBTARGET_ATTRIBUTE_TABLE +#undef TARGET_ATTRIBUTE_TABLE +#define TARGET_ATTRIBUTE_TABLE alpha_attribute_table +#endif + #if TARGET_ABI_OPEN_VMS # undef TARGET_ATTRIBUTE_TABLE # define TARGET_ATTRIBUTE_TABLE vms_attribute_table diff --git a/gcc/config/alpha/sol2.h b/gcc/config/alpha/sol2.h new file mode 100644 index 00000000000..cccadfddcca --- /dev/null +++ b/gcc/config/alpha/sol2.h @@ -0,0 +1,113 @@ +/* Definitions of target machine for GCC, for SPARC running Solaris 2 + Copyright 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, + 2006, 2007, 2008, 2010 Free Software Foundation, Inc. + Contributed by Ron Guilmette (rfg@netcom.com). + Additional changes by David V. Henkel-Wallace (gumby@cygnus.com). + +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 +. */ + +/* We are compiling for Solaris 2 now. */ +#undef TARGET_DEFAULT +#define TARGET_DEFAULT MASK_FPREGS + +/* Show that we need a GP when profiling. */ +#undef TARGET_PROFILING_NEEDS_GP +#define TARGET_PROFILING_NEEDS_GP 1 + +/* This macro closes up a function definition for the assembler. */ +#undef ASM_DECLARE_FUNCTION_SIZE +#define ASM_DECLARE_FUNCTION_SIZE(FILE, NAME, DECL) \ + do \ + { \ + alpha_end_function(FILE,NAME,DECL); \ + solaris_output_init_fini (FILE, DECL); \ + } \ + while (0) + +#define CPP_SPEC "%{pthread:-D_REENTRANT}" + +#define GNU_USER_DYNAMIC_LINKER "/lib/ld.so.1" + +#undef LINK_SPEC +#define LINK_SPEC "%{G*} %{R*} %{h*} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER " \ + %{relax:-relax} \ + -X \ + -melf64alpha" + +#undef TARGET_SUN_TLS +#define TARGET_SUN_TLS 1 + +#define ASM_OUTPUT_CALL(FILE, FN) \ + do \ + { \ + fprintf (FILE, "\t.set macro\n"); \ + fprintf (FILE, "\tjsr\t$26, "); \ + alpha_print_operand (FILE, XEXP (DECL_RTL (FN), 0), 0); \ + fprintf (FILE, "\n"); \ + fprintf (FILE, "\tldgp\t$29, 0($26)\n"); \ + fprintf (FILE, "\t.set nomacro\n"); \ + } \ + while (0) + +#undef DEFAULT_SIGNED_CHAR +#define DEFAULT_SIGNED_CHAR 1 + +#undef WCHAR_TYPE +#define WCHAR_TYPE "int" +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 32 + +#undef WINT_TYPE +#define WINT_TYPE "int" +#undef WINT_TYPE_SIZE +#define WINT_TYPE_SIZE 32 + +#undef CC1_SPEC +#define CC1_SPEC "%{!fno-PIC:-fPIC}" + +#undef LIB_SPEC +#define LIB_SPEC "%{shared:-lc -lgcc}%{!shared:%{profile:-lc -lgcc}%{!profile:-lc -lgcc}} " + +#define SUBTARGET_CPU_EXTRA_SPECS + +/* Register the Solaris-specific #pragma directives. */ +#undef REGISTER_TARGET_PRAGMAS +#define REGISTER_TARGET_PRAGMAS() do { solaris_register_pragmas (); } while (0) + +#undef INIT_SECTION_ASM_OP +#define INIT_SECTION_ASM_OP "\t.section\t.init, \"ax\"" + +#undef FINI_SECTION_ASM_OP +#define FINI_SECTION_ASM_OP "\t.section\t.fini, \"ax\"" + +#undef EXTRA_SPECS +#define EXTRA_SPECS \ + { "startfile_arch", STARTFILE_ARCH_SPEC }, \ + { "startfile_crtbegin", STARTFILE_CRTBEGIN_SPEC }, \ + { "endfile_arch", ENDFILE_ARCH_SPEC }, \ + { "endfile_crtend", ENDFILE_CRTEND_SPEC }, \ + SUBTARGET_CPU_EXTRA_SPECS + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS +#define ENDFILE_ARCH_SPEC "" + diff --git a/gcc/config/alpha/t-sol2 b/gcc/config/alpha/t-sol2 new file mode 100644 index 00000000000..5aa36dffda0 --- /dev/null +++ b/gcc/config/alpha/t-sol2 @@ -0,0 +1,25 @@ +# Copyright (C) 2000, 2001, 2003, 2004, 2005 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 +# . + +# Compile crtbeginS.o and crtendS.o with pic. +CRTSTUFF_T_CFLAGS_S = -fPIC + +# Compile libgcc2.a with pic. +TARGET_LIBGCC2_CFLAGS += -fPIC + +EXTRA_MULTILIB_PARTS = diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h index 8cf9137b5e7..4dc372529d9 100644 --- a/gcc/config/riscv/riscv-protos.h +++ b/gcc/config/riscv/riscv-protos.h @@ -74,6 +74,8 @@ extern rtx riscv_function_value (const_tree, const_tree, enum machine_mode); extern bool riscv_expand_block_move (rtx, rtx, rtx); extern bool riscv_store_data_bypass_p (rtx_insn *, rtx_insn *); +extern void riscv_print_operand (FILE*, rtx, int); + /* Routines implemented in riscv-c.c. */ void riscv_cpu_cpp_builtins (cpp_reader *); diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index 94b5ac01762..2cffb2fe91b 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -321,6 +321,7 @@ static const struct attribute_spec riscv_attribute_table[] = /* Syntax: { name, min_len, max_len, decl_required, type_required, function_type_required, affects_type_identity, handler, exclude } */ + SUBTARGET_ATTRIBUTE_TABLE, /* The attribute telling no prologue/epilogue. */ { "naked", 0, 0, true, false, false, false, @@ -3278,7 +3279,7 @@ riscv_memmodel_needs_release_fence (enum memmodel model) 'z' Print x0 if OP is zero, otherwise print OP normally. 'i' Print i if the operand is not a register. */ -static void +void riscv_print_operand (FILE *file, rtx op, int letter) { machine_mode mode = GET_MODE (op); @@ -5213,6 +5214,11 @@ riscv_hard_regno_rename_ok (unsigned from_regno ATTRIBUTE_UNUSED, #undef TARGET_MERGE_DECL_ATTRIBUTES #define TARGET_MERGE_DECL_ATTRIBUTES riscv_merge_decl_attributes +#ifdef SUBTARGET_INSERT_ATTRIBUTES +#undef TARGET_INSERT_ATTRIBUTES +#define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES +#endif + #undef TARGET_ATTRIBUTE_TABLE #define TARGET_ATTRIBUTE_TABLE riscv_attribute_table diff --git a/gcc/config/riscv/sol2.h b/gcc/config/riscv/sol2.h new file mode 100644 index 00000000000..5c92bfaffa2 --- /dev/null +++ b/gcc/config/riscv/sol2.h @@ -0,0 +1,92 @@ +/* Definitions for RISC-V GNU/Linux systems with ELF format. + Copyright (C) 1998-2018 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 +. */ + + +#define CPP_SPEC "%{pthread:-D_REENTRANT}" +#define GNU_USER_DYNAMIC_LINKER "/lib/ld.so.1" + +#undef LINK_SPEC +#define LINK_SPEC "%{G*} %{R*} %{h*} \ + %{mno-relax:--no-relax} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{!static:%{rdynamic:-export-dynamic}} \ + -dynamic-linker " GNU_USER_DYNAMIC_LINKER " \ + -melf" XLEN_SPEC "lriscv" + +#undef TARGET_SUN_TLS +#define TARGET_SUN_TLS 1 + +#define ASM_OUTPUT_CALL(FILE, FN) \ + do \ + { \ + fprintf (FILE, "\tcall\t"); \ + riscv_print_operand (FILE, XEXP (DECL_RTL (FN), 0), 0); \ + fprintf (FILE, "\n"); \ + } \ + while (0) + +#undef DEFAULT_SIGNED_CHAR +#define DEFAULT_SIGNED_CHAR 1 + +#undef WCHAR_TYPE +#define WCHAR_TYPE "int" +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 32 + +#undef WINT_TYPE +#define WINT_TYPE "int" +#undef WINT_TYPE_SIZE +#define WINT_TYPE_SIZE 32 + +#undef CC1_SPEC +#define CC1_SPEC "%{!fno-PIC:-fPIC}" + +#undef LIB_SPEC +#define LIB_SPEC "%{shared:-lc -lgcc}%{!shared:%{profile:-lc -lgcc}%{!profile:-lc -lgcc}} " + +#define SUBTARGET_CPU_EXTRA_SPECS + +/* Register the Solaris-specific #pragma directives. */ +#undef REGISTER_TARGET_PRAGMAS +#define REGISTER_TARGET_PRAGMAS() do { solaris_register_pragmas (); } while (0) + +#undef INIT_SECTION_ASM_OP +#define INIT_SECTION_ASM_OP "\t.section\t.init, \"ax\",@progbits" + +#undef FINI_SECTION_ASM_OP +#define FINI_SECTION_ASM_OP "\t.section\t.fini, \"ax\",@progbits" + +#undef EXTRA_SPECS +#define EXTRA_SPECS \ + { "startfile_arch", STARTFILE_ARCH_SPEC }, \ + { "startfile_crtbegin", STARTFILE_CRTBEGIN_SPEC }, \ + { "endfile_arch", ENDFILE_ARCH_SPEC }, \ + { "endfile_crtend", ENDFILE_CRTEND_SPEC }, \ + SUBTARGET_CPU_EXTRA_SPECS + +#undef SUBTARGET_EXTRA_SPECS +#define SUBTARGET_EXTRA_SPECS +#define ENDFILE_ARCH_SPEC "" + +#define ICACHE_FLUSH_FUNC "__riscv_flush_icache" + +#undef MULTILIB_DEFAULTS +#define MULTILIB_DEFAULTS { "march=rv64gc", "mabi=lp64d" } diff --git a/gcc/config/riscv/t-sol2 b/gcc/config/riscv/t-sol2 new file mode 100644 index 00000000000..5aa36dffda0 --- /dev/null +++ b/gcc/config/riscv/t-sol2 @@ -0,0 +1,25 @@ +# Copyright (C) 2000, 2001, 2003, 2004, 2005 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 +# . + +# Compile crtbeginS.o and crtendS.o with pic. +CRTSTUFF_T_CFLAGS_S = -fPIC + +# Compile libgcc2.a with pic. +TARGET_LIBGCC2_CFLAGS += -fPIC + +EXTRA_MULTILIB_PARTS = diff --git a/gcc/config/riscv/t-sol2-multilib b/gcc/config/riscv/t-sol2-multilib new file mode 100644 index 00000000000..7c20fc503c7 --- /dev/null +++ b/gcc/config/riscv/t-sol2-multilib @@ -0,0 +1,10 @@ +# This file was generated by multilib-generator with the command: +# ./multilib-generator rv64imac-lp64-- rv64imafdc-lp64d-- +MULTILIB_OPTIONS = march=rv64imac/march=rv64imafdc/march=rv64gc mabi=lp64/mabi=lp64d +MULTILIB_DIRNAMES = rv64imac \ +rv64imafdc \ +rv64gc lp64 \ +lp64d +MULTILIB_REQUIRED = march=rv64imac/mabi=lp64 \ +march=rv64imafdc/mabi=lp64d +MULTILIB_REUSE = march.rv64imafdc/mabi.lp64d=march.rv64gc/mabi.lp64d diff --git a/gcc/config/sol2-c.c b/gcc/config/sol2-c.c index 9eaf43c4c98..91a56758db8 100644 --- a/gcc/config/sol2-c.c +++ b/gcc/config/sol2-c.c @@ -260,6 +260,11 @@ solaris_pragma_fini (cpp_reader *pfile ATTRIBUTE_UNUSED) } } +static void +solaris_pragma_ident (cpp_reader *pfile ATTRIBUTE_UNUSED) +{ +} + /* Register Solaris-specific #pragma directives. */ void @@ -268,4 +273,5 @@ solaris_register_pragmas (void) c_register_pragma_with_expansion (0, "align", solaris_pragma_align); c_register_pragma (0, "init", solaris_pragma_init); c_register_pragma (0, "fini", solaris_pragma_fini); + c_register_pragma (0, "ident", solaris_pragma_ident); } diff --git a/gcc/config/sol2.h b/gcc/config/sol2.h index 91b4602b49d..cd1dac6601e 100644 --- a/gcc/config/sol2.h +++ b/gcc/config/sol2.h @@ -454,6 +454,7 @@ along with GCC; see the file COPYING3. If not see /* collect2.c can only parse GNU nm -n output. Solaris nm needs -png to produce the same format. */ +#undef NM_FLAGS #define NM_FLAGS "-png" #define STDC_0_IN_SYSTEM_HEADERS 1 diff --git a/gcc/configure b/gcc/configure index cd3d9516fce..81f3dd28153 100755 --- a/gcc/configure +++ b/gcc/configure @@ -24682,6 +24682,14 @@ foo: .long 25 tls_first_major=2 tls_first_minor=13 tls_as_opt=--fatal-warnings + case "$target" in + alpha*-*-solaris2.*) + on_solaris=yes + tga_func=__tls_get_addr + ;; + *) + ;; + esac ;; arc*-*-*) conftest_s=' @@ -25562,7 +25570,7 @@ fi ;; # All TARGET_ABI_OSF targets. - alpha*-*-linux* | alpha*-*-*bsd*) + alpha*-*-linux* | alpha*-*-*bsd* | alpha*-*-solaris2*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for explicit relocation support" >&5 $as_echo_n "checking assembler for explicit relocation support... " >&6; } if ${gcc_cv_as_alpha_explicit_relocs+:} false; then : @@ -29924,7 +29932,8 @@ case "$target" in *-*-solaris2*) # needs both a dl_iterate_phdr declaration and support for # compilation with largefile support. - if grep dl_iterate_phdr $target_header_dir/link.h > /dev/null 2>&1 \ + if test x"$gnu_ld" = xno \ + && grep dl_iterate_phdr $target_header_dir/link.h > /dev/null 2>&1 \ && grep 'large file capable' $target_header_dir/link.h > /dev/null 2>&1; then gcc_cv_target_dl_iterate_phdr=yes else diff --git a/gcc/configure.ac b/gcc/configure.ac index 0de3b4bf97b..87d1aa0d2e7 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3446,6 +3446,14 @@ foo: .long 25 tls_first_major=2 tls_first_minor=13 tls_as_opt=--fatal-warnings + case "$target" in + alpha*-*-solaris2.*) + on_solaris=yes + tga_func=__tls_get_addr + ;; + *) + ;; + esac ;; arc*-*-*) conftest_s=' @@ -4210,7 +4218,7 @@ AS_HELP_STRING([--disable-fix-cortex-a53-843419], ;; # All TARGET_ABI_OSF targets. - alpha*-*-linux* | alpha*-*-*bsd*) + alpha*-*-linux* | alpha*-*-*bsd* | alpha*-*-solaris2*) gcc_GAS_CHECK_FEATURE([explicit relocation support], gcc_cv_as_alpha_explicit_relocs, [2,12,0],, [ .set nomacro @@ -6305,7 +6313,8 @@ case "$target" in *-*-solaris2*) # needs both a dl_iterate_phdr declaration and support for # compilation with largefile support. - if grep dl_iterate_phdr $target_header_dir/link.h > /dev/null 2>&1 \ + if test x"$gnu_ld" = xno \ + && grep dl_iterate_phdr $target_header_dir/link.h > /dev/null 2>&1 \ && grep 'large file capable' $target_header_dir/link.h > /dev/null 2>&1; then gcc_cv_target_dl_iterate_phdr=yes else diff --git a/gcc/genmddeps.c b/gcc/genmddeps.c index 7e9da41e1f9..8a6c75b42c1 100644 --- a/gcc/genmddeps.c +++ b/gcc/genmddeps.c @@ -15,7 +15,11 @@ along with this program; see the file COPYING3. If not see . */ +#ifdef GENERATOR_FILE #include "bconfig.h" +#else +#include "config.h" +#endif #include "system.h" #include "coretypes.h" #include "errors.h" diff --git a/libgcc/config.host b/libgcc/config.host index 1ff41592337..391d22af192 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -297,6 +297,9 @@ case ${host} in extra_parts="$extra_parts crtbeginS.o crtendS.o" else case ${host} in + aarch64*-*-solaris2* | alpha*-*-solaris2* | riscv64-*-solaris2*) + extra_parts="crtbegin.o crtend.o" + ;; i?86-*-solaris2* | x86_64-*-solaris2*) # Solaris 10+/x86 provides crt1.o, crti.o, crtn.o, and gcrt1.o as # part of the base system. @@ -343,6 +346,9 @@ arm-*-vxworks*) esac case ${host} in +aarch64*-*-solaris2* | alpha*-*-solaris2* | riscv64-*-solaris2*) + enable_execute_stack=enable-execute-stack-empty.c; + ;; *-*-darwin* | *-*-dragonfly* | *-*-freebsd* | *-*-netbsd* | *-*-openbsd* | \ *-*-solaris2*) enable_execute_stack=enable-execute-stack-mprotect.c @@ -398,11 +404,21 @@ aarch64*-*-vxworks7*) tmake_file="${tmake_file} ${cpu_type}/t-aarch64" tmake_file="${tmake_file} ${cpu_type}/t-softfp t-softfp t-crtfm" ;; +aarch64*-*-solaris2*) + tmake_file="${tmake_file} ${cpu_type}/t-aarch64 aarch64/t-sol2" + tmake_file="${tmake_file} ${cpu_type}/t-softfp t-softfp t-crtfm" + extra_parts="$extra_parts crtfastmath.o crtbeginS.o crtendS.o" + md_unwind_header=aarch64/aarch64-unwind.h + ;; alpha*-*-linux*) tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee t-crtfm alpha/t-linux" extra_parts="$extra_parts crtfastmath.o" md_unwind_header=alpha/linux-unwind.h ;; +alpha*-*-solaris2*) + tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee t-crtfm alpha/t-sol2" + extra_parts="$extra_parts crtfastmath.o crtbeginS.o crtendS.o" + ;; alpha*-*-freebsd*) tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee t-crtfm" extra_parts="$extra_parts crtbeginT.o crtfastmath.o" @@ -1252,6 +1268,11 @@ pru-*-*) tmake_file="${tmake_file} t-softfp-sfdf t-softfp-excl t-softfp t-gnu-prefix pru/t-pru" tm_file="$tm_file pru/pru-abi.h" ;; +riscv64-*-solaris2*) + tmake_file="${tmake_file} riscv/t-softfp${host_address} t-softfp riscv/t-elf riscv/t-elf${host_address}" + tmake_file="${tmake_file} riscv/t-sol2" + extra_parts="$extra_parts crtfastmath.o crtbeginS.o crtendS.o" + ;; riscv*-*-linux*) tmake_file="${tmake_file} riscv/t-softfp${host_address} t-softfp riscv/t-elf riscv/t-elf${host_address} t-slibgcc-libgcc" extra_parts="$extra_parts crtbegin.o crtend.o crti.o crtn.o crtendS.o crtbeginT.o" diff --git a/libgcc/config/alpha/t-sol2 b/libgcc/config/alpha/t-sol2 new file mode 100644 index 00000000000..ea3fa63a272 --- /dev/null +++ b/libgcc/config/alpha/t-sol2 @@ -0,0 +1,6 @@ +# We need to use -fPIC when we are using gcc to compile the routines in +# crtstuff.c. This is only really needed when we are going to use gcc/g++ +# to produce a shared library, but since we don't know ahead of time when +# we will be doing that, we just always use -fPIC when compiling the +# routines in crtstuff.c. +CRTSTUFF_T_CFLAGS = $(PICFLAG) diff --git a/libgcc/config/riscv/atomic.c b/libgcc/config/riscv/atomic.c index e556e343362..cb9ed374f49 100644 --- a/libgcc/config/riscv/atomic.c +++ b/libgcc/config/riscv/atomic.c @@ -96,6 +96,30 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see return __sync_val_compare_and_swap(p, o, n) == o; \ } +#define GENERATE_TEST_AND_SET(type, size) \ + type __sync_lock_test_and_set_ ## size (type *p, type n) \ + { \ + unsigned long aligned_addr = ((unsigned long) p) & ~3UL; \ + int shift = (((unsigned long) p) & 3) * 8; \ + unsigned mask = ((1U << ((sizeof n) * 8)) - 1) << shift; \ + unsigned old, tmp1; \ + \ + asm volatile ("1:\n\t" \ + "lr.w.aq %[old], %[mem]\n\t" \ + "and %[tmp1], %[old], %[not_mask]\n\t" \ + "or %[tmp1], %[tmp1], %[n]\n\t" \ + "sc.w.rl %[tmp1], %[tmp1], %[mem]\n\t" \ + "bnez %[tmp1], 1b\n\t" \ + "1:" \ + : [old] "=&r" (old), \ + [mem] "+A" (*(volatile unsigned*) aligned_addr), \ + [tmp1] "=&r" (tmp1) \ + : [n] "r" ((((unsigned) n) << shift) & mask), \ + [not_mask] "r" (~mask)); \ + \ + return (type) (old >> shift); \ + } + #define GENERATE_ALL(type, size) \ GENERATE_FETCH_AND_OP(type, size, add, add, DONT_INVERT, o + v) \ GENERATE_FETCH_AND_OP(type, size, sub, sub, DONT_INVERT, o - v) \ @@ -103,7 +127,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see GENERATE_FETCH_AND_OP(type, size, xor, xor, DONT_INVERT, o ^ v) \ GENERATE_FETCH_AND_OP(type, size, or, or, DONT_INVERT, o | v) \ GENERATE_FETCH_AND_OP(type, size, nand, and, INVERT, ~(o & v)) \ - GENERATE_COMPARE_AND_SWAP(type, size) + GENERATE_COMPARE_AND_SWAP(type, size) \ + GENERATE_TEST_AND_SET(type, size) GENERATE_ALL(unsigned char, 1) GENERATE_ALL(unsigned short, 2) diff --git a/libstdc++-v3/src/c++98/locale_init.cc b/libstdc++-v3/src/c++98/locale_init.cc index c3841ccbd3c..7c7d07b8e59 100644 --- a/libstdc++-v3/src/c++98/locale_init.cc +++ b/libstdc++-v3/src/c++98/locale_init.cc @@ -69,12 +69,12 @@ namespace using namespace std; - typedef char fake_locale_Impl[sizeof(locale::_Impl)] - __attribute__ ((aligned(__alignof__(locale::_Impl)))); + typedef char fake_locale_Impl[sizeof(std::locale::_Impl)] + __attribute__ ((aligned(__alignof__(std::locale::_Impl)))); fake_locale_Impl c_locale_impl; - typedef char fake_locale[sizeof(locale)] - __attribute__ ((aligned(__alignof__(locale)))); + typedef char fake_locale[sizeof(std::locale)] + __attribute__ ((aligned(__alignof__(std::locale)))); fake_locale c_locale; typedef char fake_name_vec[sizeof(char*)] @@ -219,7 +219,7 @@ namespace fake_codecvt_c32_c8 codecvt_c32_c8; #endif - // Storage for "C" locale caches. + // Storage for "C" std::locale caches. typedef char fake_num_cache_c[sizeof(std::__numpunct_cache)] __attribute__ ((aligned(__alignof__(std::__numpunct_cache)))); fake_num_cache_c numpunct_cache_c;