]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
LoongArch: Reimplement multilib build option handling.
authorYang Yujie <yangyujie@loongson.cn>
Wed, 13 Sep 2023 09:52:14 +0000 (17:52 +0800)
committerLulu Cheng <chenglulu@loongson.cn>
Fri, 15 Sep 2023 02:42:12 +0000 (10:42 +0800)
Library build options from --with-multilib-list used to be processed with
*self_spec, which missed the driver's initial canonicalization.  This
caused limitations on CFLAGS override and the use of driver-only options
like -m[no]-lsx.

The problem is solved by promoting the injection rules of --with-multilib-list
options to the first element of DRIVER_SELF_SPECS, to make them execute before
the canonialization.  The library-build options are also hard-coded in
the driver and can be used conveniently by the builders of other non-gcc
libraries via the use of -fmultiflags.

Bootstrapped and tested on loongarch64-linux-gnu.

ChangeLog:

* config-ml.in: Remove unneeded loongarch clause.
* configure.ac: Register custom makefile fragments mt-loongarch-*
for loongarch targets.
* configure: Regenerate.

config/ChangeLog:

* mt-loongarch-mlib: New file.  Pass -fmultiflags when building
target libraries (FLAGS_FOR_TARGET).
* mt-loongarch-elf: New file.
* mt-loongarch-gnu: New file.

gcc/ChangeLog:

* config.gcc: Pass the default ABI via TM_MULTILIB_CONFIG.
* config/loongarch/loongarch-driver.h: Invoke MLIB_SELF_SPECS
before the driver canonicalization routines.
* config/loongarch/loongarch.h: Move definitions of CC1_SPEC etc.
to loongarch-driver.h
* config/loongarch/t-linux: Move multilib-related definitions to
t-multilib.
* config/loongarch/t-multilib: New file.  Inject library build
options obtained from --with-multilib-list.
* config/loongarch/t-loongarch: Same.

12 files changed:
config-ml.in
config/mt-loongarch-elf [new file with mode: 0644]
config/mt-loongarch-gnu [new file with mode: 0644]
config/mt-loongarch-mlib [new file with mode: 0644]
configure
configure.ac
gcc/config.gcc
gcc/config/loongarch/loongarch-driver.h
gcc/config/loongarch/loongarch.h
gcc/config/loongarch/t-linux
gcc/config/loongarch/t-loongarch
gcc/config/loongarch/t-multilib [new file with mode: 0644]

index ad0db07817182a0badc28ca38097489c7ab96777..68854a4f16c2bfcd48a8d721d4c28f0a602148cf 100644 (file)
@@ -301,16 +301,6 @@ arm-*-*)
          done
        fi
        ;;
-loongarch*-*)
-       old_multidirs="${multidirs}"
-       multidirs=""
-       for x in ${old_multidirs}; do
-       case "$x" in
-       `${CC-gcc} --print-multi-directory`) : ;;
-       *) multidirs="${multidirs} ${x}" ;;
-       esac
-       done
-       ;;
 m68*-*-*)
        if [ x$enable_softfloat = xno ]
        then
diff --git a/config/mt-loongarch-elf b/config/mt-loongarch-elf
new file mode 100644 (file)
index 0000000..bbf29bb
--- /dev/null
@@ -0,0 +1 @@
+include $(srcdir)/config/mt-loongarch-mlib
diff --git a/config/mt-loongarch-gnu b/config/mt-loongarch-gnu
new file mode 100644 (file)
index 0000000..dfefb44
--- /dev/null
@@ -0,0 +1,2 @@
+include $(srcdir)/config/mt-gnu
+include $(srcdir)/config/mt-loongarch-mlib
diff --git a/config/mt-loongarch-mlib b/config/mt-loongarch-mlib
new file mode 100644 (file)
index 0000000..4cfe568
--- /dev/null
@@ -0,0 +1 @@
+FLAGS_FOR_TARGET += -fmultiflags
index 28f0913bdd4a5909b9ce60cb06f72cc9d4f7b8c1..8fc163d36bdfe58ea793cc8f24dd2de440c34888 100755 (executable)
--- a/configure
+++ b/configure
@@ -9683,6 +9683,12 @@ case "${target}" in
   spu-*-*)
     target_makefile_frag="config/mt-spu"
     ;;
+  loongarch*-*linux* | loongarch*-*gnu*)
+    target_makefile_frag="config/mt-loongarch-gnu"
+    ;;
+  loongarch*-*elf*)
+    target_makefile_frag="config/mt-loongarch-elf"
+    ;;
   mips*-sde-elf* | mips*-mti-elf* | mips*-img-elf*)
     target_makefile_frag="config/mt-sde"
     ;;
index 5d25dc864c36968ad9eb7350afd3883fae91aab7..1d16530140abed0aa7fdd9678b0105a34b661d67 100644 (file)
@@ -2810,6 +2810,12 @@ case "${target}" in
   spu-*-*)
     target_makefile_frag="config/mt-spu"
     ;;
+  loongarch*-*linux* | loongarch*-*gnu*)
+    target_makefile_frag="config/mt-loongarch-gnu"
+    ;;
+  loongarch*-*elf*)
+    target_makefile_frag="config/mt-loongarch-elf"
+    ;;
   mips*-sde-elf* | mips*-mti-elf* | mips*-img-elf*)
     target_makefile_frag="config/mt-sde"
     ;;
index d642291610dea2adaeff6e0a9163e42151429f00..ce5def08e2e766209dac4e445303c959cf4bc747 100644 (file)
@@ -2483,7 +2483,7 @@ loongarch*-*-linux*)
        tm_file="elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file}"
        tm_file="${tm_file} loongarch/gnu-user.h loongarch/linux.h"
        extra_options="${extra_options} linux-android.opt"
-       tmake_file="${tmake_file} loongarch/t-linux"
+       tmake_file="${tmake_file} loongarch/t-multilib loongarch/t-linux"
        gnu_ld=yes
        gas=yes
 
@@ -2495,7 +2495,7 @@ loongarch*-*-linux*)
 loongarch*-*-elf*)
        tm_file="elfos.h newlib-stdint.h ${tm_file}"
        tm_file="${tm_file} loongarch/elf.h loongarch/linux.h"
-       tmake_file="${tmake_file} loongarch/t-linux"
+       tmake_file="${tmake_file} loongarch/t-multilib loongarch/t-linux"
        gnu_ld=yes
        gas=yes
 
@@ -5168,7 +5168,7 @@ case "${target}" in
                loongarch_multilib_list_sane=no
 
                # This one goes to TM_MULTILIB_CONFIG, for use in t-linux.
-               loongarch_multilib_list_make=""
+               loongarch_multilib_list_make="${abi_base},"
 
                # This one goes to tm_defines, for use in loongarch-driver.c.
                loongarch_multilib_list_c=""
index b39b96dec3659eea4f72e3206228b6963fb387b5..d917fcabd37948be68290688b82db53195c896d0 100644 (file)
@@ -23,6 +23,39 @@ along with GCC; see the file COPYING3.  If not see
 
 #include "loongarch-str.h"
 
+#ifndef SUBTARGET_CPP_SPEC
+#define SUBTARGET_CPP_SPEC ""
+#endif
+
+#ifndef SUBTARGET_CC1_SPEC
+#define SUBTARGET_CC1_SPEC ""
+#endif
+
+#ifndef SUBTARGET_ASM_SPEC
+#define SUBTARGET_ASM_SPEC ""
+#endif
+
+#define EXTRA_SPECS \
+  {"early_self_spec", ""}, \
+  {"subtarget_cc1_spec", SUBTARGET_CC1_SPEC}, \
+  {"subtarget_cpp_spec", SUBTARGET_CPP_SPEC}, \
+  {"subtarget_asm_spec", SUBTARGET_ASM_SPEC},
+
+
+#undef CPP_SPEC
+#define CPP_SPEC \
+  "%(subtarget_cpp_spec)"
+
+#undef CC1_SPEC
+#define CC1_SPEC \
+  "%{G*} %{,ada:-gnatea %{mabi=*} -gnatez} " \
+  "%(subtarget_cc1_spec)"
+
+#undef ASM_SPEC
+#define ASM_SPEC \
+  "%{mabi=*} %(subtarget_asm_spec)"
+
+
 extern const char*
 la_driver_init (int argc, const char **argv);
 
@@ -45,7 +78,16 @@ driver_get_normalized_m_opts (int argc, const char **argv);
 #define LA_SET_PARM_SPEC(NAME) \
   " %{m" OPTSTR_##NAME  "=*: %:set_m_parm(" OPTSTR_##NAME " %*)}" \
 
+/* For MLIB_SELF_SPECS.  */
+#include "loongarch-multilib.h"
+
+#ifndef MLIB_SELF_SPECS
+#define MLIB_SELF_SPECS ""
+#endif
+
 #define DRIVER_HANDLE_MACHINE_OPTIONS \
+  " %(early_self_spec)", \
+  MLIB_SELF_SPECS \
   " %:driver_init()" \
   " %{c|S|E|nostdlib: %:set_no_link()}" \
   " %{nostartfiles: %{nodefaultlibs: %:set_no_link()}}" \
index 7e391205583d1e0e755a626b5da51b0625748cb9..d357e32e4141f22016f1c654f1a5d6fd5445ce39 100644 (file)
@@ -64,56 +64,6 @@ along with GCC; see the file COPYING3.  If not see
 #define NM_FLAGS "-Bn"
 #endif
 
-/* SUBTARGET_ASM_SPEC is always passed to the assembler.  It may be
-   overridden by subtargets.  */
-
-#ifndef SUBTARGET_ASM_SPEC
-#define SUBTARGET_ASM_SPEC ""
-#endif
-
-#undef ASM_SPEC
-#define ASM_SPEC "%{mabi=*} %{subtarget_asm_spec}"
-
-/* Extra switches sometimes passed to the linker.  */
-
-#ifndef LINK_SPEC
-#define LINK_SPEC ""
-#endif /* LINK_SPEC defined  */
-
-/* Specs for the compiler proper.  */
-
-/* CC1_SPEC is the set of arguments to pass to the compiler proper.  */
-
-#undef CC1_SPEC
-#define CC1_SPEC "%{,ada:-gnatea} %{m*} \
-%{G*} \
-%(subtarget_cc1_spec) %{,ada:-gnatez}"
-
-/* Preprocessor specs.  */
-
-/* SUBTARGET_CPP_SPEC is passed to the preprocessor.  It may be
-   overridden by subtargets.  */
-#ifndef SUBTARGET_CPP_SPEC
-#define SUBTARGET_CPP_SPEC ""
-#endif
-
-#define CPP_SPEC "%(subtarget_cpp_spec)"
-
-/* This macro defines names of additional specifications to put in the specs
-   that can be used in various specifications like CC1_SPEC.  Its definition
-   is an initializer with a subgrouping for each command option.
-
-   Each subgrouping contains a string constant, that defines the
-   specification name, and a string constant that used by the GCC driver
-   program.
-
-   Do not define this macro if it does not need to do anything.  */
-
-#define EXTRA_SPECS \
-  {"subtarget_cc1_spec", SUBTARGET_CC1_SPEC}, \
-  {"subtarget_cpp_spec", SUBTARGET_CPP_SPEC}, \
-  {"subtarget_asm_spec", SUBTARGET_ASM_SPEC},
-
 /* Registers may have a prefix which can be ignored when matching
    user asm and register definitions.  */
 #ifndef REGISTER_PREFIX
index 9997596d722a0ba0af10d91f250507c3c0cef381..5e849c3643527311b722adbd84796f3a23d67631 100644 (file)
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-# Multilib
-MULTILIB_OPTIONS = mabi=lp64d/mabi=lp64f/mabi=lp64s
-MULTILIB_DIRNAMES = base/lp64d base/lp64f base/lp64s
-
-# The GCC driver always gets all abi-related options on the command line.
-# (see loongarch-driver.c:driver_get_normalized_m_opts)
-comma=,
-MULTILIB_REQUIRED = $(foreach mlib,$(subst $(comma), ,$(TM_MULTILIB_CONFIG)),\
-       $(firstword $(subst /, ,$(mlib))))
-
-SPECS = specs.install
-
-# temporary self_spec when building libraries (e.g. libgcc)
-gen_mlib_spec = $(if $(word 2,$1),\
-       %{$(firstword $1):$(patsubst %,-%,$(wordlist 2,$(words $1),$1))})
-
-# clean up the result of DRIVER_SELF_SPEC to avoid conflict
-lib_build_self_spec  = %<march=* %<mtune=* %<mcmodel=* %<mfpu=* %<msimd=*
-
-# append user-specified build options from --with-multilib-list
-lib_build_self_spec += $(foreach mlib,\
-       $(subst $(comma), ,$(TM_MULTILIB_CONFIG)),\
-       $(call gen_mlib_spec,$(subst /, ,$(mlib))))
-
-specs: specs.install
-       sed '/^*self_spec:$$/{ n;s/^$$/$(lib_build_self_spec)/g; }' $< > $@
-
-# Do some preparation before regression tests:
-# remove lib-build-specs / make symlinks for the toplevel multilib variant
-
-LA_DEFAULT_MULTISUBDIR = $(shell $(GCC_FOR_TARGET) --print-multi-dir)
-.PHONY: remove-lib-specs
-check check-host check-target $(CHECK_TARGETS) $(lang_checks): remove-lib-specs
-remove-lib-specs:
-       -mv -f specs.install specs 2>/dev/null
-       -mv $(LA_DEFAULT_MULTISUBDIR)/* ./
-       -mkdir -p ../$(target_noncanonical)/`dirname $(LA_DEFAULT_MULTISUBDIR)`
-       -$(LN_S) .. ../$(target_noncanonical)/$(LA_DEFAULT_MULTISUBDIR)
-
-# Multiarch
-ifneq ($(call if_multiarch,yes),yes)
-    # Define LA_DISABLE_MULTIARCH if multiarch is disabled.
-    tm_defines += LA_DISABLE_MULTIARCH
-else
-    # Only define MULTIARCH_DIRNAME when multiarch is enabled,
-    # or it would always introduce ${target} into the search path.
-    MULTIARCH_DIRNAME = $(LA_MULTIARCH_TRIPLET)
-endif
+MULTIOSDIR_lp64d := ../lib64$(call if_multiarch,:loongarch64-linux-gnu)
+MULTIOSDIR_lp64f := ../lib64/f32$(call if_multiarch,:loongarch64-linux-gnuf32)
+MULTIOSDIR_lp64s := ../lib64/sf$(call if_multiarch,:loongarch64-linux-gnusf)
 
 # Don't define MULTILIB_OSDIRNAMES if multilib is disabled.
 ifeq ($(filter LA_DISABLE_MULTILIB,$(tm_defines)),)
 
-    MULTILIB_OSDIRNAMES = \
-      mabi.lp64d=../lib64$\
-      $(call if_multiarch,:loongarch64-linux-gnu)
-
-    MULTILIB_OSDIRNAMES += \
-      mabi.lp64f=../lib64/f32$\
-      $(call if_multiarch,:loongarch64-linux-gnuf32)
-
-    MULTILIB_OSDIRNAMES += \
-      mabi.lp64s=../lib64/sf$\
-      $(call if_multiarch,:loongarch64-linux-gnusf)
+    MULTILIB_OSDIRNAMES = .=$(MULTIOSDIR_$(mlib_default))
+    MULTILIB_OSDIRNAMES += mabi.lp64d=$(MULTIOSDIR_lp64d)
+    MULTILIB_OSDIRNAMES += mabi.lp64f=$(MULTIOSDIR_lp64f)
+    MULTILIB_OSDIRNAMES += mabi.lp64s=$(MULTIOSDIR_lp64s)
 
 endif
index 43088a05643b0b01bef64bcd8108ea059e025b23..9b06fa84bcc80d6e6baaa3347e6ff2d7e1c0aa00 100644 (file)
@@ -16,7 +16,7 @@
 # along with GCC; see the file COPYING3.  If not see
 # <http://www.gnu.org/licenses/>.
 
-TM_H += $(srcdir)/config/loongarch/loongarch-driver.h
+TM_H += loongarch-multilib.h $(srcdir)/config/loongarch/loongarch-driver.h
 OPTIONS_H_EXTRA += $(srcdir)/config/loongarch/loongarch-def.h \
                   $(srcdir)/config/loongarch/loongarch-tune.h
 
diff --git a/gcc/config/loongarch/t-multilib b/gcc/config/loongarch/t-multilib
new file mode 100644 (file)
index 0000000..bf6c182
--- /dev/null
@@ -0,0 +1,68 @@
+# Copyright (C) 2023 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/>.
+
+# Helper definitions
+comma=,
+null  :=
+space := $(null) #
+exclude_1st = $(wordlist 2,$(words $1),$1)
+
+# Common definitions
+mlib_all := lp64d lp64f lp64s
+$(foreach i,$(mlib_all),$(eval MULTISUBDIR_$i := base/$i))
+
+mlib_default := $(firstword $(subst $(comma), ,$(TM_MULTILIB_CONFIG)))
+mlib_all := $(filter-out $(mlib_default),$(mlib_all))
+
+MULTILIB_OPTIONS := $(subst $(space),/,$(foreach i,$(mlib_all),mabi=$(i)))
+MULTILIB_DIRNAMES := $(foreach i,$(mlib_all),$(MULTISUBDIR_$(i)))
+
+# Customize builds with --with-multilib-list
+MULTILIB_REQUIRED := $(foreach i,$(call exclude_1st,\
+       $(subst $(comma), ,$(TM_MULTILIB_CONFIG))),\
+       $(firstword $(subst /, ,$(i))))
+
+## spec rules for building libraries, triggered by -fmultiflags
+gen_mlib_spec = $(if $(word 2,$1),\
+       %{$(firstword $1):$(patsubst %,-%,$(call exclude_1st,$1)}))
+
+lib_build_spec = $(foreach mlib,\
+       $(call exclude_1st,$(subst $(comma), ,$(TM_MULTILIB_CONFIG))),\
+       $(call gen_mlib_spec,$(subst /, ,$(mlib))))
+
+default_mlib_spec := %{fmultiflags:%{!mabi=*:-mabi=$(mlib_default)}}
+lib_build_spec    := %{fmultiflags:$(lib_build_spec)}
+
+ifneq ($(TM_MULTILIB_CONFIG),)
+loongarch-multilib.h:
+       @echo "#define MLIB_SELF_SPECS" \
+             "\"$(default_mlib_spec)\"," \
+             "\"$(lib_build_spec)\"," > $@
+else
+loongarch-multilib.h: ; @touch $@
+endif
+
+# Multiarch
+ifneq ($(call if_multiarch,yes),yes)
+    # Define LA_DISABLE_MULTIARCH if multiarch is disabled.
+    tm_defines += LA_DISABLE_MULTIARCH
+else
+    # Only define MULTIARCH_DIRNAME when multiarch is enabled,
+    # or it would always introduce ${target} into the search path.
+    MULTIARCH_DIRNAME = $(LA_MULTIARCH_TRIPLET)
+endif