From patchwork Tue Jul 25 12:25:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Huber X-Patchwork-Id: 793359 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-458893-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="rR8Ml0Ma"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xGyBf33lWz9ryr for ; Tue, 25 Jul 2017 22:25:45 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=JDxpumclpR/Q YZJfgYjqXxWSKZFlwgcBHJm6d9NsFOft1OPcDNXbF7bmMWmqka8Z5v1bEFxUIQQT 0nFJzxXcvOl6+4TkZYOMLam8FGoq71V5t1rHUouNi9CIopwUCMlbTuVYIeojSue5 Sb1M7nTvozNqtWfo2eDTxBfG60gs1NQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=P9TklpeoUh06qDoy0m wUdSoo3Yc=; b=rR8Ml0Maug0/D0A5M6s53OwxjVLy2PLNXJyg3GlHiwJGn5m6hf /31qBZFka/wO+LNW0/HiAxnyq01Xrvc3PQdAjXwVlY10els9rA6n+KwgMFctcDSG 6sy6FQvGAXtbcS3gf8loLYWhRyarjHMlGFk0cp5GcgnMPmRu0P/3khPKY= Received: (qmail 114789 invoked by alias); 25 Jul 2017 12:25:33 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 114761 invoked by uid 89); 25 Jul 2017 12:25:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=8540 X-HELO: dedi548.your-server.de Received: from dedi548.your-server.de (HELO dedi548.your-server.de) (85.10.215.148) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 25 Jul 2017 12:25:28 +0000 Received: from [78.47.166.52] (helo=sslproxy04.your-server.de) by dedi548.your-server.de with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.85_2) (envelope-from ) id 1dZytw-0004Ad-Ul; Tue, 25 Jul 2017 14:25:24 +0200 Received: from [82.135.62.35] (helo=mail.embedded-brains.de) by sslproxy04.your-server.de with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.84_2) (envelope-from ) id 1dZytw-0007I2-LD; Tue, 25 Jul 2017 14:25:24 +0200 Received: from localhost (localhost.localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id DDAD12A004F; Tue, 25 Jul 2017 14:25:30 +0200 (CEST) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id jFSCg36X6e07; Tue, 25 Jul 2017 14:25:28 +0200 (CEST) Received: from localhost (localhost.localhost [127.0.0.1]) by mail.embedded-brains.de (Postfix) with ESMTP id C28F12A1677; Tue, 25 Jul 2017 14:25:28 +0200 (CEST) Received: from mail.embedded-brains.de ([127.0.0.1]) by localhost (zimbra.eb.localhost [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id oEp2Osk3W0wu; Tue, 25 Jul 2017 14:25:28 +0200 (CEST) Received: from linux-diu0.suse (unknown [192.168.96.129]) by mail.embedded-brains.de (Postfix) with ESMTP id A5A5C2A004F; Tue, 25 Jul 2017 14:25:28 +0200 (CEST) From: Sebastian Huber To: gcc-patches@gcc.gnu.org Cc: segher@kernel.crashing.org Subject: [PATCH] [PowerPC/RTEMS] Add 64-bit support using ELFv2 ABI Date: Tue, 25 Jul 2017 14:25:21 +0200 Message-Id: <20170725122521.10857-1-sebastian.huber@embedded-brains.de> X-IsSubscribed: yes Add 64-bit support for RTEMS using the ELFv2 ABI with 64-bit long double. gcc/ * config.gcc (powerpc-*-rtems*): Remove rs6000/eabi.h. Add rs6000/biarch64.h. * config/rs6000/rtems.h (ASM_DECLARE_FUNCTION_SIZE): New macro. (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise. (CRT_CALL_STATIC_FUNCTION): Likewise. (ASM_DEFAULT_SPEC): New define. (ASM_SPEC32): Likewise. (ASM_SPEC64): Likewise. (ASM_SPEC_COMMON): Likewise. (ASM_SPEC): Likewise. (INVALID_64BIT): Likewise. (LINK_OS_DEFAULT_SPEC): Likewise. (LINK_OS_SPEC32): Likewise. (LINK_OS_SPEC64): Likewise. (POWERPC_LINUX): Likewise. (PTRDIFF_TYPE): Likewise. (RESTORE_FP_PREFIX): Likewise. (RESTORE_FP_SUFFIX): Likewise. (SAVE_FP_PREFIX): Likewise. (SAVE_FP_SUFFIX): Likewise. (SIZE_TYPE): Likewise. (SUBSUBTARGET_OVERRIDE_OPTIONS): Likewise. (TARGET_64BIT): Likewise. (TARGET_64BIT): Likewise. (TARGET_AIX): Likewise. (WCHAR_TYPE_SIZE): Likewise. (WCHAR_TYPE): Undefine. (TARGET_OS_CPP_BUILTINS): Add 64-bit PowerPC defines. (CPP_OS_DEFAULT_SPEC): Use previous CPP_OS_RTEMS_SPEC. (CPP_OS_RTEMS_SPEC): Delete. (SUBSUBTARGET_EXTRA_SPECS): Remove cpp_os_rtems. Add asm_spec_common, asm_spec32, asm_spec64, link_os_spec32, and link_os_spec64. * config/rs6000/t-rtems: Add mcpu=e6500/m64 multilib. libgcc/ * config/rs6000/ibm-ldouble.c: Disable if defined __rtems__. --- gcc/config.gcc | 2 +- gcc/config/rs6000/rtems.h | 197 ++++++++++++++++++++++++++++++++++--- gcc/config/rs6000/t-rtems | 5 + libgcc/config/rs6000/ibm-ldouble.c | 3 +- 4 files changed, 189 insertions(+), 18 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 2ae0218b5fc..aab7f65c1df 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2424,7 +2424,7 @@ powerpc-*-rtems*spe*) tmake_file="${tmake_file} powerpcspe/t-fprules powerpcspe/t-rtems powerpcspe/t-ppccomm" ;; powerpc-*-rtems*) - tm_file="${tm_file} dbxelf.h elfos.h freebsd-spec.h newlib-stdint.h rs6000/sysv4.h rs6000/eabi.h rs6000/rtems.h rtems.h" + tm_file="rs6000/biarch64.h ${tm_file} dbxelf.h elfos.h freebsd-spec.h newlib-stdint.h rs6000/sysv4.h rs6000/rtems.h rtems.h" extra_options="${extra_options} rs6000/sysv4.opt" tmake_file="${tmake_file} rs6000/t-fprules rs6000/t-rtems rs6000/t-ppccomm" ;; diff --git a/gcc/config/rs6000/rtems.h b/gcc/config/rs6000/rtems.h index 1ab4e313fdb..8a62fdcbaf3 100644 --- a/gcc/config/rs6000/rtems.h +++ b/gcc/config/rs6000/rtems.h @@ -23,29 +23,163 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ -/* Specify predefined symbols in preprocessor. */ +/* Copy and paste from linux64.h and freebsd64.h */ +#ifdef IN_LIBGCC2 +#undef TARGET_64BIT +#ifdef __powerpc64__ +#define TARGET_64BIT 1 +#else +#define TARGET_64BIT 0 +#endif +#endif + +/* Copy and paste from linux64.h and freebsd64.h */ +#undef TARGET_AIX +#define TARGET_AIX TARGET_64BIT #undef TARGET_OS_CPP_BUILTINS -#define TARGET_OS_CPP_BUILTINS() \ - do \ - { \ - builtin_define_std ("PPC"); \ - builtin_define ("__rtems__"); \ - builtin_define ("__USE_INIT_FINI__"); \ - builtin_assert ("system=rtems"); \ - builtin_assert ("cpu=powerpc"); \ - builtin_assert ("machine=powerpc"); \ - TARGET_OS_SYSV_CPP_BUILTINS (); \ - } \ +#define TARGET_OS_CPP_BUILTINS() \ + do \ + { \ + builtin_define ("__rtems__"); \ + builtin_define ("__USE_INIT_FINI__"); \ + builtin_assert ("system=rtems"); \ + if (TARGET_64BIT) \ + { \ + builtin_define ("__PPC__"); \ + builtin_define ("__PPC64__"); \ + builtin_define ("__powerpc64__"); \ + builtin_assert ("cpu=powerpc64"); \ + builtin_assert ("machine=powerpc64"); \ + } \ + else \ + { \ + builtin_define_std ("PPC"); \ + builtin_define_std ("powerpc"); \ + builtin_assert ("cpu=powerpc"); \ + builtin_assert ("machine=powerpc"); \ + TARGET_OS_SYSV_CPP_BUILTINS (); \ + } \ + } \ + while (0) + +/* Copy and paste from linux64.h and freebsd64.h */ +#define INVALID_64BIT "-m%s not supported in this configuration" + +/* A lot of copy and paste from linux64.h and freebsd64.h */ +#undef SUBSUBTARGET_OVERRIDE_OPTIONS +#define SUBSUBTARGET_OVERRIDE_OPTIONS \ + do \ + { \ + if (rs6000_isa_flags & OPTION_MASK_64BIT) \ + { \ + rs6000_elf_abi = 2; \ + rs6000_current_abi = ABI_ELFv2; \ + if (rs6000_isa_flags & OPTION_MASK_RELOCATABLE) \ + { \ + rs6000_isa_flags &= ~OPTION_MASK_RELOCATABLE; \ + error (INVALID_64BIT, "relocatable"); \ + } \ + if (rs6000_isa_flags & OPTION_MASK_EABI) \ + { \ + rs6000_isa_flags &= ~OPTION_MASK_EABI; \ + error (INVALID_64BIT, "eabi"); \ + } \ + if (TARGET_PROTOTYPE) \ + { \ + target_prototype = 0; \ + error (INVALID_64BIT, "prototype"); \ + } \ + if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) == 0) \ + { \ + rs6000_isa_flags |= OPTION_MASK_POWERPC64; \ + error ("-m64 requires a PowerPC64 cpu"); \ + } \ + } \ + } \ while (0) #undef TARGET_LIBGCC_SDATA_SECTION #define TARGET_LIBGCC_SDATA_SECTION ".sdata" -#undef CPP_OS_DEFAULT_SPEC -#define CPP_OS_DEFAULT_SPEC "%(cpp_os_rtems)" +/* Copy and paste from linux64.h and freebsd64.h */ +#undef SIZE_TYPE +#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") + +/* Copy and paste from linux64.h and freebsd64.h */ +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") + +/* Copy and paste from freebsd64.h */ +#undef WCHAR_TYPE + +/* Copy and paste from freebsd64.h */ +#undef WCHAR_TYPE_SIZE +#define WCHAR_TYPE_SIZE 32 + +/* Copy and paste from linux64.h and freebsd64.h */ +#ifdef __powerpc64__ +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ + asm (SECTION_OP "\n" \ +" bl " #FUNC "\n" \ +" nop\n" \ +" .previous"); +#endif + +/* This could be also POWERPC_FREEBSD. It is related to the save/restore + defines below. */ +#define POWERPC_LINUX + +/* Copy and paste from linux64.h and freebsd64.h */ +#undef SAVE_FP_PREFIX +#define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_") +#undef SAVE_FP_SUFFIX +#define SAVE_FP_SUFFIX "" +#undef RESTORE_FP_PREFIX +#define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_") +#undef RESTORE_FP_SUFFIX +#define RESTORE_FP_SUFFIX "" -#define CPP_OS_RTEMS_SPEC "\ +/* Copy and paste from linux64.h and freebsd64.h */ +#undef ASM_DECLARE_FUNCTION_SIZE +#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ + do \ + { \ + if (!flag_inhibit_size_directive) \ + { \ + fputs ("\t.size\t", (FILE)); \ + if (TARGET_64BIT && DOT_SYMBOLS) \ + putc ('.', (FILE)); \ + assemble_name ((FILE), (FNAME)); \ + fputs (",.-", (FILE)); \ + rs6000_output_function_entry (FILE, FNAME); \ + putc ('\n', (FILE)); \ + } \ + } \ + while (0) + +/* Copy and paste from linux64.h and freebsd64.h */ +#undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P +#define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \ + (TARGET_TOC \ + && (GET_CODE (X) == SYMBOL_REF \ + || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \ + && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF) \ + || GET_CODE (X) == LABEL_REF \ + || (GET_CODE (X) == CONST_INT \ + && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \ + || (GET_CODE (X) == CONST_DOUBLE \ + && ((TARGET_64BIT \ + && (TARGET_MINIMAL_TOC \ + || (SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ + && ! TARGET_NO_FP_IN_TOC))) \ + || (!TARGET_64BIT \ + && !TARGET_NO_FP_IN_TOC \ + && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ + && BITS_PER_WORD == HOST_BITS_PER_INT))))) + +#undef CPP_OS_DEFAULT_SPEC +#define CPP_OS_DEFAULT_SPEC "\ %{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }\ %{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } \ %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } \ @@ -60,6 +194,37 @@ %{mcpu=8540: %{!Dppc*: %{!Dmpc*: -Dppc8540} } } \ %{mcpu=e6500: -D__PPC_CPU_E6500__}" +#undef ASM_DEFAULT_SPEC +#define ASM_DEFAULT_SPEC "-mppc%{m64:64}" + +#undef ASM_SPEC +#define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)" + +#define ASM_SPEC32 "-a32 \ +%{mrelocatable} %{mrelocatable-lib} %{" FPIE_OR_FPIC_SPEC ":-K PIC} \ +%{memb|msdata=eabi: -memb}" + +#define ASM_SPEC64 "-a64" + +#define ASM_SPEC_COMMON "%(asm_cpu) \ +%{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}}" \ + ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN) + +#undef LINK_OS_DEFAULT_SPEC +#define LINK_OS_DEFAULT_SPEC \ +"%{!m64:%(link_os_spec32)}%{m64:%(link_os_spec64)}" + +#define LINK_OS_SPEC32 ENDIAN_SELECT(" -m elf32ppc", \ + " -m elf32lppc", \ + " -m elf32ppc") +#define LINK_OS_SPEC64 ENDIAN_SELECT(" -m elf64ppc", \ + " -m elf64lppc", \ + " -m elf64ppc") + #undef SUBSUBTARGET_EXTRA_SPECS #define SUBSUBTARGET_EXTRA_SPECS \ - { "cpp_os_rtems", CPP_OS_RTEMS_SPEC } + { "asm_spec_common", ASM_SPEC_COMMON }, \ + { "asm_spec32", ASM_SPEC32 }, \ + { "asm_spec64", ASM_SPEC64 }, \ + { "link_os_spec32", LINK_OS_SPEC32 }, \ + { "link_os_spec64", LINK_OS_SPEC64 }, diff --git a/gcc/config/rs6000/t-rtems b/gcc/config/rs6000/t-rtems index 8290f5c5bdd..e8878a92898 100644 --- a/gcc/config/rs6000/t-rtems +++ b/gcc/config/rs6000/t-rtems @@ -33,6 +33,9 @@ MULTILIB_DIRNAMES += m32 MULTILIB_OPTIONS += msoft-float MULTILIB_DIRNAMES += nof +MULTILIB_OPTIONS += m64 +MULTILIB_DIRNAMES += m64 + MULTILIB_OPTIONS += mno-altivec MULTILIB_DIRNAMES += noaltivec @@ -72,3 +75,5 @@ MULTILIB_REQUIRED += mcpu=8540/msoft-float MULTILIB_REQUIRED += mcpu=860 MULTILIB_REQUIRED += mcpu=e6500/m32 MULTILIB_REQUIRED += mcpu=e6500/m32/msoft-float/mno-altivec +MULTILIB_REQUIRED += mcpu=e6500/m64 +MULTILIB_REQUIRED += mcpu=e6500/m64/msoft-float/mno-altivec diff --git a/libgcc/config/rs6000/ibm-ldouble.c b/libgcc/config/rs6000/ibm-ldouble.c index 949b50c98ca..e99652e523f 100644 --- a/libgcc/config/rs6000/ibm-ldouble.c +++ b/libgcc/config/rs6000/ibm-ldouble.c @@ -45,7 +45,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see This code currently assumes the most significant double is in the lower numbered register or lower addressed memory. */ -#if defined (__MACH__) || defined (__powerpc__) || defined (_AIX) +#if (defined (__MACH__) || defined (__powerpc__) || defined (_AIX)) \ + && !defined (__rtems__) #define fabs(x) __builtin_fabs(x) #define isless(x, y) __builtin_isless (x, y)