Skip to content

Commit

Permalink
LoongArch: Reimplement multilib build option handling.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
scylaac authored and chenglulu326 committed Sep 15, 2023
1 parent 68cb873 commit 227b18f
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 123 deletions.
10 changes: 0 additions & 10 deletions config-ml.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions config/mt-loongarch-elf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include $(srcdir)/config/mt-loongarch-mlib
2 changes: 2 additions & 0 deletions config/mt-loongarch-gnu
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
include $(srcdir)/config/mt-gnu
include $(srcdir)/config/mt-loongarch-mlib
1 change: 1 addition & 0 deletions config/mt-loongarch-mlib
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
FLAGS_FOR_TARGET += -fmultiflags
6 changes: 6 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -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"
;;
Expand Down
6 changes: 6 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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"
;;
Expand Down
6 changes: 3 additions & 3 deletions gcc/config.gcc
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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=""
Expand Down
42 changes: 42 additions & 0 deletions gcc/config/loongarch/loongarch-driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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()}}" \
Expand Down
50 changes: 0 additions & 50 deletions gcc/config/loongarch/loongarch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
66 changes: 7 additions & 59 deletions gcc/config/loongarch/t-linux
Original file line number Diff line number Diff line change
Expand Up @@ -16,68 +16,16 @@
# 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
2 changes: 1 addition & 1 deletion gcc/config/loongarch/t-loongarch
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
68 changes: 68 additions & 0 deletions gcc/config/loongarch/t-multilib
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 227b18f

Please sign in to comment.