[GLIBC] ARC: Add multilib support
diff mbox series

Message ID 20190508152333.2949-1-abrodkin@synopsys.com
State New
Headers show
Series
  • [GLIBC] ARC: Add multilib support
Related show

Commit Message

Alexey Brodkin May 8, 2019, 3:23 p.m. UTC
Based on preprocessor defines we determine which type of ARC core
we're targeting and set slibdir accordingly so that on installation
of libraries to sysroot libs for different ARC cores end up in different
locations which match ARC Linux multilib spec.

Note though it all only happens if 2 conditions happen simultaneously:
 1. Glibc configured with "--prefix=/usr"
 2. "-mcpu=xxx" exists in CC passed to Glibc's configure script

I.e. when we build Glibc for default CPU libs are installed in default
location.

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
---
 sysdeps/unix/sysv/linux/arc/configure    | 329 ++++++++++++++++++++++++++++++-
 sysdeps/unix/sysv/linux/arc/configure.ac |  70 +++++++
 2 files changed, 398 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 sysdeps/unix/sysv/linux/arc/configure

Comments

Vineet Gupta May 9, 2019, 8:36 p.m. UTC | #1
On 5/8/19 8:23 AM, Alexey Brodkin wrote:
> Based on preprocessor defines we determine which type of ARC core
> we're targeting and set slibdir accordingly so that on installation
> of libraries to sysroot libs for different ARC cores end up in different
> locations which match ARC Linux multilib spec.
>
> Note though it all only happens if 2 conditions happen simultaneously:
>  1. Glibc configured with "--prefix=/usr"

So how can we do this in a typical cross compile setup.

>  2. "-mcpu=xxx" exists in CC passed to Glibc's configure script
>
> I.e. when we build Glibc for default CPU libs are installed in default
> location.
>
> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
> ---
>  sysdeps/unix/sysv/linux/arc/configure    | 329 ++++++++++++++++++++++++++++++-
>  sysdeps/unix/sysv/linux/arc/configure.ac |  70 +++++++
>  2 files changed, 398 insertions(+), 1 deletion(-)
>  mode change 100644 => 100755 sysdeps/unix/sysv/linux/arc/configure

skipping generated file
 
> diff --git a/sysdeps/unix/sysv/linux/arc/configure.ac b/sysdeps/unix/sysv/linux/arc/configure.ac
> index a9528032d32..3615db8eabc 100644
> --- a/sysdeps/unix/sysv/linux/arc/configure.ac
> +++ b/sysdeps/unix/sysv/linux/arc/configure.ac
> @@ -2,3 +2,73 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
>  # Local configure fragment for sysdeps/unix/sysv/linux/arc.
>  
>  arch_minimum_kernel=3.9.0
> +
> +# If "-mcpu=xxx" found in passed CC assume we're building for
> +# non-default CPU and thus we need to install libs in non-default location.
> +if AC_TRY_COMMAND([echo $CC | grep -F "mcpu" > /dev/null]);
> +then
> +	libc_cv_arc_arch=no
> +
> +	# If this is ARCompact-based core
> +	AC_EGREP_CPP(yes, [#ifdef __ARC700__
> +			   yes
> +			   #endif
> +	],libc_cv_arc_arch=arc700)
> +
> +	# If this is ARCv2-based core
> +	AC_EGREP_CPP(yes, [#ifdef __ARCHS__
> +			   yes
> +			   #endif
> +	],libc_cv_arc_arch=hs)
> +
> +	if test $libc_cv_arc_arch = no; then
> +	  AC_MSG_ERROR([Unable to determine ARC architecture])
> +	fi
> +
> +	if test $libc_cv_arc_arch = arc700; then
> +		# NPS400
> +		AC_EGREP_CPP(yes, [#ifdef __NPS400__
> +				   yes
> +				   #endif
> +		],libc_cv_arc_arch=nps400)

I don't see any activity on NPS front so best to skip that in new code for now.


> +	else
> +		# Base-line HS38 + HW multiplier
> +		AC_EGREP_CPP(yes, [#ifdef __ARC_MPY__
> +				   yes
> +				   #endif
> +		],libc_cv_arc_arch=archs)
> +
> +		# Base-line HS38 + HW quad-multiplier
> +		AC_EGREP_CPP(yes, [#ifdef __ARC_MPY_QMACW__
> +				   yes
> +				   #endif
> +		],libc_cv_arc_arch=hs38)
> +
> +		# Base-line HS38 + HW quad-multiplier + FPU
> +		AC_EGREP_CPP(yes, [#ifdef __ARC_FPU_DP__
> +				   yes
> +				   #endif
> +		],libc_cv_arc_arch=hs38_linux)
> +	fi
> +

This zoo makes sense for gcc - for say baremetal stuff, but we don't want to spend
time (even machine time) building glibc for those.
You can assume MPY to be always present when running linux/glibc.

> +	case $libc_cv_arc_arch in
> +	arc700)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/arc700], [lib/arc700])
> +	  ;;
> +	nps400)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/nps400], [lib/nps400])


> +	  ;;
> +	hs)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/hs], [lib/hs])

Looking at
https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/wiki/Understanding-GCC-mcpu-optio

I'd recommend drop above


> +	  ;;
> +	archs)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/archs], [lib/archs])
> +	  ;;

ditto

> +	hs38)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/hs38], [lib/hs38])
> +	  ;;
> +	hs38_linux)
> +	  LIBC_SLIBDIR_RTLDDIR([lib/hs38_linux], [lib/hs38_linux])
> +	  ;;
> +	esac
> +fi

-Vineet

Patch
diff mbox series

diff --git a/sysdeps/unix/sysv/linux/arc/configure b/sysdeps/unix/sysv/linux/arc/configure
old mode 100644
new mode 100755
index f74fa7cb025..2173bd45484
--- a/sysdeps/unix/sysv/linux/arc/configure
+++ b/sysdeps/unix/sysv/linux/arc/configure
@@ -1,4 +1,331 @@ 
-# This file is generated from configure.in by Autoconf.  DO NOT EDIT!
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
  # Local configure fragment for sysdeps/unix/sysv/linux/arc.
 
 arch_minimum_kernel=3.9.0
+
+# If "-mcpu=xxx" found in passed CC assume we're building for
+# non-default CPU and thus we need to install libs in non-default location.
+if { ac_try='echo $CC | grep -F "mcpu" > /dev/null'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; };
+then
+	libc_cv_arc_arch=no
+
+	# If this is ARCompact-based core
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ARC700__
+			   yes
+			   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=arc700
+fi
+rm -f conftest*
+
+
+	# If this is ARCv2-based core
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ARCHS__
+			   yes
+			   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=hs
+fi
+rm -f conftest*
+
+
+	if test $libc_cv_arc_arch = no; then
+	  as_fn_error $? "Unable to determine ARC architecture" "$LINENO" 5
+	fi
+
+	if test $libc_cv_arc_arch = arc700; then
+		# NPS400
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __NPS400__
+				   yes
+				   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=nps400
+fi
+rm -f conftest*
+
+	else
+		# Base-line HS38 + HW multiplier
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ARC_MPY__
+				   yes
+				   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=archs
+fi
+rm -f conftest*
+
+
+		# Base-line HS38 + HW quad-multiplier
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ARC_MPY_QMACW__
+				   yes
+				   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=hs38
+fi
+rm -f conftest*
+
+
+		# Base-line HS38 + HW quad-multiplier + FPU
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __ARC_FPU_DP__
+				   yes
+				   #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  libc_cv_arc_arch=hs38_linux
+fi
+rm -f conftest*
+
+	fi
+
+	case $libc_cv_arc_arch in
+	arc700)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/arc700'
+  libc_cv_rtlddir='/lib/arc700'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/arc700';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	nps400)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/nps400'
+  libc_cv_rtlddir='/lib/nps400'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/nps400';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	hs)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/hs'
+  libc_cv_rtlddir='/lib/hs'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/hs';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	archs)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/archs'
+  libc_cv_rtlddir='/lib/archs'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/archs';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	hs38)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/hs38'
+  libc_cv_rtlddir='/lib/hs38'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/hs38';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	hs38_linux)
+	  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib/hs38_linux'
+  libc_cv_rtlddir='/lib/hs38_linux'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib/hs38_linux';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+	  ;;
+	esac
+fi
diff --git a/sysdeps/unix/sysv/linux/arc/configure.ac b/sysdeps/unix/sysv/linux/arc/configure.ac
index a9528032d32..3615db8eabc 100644
--- a/sysdeps/unix/sysv/linux/arc/configure.ac
+++ b/sysdeps/unix/sysv/linux/arc/configure.ac
@@ -2,3 +2,73 @@  GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
 # Local configure fragment for sysdeps/unix/sysv/linux/arc.
 
 arch_minimum_kernel=3.9.0
+
+# If "-mcpu=xxx" found in passed CC assume we're building for
+# non-default CPU and thus we need to install libs in non-default location.
+if AC_TRY_COMMAND([echo $CC | grep -F "mcpu" > /dev/null]);
+then
+	libc_cv_arc_arch=no
+
+	# If this is ARCompact-based core
+	AC_EGREP_CPP(yes, [#ifdef __ARC700__
+			   yes
+			   #endif
+	],libc_cv_arc_arch=arc700)
+
+	# If this is ARCv2-based core
+	AC_EGREP_CPP(yes, [#ifdef __ARCHS__
+			   yes
+			   #endif
+	],libc_cv_arc_arch=hs)
+
+	if test $libc_cv_arc_arch = no; then
+	  AC_MSG_ERROR([Unable to determine ARC architecture])
+	fi
+
+	if test $libc_cv_arc_arch = arc700; then
+		# NPS400
+		AC_EGREP_CPP(yes, [#ifdef __NPS400__
+				   yes
+				   #endif
+		],libc_cv_arc_arch=nps400)
+	else
+		# Base-line HS38 + HW multiplier
+		AC_EGREP_CPP(yes, [#ifdef __ARC_MPY__
+				   yes
+				   #endif
+		],libc_cv_arc_arch=archs)
+
+		# Base-line HS38 + HW quad-multiplier
+		AC_EGREP_CPP(yes, [#ifdef __ARC_MPY_QMACW__
+				   yes
+				   #endif
+		],libc_cv_arc_arch=hs38)
+
+		# Base-line HS38 + HW quad-multiplier + FPU
+		AC_EGREP_CPP(yes, [#ifdef __ARC_FPU_DP__
+				   yes
+				   #endif
+		],libc_cv_arc_arch=hs38_linux)
+	fi
+
+	case $libc_cv_arc_arch in
+	arc700)
+	  LIBC_SLIBDIR_RTLDDIR([lib/arc700], [lib/arc700])
+	  ;;
+	nps400)
+	  LIBC_SLIBDIR_RTLDDIR([lib/nps400], [lib/nps400])
+	  ;;
+	hs)
+	  LIBC_SLIBDIR_RTLDDIR([lib/hs], [lib/hs])
+	  ;;
+	archs)
+	  LIBC_SLIBDIR_RTLDDIR([lib/archs], [lib/archs])
+	  ;;
+	hs38)
+	  LIBC_SLIBDIR_RTLDDIR([lib/hs38], [lib/hs38])
+	  ;;
+	hs38_linux)
+	  LIBC_SLIBDIR_RTLDDIR([lib/hs38_linux], [lib/hs38_linux])
+	  ;;
+	esac
+fi