# Copyright (C) 2021-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/>.

# 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

# 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)

endif
