public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Thomas Preudhomme <thomas.preudhomme@foss.arm.com>
To: Kyrill Tkachov <kyrylo.tkachov@arm.com>,
	Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>,
	Richard Earnshaw <richard.earnshaw@arm.com>,
	"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: "Jasmin J." <jasmin@anw.at>
Subject: Re: [PATCH, GCC/ARM 2/2, ping3] Allow combination of aprofile and rmprofile multilibs
Date: Thu, 17 Nov 2016 20:43:00 -0000	[thread overview]
Message-ID: <b6aaf75d-1c13-3281-a55e-e744b2d14d5c@foss.arm.com> (raw)
In-Reply-To: <7329ec65-7cbc-7be9-1198-5fa67acc117c@foss.arm.com>

[-- Attachment #1: Type: text/plain, Size: 5720 bytes --]

Ping?

Best regards,

Thomas

On 08/11/16 13:36, Thomas Preudhomme wrote:
> Ping?
>
> Best regards,
>
> Thomas
>
> On 02/11/16 10:05, Thomas Preudhomme wrote:
>> Ping?
>>
>> Best regards,
>>
>> Thomas
>>
>> On 24/10/16 09:07, Thomas Preudhomme wrote:
>>> Ping?
>>>
>>> Best regards,
>>>
>>> Thomas
>>>
>>> On 13/10/16 16:35, Thomas Preudhomme wrote:
>>>> Hi ARM maintainers,
>>>>
>>>> This patchset aims at adding multilib support for R and M profile ARM
>>>> architectures and allowing it to be built alongside multilib for A profile ARM
>>>> architectures. This specific patch is concerned with the latter. The patch
>>>> works
>>>> by moving the bits shared by both aprofile and rmprofile multilib build
>>>> (variable initilization as well as ISA and float ABI to build multilib for)
>>>> to a
>>>> new t-multilib file. Then, based on which profile was requested in
>>>> --with-multilib-list option, that files includes t-aprofile and/or t-rmprofile
>>>> where the architecture and FPU to build the multilib for are specified.
>>>>
>>>> Unfortunately the duplication of CPU to A profile architectures could not be
>>>> avoided because substitution due to MULTILIB_MATCHES are not transitive.
>>>> Therefore, mapping armv7-a to armv7 for rmprofile multilib build does not have
>>>> the expected effect. Two patches were written to allow this using 2 different
>>>> approaches but I decided against it because this is not the right solution IMO.
>>>> See caveats below for what I believe is the correct approach.
>>>>
>>>>
>>>> *** combined build caveats ***
>>>>
>>>> As the documentation in this patch warns, there is a few caveats to using a
>>>> combined multilib build due to the way the multilib framework works.
>>>>
>>>> 1) For instance, when using only rmprofile the combination of options -mthumb
>>>> -march=armv7 -mfpu=neon the thumb/-march=armv7 multilib but in a combined
>>>> multilib build the default multilib would be used. This is because in the
>>>> rmprofile build -mfpu=neon is not specified in MULTILIB_OPTION and thus the
>>>> option is ignored when considering MULTILIB_REQUIRED entries.
>>>>
>>>> 2) Another issue is the fact that aprofile and rmprofile multilib build have
>>>> some conflicting requirements in terms of how to map options for which no
>>>> multilib is built to another option. (i) A first example of this is the
>>>> difference of CPU to architecture mapping mentionned above: rmprofile multilib
>>>> build needs A profile CPUs and architectures to be mapped down to ARMv7 so that
>>>> one of the v7-ar multilib gets chosen in such a case but aprofile needs A
>>>> profile architectures to stand on their own because multilibs are built for
>>>> several architectures.
>>>>
>>>> (ii) Another example of this is that in aprofile multilib build no multilib is
>>>> built with -mfpu=fpv5-d16 but some multilibs are built with -mfpu=fpv4-d16.
>>>> Therefore, aprofile defines a match rule to map fpv5-d16 onto fpv4-d16.
>>>> However,
>>>> rmprofile multilib profile *does* build some multilibs with -mfpu=fpv5-d16.
>>>> This
>>>> has the consequence that when building for -mthumb -march=armv7e-m
>>>> -mfpu=fpv5-d16 -mfloat-abi=hard the default multilib is chosen because this is
>>>> rewritten into -mthumb -march=armv7e-m -mfpu=fpv5-d16 -mfloat-abi=hard and
>>>> there
>>>> is no multilib for that.
>>>>
>>>> Both of these issues could be handled by using MULTILIB_REUSE instead of
>>>> MULTILIB_MATCHES but this would require a large set of rules. I believe instead
>>>> the right approach is to create a new mechanism to inform GCC on how options
>>>> can
>>>> be down mapped _when no multilib can be found_ which would require a smaller
>>>> set
>>>> of rules and would make it explicit that the options are not equivalent. A
>>>> patch
>>>> will be posted to this effect at a later time.
>>>>
>>>> ChangeLog entry is as follows:
>>>>
>>>>
>>>> *** gcc/ChangeLog ***
>>>>
>>>> 2016-10-03  Thomas Preud'homme  <thomas.preudhomme@arm.com>
>>>>
>>>>         * config.gcc: Allow combinations of aprofile and rmprofile values for
>>>>         --with-multilib-list.
>>>>         * config/arm/t-multilib: New file.
>>>>         * config/arm/t-aprofile: Remove initialization of MULTILIB_*
>>>>         variables.  Remove setting of ISA and floating-point ABI in
>>>>         MULTILIB_OPTIONS and MULTILIB_DIRNAMES.  Set architecture and FPU in
>>>>         MULTI_ARCH_OPTS_A and MULTI_ARCH_DIRS_A rather than MULTILIB_OPTIONS
>>>>         and MULTILIB_DIRNAMES respectively.  Add comment to introduce all
>>>>         matches.  Add architecture matches for marvel-pj4 and generic-armv7-a
>>>>         CPU options.
>>>>         * config/arm/t-rmprofile: Likewise except for the matches changes.
>>>>         * doc/install.texi (--with-multilib-list): Document the combination of
>>>>         aprofile and rmprofile values and warn about pitfalls in doing that.
>>>>
>>>>
>>>> Testing:
>>>>
>>>> * "tree install/lib/gcc/arm-none-eabi/7.0.0" is the same before and after the
>>>> patchset for both aprofile and rmprofile
>>>> * "tree install/lib/gcc/arm-none-eabi/7.0.0" is the same for aprofile,rmprofile
>>>> and rmprofile,aprofile
>>>> * default spec (gcc -dumpspecs) is the same for aprofile,rmprofile and
>>>> rmprofile,aprofile
>>>>
>>>> * Difference in --print-multi-directory between aprofile or rmprofile and
>>>> aprofile,rmprofile for all combination of ISA (ARM/Thumb), architecture, CPU,
>>>> FPU and float ABI is as expected (best multilib for the combination is chosen),
>>>> modulo the caveat mentionned above and the new marvel-pj4 and generic-armv7-a
>>>> CPU to architecture mapping.
>>>>
>>>>
>>>> Is this ok for master?
>>>>
>>>> Best regards,
>>>>
>>>> Thomas

[-- Attachment #2: 2_combine_profile_multilib.patch --]
[-- Type: text/x-patch, Size: 9988 bytes --]

diff --git a/gcc/config.gcc b/gcc/config.gcc
index bfd1127d6e8e647ca8c3a57dd2d58b586dffe4a5..d7508e89de0e1d7a3027da0b04e4fa36c1e95fd0 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -3710,34 +3710,18 @@ case "${target}" in
 		# Add extra multilibs
 		if test "x$with_multilib_list" != x; then
 			arm_multilibs=`echo $with_multilib_list | sed -e 's/,/ /g'`
-			case ${arm_multilibs} in
-			aprofile)
-				# Note that arm/t-aprofile is a
-				# stand-alone make file fragment to be
-				# used only with itself.  We do not
-				# specifically use the
-				# TM_MULTILIB_OPTION framework because
-				# this shorthand is more
-				# pragmatic.
-				tmake_profile_file="arm/t-aprofile"
-				;;
-			rmprofile)
-				# Note that arm/t-rmprofile is a
-				# stand-alone make file fragment to be
-				# used only with itself.  We do not
-				# specifically use the
-				# TM_MULTILIB_OPTION framework because
-				# this shorthand is more
-				# pragmatic.
-				tmake_profile_file="arm/t-rmprofile"
-				;;
-			default)
-				;;
-			*)
-				echo "Error: --with-multilib-list=${with_multilib_list} not supported." 1>&2
-				exit 1
-				;;
-			esac
+			if test "x${arm_multilibs}" != xdefault ; then
+				for arm_multilib in ${arm_multilibs}; do
+					case ${arm_multilib} in
+					aprofile|rmprofile)
+						tmake_profile_file="arm/t-multilib"
+						;;
+					*)
+						echo "Error: --with-multilib-list=${with_multilib_list} not supported." 1>&2
+						exit 1
+						;;
+					esac
+				done
 
 			if test "x${tmake_profile_file}" != x ; then
 				# arm/t-aprofile and arm/t-rmprofile are only
diff --git a/gcc/config/arm/t-aprofile b/gcc/config/arm/t-aprofile
index 90305e1206e3964e08a673e385d3198747bdffa1..2cbd8e3c8e8bcd4bed6368bfea83ece953c8dbb4 100644
--- a/gcc/config/arm/t-aprofile
+++ b/gcc/config/arm/t-aprofile
@@ -24,30 +24,13 @@
 # have their default values during the configure step.  We enforce
 # this during the top-level configury.
 
-MULTILIB_OPTIONS     =
-MULTILIB_DIRNAMES    =
-MULTILIB_EXCEPTIONS  =
-MULTILIB_MATCHES     =
-MULTILIB_REUSE	     =
+# Arch and FPU variants to build libraries with
 
-# We have the following hierachy:
-#   ISA: A32 (.) or T32 (thumb)
-#   Architecture: ARMv7-A (v7-a), ARMv7VE (v7ve), or ARMv8-A (v8-a).
-#   FPU: VFPv3-D16 (fpv3), NEONv1 (simdv1), VFPv4-D16 (fpv4),
-#        NEON-VFPV4 (simdvfpv4), NEON for ARMv8 (simdv8), or None (.).
-#   Float-abi: Soft (.), softfp (softfp), or hard (hardfp).
+MULTI_ARCH_OPTS_A       = march=armv7-a/march=armv7ve/march=armv8-a
+MULTI_ARCH_DIRS_A       = v7-a v7ve v8-a
 
-MULTILIB_OPTIONS       += mthumb
-MULTILIB_DIRNAMES      += thumb
-
-MULTILIB_OPTIONS       += march=armv7-a/march=armv7ve/march=armv8-a
-MULTILIB_DIRNAMES      += v7-a v7ve v8-a
-
-MULTILIB_OPTIONS       += mfpu=vfpv3-d16/mfpu=neon/mfpu=vfpv4-d16/mfpu=neon-vfpv4/mfpu=neon-fp-armv8
-MULTILIB_DIRNAMES      += fpv3 simdv1 fpv4 simdvfpv4 simdv8
-
-MULTILIB_OPTIONS       += mfloat-abi=softfp/mfloat-abi=hard
-MULTILIB_DIRNAMES      += softfp hard
+MULTI_FPU_OPTS_A        = mfpu=vfpv3-d16/mfpu=neon/mfpu=vfpv4-d16/mfpu=neon-vfpv4/mfpu=neon-fp-armv8
+MULTI_FPU_DIRS_A        = fpv3 simdv1 fpv4 simdvfpv4 simdv8
 
 
 # Option combinations to build library with
@@ -71,7 +54,11 @@ MULTILIB_REQUIRED      += *march=armv8-a
 MULTILIB_REQUIRED      += *march=armv8-a/mfpu=neon-fp-armv8/mfloat-abi=*
 
 
+# Matches
+
 # CPU Matches
+MULTILIB_MATCHES       += march?armv7-a=mcpu?marvell-pj4
+MULTILIB_MATCHES       += march?armv7-a=mcpu?generic-armv7-a
 MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a8
 MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a9
 MULTILIB_MATCHES       += march?armv7-a=mcpu?cortex-a5
diff --git a/gcc/config/arm/t-multilib b/gcc/config/arm/t-multilib
new file mode 100644
index 0000000000000000000000000000000000000000..642e731765534904b752d7e15fb6b68a3db2708e
--- /dev/null
+++ b/gcc/config/arm/t-multilib
@@ -0,0 +1,69 @@
+# Copyright (C) 2016 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/>.
+
+# This is a target makefile fragment that attempts to get
+# multilibs built for the range of CPU's, FPU's and ABI's that
+# are relevant for the ARM architecture.  It should not be used in
+# conjunction with another make file fragment and assumes --with-arch,
+# --with-cpu, --with-fpu, --with-float, --with-mode have their default
+# values during the configure step.  We enforce this during the
+# top-level configury.
+
+MULTILIB_OPTIONS     =
+MULTILIB_DIRNAMES    =
+MULTILIB_EXCEPTIONS  =
+MULTILIB_MATCHES     =
+MULTILIB_REUSE	     =
+
+comma := ,
+tm_multilib_list := $(subst $(comma), ,$(TM_MULTILIB_CONFIG))
+
+HAS_APROFILE := $(filter aprofile,$(tm_multilib_list))
+HAS_RMPROFILE := $(filter rmprofile,$(tm_multilib_list))
+
+ifneq (,$(HAS_APROFILE))
+include $(srcdir)/config/arm/t-aprofile
+endif
+ifneq (,$(HAS_RMPROFILE))
+include $(srcdir)/config/arm/t-rmprofile
+endif
+SEP := $(and $(HAS_APROFILE),$(HAS_RMPROFILE),/)
+
+
+# We have the following hierachy:
+#   ISA: A32 (.) or T16/T32 (thumb)
+#   Architecture: ARMv6-M (v6-m), ARMv7-M (v7-m), ARMv7E-M (v7e-m),
+#                 ARMv7 (v7-ar), ARMv7-A (v7-a), ARMv7VE (v7ve),
+#                 ARMv8-M Baseline (v8-m.base), ARMv8-M Mainline (v8-m.main)
+#                 or ARMv8-A (v8-a).
+#   FPU: VFPv3-D16 (fpv3), NEONv1 (simdv1), FPV4-SP-D16 (fpv4-sp),
+#        VFPv4-D16 (fpv4), NEON-VFPV4 (simdvfpv4), FPV5-SP-D16 (fpv5-sp),
+#        VFPv5-D16 (fpv5), NEON for ARMv8 (simdv8), or None (.).
+#   Float-abi: Soft (.), softfp (softfp), or hard (hard).
+
+MULTILIB_OPTIONS       += mthumb
+MULTILIB_DIRNAMES      += thumb
+
+MULTILIB_OPTIONS       += $(MULTI_ARCH_OPTS_A)$(SEP)$(MULTI_ARCH_OPTS_RM)
+MULTILIB_DIRNAMES      += $(MULTI_ARCH_DIRS_A) $(MULTI_ARCH_DIRS_RM)
+
+MULTILIB_OPTIONS       += $(MULTI_FPU_OPTS_A)$(SEP)$(MULTI_FPU_OPTS_RM)
+MULTILIB_DIRNAMES      += $(MULTI_FPU_DIRS_A) $(MULTI_FPU_DIRS_RM)
+
+MULTILIB_OPTIONS       += mfloat-abi=softfp/mfloat-abi=hard
+MULTILIB_DIRNAMES      += softfp hard
diff --git a/gcc/config/arm/t-rmprofile b/gcc/config/arm/t-rmprofile
index c195a6590c2f8e1753a9f2498583f5be89df7d1e..ea6054dfd58be63426fc77e3a00a25fde96a8583 100644
--- a/gcc/config/arm/t-rmprofile
+++ b/gcc/config/arm/t-rmprofile
@@ -24,33 +24,14 @@
 # values during the configure step.  We enforce this during the
 # top-level configury.
 
-MULTILIB_OPTIONS     =
-MULTILIB_DIRNAMES    =
-MULTILIB_EXCEPTIONS  =
-MULTILIB_MATCHES     =
-MULTILIB_REUSE       =
 
-# We have the following hierachy:
-#   ISA: A32 (.) or T16/T32 (thumb).
-#   Architecture: ARMv6S-M (v6-m), ARMv7-M (v7-m), ARMv7E-M (v7e-m),
-#                 ARMv8-M Baseline (v8-m.base) or ARMv8-M Mainline (v8-m.main).
-#   FPU: VFPv3-D16 (fpv3), FPV4-SP-D16 (fpv4-sp), FPV5-SP-D16 (fpv5-sp),
-#        VFPv5-D16 (fpv5), or None (.).
-#   Float-abi: Soft (.), softfp (softfp), or hard (hardfp).
+# Arch and FPU variants to build libraries with
 
-# Options to build libraries with
+MULTI_ARCH_OPTS_RM      = march=armv6s-m/march=armv7-m/march=armv7e-m/march=armv7/march=armv8-m.base/march=armv8-m.main
+MULTI_ARCH_DIRS_RM      = v6-m v7-m v7e-m v7-ar v8-m.base v8-m.main
 
-MULTILIB_OPTIONS       += mthumb
-MULTILIB_DIRNAMES      += thumb
-
-MULTILIB_OPTIONS       += march=armv6s-m/march=armv7-m/march=armv7e-m/march=armv7/march=armv8-m.base/march=armv8-m.main
-MULTILIB_DIRNAMES      += v6-m v7-m v7e-m v7-ar v8-m.base v8-m.main
-
-MULTILIB_OPTIONS       += mfpu=vfpv3-d16/mfpu=fpv4-sp-d16/mfpu=fpv5-sp-d16/mfpu=fpv5-d16
-MULTILIB_DIRNAMES      += fpv3 fpv4-sp fpv5-sp fpv5
-
-MULTILIB_OPTIONS       += mfloat-abi=softfp/mfloat-abi=hard
-MULTILIB_DIRNAMES      += softfp hard
+MULTI_FPU_OPTS_RM       = mfpu=vfpv3-d16/mfpu=fpv4-sp-d16/mfpu=fpv5-sp-d16/mfpu=fpv5-d16
+MULTI_FPU_DIRS_RM       = fpv3 fpv4-sp fpv5-sp fpv5
 
 
 # Option combinations to build library with
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 0b94bc1931a226e58d06a7ed5a726454142c006a..d91c82b569c017819cc2390085ed159e02929819 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1114,14 +1114,18 @@ for each target is given below.
 
 @table @code
 @item arm*-*-*
-@var{list} is one of@code{default}, @code{aprofile} or @code{rmprofile}.
-Specifying @code{default} is equivalent to omitting this option, ie. only the
-default runtime library will be enabled.  Specifying @code{aprofile} or
-@code{rmprofile} builds multilibs for a combination of ISA, architecture,
-FPU available and floating-point ABI.
+@var{list} is a comma separated list of @code{aprofile} and @code{rmprofile}
+to build multilibs for A or R and M architecture profiles respectively.  Note
+that, due to some limitation of the current multilib framework, using the
+combined @code{aprofile,rmprofile} multilibs selects in some cases a less
+optimal multilib than when using the multilib profile for the architecture
+targetted.  The special value @code{default} is also accepted and is equivalent
+to omitting the option, ie. only the default run-time library will be enabled.
 
 The table below gives the combination of ISAs, architectures, FPUs and
 floating-point ABIs for which multilibs are built for each accepted value.
+The union of these options is considered when specifying both @code{aprofile}
+and @code{rmprofile}.
 
 @multitable @columnfractions .15 .28 .30
 @item Option @tab aprofile @tab rmprofile

  reply	other threads:[~2016-11-17 20:43 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-13 15:35 [PATCH, GCC/ARM 2/2] " Thomas Preudhomme
2016-10-24  8:07 ` [PATCH, GCC/ARM 2/2, ping] " Thomas Preudhomme
2016-11-02 10:05   ` [PATCH, GCC/ARM 2/2, ping2] " Thomas Preudhomme
2016-11-08 13:37     ` Thomas Preudhomme
2016-11-17 20:43       ` Thomas Preudhomme [this message]
2016-12-06 11:35         ` [PATCH, GCC/ARM 2/2, ping3] " Thomas Preudhomme
2017-01-03 17:23           ` [PATCH, GCC/ARM 2/2, ping4] " Thomas Preudhomme
2017-05-04 15:21             ` [PATCH, GCC/ARM 2/2, ping] " Thomas Preudhomme
2017-05-05 16:06 ` [PATCH, GCC/ARM 2/2] " Ramana Radhakrishnan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b6aaf75d-1c13-3281-a55e-e744b2d14d5c@foss.arm.com \
    --to=thomas.preudhomme@foss.arm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jasmin@anw.at \
    --cc=kyrylo.tkachov@arm.com \
    --cc=ramana.radhakrishnan@arm.com \
    --cc=richard.earnshaw@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).