# Plugins for offload execution, configure.ac fragment.  -*- mode: autoconf -*-
#
# Copyright (C) 2014-2023 Free Software Foundation, Inc.
#
# Contributed by Mentor Embedded.
#
# This file is part of the GNU Offloading and Multi Processing Library
# (libgomp).
#
# Libgomp 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.
#
# Libgomp 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.
#
# Under Section 7 of GPL version 3, you are granted additional
# permissions described in the GCC Runtime Library Exception, version
# 3.1, as published by the Free Software Foundation.
#
# You should have received a copy of the GNU General Public License and
# a copy of the GCC Runtime Library Exception along with this program;
# see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
# <http://www.gnu.org/licenses/>.

plugin_support=yes
DL_LIBS=
AC_SUBST(DL_LIBS)
AC_CHECK_LIB(dl, dlsym, [DL_LIBS=-ldl], [plugin_support=no])
if test x"$plugin_support" = xyes; then
  AC_DEFINE(PLUGIN_SUPPORT, 1,
    [Define if all infrastructure, needed for plugins, is supported.])
elif test "x${enable_offload_targets-no}" != xno; then
  AC_MSG_ERROR([Can't support offloading without support for plugins])
fi
AC_CHECK_HEADERS_ONCE(unistd.h)
AC_CHECK_FUNCS_ONCE(secure_getenv __secure_getenv getuid geteuid getgid getegid)


PLUGIN_NVPTX=0
PLUGIN_GCN=0
# Parse '--enable-offload-targets', figure out the corresponding libgomp
# plugins, and configure to find the corresponding offload compilers.
# 'offload_plugins' and 'offload_targets' will be populated in the same order.
offload_plugins=
offload_targets=
AC_SUBST(offload_plugins)
AC_SUBST(offload_targets)
offload_additional_options=
offload_additional_lib_paths=
AC_SUBST(offload_additional_options)
AC_SUBST(offload_additional_lib_paths)
if test x"$enable_offload_targets" != x; then
  for tgt in `echo $enable_offload_targets | sed -e 's#,# #g'`; do
    tgt_dir=`echo $tgt | grep '=' | sed 's/.*=//'`
    tgt=`echo $tgt | sed 's/=.*//'`
    tgt_plugin=
    case $tgt in
      nvptx*)
	case "${target}" in
	  aarch64*-*-* | powerpc64le-*-* | x86_64-*-*)
	    case "$ac_cv_sizeof_void_p" in
	      4)
		# PR libgomp/65099: Currently, we only support offloading in
		# 64-bit configurations.
		PLUGIN_NVPTX=0
		;;
	      *)
		tgt_plugin=nvptx
		PLUGIN_NVPTX=1
		;;
	    esac
	    ;;
	  *-*-*)
	    # Target architecture not supported.
	    PLUGIN_NVPTX=0
	    ;;
	esac
	;;
      amdgcn*)
	case "${target}" in
	  x86_64-*-*)
	    case "$ac_cv_sizeof_void_p" in
	      4)
		PLUGIN_GCN=0
		;;
	      *)
		tgt_plugin=gcn
		PLUGIN_GCN=1
		;;
	      esac
	    ;;
	  *-*-*)
	    PLUGIN_GCN=0
	     ;;
	esac
	;;
      *)
	AC_MSG_ERROR([unknown offload target specified])
	;;
    esac
    if test x"$tgt_plugin" = x; then
      # Not configuring libgomp for this offload target if we're not building
      # the corresponding offload plugin.
      continue
    elif test x"$offload_plugins" = x; then
      offload_plugins=$tgt_plugin
      offload_targets=$tgt
    else
      offload_plugins=$offload_plugins,$tgt_plugin
      offload_targets=$offload_targets,$tgt
    fi
    # Configure additional search paths.
    if test x"$tgt_dir" != x; then
      offload_additional_options="$offload_additional_options -B$tgt_dir/\$(libexecdir:\$(exec_prefix)/%=%)/gcc/\$(target_alias)/\$(gcc_version) -B$tgt_dir/bin"
      offload_additional_lib_paths="$offload_additional_lib_paths:$tgt_dir/lib64:$tgt_dir/lib:$tgt_dir/lib32"
    else
      offload_additional_options="$offload_additional_options -B\$(libexecdir)/gcc/\$(target_alias)/\$(gcc_version) -B\$(bindir)"
      offload_additional_lib_paths="$offload_additional_lib_paths:$toolexeclibdir"
    fi
  done
fi
AC_DEFINE_UNQUOTED(OFFLOAD_PLUGINS, "$offload_plugins",
  [Define to offload plugins, separated by commas.])
AM_CONDITIONAL([PLUGIN_NVPTX], [test $PLUGIN_NVPTX = 1])
AM_CONDITIONAL([PLUGIN_GCN], [test $PLUGIN_GCN = 1])
