public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
@ 2018-10-11 13:36 ` Christophe Lyon
  2018-10-12 10:14   ` Richard Earnshaw (lists)
  2018-10-11 13:36 ` [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support Christophe Lyon
                   ` (19 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:36 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

The new arm-uclinuxfdpiceabi target behaves pretty much like
arm-linux-gnueabi. In order the enable the same set of features, we
have to update several configure scripts that generally match targets
like *-*-linux*: in most places, we add *-uclinux* where there is
already *-linux*, or uclinux* when there is already linux*.

In gcc/config.gcc and libgcc/config.host we use *-*-uclinuxfdpiceabi
because there is already a different behaviour for *-*uclinux* target.

In libtool.m4, we use uclinuxfdpiceabi in cases where ELF shared
libraries support is required, as uclinux does not guarantee that.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>

	config/
	* futex.m4: Handle *-uclinux*.
	* tls.m4 (GCC_CHECK_TLS): Likewise.

	gcc/
	* config.gcc: Handle *-*-uclinuxfdpiceabi.

	libatomic/
	* configure.tgt: Handle arm*-*-uclinux*.
	* configure: Regenerate.

	libgcc/
	* config.host: Handle *-*-uclinuxfdpiceabi.

	libitm/
	* configure.tgt: Handle *-*-uclinux*.
	* configure: Regenerate.

	libstdc++-v3/
	* acinclude.m4: Handle uclinux*.
	* configure: Regenerate.
	* configure.host: Handle uclinux*

	* libtool.m4: Handle uclinux*.

Change-Id: I6a1fdcd9847d8a82179a214612a3474c1f492916

diff --git a/config/futex.m4 b/config/futex.m4
index e95144d..4dffe15 100644
--- a/config/futex.m4
+++ b/config/futex.m4
@@ -9,7 +9,7 @@ AC_DEFUN([GCC_LINUX_FUTEX],[dnl
 GCC_ENABLE(linux-futex,default, ,[use the Linux futex system call],
 	   permit yes|no|default)
 case "$target" in
-  *-linux*)
+  *-linux* | *-uclinux*)
     case "$enable_linux_futex" in
       default)
 	# If headers don't have gettid/futex syscalls definition, then
diff --git a/config/tls.m4 b/config/tls.m4
index 4e170c8..5a8676e 100644
--- a/config/tls.m4
+++ b/config/tls.m4
@@ -76,7 +76,7 @@ AC_DEFUN([GCC_CHECK_TLS], [
 	  dnl Shared library options may depend on the host; this check
 	  dnl is only known to be needed for GNU/Linux.
 	  case $host in
-	    *-*-linux*)
+	    *-*-linux* | -*-uclinux*)
 	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
 	      ;;
 	  esac
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 0c579d1..793fc69 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -753,7 +753,7 @@ case ${target} in
 *-*-fuchsia*)
   native_system_header_dir=/include
   ;;
-*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
+*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
   extra_options="$extra_options gnu-user.opt"
   gas=yes
   gnu_ld=yes
@@ -762,7 +762,7 @@ case ${target} in
   esac
   tmake_file="t-slibgcc"
   case $target in
-    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu)
+    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu  | *-*-uclinuxfdpiceabi)
       :;;
     *-*-gnu*)
       native_system_header_dir=/include
@@ -782,7 +782,7 @@ case ${target} in
     *-*-*android*)
       tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC"
       ;;
-    *-*-*uclibc*)
+    *-*-*uclibc* | *-*-uclinuxfdpiceabi)
       tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
       ;;
     *-*-*musl*)
@@ -1134,7 +1134,7 @@ arm*-*-netbsdelf*)
 	tmake_file="${tmake_file} arm/t-arm"
 	target_cpu_cname="arm6"
 	;;
-arm*-*-linux-*)			# ARM GNU/Linux with ELF
+arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
 	extra_options="${extra_options} linux-android.opt"
 	case $target in
diff --git a/libatomic/configure b/libatomic/configure
index b902e2c..5b3ef8e 100755
--- a/libatomic/configure
+++ b/libatomic/configure
@@ -5819,7 +5819,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -8305,7 +8305,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -8900,7 +8900,7 @@ _LT_EOF
       archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
 	case $cc_basename in
@@ -10431,7 +10431,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
index ea8c34f..c1a608f 100644
--- a/libatomic/configure.tgt
+++ b/libatomic/configure.tgt
@@ -124,7 +124,7 @@ case "${target}" in
 	config_path="${config_path} linux/aarch64 posix"
 	;;
 
-  arm*-*-linux*)
+  arm*-*-linux* | arm*-*-uclinux*)
 	# OS support for atomic primitives.
 	config_path="${config_path} linux/arm posix"
 	;;
diff --git a/libgcc/config.host b/libgcc/config.host
index 029f656..28f3c14 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -238,7 +238,7 @@ case ${host} in
   tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia"
   extra_parts="crtbegin.o crtend.o"
   ;;
-*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
+*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
   tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
   extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
   if test x$enable_vtable_verify = xyes; then
@@ -424,7 +424,7 @@ arm*-*-fuchsia*)
 arm*-*-netbsdelf*)
 	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
 	;;
-arm*-*-linux*)			# ARM GNU/Linux with ELF
+arm*-*-linux* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
 	tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
 	tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
 	tm_file="$tm_file arm/bpabi-lib.h"
diff --git a/libitm/configure b/libitm/configure
index dbf386d..fd82500 100644
--- a/libitm/configure
+++ b/libitm/configure
@@ -6494,7 +6494,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -8981,7 +8981,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -9576,7 +9576,7 @@ _LT_EOF
       archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
 	case $cc_basename in
@@ -11107,7 +11107,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -13008,7 +13008,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
         inherit_rpath_CXX=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -13595,7 +13595,7 @@ interix[3-9]*)
   postdeps_CXX=
   ;;
 
-linux*)
+linux* | uclinux*)
   case `$CC -V 2>&1 | sed 5q` in
   *Sun\ C*)
     # Sun C++ 5.9
@@ -13846,7 +13846,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -14767,7 +14767,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -16239,7 +16239,7 @@ fi
 
 
 case "$target" in
-  *-linux*)
+  *-linux* | *-uclinux*)
     case "$enable_linux_futex" in
       default)
 	# If headers don't have gettid/futex syscalls definition, then
@@ -16362,7 +16362,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   chktls_save_LDFLAGS="$LDFLAGS"
 	  	  	  case $host in
-	    *-*-linux*)
+	    *-*-linux* | -*-uclinux*)
 	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
 	      ;;
 	  esac
diff --git a/libitm/configure.tgt b/libitm/configure.tgt
index 0cbb097..bc6c3ca 100644
--- a/libitm/configure.tgt
+++ b/libitm/configure.tgt
@@ -127,7 +127,7 @@ config_path="$ARCH posix generic"
 
 # Other system configury
 case "${target}" in
-  *-*-linux*)
+  *-*-linux* | *-*-uclinux*)
 	if test "$enable_linux_futex" = yes; then
 	  config_path="linux/$ARCH linux $config_path"
 	fi
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 6d68e90..2e18049 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -1395,7 +1395,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
         ac_has_nanosleep=yes
         ac_has_sched_yield=yes
         ;;
-      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
+      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
         AC_MSG_CHECKING([for at least GNU libc 2.17])
         AC_TRY_COMPILE(
           [#include <features.h>],
@@ -1517,7 +1517,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
 
   if test x"$ac_has_clock_monotonic" != x"yes"; then
     case ${target_os} in
-      linux*)
+      linux* | uclinux*)
 	AC_MSG_CHECKING([for clock_gettime syscall])
 	AC_TRY_COMPILE(
 	  [#include <unistd.h>
@@ -2402,7 +2402,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
   # Default to "generic".
   if test $enable_clocale_flag = auto; then
     case ${target_os} in
-      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
 	enable_clocale_flag=gnu
 	;;
       darwin*)
@@ -2648,7 +2648,7 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
   # Default to "new".
   if test $enable_libstdcxx_allocator_flag = auto; then
     case ${target_os} in
-      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
 	enable_libstdcxx_allocator_flag=new
 	;;
       *)
@@ -4282,7 +4282,7 @@ AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
         enable_libstdcxx_filesystem_ts=yes
         ;;
-      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
+      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
         enable_libstdcxx_filesystem_ts=yes
         ;;
       rtems*)
@@ -4430,7 +4430,7 @@ dnl
     AC_MSG_CHECKING([for sendfile that can copy files])
     AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
       case "${target_os}" in
-        gnu* | linux* | solaris*)
+        gnu* | linux* | solaris* | uclinux*)
           GCC_TRY_COMPILE_OR_LINK(
             [#include <sys/sendfile.h>],
             [sendfile(1, 2, (off_t*)0, sizeof 1);],
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index d33081d..7780679 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -6413,7 +6413,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -8765,7 +8765,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -9360,7 +9360,7 @@ _LT_EOF
       archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
 	case $cc_basename in
@@ -10900,7 +10900,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -12825,7 +12825,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
         inherit_rpath_CXX=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -13412,7 +13412,7 @@ interix[3-9]*)
   postdeps_CXX=
   ;;
 
-linux*)
+linux* | uclinux*)
   case `$CC -V 2>&1 | sed 5q` in
   *Sun\ C*)
     # Sun C++ 5.9
@@ -13663,7 +13663,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -14584,7 +14584,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -15833,7 +15833,7 @@ fi
   # Default to "generic".
   if test $enable_clocale_flag = auto; then
     case ${target_os} in
-      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
 	enable_clocale_flag=gnu
 	;;
       darwin*)
@@ -16250,7 +16250,7 @@ fi
   # Default to "new".
   if test $enable_libstdcxx_allocator_flag = auto; then
     case ${target_os} in
-      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
 	enable_libstdcxx_allocator_flag=new
 	;;
       *)
@@ -20526,7 +20526,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
         ac_has_nanosleep=yes
         ac_has_sched_yield=yes
         ;;
-      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
+      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at least GNU libc 2.17" >&5
 $as_echo_n "checking for at least GNU libc 2.17... " >&6; }
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -21026,7 +21026,7 @@ $as_echo "$ac_has_nanosleep" >&6; }
 
   if test x"$ac_has_clock_monotonic" != x"yes"; then
     case ${target_os} in
-      linux*)
+      linux* | uclinux*)
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall" >&5
 $as_echo_n "checking for clock_gettime syscall... " >&6; }
 	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -27918,7 +27918,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   chktls_save_LDFLAGS="$LDFLAGS"
 	  	  	  case $host in
-	    *-*-linux*)
+	    *-*-linux* | -*-uclinux*)
 	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
 	      ;;
 	  esac
@@ -53578,7 +53578,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   chktls_save_LDFLAGS="$LDFLAGS"
 	  	  	  case $host in
-	    *-*-linux*)
+	    *-*-linux* | -*-uclinux*)
 	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
 	      ;;
 	  esac
@@ -59771,7 +59771,7 @@ _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   chktls_save_LDFLAGS="$LDFLAGS"
 	  	  	  case $host in
-	    *-*-linux*)
+	    *-*-linux* | -*-uclinux*)
 	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
 	      ;;
 	  esac
@@ -78397,7 +78397,7 @@ fi
 
 
 case "$target" in
-  *-linux*)
+  *-linux* | *-uclinux*)
     case "$enable_linux_futex" in
       default)
 	# If headers don't have gettid/futex syscalls definition, then
@@ -80033,7 +80033,7 @@ $as_echo_n "checking whether to build Filesystem TS support... " >&6; }
       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
         enable_libstdcxx_filesystem_ts=yes
         ;;
-      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
+      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
         enable_libstdcxx_filesystem_ts=yes
         ;;
       rtems*)
@@ -80457,7 +80457,7 @@ $as_echo_n "checking for sendfile that can copy files... " >&6; }
   $as_echo_n "(cached) " >&6
 else
         case "${target_os}" in
-        gnu* | linux* | solaris*)
+        gnu* | linux* | solaris* | uclinux*)
           if test x$gcc_no_link = xyes; then
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
index 155a3cd..1c298ab 100644
--- a/libstdc++-v3/configure.host
+++ b/libstdc++-v3/configure.host
@@ -264,7 +264,7 @@ case "${host_os}" in
   linux-musl*)
     os_include_dir="os/generic"
     ;;
-  gnu* | linux* | kfreebsd*-gnu)
+  gnu* | linux* | kfreebsd*-gnu | uclinux*)
     if [ "$uclibc" = "yes" ]; then
       os_include_dir="os/uclibc"
     elif [ "$bionic" = "yes" ]; then
@@ -327,7 +327,7 @@ esac
 # Set any OS-dependent and CPU-dependent bits.
 # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
 case "${host}" in
-  *-*-linux*)
+  *-*-linux* | *-*-uclinux*)
     case "${host_cpu}" in
       i[567]86)
         abi_baseline_pair=i486-linux-gnu
@@ -358,7 +358,7 @@ case "${host}" in
         fi
     esac
     case "${host}" in
-      arm*-*-linux-*)
+      arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
 	port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
 	;;
     esac
diff --git a/libtool.m4 b/libtool.m4
index 940faaa..49ab293 100644
--- a/libtool.m4
+++ b/libtool.m4
@@ -2449,7 +2449,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   version_type=linux
   need_lib_prefix=no
   need_version=no
@@ -3089,7 +3089,7 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
@@ -3734,7 +3734,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -4032,7 +4032,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -4449,7 +4449,7 @@ _LT_EOF
       _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
       tmp_diet=no
       if test "$host_os" = linux-dietlibc; then
 	case $cc_basename in
@@ -5946,7 +5946,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -6598,7 +6598,7 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdeps,$1)=
   ;;
 
-linux*)
+linux* | uclinux*)
   case `$CC -V 2>&1 | sed 5q` in
   *Sun\ C*)
     # Sun C++ 5.9
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 00/21] FDPIC ABI for ARM
@ 2018-10-11 13:36 Christophe Lyon
  2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
                   ` (20 more replies)
  0 siblings, 21 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:36 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Hello,

This patch series implements the GCC contribution of the FDPIC ABI for
ARM targets.

This ABI enables to run Linux on ARM MMU-less cores and supports
shared libraries to reduce the memory footprint.

Without MMU, text and data segments relative distances are different
from one process to another, hence the need for a dedicated FDPIC
register holding the start address of the data segment. One of the
side effects is that function pointers require two words to be
represented: the address of the code, and the data segment start
address. These two words are designated as "Function Descriptor",
hence the "FD PIC" name.

On ARM, the FDPIC register is r9 [1], and the target name is
arm-uclinuxfdpiceabi. Note that arm-uclinux exists, but uses another
ABI and the BFLAT file format; it does not support code sharing.
The -mfdpic option is enabled by default, and -mno-fdpic should be
used to build the Linux kernel.

This work was developed some time ago by STMicroelectronics, and was
presented during Linaro Connect SFO15 (September 2015). You can watch
the discussion and read the slides [2].
This presentation was related to the toolchain published on github [3],
which is based on binutils-2.22, gcc-4.7, uclibc-0.9.33.2, gdb-7.5.1
and qemu-2.3.0, and for which pre-built binaries are available [3].

The ABI itself is described in details in [1].

Our Linux kernel patches have been updated and committed by Nicolas
Pitre (Linaro) in July 2017. They are required so that the loader is
able to handle this new file type. Indeed, the ELF files are tagged
with ELFOSABI_ARM_FDPIC. This new tag has been allocated by ARM, as
well as the new relocations involved.

The binutils, QEMU and uclibc-ng patch series have been merged
recently. [4][5][6]

This series provides support for ARM v7 architecture and has been
tested on arm-linux-gnueabi without regression, as well as
arm-uclinuxfdpiceabi, using QEMU. arm-uclinuxfdpiceabi has more
failures than arm-linux-gnueabi, but is quite functional.

Are the GCC patches OK for inclusion in master?

Changes between v2 and v3:
- added doc entry for -mfdpic new option
- took Kyrill's comments into account (use "Armv7" instead of "7",
  code factorization, use preprocessor instead of hard-coding "r9",
  remove leftover code for thumb1 support, fixed comments)
- rebase over recent trunk
- patches with changes: 1, 2 (commit message), 3 (rebase), 4, 6, 7, 9,
  14 (rebase), 19 (rebase)

Changes between v1 and v2:
- fix GNU coding style
- exit with an error for pre-Armv7
- use ACLE __ARM_ARCH and remove dead code for pre-Armv4
- remove unsupported attempts of pre-Armv7/thumb1 support
- add instructions in comments next to opcodes
- merge patches 11 and 13
- fixed protected visibility handling in patch 8
- merged legitimize_tls_address_fdpic and
  legitimize_tls_address_not_fdpic as requested

Thanks,

Christophe.


[1] https://github.com/mickael-guene/fdpic_doc/blob/master/abi.txt
[2] http://connect.linaro.org/resource/sfo15/sfo15-406-arm-fdpic-toolset-kernel-libraries-for-cortex-m-cortex-r-mmuless-cores/
[3] https://github.com/mickael-guene/fdpic_manifest
[4] https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=f1ac0afe481e83c9a33f247b81fa7de789edc4d9
[5] https://git.qemu.org/?p=qemu.git;a=commit;h=e8fa72957419c11984608062c7dcb204a6003a06
[6] https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/commit/?id=13c46fbc1e5a021f2b9ed32d83aecc93ae5e655d

Christophe Lyon (21):
  [ARM] FDPIC: Add -mfdpic option support
  [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  [ARM] FDPIC: Add support for FDPIC for arm architecture
  [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation
  [ARM] FDPIC: Add support for c++ exceptions
  [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO
  [ARM] FDPIC: Ensure local/global binding for function descriptors
  [ARM] FDPIC: Add support for taking address of nested function
  [ARM] FDPIC: Implement TLS support.
  [ARM] FDPIC: Add support to unwind FDPIC signal frame
  [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp
  [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture
  [ARM][testsuite] FDPIC: Skip unsupported tests
  [ARM][testsuite] FDPIC: Adjust scan-assembler patterns.
  [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently
    produce an ICE
  [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode
  [ARM][testsuite] FDPIC: Handle *-*-uclinux*
  [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets
  [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc.
  [ARM][testsuite] FDPIC: Skip tests using architecture older than v7

 config/futex.m4                                    |   2 +-
 config/tls.m4                                      |   2 +-
 gcc/config.gcc                                     |  13 +-
 gcc/config/arm/arm-c.c                             |   2 +
 gcc/config/arm/arm-protos.h                        |   1 +
 gcc/config/arm/arm.c                               | 478 ++++++++++++++++++---
 gcc/config/arm/arm.h                               |   9 +-
 gcc/config/arm/arm.md                              | 125 +++++-
 gcc/config/arm/arm.opt                             |   4 +
 gcc/config/arm/bpabi.h                             |   4 +-
 gcc/config/arm/linux-eabi.h                        |   7 +-
 gcc/config/arm/uclinuxfdpiceabi.h                  |  53 +++
 gcc/config/arm/unspecs.md                          |   1 +
 gcc/doc/invoke.texi                                |  10 +-
 gcc/ginclude/unwind-arm-common.h                   |   4 +-
 gcc/testsuite/g++.dg/abi/forced.C                  |   2 +-
 gcc/testsuite/g++.dg/abi/guard2.C                  |   2 +-
 gcc/testsuite/g++.dg/cpp0x/noexcept03.C            |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-10.C              |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-11.C              |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-8.C               |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-9.C               |   2 +-
 gcc/testsuite/g++.dg/ext/sync-4.C                  |   2 +-
 gcc/testsuite/g++.dg/ipa/comdat.C                  |   2 +-
 gcc/testsuite/g++.dg/ipa/devirt-c-7.C              |   3 +-
 gcc/testsuite/g++.dg/ipa/ivinline-1.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-2.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-3.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-4.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-5.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-7.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-8.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-9.C              |   2 +-
 gcc/testsuite/g++.dg/other/anon5.C                 |   1 +
 gcc/testsuite/g++.dg/tls/pr79288.C                 |   2 +-
 gcc/testsuite/gcc.dg/20020312-2.c                  |   1 +
 gcc/testsuite/gcc.dg/20041106-1.c                  |   2 +-
 gcc/testsuite/gcc.dg/addr_equal-1.c                |   3 +-
 gcc/testsuite/gcc.dg/cleanup-10.c                  |   2 +-
 gcc/testsuite/gcc.dg/cleanup-11.c                  |   2 +-
 gcc/testsuite/gcc.dg/cleanup-8.c                   |   2 +-
 gcc/testsuite/gcc.dg/cleanup-9.c                   |   2 +-
 gcc/testsuite/gcc.dg/const-1.c                     |   2 +-
 gcc/testsuite/gcc.dg/fdata-sections-1.c            |   2 +-
 gcc/testsuite/gcc.dg/fdata-sections-2.c            |   2 +-
 gcc/testsuite/gcc.dg/ipa/pure-const-1.c            |   2 +-
 gcc/testsuite/gcc.dg/noreturn-8.c                  |   2 +-
 gcc/testsuite/gcc.dg/pr33826.c                     |   3 +-
 gcc/testsuite/gcc.dg/pr39323-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr39323-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr39323-3.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr65780-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr65780-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr67338.c                     |   2 +-
 gcc/testsuite/gcc.dg/pr78185.c                     |   2 +-
 gcc/testsuite/gcc.dg/pr83100-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr83100-4.c                   |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-12g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-14g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-14gf.c              |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-16g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-17g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-18g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-1f.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-22g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-2f.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-31g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-33g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-4g.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-4gf.c               |   2 +-
 gcc/testsuite/gcc.dg/strncmp-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/struct-ret-3.c                |   2 +-
 gcc/testsuite/gcc.dg/torture/ipa-pta-1.c           |   2 +-
 gcc/testsuite/gcc.dg/torture/pr69760.c             |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/alias-2.c            |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c        |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c           |   2 +-
 gcc/testsuite/gcc.target/arm/20051215-1.c          |   1 +
 .../gcc.target/arm/armv6-unaligned-load-ice.c      |   1 +
 .../arm/atomic-comp-swap-release-acquire-3.c       |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-char-3.c    |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-int-3.c     |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-release-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-short-3.c   |   1 +
 .../gcc.target/arm/attr-unaligned-load-ice.c       |   1 +
 gcc/testsuite/gcc.target/arm/attr_arm-err.c        |   1 +
 gcc/testsuite/gcc.target/arm/data-rel-2.c          |   1 +
 gcc/testsuite/gcc.target/arm/data-rel-3.c          |   1 +
 gcc/testsuite/gcc.target/arm/div64-unwinding.c     |   2 +-
 gcc/testsuite/gcc.target/arm/eliminate.c           |   2 +-
 gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c     |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c     |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/g2.c                  |   1 +
 gcc/testsuite/gcc.target/arm/interrupt-1.c         |   6 +-
 gcc/testsuite/gcc.target/arm/interrupt-2.c         |   6 +-
 gcc/testsuite/gcc.target/arm/ivopts-2.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-3.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-4.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-5.c            |   2 +-
 gcc/testsuite/gcc.target/arm/macro_defs1.c         |   1 +
 gcc/testsuite/gcc.target/arm/mmx-1.c               |   1 +
 gcc/testsuite/gcc.target/arm/pr19599.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr40887.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr43597.c             |   2 +-
 gcc/testsuite/gcc.target/arm/pr43698.c             |   4 +-
 gcc/testsuite/gcc.target/arm/pr43920-2.c           |   2 +-
 gcc/testsuite/gcc.target/arm/pr45701-1.c           |   4 +-
 gcc/testsuite/gcc.target/arm/pr45701-2.c           |   4 +-
 gcc/testsuite/gcc.target/arm/pr59858.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr61948.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr65647-2.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr65647.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr66912.c             |   2 +-
 gcc/testsuite/gcc.target/arm/pr70830.c             |   3 +-
 gcc/testsuite/gcc.target/arm/pr77933-1.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr77933-2.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr79058.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr83712.c             |   1 +
 .../gcc.target/arm/pragma_arch_switch_2.c          |   1 +
 gcc/testsuite/gcc.target/arm/scd42-1.c             |   1 +
 gcc/testsuite/gcc.target/arm/scd42-2.c             |   1 +
 gcc/testsuite/gcc.target/arm/scd42-3.c             |   1 +
 gcc/testsuite/gcc.target/arm/sibcall-1.c           |   1 +
 gcc/testsuite/gcc.target/arm/stack-checking.c      |   2 +-
 gcc/testsuite/gcc.target/arm/stack-red-zone.c      |   2 +-
 gcc/testsuite/gcc.target/arm/synchronize.c         |   2 +-
 gcc/testsuite/gcc.target/arm/tail-long-call.c      |   1 +
 gcc/testsuite/gcc.target/arm/tlscall.c             |   1 +
 gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c   |   1 +
 gcc/testsuite/lib/target-supports.exp              |   4 +
 libatomic/configure                                |   8 +-
 libatomic/configure.tgt                            |   2 +-
 libgcc/config.host                                 |   4 +-
 libgcc/config/arm/linux-atomic.c                   |  38 ++
 libgcc/config/arm/unwind-arm.c                     |   5 +
 libgcc/config/arm/unwind-arm.h                     |  29 +-
 libgcc/crtstuff.c                                  |  16 +
 libgcc/unwind-arm-common.inc                       | 215 +++++++++
 libgcc/unwind-pe.h                                 |  17 +
 libitm/configure                                   |  20 +-
 libitm/configure.tgt                               |   2 +-
 libsanitizer/configure.tgt                         |   3 +
 libstdc++-v3/acinclude.m4                          |  12 +-
 libstdc++-v3/configure                             |  36 +-
 libstdc++-v3/configure.host                        |   6 +-
 libstdc++-v3/libsupc++/eh_personality.cc           |  10 +-
 libtool.m4                                         |  14 +-
 166 files changed, 1175 insertions(+), 210 deletions(-)
 create mode 100644 gcc/config/arm/uclinuxfdpiceabi.h

-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
  2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
@ 2018-10-11 13:36 ` Christophe Lyon
  2018-10-12 10:01   ` Richard Earnshaw (lists)
  2018-10-11 13:37 ` [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation Christophe Lyon
                   ` (18 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:36 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné  <mickael.guene@st.com>

	gcc/
	* config/arm/arm.opt: Add -mfdpic option.
	* doc/invoke.texi: Add documentation for -mfdpic.

diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
index a1286a4..231c1cb 100644
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -302,3 +302,7 @@ When linking for big-endian targets, generate a legacy BE32 format image.
 mbranch-cost=
 Target RejectNegative Joined UInteger Var(arm_branch_cost) Init(-1)
 Cost to assume for a branch insn.
+
+mfdpic
+Target Report Mask(FDPIC)
+Enable Function Descriptor PIC mode.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 5c95f67..3e33e60 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -684,7 +684,8 @@ Objective-C and Objective-C++ Dialects}.
 -mrestrict-it @gol
 -mverbose-cost-dump @gol
 -mpure-code @gol
--mcmse}
+-mcmse @gol
+-mfdpic}
 
 @emph{AVR Options}
 @gccoptlist{-mmcu=@var{mcu}  -mabsdata  -maccumulate-args @gol
@@ -17059,6 +17060,13 @@ MOVT instruction.
 Generate secure code as per the "ARMv8-M Security Extensions: Requirements on
 Development Tools Engineering Specification", which can be found on
 @url{http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/ECM0359818_armv8m_security_extensions_reqs_on_dev_tools_1_0.pdf}.
+
+@item -mfdpic
+@opindex mfdpic
+Select the FDPIC ABI, which uses function descriptors to represent
+pointers to functions.  Without any PIC/PIE-related options, it
+implies @option{-fPIE}.
+
 @end table
 
 @node AVR Options
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
  2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
  2018-10-11 13:36 ` [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support Christophe Lyon
@ 2018-10-11 13:37 ` Christophe Lyon
  2018-10-12 11:29   ` Richard Earnshaw (lists)
  2018-10-11 13:37 ` [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided Christophe Lyon
                   ` (17 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:37 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

In FDPIC, we need to make sure __do_global_dtors_aux and frame_dummy
are referenced by their address, not by pointers to the function
descriptors.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	* libgcc/crtstuff.c: Add support for FDPIC.

Change-Id: Iff3aec3815e8ebd87276c0107752f00908a22100

diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c
index d81c527..ad40719 100644
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -429,9 +429,17 @@ __do_global_dtors_aux (void)
 #ifdef FINI_SECTION_ASM_OP
 CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
 #elif defined (FINI_ARRAY_SECTION_ASM_OP)
+#if defined(__FDPIC__)
+__asm__(
+    "   .section .fini_array\n"
+    "   .word __do_global_dtors_aux\n"
+);
+asm (TEXT_SECTION_ASM_OP);
+#else /* defined(__FDPIC__) */
 static func_ptr __do_global_dtors_aux_fini_array_entry[]
   __attribute__ ((__used__, section(".fini_array"), aligned(sizeof(func_ptr))))
   = { __do_global_dtors_aux };
+#endif /* defined(__FDPIC__) */
 #else /* !FINI_SECTION_ASM_OP && !FINI_ARRAY_SECTION_ASM_OP */
 static void __attribute__((used))
 __do_global_dtors_aux_1 (void)
@@ -473,9 +481,17 @@ frame_dummy (void)
 #ifdef __LIBGCC_INIT_SECTION_ASM_OP__
 CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__, frame_dummy)
 #else /* defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
+#if defined(__FDPIC__)
+__asm__(
+    "   .section .init_array\n"
+    "   .word frame_dummy\n"
+);
+asm (TEXT_SECTION_ASM_OP);
+#else /* defined(__FDPIC__) */
 static func_ptr __frame_dummy_init_array_entry[]
   __attribute__ ((__used__, section(".init_array"), aligned(sizeof(func_ptr))))
   = { frame_dummy };
+#endif /* defined(__FDPIC__) */
 #endif /* !defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
 #endif /* USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY */
 
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (2 preceding siblings ...)
  2018-10-11 13:37 ` [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation Christophe Lyon
@ 2018-10-11 13:37 ` Christophe Lyon
  2018-10-12 10:46   ` Richard Earnshaw (lists)
  2018-10-11 13:37 ` [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture Christophe Lyon
                   ` (16 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:37 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

In FDPIC mode, we set -fPIE unless the user provides -fno-PIE, -fpie,
-fPIC or -fpic: indeed FDPIC code is PIC, but we want to generate code
for executables rather than shared libraries by default.

We also make sure to use the --fdpic assembler option, and select the
appropriate linker emulation.

At link time, we also default to -pie, unless we are generating a
shared library or a relocatable file (-r). Note that even for static
link, we must specify the dynamic linker because the executable still
has to relocate itself at startup.

We also force 'now' binding since lazy binding is not supported.

We should also apply the same behavior for -Wl,-Ur as for -r, but I
couldn't find how to describe that in the specs fragment.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config.gcc: Handle arm*-*-uclinuxfdpiceabi.
	* config/arm/bpabi.h (TARGET_FDPIC_ASM_SPEC): New.
	(SUBTARGET_EXTRA_ASM_SPEC): Use TARGET_FDPIC_ASM_SPEC.
	* config/arm/linux-eabi.h (FDPIC_CC1_SPEC): New.
	(CC1_SPEC): Use FDPIC_CC1_SPEC.
	* config/arm/uclinuxfdpiceabi.h: New file.

	libsanitizer/
	* configure.tgt (arm*-*-uclinuxfdpiceabi): Sanitizers are
	unsupported in this configuration.

Change-Id: If369e0a10bb916fd72e38f71498d3c640fa85c4c

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 793fc69..a4f4331 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1144,6 +1144,11 @@ arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
 	esac
 	tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
 	tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h"
+	case $target in
+	arm*-*-uclinuxfdpiceabi)
+	    tm_file="$tm_file arm/uclinuxfdpiceabi.h"
+	    ;;
+	esac
 	# Generation of floating-point instructions requires at least ARMv5te.
 	if [ "$with_float" = "hard" -o "$with_float" = "softfp" ] ; then
 	    target_cpu_cname="arm10e"
diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
index 1e3ecfb..5901154 100644
--- a/gcc/config/arm/bpabi.h
+++ b/gcc/config/arm/bpabi.h
@@ -55,6 +55,8 @@
 #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
   "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
 
+#define TARGET_FDPIC_ASM_SPEC  ""
+
 #define BE8_LINK_SPEC							\
   "%{!r:%{!mbe32:%:be8_linkopt(%{mlittle-endian:little}"		\
   "			       %{mbig-endian:big}"			\
@@ -64,7 +66,7 @@
 /* Tell the assembler to build BPABI binaries.  */
 #undef  SUBTARGET_EXTRA_ASM_SPEC
 #define SUBTARGET_EXTRA_ASM_SPEC \
-  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC
+  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC TARGET_FDPIC_ASM_SPEC
 
 #ifndef SUBTARGET_EXTRA_LINK_SPEC
 #define SUBTARGET_EXTRA_LINK_SPEC ""
diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
index 8585fde..4cee958 100644
--- a/gcc/config/arm/linux-eabi.h
+++ b/gcc/config/arm/linux-eabi.h
@@ -98,11 +98,14 @@
 #undef  ASAN_CC1_SPEC
 #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
 
+#define FDPIC_CC1_SPEC ""
+
 #undef  CC1_SPEC
 #define CC1_SPEC							\
-  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,	\
+  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "	\
+		       FDPIC_CC1_SPEC,					\
 		       GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "	\
-		       ANDROID_CC1_SPEC)
+		       ANDROID_CC1_SPEC "" FDPIC_CC1_SPEC)
 
 #define CC1PLUS_SPEC \
   LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
diff --git a/gcc/config/arm/uclinuxfdpiceabi.h b/gcc/config/arm/uclinuxfdpiceabi.h
new file mode 100644
index 0000000..43a17de
--- /dev/null
+++ b/gcc/config/arm/uclinuxfdpiceabi.h
@@ -0,0 +1,53 @@
+/* Configuration file for ARM GNU/Linux FDPIC EABI targets.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   Contributed by STMicroelectronics.
+
+   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/>.  */
+
+/* On uClibc EABI GNU/Linux, we want to force -mfdpic by default,
+   which also means we produce PIE code by default.  */
+#undef FDPIC_CC1_SPEC
+#define FDPIC_CC1_SPEC \
+  "%{!mno-fdpic:-mfdpic %{!no-PIE:%{!fpie:%{!fPIC:%{!fpic: -fPIE}}}}}"
+
+/* Add --fdpic assembler flag by default.  */
+#undef TARGET_FDPIC_ASM_SPEC
+#define TARGET_FDPIC_ASM_SPEC  "%{!mno-fdpic: --fdpic}"
+
+/* TARGET_BIG_ENDIAN_DEFAULT is set in
+   config.gcc for big endian configurations.  */
+#if TARGET_BIG_ENDIAN_DEFAULT
+#define TARGET_FDPIC_LINKER_EMULATION "armelfb_linux_fdpiceabi"
+#else
+#define TARGET_FDPIC_LINKER_EMULATION "armelf_linux_fdpiceabi"
+#endif
+
+/* Unless we generate a shared library or a relocatable object, we
+   force -pie.  */
+/* Even with -static, we have to define the dynamic-linker, as we
+   have some relocations to resolve at load time.  */
+#undef  SUBTARGET_EXTRA_LINK_SPEC
+#define SUBTARGET_EXTRA_LINK_SPEC			    \
+  "%{!mno-fdpic: -m " TARGET_FDPIC_LINKER_EMULATION	    \
+   "%{!shared:%{!r: -pie}}				    \
+    %{static:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" \
+  "%{mno-fdpic: -m " TARGET_LINKER_EMULATION "}"	    \
+  "%{!r:%{!mno-fdpic: -z now}}"
+
+#undef	STARTFILE_SPEC
+#define STARTFILE_SPEC "%{!mno-fdpic:%{!shared:crtreloc.o%s}} " \
+  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
index 1dce1e6..dff34cd 100644
--- a/libsanitizer/configure.tgt
+++ b/libsanitizer/configure.tgt
@@ -43,6 +43,9 @@ case "${target}" in
 	;;
   s390*-*-linux*)
 	;;
+  arm*-*-uclinuxfdpiceabi)
+	UNSUPPORTED=1
+	;;
   arm*-*-linux*)
 	;;
   mips*64*-*-linux*)
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (3 preceding siblings ...)
  2018-10-11 13:37 ` [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided Christophe Lyon
@ 2018-10-11 13:37 ` Christophe Lyon
  2018-10-12 11:02   ` Richard Earnshaw (lists)
  2018-10-11 13:38 ` [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions Christophe Lyon
                   ` (15 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:37 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

The FDPIC register is hard-coded to r9, as defined in the ABI.

We have to disable tailcall optimizations if we don't know if the
target function is in the same module. If not, we have to set r9 to
the value associated with the target module.

When generating a symbol address, we have to take into account whether
it is a pointer to data or to a function, because different
relocations are needed.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	* config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
	in FDPIC mode.
	* config/arm/arm-protos.h (arm_load_function_descriptor): Declare
	new function.
	* config/arm/arm.c (arm_option_override): Define pic register to
	FDPIC_REGNUM.
	(arm_function_ok_for_sibcall) Disable sibcall optimization if we
	have no decl or go through PLT.
	(arm_load_pic_register): Handle TARGET_FDPIC.
	(arm_is_segment_info_known): New function.
	(arm_pic_static_addr): Add support for FDPIC.
	(arm_load_function_descriptor): New function.
	(arm_assemble_integer): Add support for FDPIC.
	* config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
	Define. (FDPIC_REGNUM): New define.
	* config/arm/arm.md (call): Add support for FDPIC.
	(call_value): Likewise.
	(*restore_pic_register_after_call): New pattern.
	(untyped_call): Disable if FDPIC.
	(untyped_return): Likewise.
	* config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.

diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
index 4471f79..90733cc 100644
--- a/gcc/config/arm/arm-c.c
+++ b/gcc/config/arm/arm-c.c
@@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
       builtin_define ("__ARM_EABI__");
     }
 
+  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
+
   def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
   def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
 
diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
index 0dfb3ac..28cafa8 100644
--- a/gcc/config/arm/arm-protos.h
+++ b/gcc/config/arm/arm-protos.h
@@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
 extern int arm_const_double_inline_cost (rtx);
 extern bool arm_const_double_by_parts (rtx);
 extern bool arm_const_double_by_immediates (rtx);
+extern rtx arm_load_function_descriptor (rtx funcdesc);
 extern void arm_emit_call_insn (rtx, rtx, bool);
 bool detect_cmse_nonsecure_call (tree);
 extern const char *output_call (rtx *);
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 8810df5..92ae24b 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3470,6 +3470,14 @@ arm_option_override (void)
   if (flag_pic && TARGET_VXWORKS_RTP)
     arm_pic_register = 9;
 
+  /* If in FDPIC mode then force arm_pic_register to be r9.  */
+  if (TARGET_FDPIC)
+    {
+      arm_pic_register = FDPIC_REGNUM;
+      if (TARGET_ARM_ARCH < 7)
+	error ("FDPIC mode is not supported on architectures older than Armv7");
+    }
+
   if (arm_pic_register_string != NULL)
     {
       int pic_register = decode_reg_name (arm_pic_register_string);
@@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
   if (cfun->machine->sibcall_blocked)
     return false;
 
+  if (TARGET_FDPIC)
+    {
+      /* In FDPIC, never tailcall something for which we have no decl:
+	 the target function could be in a different module, requiring
+	 a different FDPIC register value.  */
+      if (decl == NULL)
+	return false;
+
+      /* Don't tailcall if we go through the PLT since the FDPIC
+	 register is then corrupted and we don't restore it after
+	 static function calls.  */
+      if (!targetm.binds_local_p (decl))
+	return false;
+    }
+
   /* Never tailcall something if we are generating code for Thumb-1.  */
   if (TARGET_THUMB1)
     return false;
@@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
 {
   rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
 
-  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
+  if (crtl->uses_pic_offset_table == 0
+      || TARGET_SINGLE_PIC_BASE
+      || TARGET_FDPIC)
     return;
 
   gcc_assert (flag_pic);
@@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
   emit_use (pic_reg);
 }
 
+/* Try to know if the object will go in text or data segment. This is
+   used in FDPIC mode, to decide which relocations to use when
+   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
+   location, false otherwise.  */
+static bool
+arm_is_segment_info_known (rtx orig, bool *is_readonly)
+{
+  bool res = false;
+
+  *is_readonly = false;
+
+  if (GET_CODE (orig) == LABEL_REF)
+    {
+      res = true;
+      *is_readonly = true;
+    }
+  else if (SYMBOL_REF_P (orig))
+    {
+      if (CONSTANT_POOL_ADDRESS_P (orig))
+	{
+	  res = true;
+	  *is_readonly = true;
+	}
+      else if (SYMBOL_REF_LOCAL_P (orig)
+	       && !SYMBOL_REF_EXTERNAL_P (orig)
+	       && SYMBOL_REF_DECL (orig)
+	       && (!DECL_P (SYMBOL_REF_DECL (orig))
+		   || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
+	{
+	  tree decl = SYMBOL_REF_DECL (orig);
+	  tree init = (TREE_CODE (decl) == VAR_DECL)
+	    ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
+	    ? decl : 0;
+	  int reloc = 0;
+	  bool named_section, readonly;
+
+	  if (init && init != error_mark_node)
+	    reloc = compute_reloc_for_constant (init);
+
+	  named_section = TREE_CODE (decl) == VAR_DECL
+	    && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
+	  readonly = decl_readonly_section (decl, reloc);
+
+	  /* We don't know where the link script will put a named
+	     section, so return false in such a case.  */
+	  res = !named_section;
+
+	  if (!named_section)
+	    *is_readonly = readonly;
+	}
+      else
+	{
+	  /* We don't know.  */
+	  res = false;
+	}
+    }
+  else
+    gcc_unreachable ();
+
+  return res;
+}
+
 /* Generate code to load the address of a static var when flag_pic is set.  */
 static rtx_insn *
 arm_pic_static_addr (rtx orig, rtx reg)
 {
   rtx l1, labelno, offset_rtx;
+  rtx_insn *insn;
 
   gcc_assert (flag_pic);
 
-  /* We use an UNSPEC rather than a LABEL_REF because this label
-     never appears in the code stream.  */
-  labelno = GEN_INT (pic_labelno++);
-  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
-  l1 = gen_rtx_CONST (VOIDmode, l1);
+  bool is_readonly = false;
+  bool info_known = false;
 
-  /* On the ARM the PC register contains 'dot + 8' at the time of the
-     addition, on the Thumb it is 'dot + 4'.  */
-  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
-  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
-                               UNSPEC_SYMBOL_OFFSET);
-  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
+  if (TARGET_FDPIC
+      && SYMBOL_REF_P (orig)
+      && !SYMBOL_REF_FUNCTION_P (orig))
+      info_known = arm_is_segment_info_known (orig, &is_readonly);
 
-  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx, labelno));
+  if (TARGET_FDPIC
+      && SYMBOL_REF_P (orig)
+      && !SYMBOL_REF_FUNCTION_P (orig)
+      && !info_known)
+    {
+      /* We don't know where orig is stored, so we have be
+	 pessimistic and use a GOT relocation.  */
+      rtx pat;
+      rtx mem;
+      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
+
+      pat = gen_calculate_pic_address (reg, pic_reg, orig);
+
+      /* Make the MEM as close to a constant as possible.  */
+      mem = SET_SRC (pat);
+      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
+      MEM_READONLY_P (mem) = 1;
+      MEM_NOTRAP_P (mem) = 1;
+
+      insn = emit_insn (pat);
+    }
+  else if (TARGET_FDPIC
+	   && SYMBOL_REF_P (orig)
+	   && (SYMBOL_REF_FUNCTION_P (orig)
+	       || (info_known && !is_readonly)))
+    {
+      /* We use the GOTOFF relocation.  */
+      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
+
+      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig), UNSPEC_PIC_SYM);
+      emit_insn (gen_movsi (reg, l1));
+      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
+    }
+  else
+    {
+      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
+	 PC-relative access.  */
+      /* We use an UNSPEC rather than a LABEL_REF because this label
+	 never appears in the code stream.  */
+      labelno = GEN_INT (pic_labelno++);
+      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
+      l1 = gen_rtx_CONST (VOIDmode, l1);
+
+      /* On the ARM the PC register contains 'dot + 8' at the time of the
+	 addition, on the Thumb it is 'dot + 4'.  */
+      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
+      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
+				   UNSPEC_SYMBOL_OFFSET);
+      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
+
+      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
+						   labelno));
+    }
+
+  return insn;
 }
 
 /* Return nonzero if X is valid as an ARM state addressing register.  */
@@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
   return 0;
 }
 
+/* Emit insns to load the function address from FUNCDESC (an FDPIC
+   function descriptor) into a register and the GOT address into the
+   FDPIC register, returning an rtx for the register holding the
+   function address.  */
+
+rtx
+arm_load_function_descriptor (rtx funcdesc)
+{
+  rtx fnaddr_reg = gen_reg_rtx (Pmode);
+  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
+  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
+  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc, 4));
+  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
+
+  emit_move_insn (fnaddr_reg, fnaddr);
+  /* The ABI requires the entry point address to be loaded first, so
+     prevent the load from being moved after that of the GOT
+     address.  */
+  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
+					gen_rtvec (2, pic_reg, gotaddr),
+					UNSPEC_PIC_RESTORE);
+  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+  emit_insn (par);
+
+  return fnaddr_reg;
+}
+
 /* Return the maximum amount of padding that will be inserted before
    label LABEL.  */
-
 static HOST_WIDE_INT
 get_label_padding (rtx label)
 {
@@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
 		  && (!SYMBOL_REF_LOCAL_P (x)
 		      || (SYMBOL_REF_DECL (x)
 			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
-	    fputs ("(GOT)", asm_out_file);
+	    {
+	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
+		fputs ("(GOTFUNCDESC)", asm_out_file);
+	      else
+		fputs ("(GOT)", asm_out_file);
+	    }
 	  else
-	    fputs ("(GOTOFF)", asm_out_file);
+	    {
+	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
+		fputs ("(GOTOFFFUNCDESC)", asm_out_file);
+	      else
+		{
+		  bool is_readonly;
+
+		  if (arm_is_segment_info_known (x, &is_readonly))
+		    fputs ("(GOTOFF)", asm_out_file);
+		  else
+		    fputs ("(GOT)", asm_out_file);
+		}
+	    }
+	}
+
+      /* For FDPIC we also have to mark symbol for .data section.  */
+      if (TARGET_FDPIC
+	  && NEED_GOT_RELOC
+	  && flag_pic
+	  && !making_const_table
+	  && SYMBOL_REF_P (x))
+	{
+	  if (SYMBOL_REF_FUNCTION_P (x))
+	    fputs ("(FUNCDESC)", asm_out_file);
 	}
       fputc ('\n', asm_out_file);
       return true;
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 34894c0..4671d64 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -871,6 +871,9 @@ extern int arm_arch_cmse;
    Pascal), so the following is not true.  */
 #define STATIC_CHAIN_REGNUM	12
 
+/* r9 is the FDPIC register (base register for GOT and FUNCDESC accesses).  */
+#define FDPIC_REGNUM		9
+
 /* Define this to be where the real frame pointer is if it is not possible to
    work out the offset between the frame pointer and the automatic variables
    until after register allocation has taken place.  FRAME_POINTER_REGNUM
@@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
    data addresses in memory.  */
 #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
 
+/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
+   entries would need to handle saving and restoring it).  */
+#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
+
 /* We can't directly access anything that contains a symbol,
    nor can we indirect via the constant pool.  One exception is
    UNSPEC_TLS, which is always PIC.  */
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 270b8e4..09a0701 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -8031,6 +8031,23 @@
     rtx callee, pat;
     tree addr = MEM_EXPR (operands[0]);
     
+    /* Force FDPIC register (r9) before call.  */
+    if (TARGET_FDPIC)
+      {
+	/* No need to update r9 if calling a static function.
+	   In other words: set r9 for indirect or non-local calls.  */
+	callee = XEXP (operands[0], 0);
+	if (!SYMBOL_REF_P (callee)
+	    || !SYMBOL_REF_LOCAL_P (callee)
+	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
+	  {
+	    emit_insn (gen_blockage ());
+	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
+	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
+	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
+	 }
+      }
+
     /* In an untyped call, we can get NULL for operand 2.  */
     if (operands[2] == NULL_RTX)
       operands[2] = const0_rtx;
@@ -8044,6 +8061,13 @@
 	: !REG_P (callee))
       XEXP (operands[0], 0) = force_reg (Pmode, callee);
 
+    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
+      {
+	/* Indirect call: set r9 with FDPIC value of callee.  */
+	XEXP (operands[0], 0)
+	  = arm_load_function_descriptor (XEXP (operands[0], 0));
+      }
+
     if (detect_cmse_nonsecure_call (addr))
       {
 	pat = gen_nonsecure_call_internal (operands[0], operands[1],
@@ -8055,10 +8079,38 @@
 	pat = gen_call_internal (operands[0], operands[1], operands[2]);
 	arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
       }
+
+    /* Restore FDPIC register (r9) after call.  */
+    if (TARGET_FDPIC)
+      {
+	/* No need to update r9 if calling a static function.  */
+	if (!SYMBOL_REF_P (callee)
+	    || !SYMBOL_REF_LOCAL_P (callee)
+	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
+	  {
+	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
+	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
+	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
+	    emit_insn (gen_blockage ());
+	  }
+      }
     DONE;
   }"
 )
 
+(define_insn "*restore_pic_register_after_call"
+  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
+		       (match_operand:SI 1 "nonimmediate_operand" "r,m")]
+	       UNSPEC_PIC_RESTORE)
+	      (use (match_dup 0))
+	      (clobber (match_dup 0))])
+  ]
+  ""
+  "@
+  mov\t%0, %1
+  ldr\t%0, %1"
+)
+
 (define_expand "call_internal"
   [(parallel [(call (match_operand 0 "memory_operand" "")
 	            (match_operand 1 "general_operand" ""))
@@ -8119,6 +8171,30 @@
     rtx pat, callee;
     tree addr = MEM_EXPR (operands[1]);
     
+    /* Force FDPIC register (r9) before call.  */
+    if (TARGET_FDPIC)
+      {
+	/* No need to update the FDPIC register (r9) if calling a static function.
+	   In other words: set r9 for indirect or non-local calls.  */
+	callee = XEXP (operands[1], 0);
+	if (!SYMBOL_REF_P (callee)
+	    || !SYMBOL_REF_LOCAL_P (callee)
+	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
+	  {
+	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
+
+	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
+		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
+			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
+		UNSPEC_PIC_RESTORE);
+	    XVECEXP (par, 0, 1)
+	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	    XVECEXP (par, 0, 2)
+	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	    emit_insn (par);
+	  }
+      }
+
     /* In an untyped call, we can get NULL for operand 2.  */
     if (operands[3] == 0)
       operands[3] = const0_rtx;
@@ -8132,6 +8208,14 @@
 	: !REG_P (callee))
       XEXP (operands[1], 0) = force_reg (Pmode, callee);
 
+    if (TARGET_FDPIC
+	&& !SYMBOL_REF_P (XEXP (operands[1], 0)))
+      {
+	/* Indirect call: set r9 with FDPIC value of callee.  */
+	XEXP (operands[1], 0)
+	  = arm_load_function_descriptor (XEXP (operands[1], 0));
+      }
+
     if (detect_cmse_nonsecure_call (addr))
       {
 	pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
@@ -8144,6 +8228,28 @@
 				       operands[2], operands[3]);
 	arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
       }
+    /* Restore FDPIC register (r9) after call.  */
+    if (TARGET_FDPIC)
+      {
+	/* No need to update r9 if calling a static function.  */
+	if (!SYMBOL_REF_P (callee)
+	    || !SYMBOL_REF_LOCAL_P (callee)
+	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
+	  {
+	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
+
+	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
+		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
+			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
+		UNSPEC_PIC_RESTORE);
+	    XVECEXP (par, 0, 1)
+	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	    XVECEXP (par, 0, 2)
+	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	    emit_insn (par);
+	  }
+      }
+
     DONE;
   }"
 )
@@ -8486,7 +8592,7 @@
 		    (const_int 0))
 	      (match_operand 1 "" "")
 	      (match_operand 2 "" "")])]
-  "TARGET_EITHER"
+  "TARGET_EITHER && !TARGET_FDPIC"
   "
   {
     int i;
@@ -8553,7 +8659,7 @@
 (define_expand "untyped_return"
   [(match_operand:BLK 0 "memory_operand" "")
    (match_operand 1 "" "")]
-  "TARGET_EITHER"
+  "TARGET_EITHER && !TARGET_FDPIC"
   "
   {
     int i;
diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
index 1941673..349ae0e 100644
--- a/gcc/config/arm/unspecs.md
+++ b/gcc/config/arm/unspecs.md
@@ -86,6 +86,7 @@
   UNSPEC_PROBE_STACK    ; Probe stack memory reference
   UNSPEC_NONSECURE_MEM	; Represent non-secure memory in ARMv8-M with
 			; security extension
+  UNSPEC_PIC_RESTORE	; Use to restore fdpic register
 ])
 
 (define_c_enum "unspec" [
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (5 preceding siblings ...)
  2018-10-11 13:38 ` [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions Christophe Lyon
@ 2018-10-11 13:38 ` Christophe Lyon
  2018-10-12 12:39   ` Richard Earnshaw (lists)
  2018-10-11 13:38 ` [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO Christophe Lyon
                   ` (13 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:38 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Use local binding rules to decide whether we can use GOTOFFFUNCDESC to
compute the function address.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.c (arm_local_funcdesc_p): New function.
	(legitimize_pic_address): Ensure binding rules on function
	pointers in FDPIC mode.
	(arm_assemble_integer): Likewise.

Change-Id: I3fa0b63bc0f672903f405aa72cc46052de1c0feb

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index a6dce36..d0144fd 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3768,6 +3768,42 @@ arm_options_perform_arch_sanity_checks (void)
     }
 }
 
+/* Test whether a local function descriptor is canonical, i.e.,
+   whether we can use GOTOFFFUNCDESC to compute the address of the
+   function.  */
+static bool
+arm_local_funcdesc_p (rtx fnx)
+{
+  tree fn;
+  enum symbol_visibility vis;
+  bool ret;
+
+  if (!TARGET_FDPIC)
+    return TRUE;
+
+  if (! SYMBOL_REF_LOCAL_P (fnx))
+    return FALSE;
+
+  fn = SYMBOL_REF_DECL (fnx);
+
+  if (! fn)
+    return FALSE;
+
+  vis = DECL_VISIBILITY (fn);
+
+  if (vis == VISIBILITY_PROTECTED)
+    /* Private function descriptors for protected functions are not
+       canonical.  Temporarily change the visibility to global so that
+       we can ensure unicity of funcdesc pointers.  */
+    DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT;
+
+  ret = default_binds_local_p_1 (fn, flag_pic);
+
+  DECL_VISIBILITY (fn) = vis;
+
+  return ret;
+}
+
 static void
 arm_add_gc_roots (void)
 {
@@ -7485,7 +7521,9 @@ legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
 	   || (GET_CODE (orig) == SYMBOL_REF
 	       && SYMBOL_REF_LOCAL_P (orig)
 	       && (SYMBOL_REF_DECL (orig)
-		   ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)))
+		   ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)
+	       && (!SYMBOL_REF_FUNCTION_P(orig)
+		   || arm_local_funcdesc_p (orig))))
 	  && NEED_GOT_RELOC
 	  && arm_pic_data_is_text_relative)
 	insn = arm_pic_static_addr (orig, reg);
@@ -23053,7 +23091,9 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
 	      || (GET_CODE (x) == SYMBOL_REF
 		  && (!SYMBOL_REF_LOCAL_P (x)
 		      || (SYMBOL_REF_DECL (x)
-			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
+			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0)
+		      || (SYMBOL_REF_FUNCTION_P (x)
+			  && !arm_local_funcdesc_p (x)))))
 	    {
 	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
 		fputs ("(GOTFUNCDESC)", asm_out_file);
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (6 preceding siblings ...)
  2018-10-11 13:38 ` [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors Christophe Lyon
@ 2018-10-11 13:38 ` Christophe Lyon
  2018-10-12 12:21   ` Richard Earnshaw (lists)
  2018-10-11 13:39 ` [ARM/FDPIC v3 11/21] [ARM] FDPIC: Add support to unwind FDPIC signal frame Christophe Lyon
                   ` (12 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:38 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Handle
	FDPIC.
	(thumb1_compute_save_core_reg_mask): Likewise.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 92ae24b..a6dce36 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -19470,7 +19470,7 @@ arm_compute_save_reg0_reg12_mask (void)
 
       /* Also save the pic base register if necessary.  */
       if (flag_pic
-	  && !TARGET_SINGLE_PIC_BASE
+	  && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
 	  && arm_pic_register != INVALID_REGNUM
 	  && crtl->uses_pic_offset_table)
 	save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
@@ -19504,7 +19504,7 @@ arm_compute_save_reg0_reg12_mask (void)
       /* If we aren't loading the PIC register,
 	 don't stack it even though it may be live.  */
       if (flag_pic
-	  && !TARGET_SINGLE_PIC_BASE
+	  && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
 	  && arm_pic_register != INVALID_REGNUM
 	  && (df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)
 	      || crtl->uses_pic_offset_table))
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (4 preceding siblings ...)
  2018-10-11 13:37 ` [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture Christophe Lyon
@ 2018-10-11 13:38 ` Christophe Lyon
  2018-10-12 11:54   ` Richard Earnshaw (lists)
  2018-10-11 13:38 ` [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors Christophe Lyon
                   ` (14 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:38 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

The main difference with existing support is that function addresses
are function descriptor addresses instead. This means that all code
dealing with function pointers now has to cope with function
descriptors instead.

For the same reason, Linux kernel helpers can no longer be called by
dereferencing their address, so we implement the same functionality as
a regular function here.

When restoring a function address, we also have to restore the FDPIC
register value (r9).

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* ginclude/unwind-arm-common.h (unwinder_cache): Add reserved5
	field.
	(FDPIC_REGNUM): New define.

	libgcc/
	* config/arm/linux-atomic.c (__kernel_cmpxchg): Add FDPIC support.
	(__kernel_dmb): Likewise.
	(__fdpic_cmpxchg): New function.
	(__fdpic_dmb): New function.
	* config/arm/unwind-arm.h (gnu_Unwind_Find_got): New function.
	(_Unwind_decode_typeinfo_ptr): Add FDPIC support.
	* unwindo-arm-common.inc (UCB_PR_GOT): New.
	(funcdesc_t): New struct.
	(get_eit_entry): Add FDPIC support.
	(unwind_phase2): Likewise.
	(unwind_phase2_forced): Likewise.
	(__gnu_Unwind_RaiseException): Likewise.
	(__gnu_Unwind_Resume): Likewise.
	(__gnu_Unwind_Backtrace): Likewise.
	* unwind-pe.h (read_encoded_value_with_base): Likewise.

	libstdc++/
	* libsupc++/eh_personality.cc (get_ttype_entry): Add FDPIC
	support.

Change-Id: I517a49ff18fae21c686cd1c6008ea7974515b347

diff --git a/gcc/ginclude/unwind-arm-common.h b/gcc/ginclude/unwind-arm-common.h
index 8a1a919..f663891 100644
--- a/gcc/ginclude/unwind-arm-common.h
+++ b/gcc/ginclude/unwind-arm-common.h
@@ -91,7 +91,7 @@ extern "C" {
 	  _uw reserved2;  /* Personality routine address */
 	  _uw reserved3;  /* Saved callsite address */
 	  _uw reserved4;  /* Forced unwind stop arg */
-	  _uw reserved5;
+	  _uw reserved5;  /* Personality routine GOT value in FDPIC mode.  */
 	}
       unwinder_cache;
       /* Propagation barrier cache (valid after phase 1): */
@@ -247,4 +247,6 @@ typedef unsigned long _uleb128_t;
 }   /* extern "C" */
 #endif
 
+#define FDPIC_REGNUM 9
+
 #endif /* defined UNWIND_ARM_COMMON_H */
diff --git a/libgcc/config/arm/linux-atomic.c b/libgcc/config/arm/linux-atomic.c
index d334c58..161d1ce 100644
--- a/libgcc/config/arm/linux-atomic.c
+++ b/libgcc/config/arm/linux-atomic.c
@@ -25,11 +25,49 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 /* Kernel helper for compare-and-exchange.  */
 typedef int (__kernel_cmpxchg_t) (int oldval, int newval, int *ptr);
+#if __FDPIC__
+/* Non-FDPIC ABIs call __kernel_cmpxchg directly by dereferencing its
+   address, but under FDPIC we would generate a broken call
+   sequence. That's why we have to implement __kernel_cmpxchg and
+   __kernel_dmb here: this way, the FDPIC call sequence works.  */
+#define __kernel_cmpxchg __fdpic_cmpxchg
+#else
 #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
+#endif
 
 /* Kernel helper for memory barrier.  */
 typedef void (__kernel_dmb_t) (void);
+#if __FDPIC__
+#define __kernel_dmb __fdpic_dmb
+#else
 #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0)
+#endif
+
+#if __FDPIC__
+static int __fdpic_cmpxchg (int oldval, int newval, int *ptr)
+{
+  int result;
+
+  asm volatile ("1: ldrex r3, [%[ptr]]\n\t"
+		"subs  r3, r3, %[oldval]\n\t"
+		"itt eq\n\t"
+		"strexeq r3, %[newval], [%[ptr]]\n\t"
+		"teqeq r3, #1\n\t"
+		"it eq\n\t"
+		"beq 1b\n\t"
+		"rsbs  %[result], r3, #0\n\t"
+		: [result] "=r" (result)
+		: [oldval] "r" (oldval) , [newval] "r" (newval), [ptr] "r" (ptr)
+		: "r3");
+    return result;
+}
+
+static void __fdpic_dmb ()
+{
+  asm volatile ("dmb\n\t");
+}
+
+#endif
 
 /* Note: we implement byte, short and int versions of atomic operations using
    the above kernel helpers; see linux-atomic-64bit.c for "long long" (64-bit)
diff --git a/libgcc/config/arm/unwind-arm.h b/libgcc/config/arm/unwind-arm.h
index 9f7d3f2..db5dfa2 100644
--- a/libgcc/config/arm/unwind-arm.h
+++ b/libgcc/config/arm/unwind-arm.h
@@ -33,9 +33,31 @@
 /* Use IP as a scratch register within the personality routine.  */
 #define UNWIND_POINTER_REG 12
 
+#define STR(x) #x
+#define XSTR(x) STR(x)
+
 #ifdef __cplusplus
 extern "C" {
 #endif
+_Unwind_Ptr __attribute__((weak)) __gnu_Unwind_Find_got (_Unwind_Ptr);
+
+static inline _Unwind_Ptr gnu_Unwind_Find_got (_Unwind_Ptr ptr)
+{
+    _Unwind_Ptr res;
+
+    if (__gnu_Unwind_Find_got)
+	res =  __gnu_Unwind_Find_got (ptr);
+    else
+      {
+	asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
+		      : [result]"=r" (res)
+		      :
+		      :);
+      }
+
+    return res;
+}
+
   /* Decode an R_ARM_TARGET2 relocation.  */
   static inline _Unwind_Word
   _Unwind_decode_typeinfo_ptr (_Unwind_Word base __attribute__ ((unused)),
@@ -48,7 +70,12 @@ extern "C" {
       if (!tmp)
 	return 0;
 
-#if (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
+#if __FDPIC__
+      /* For FDPIC, we store the offset of the GOT entry.  */
+      /* So, first get GOT from dynamic linker and then use indirect access.  */
+      tmp += gnu_Unwind_Find_got (ptr);
+      tmp = *(_Unwind_Word *) tmp;
+#elif (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
     || defined(__FreeBSD__) || defined(__fuchsia__)
       /* Pc-relative indirect.  */
 #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel | DW_EH_PE_indirect)
diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
index 76f8fc3..7187edd 100644
--- a/libgcc/unwind-arm-common.inc
+++ b/libgcc/unwind-arm-common.inc
@@ -62,6 +62,7 @@ __gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
 #define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2)
 #define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3)
 #define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4)
+#define UCB_PR_GOT(ucbp) ((ucbp)->unwinder_cache.reserved5)
 
 /* Unwind descriptors.  */
 
@@ -85,6 +86,15 @@ typedef struct __EIT_entry
   _uw content;
 } __EIT_entry;
 
+#ifdef __FDPIC__
+
+/* Only used in FDPIC case.  */
+struct funcdesc_t {
+    unsigned int ptr;
+    unsigned int got;
+};
+#endif
+
 /* Assembly helper functions.  */
 
 /* Restore core register state.  Never returns.  */
@@ -259,7 +269,21 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
     {
       /* One of the predefined standard routines.  */
       _uw idx = (*(_uw *) ucbp->pr_cache.ehtp >> 24) & 0xf;
+#if __FDPIC__
+      {
+	struct funcdesc_t *funcdesc
+	  = (struct funcdesc_t *) __gnu_unwind_get_pr_addr (idx);
+	if (funcdesc)
+	  {
+	    UCB_PR_ADDR (ucbp) = funcdesc->ptr;
+	    UCB_PR_GOT (ucbp) = funcdesc->got;
+	  }
+	else
+	  UCB_PR_ADDR (ucbp) = 0;
+      }
+#else
       UCB_PR_ADDR (ucbp) = __gnu_unwind_get_pr_addr (idx);
+#endif
       if (UCB_PR_ADDR (ucbp) == 0)
 	{
 	  /* Failed */
@@ -270,6 +294,10 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
     {
       /* Execute region offset to PR */
       UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
+#if __FDPIC__
+      UCB_PR_GOT (ucbp)
+	= (unsigned int) gnu_Unwind_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
+#endif
     }
   return _URC_OK;
 }
@@ -291,14 +319,29 @@ unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
       UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC(vrs);
 
       /* Call the pr to decide what to do.  */
+#if __FDPIC__
+      {
+	volatile struct funcdesc_t funcdesc;
+	funcdesc.ptr = UCB_PR_ADDR (ucbp);
+	funcdesc.got = UCB_PR_GOT (ucbp);
+	pr_result = ((personality_routine) &funcdesc)
+	  (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
+      }
+#else
       pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
 	(_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
+#endif
     }
   while (pr_result == _URC_CONTINUE_UNWIND);
   
   if (pr_result != _URC_INSTALL_CONTEXT)
     abort();
 
+#if __FDPIC__
+  /* r9 could have been lost due to PLT jump.  Restore correct value.  */
+  vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (vrs));
+#endif
+
   uw_restore_core_regs (vrs, &vrs->core);
 }
 
@@ -346,8 +389,18 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
 	  next_vrs = saved_vrs;
 
 	  /* Call the pr to decide what to do.  */
+#if __FDPIC__
+	  {
+	    volatile struct funcdesc_t funcdesc;
+	    funcdesc.ptr = UCB_PR_ADDR (ucbp);
+	    funcdesc.got = UCB_PR_GOT (ucbp);
+	    pr_result = ((personality_routine) &funcdesc)
+	      (action, ucbp, (void *) &next_vrs);
+	  }
+#else
 	  pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
 	    (action, ucbp, (void *) &next_vrs);
+#endif
 
 	  saved_vrs.prev_sp = VRS_SP (&next_vrs);
 	}
@@ -384,6 +437,11 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
       return _URC_FAILURE;
     }
 
+#if __FDPIC__
+  /* r9 could have been lost due to PLT jump.  Restore correct value.  */
+  saved_vrs.core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (&saved_vrs));
+#endif
+
   uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
 }
 
@@ -429,8 +487,18 @@ __gnu_Unwind_RaiseException (_Unwind_Control_Block * ucbp,
 	return _URC_FAILURE;
 
       /* Call the pr to decide what to do.  */
+#if __FDPIC__
+      {
+	volatile struct funcdesc_t funcdesc;
+	funcdesc.ptr = UCB_PR_ADDR (ucbp);
+	funcdesc.got = UCB_PR_GOT (ucbp);
+	pr_result = ((personality_routine) &funcdesc)
+	  (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
+      }
+#else
       pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
 	(_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
+#endif
     }
   while (pr_result == _URC_CONTINUE_UNWIND);
 
@@ -488,13 +556,27 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, phase2_vrs * entry_vrs)
     }
 
   /* Call the cached PR.  */
+#if __FDPIC__
+  {
+    volatile struct funcdesc_t funcdesc;
+    funcdesc.ptr = UCB_PR_ADDR (ucbp);
+    funcdesc.got = UCB_PR_GOT (ucbp);
+    pr_result = ((personality_routine) &funcdesc)
+      (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
+  }
+#else
   pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
 	(_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
+#endif
 
   switch (pr_result)
     {
     case _URC_INSTALL_CONTEXT:
       /* Upload the registers to enter the landing pad.  */
+#if __FDPIC__
+      /* r9 could have been lost due to PLT jump.  Restore correct value.  */
+      entry_vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (entry_vrs));
+#endif
       uw_restore_core_regs (entry_vrs, &entry_vrs->core);
 
     case _URC_CONTINUE_UNWIND:
@@ -586,9 +668,20 @@ __gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
 	}
 
       /* Call the pr to decide what to do.  */
+#if __FDPIC__
+      {
+	volatile struct funcdesc_t funcdesc;
+	funcdesc.ptr = UCB_PR_ADDR (ucbp);
+	funcdesc.got = UCB_PR_GOT (ucbp);
+	code = ((personality_routine) &funcdesc)
+	  (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
+	   ucbp, (void *) &saved_vrs);
+      }
+#else
       code = ((personality_routine) UCB_PR_ADDR (ucbp))
 	(_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND, 
 	 ucbp, (void *) &saved_vrs);
+#endif
     }
   while (code != _URC_END_OF_STACK
 	 && code != _URC_FAILURE);
diff --git a/libgcc/unwind-pe.h b/libgcc/unwind-pe.h
index dd5ae95..9c5177f 100644
--- a/libgcc/unwind-pe.h
+++ b/libgcc/unwind-pe.h
@@ -259,10 +259,27 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
 
       if (result != 0)
 	{
+#if __FDPIC__
+	  /* FDPIC relative addresses imply taking the GOT address
+	     into account.  */
+	  if ((encoding & DW_EH_PE_pcrel) && (encoding & DW_EH_PE_indirect))
+	    {
+	      result += gnu_Unwind_Find_got ((_Unwind_Ptr) u);
+	      result = *(_Unwind_Internal_Ptr *) result;
+	    }
+	  else
+	    {
+	      result += ((encoding & 0x70) == DW_EH_PE_pcrel
+			 ? (_Unwind_Internal_Ptr) u : base);
+	      if (encoding & DW_EH_PE_indirect)
+		result = *(_Unwind_Internal_Ptr *) result;
+	    }
+#else
 	  result += ((encoding & 0x70) == DW_EH_PE_pcrel
 		     ? (_Unwind_Internal_Ptr) u : base);
 	  if (encoding & DW_EH_PE_indirect)
 	    result = *(_Unwind_Internal_Ptr *) result;
+#endif
 	}
     }
 
diff --git a/libstdc++-v3/libsupc++/eh_personality.cc b/libstdc++-v3/libsupc++/eh_personality.cc
index 1b336c7..7b26b8d 100644
--- a/libstdc++-v3/libsupc++/eh_personality.cc
+++ b/libstdc++-v3/libsupc++/eh_personality.cc
@@ -93,7 +93,15 @@ get_ttype_entry (lsda_header_info *info, _uleb128_t i)
   _Unwind_Ptr ptr;
 
   i *= size_of_encoded_value (info->ttype_encoding);
-  read_encoded_value_with_base (info->ttype_encoding, info->ttype_base,
+  read_encoded_value_with_base (
+#if __FDPIC__
+				/* Force these flags to nake sure to
+				   take the GOT into account.  */
+				(DW_EH_PE_pcrel | DW_EH_PE_indirect),
+#else
+				info->ttype_encoding,
+#endif
+				info->ttype_base,
 				info->TType - i, &ptr);
 
   return reinterpret_cast<const std::type_info *>(ptr);
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 10/21] [ARM] FDPIC: Implement TLS support.
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (9 preceding siblings ...)
  2018-10-11 13:39 ` [ARM/FDPIC v3 09/21] [ARM] FDPIC: Add support for taking address of nested function Christophe Lyon
@ 2018-10-11 13:39 ` Christophe Lyon
  2018-10-11 13:40 ` [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp Christophe Lyon
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:39 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Support additional relocations: TLS_GD32_FDPIC, TLS_LDM32_FDPIC, and
TLS_IE32_FDPIC.

We do not support the GNU2 TLS dialect.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.c (tls_reloc): Add TLS_GD32_FDPIC,
	TLS_LDM32_FDPIC and TLS_IE32_FDPIC.
	(arm_call_tls_get_addr): Add FDPIC support.
	(legitimize_tls_address): Likewise.
	(arm_emit_tls_decoration): Likewise.

Change-Id: I4ea5034ff654540c4658d0a79fb92f70550cdf4a

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 2a58d83..d7b7d99 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -2373,9 +2373,12 @@ char arm_arch_name[] = "__ARM_ARCH_PROFILE__";
 
 enum tls_reloc {
   TLS_GD32,
+  TLS_GD32_FDPIC,
   TLS_LDM32,
+  TLS_LDM32_FDPIC,
   TLS_LDO32,
   TLS_IE32,
+  TLS_IE32_FDPIC,
   TLS_LE32,
   TLS_DESCSEQ	/* GNU scheme */
 };
@@ -8674,20 +8677,34 @@ arm_call_tls_get_addr (rtx x, rtx reg, rtx *valuep, int reloc)
   gcc_assert (reloc != TLS_DESCSEQ);
   start_sequence ();
 
-  labelno = GEN_INT (pic_labelno++);
-  label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
-  label = gen_rtx_CONST (VOIDmode, label);
+  if (TARGET_FDPIC)
+    {
+      sum = gen_rtx_UNSPEC (Pmode,
+			    gen_rtvec (2, x, GEN_INT (reloc)),
+			    UNSPEC_TLS);
+    }
+  else
+    {
+      labelno = GEN_INT (pic_labelno++);
+      label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
+      label = gen_rtx_CONST (VOIDmode, label);
 
-  sum = gen_rtx_UNSPEC (Pmode,
-			gen_rtvec (4, x, GEN_INT (reloc), label,
-				   GEN_INT (TARGET_ARM ? 8 : 4)),
-			UNSPEC_TLS);
+      sum = gen_rtx_UNSPEC (Pmode,
+			    gen_rtvec (4, x, GEN_INT (reloc), label,
+				       GEN_INT (TARGET_ARM ? 8 : 4)),
+			    UNSPEC_TLS);
+    }
   reg = load_tls_operand (sum, reg);
 
-  if (TARGET_ARM)
-    emit_insn (gen_pic_add_dot_plus_eight (reg, reg, labelno));
+  if (TARGET_FDPIC)
+    {
+      emit_insn (gen_addsi3 (reg, reg, gen_rtx_REG (Pmode, FDPIC_REGNUM)));
+    }
   else
-    emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno));
+    if (TARGET_ARM)
+      emit_insn (gen_pic_add_dot_plus_eight (reg, reg, labelno));
+    else
+      emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno));
 
   *valuep = emit_library_call_value (get_tls_get_addr (), NULL_RTX,
 				     LCT_PURE, /* LCT_CONST?  */
@@ -8722,6 +8739,7 @@ arm_tls_descseq_addr (rtx x, rtx reg)
   return reg;
 }
 
+
 rtx
 legitimize_tls_address (rtx x, rtx reg)
 {
@@ -8734,6 +8752,9 @@ legitimize_tls_address (rtx x, rtx reg)
     case TLS_MODEL_GLOBAL_DYNAMIC:
       if (TARGET_GNU2_TLS)
 	{
+	  if (TARGET_FDPIC)
+	    gcc_unreachable();
+
 	  reg = arm_tls_descseq_addr (x, reg);
 
 	  tp = arm_load_tp (NULL_RTX);
@@ -8743,7 +8764,10 @@ legitimize_tls_address (rtx x, rtx reg)
       else
 	{
 	  /* Original scheme */
-	  insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32);
+	  if (TARGET_FDPIC)
+	    insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32_FDPIC);
+	  else
+	    insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32);
 	  dest = gen_reg_rtx (Pmode);
 	  emit_libcall_block (insns, dest, ret, x);
 	}
@@ -8752,6 +8776,9 @@ legitimize_tls_address (rtx x, rtx reg)
     case TLS_MODEL_LOCAL_DYNAMIC:
       if (TARGET_GNU2_TLS)
 	{
+	  if (TARGET_FDPIC)
+	    gcc_unreachable();
+
 	  reg = arm_tls_descseq_addr (x, reg);
 
 	  tp = arm_load_tp (NULL_RTX);
@@ -8760,7 +8787,10 @@ legitimize_tls_address (rtx x, rtx reg)
 	}
       else
 	{
-	  insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32);
+	  if (TARGET_FDPIC)
+	    insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32_FDPIC);
+	  else
+	    insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32);
 
 	  /* Attach a unique REG_EQUIV, to allow the RTL optimizers to
 	     share the LDM result with other LD model accesses.  */
@@ -8779,23 +8809,35 @@ legitimize_tls_address (rtx x, rtx reg)
       return dest;
 
     case TLS_MODEL_INITIAL_EXEC:
-      labelno = GEN_INT (pic_labelno++);
-      label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
-      label = gen_rtx_CONST (VOIDmode, label);
-      sum = gen_rtx_UNSPEC (Pmode,
-			    gen_rtvec (4, x, GEN_INT (TLS_IE32), label,
-				       GEN_INT (TARGET_ARM ? 8 : 4)),
-			    UNSPEC_TLS);
-      reg = load_tls_operand (sum, reg);
-
-      if (TARGET_ARM)
-	emit_insn (gen_tls_load_dot_plus_eight (reg, reg, labelno));
-      else if (TARGET_THUMB2)
-	emit_insn (gen_tls_load_dot_plus_four (reg, NULL, reg, labelno));
+      if (TARGET_FDPIC)
+	{
+	  sum = gen_rtx_UNSPEC (Pmode,
+				gen_rtvec (2, x, GEN_INT (TLS_IE32_FDPIC)),
+				UNSPEC_TLS);
+	  reg = load_tls_operand (sum, reg);
+	  emit_insn (gen_addsi3 (reg, reg, gen_rtx_REG (Pmode, FDPIC_REGNUM)));
+	  emit_move_insn (reg, gen_rtx_MEM (Pmode, reg));
+	}
       else
 	{
-	  emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno));
-	  emit_move_insn (reg, gen_const_mem (SImode, reg));
+	  labelno = GEN_INT (pic_labelno++);
+	  label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
+	  label = gen_rtx_CONST (VOIDmode, label);
+	  sum = gen_rtx_UNSPEC (Pmode,
+				gen_rtvec (4, x, GEN_INT (TLS_IE32), label,
+					   GEN_INT (TARGET_ARM ? 8 : 4)),
+				UNSPEC_TLS);
+	  reg = load_tls_operand (sum, reg);
+
+	  if (TARGET_ARM)
+	    emit_insn (gen_tls_load_dot_plus_eight (reg, reg, labelno));
+	  else if (TARGET_THUMB2)
+	    emit_insn (gen_tls_load_dot_plus_four (reg, NULL, reg, labelno));
+	  else
+	    {
+	      emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno));
+	      emit_move_insn (reg, gen_const_mem (SImode, reg));
+	    }
 	}
 
       tp = arm_load_tp (NULL_RTX);
@@ -28034,15 +28076,24 @@ arm_emit_tls_decoration (FILE *fp, rtx x)
     case TLS_GD32:
       fputs ("(tlsgd)", fp);
       break;
+    case TLS_GD32_FDPIC:
+      fputs ("(tlsgd_fdpic)", fp);
+      break;
     case TLS_LDM32:
       fputs ("(tlsldm)", fp);
       break;
+    case TLS_LDM32_FDPIC:
+      fputs ("(tlsldm_fdpic)", fp);
+      break;
     case TLS_LDO32:
       fputs ("(tlsldo)", fp);
       break;
     case TLS_IE32:
       fputs ("(gottpoff)", fp);
       break;
+    case TLS_IE32_FDPIC:
+      fputs ("(gottpoff_fdpic)", fp);
+      break;
     case TLS_LE32:
       fputs ("(tpoff)", fp);
       break;
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 09/21] [ARM] FDPIC: Add support for taking address of nested function
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (8 preceding siblings ...)
  2018-10-11 13:39 ` [ARM/FDPIC v3 11/21] [ARM] FDPIC: Add support to unwind FDPIC signal frame Christophe Lyon
@ 2018-10-11 13:39 ` Christophe Lyon
  2018-10-11 13:39 ` [ARM/FDPIC v3 10/21] [ARM] FDPIC: Implement TLS support Christophe Lyon
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:39 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

In FDPIC mode, the trampoline generated to support pointers to nested
functions looks like:

	   .word	trampoline address
	   .word	trampoline GOT address
	   ldr 		r12, [pc, #8]
	   ldr 		r9, [pc, #8]
	   ldr		pc, [pc, #8]
	   .word	static chain value
	   .word	GOT address
	   .word	function's address

because in FDPIC function pointers are actually pointers to function
descriptors, we have to actually generate a function descriptor for
the trampoline.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.c (arm_asm_trampoline_template): Add FDPIC
	support.
	(arm_trampoline_init): Likewise.
	(arm_trampoline_init): Likewise.
	* config/arm/arm.h (TRAMPOLINE_SIZE): Likewise.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index d0144fd..2a58d83 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3954,13 +3954,50 @@ arm_warn_func_return (tree decl)
 	   .word	static chain value
 	   .word	function's address
    XXX FIXME: When the trampoline returns, r8 will be clobbered.  */
+/* In FDPIC mode, the trampoline looks like:
+	   .word	trampoline address
+	   .word	trampoline GOT address
+	   ldr 		r12, [pc, #8] ; #4 for Thumb2
+	   ldr 		r9,  [pc, #8] ; #4 for Thumb2
+	   ldr		pc,  [pc, #8] ; #4 for Thumb2
+	   .word	static chain value
+	   .word	GOT address
+	   .word	function's address
+*/
 
 static void
 arm_asm_trampoline_template (FILE *f)
 {
   fprintf (f, "\t.syntax unified\n");
 
-  if (TARGET_ARM)
+  if (TARGET_FDPIC)
+    {
+      /* The first two words are a function descriptor pointing to the
+	 trampoline code just below.  */
+      if (TARGET_ARM)
+	fprintf (f, "\t.arm\n");
+      else if (TARGET_THUMB2)
+	fprintf (f, "\t.thumb\n");
+      else
+	/* Only ARM and Thumb-2 are supported.  */
+	gcc_unreachable ();
+
+      assemble_aligned_integer (UNITS_PER_WORD, const0_rtx);
+      assemble_aligned_integer (UNITS_PER_WORD, const0_rtx);
+      /* Trampoline code which sets the static chain register but also
+	 PIC register before jumping into real code.  */
+      asm_fprintf (f, "\tldr\t%r, [%r, #%d]\n",
+		   STATIC_CHAIN_REGNUM, PC_REGNUM,
+		   TARGET_THUMB2 ? 8 : 4);
+      asm_fprintf (f, "\tldr\t%r, [%r, #%d]\n",
+		   PIC_OFFSET_TABLE_REGNUM, PC_REGNUM,
+		   TARGET_THUMB2 ? 8 : 4);
+      asm_fprintf (f, "\tldr\t%r, [%r, #%d]\n",
+		   PC_REGNUM, PC_REGNUM,
+		   TARGET_THUMB2 ? 8 : 4);
+      assemble_aligned_integer (UNITS_PER_WORD, const0_rtx);
+    }
+  else if (TARGET_ARM)
     {
       fprintf (f, "\t.arm\n");
       asm_fprintf (f, "\tldr\t%r, [%r, #0]\n", STATIC_CHAIN_REGNUM, PC_REGNUM);
@@ -4001,12 +4038,40 @@ arm_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
   emit_block_move (m_tramp, assemble_trampoline_template (),
 		   GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
 
-  mem = adjust_address (m_tramp, SImode, TARGET_32BIT ? 8 : 12);
-  emit_move_insn (mem, chain_value);
+  if (TARGET_FDPIC)
+    {
+      rtx funcdesc = XEXP (DECL_RTL (fndecl), 0);
+      rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
+      rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc, 4));
+      /* The function start address is at offset 8, but in Thumb mode
+	 we want bit 0 set to 1 to indicate Thumb-ness, hence 9
+	 below.  */
+      rtx trampoline_code_start
+	= plus_constant (Pmode, XEXP (m_tramp, 0), TARGET_THUMB2 ? 9 : 8);
+
+      /* Write initial funcdesc which points to the trampoline.  */
+      mem = adjust_address (m_tramp, SImode, 0);
+      emit_move_insn (mem, trampoline_code_start);
+      mem = adjust_address (m_tramp, SImode, 4);
+      emit_move_insn (mem, gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
+      /* Setup static chain.  */
+      mem = adjust_address (m_tramp, SImode, 20);
+      emit_move_insn (mem, chain_value);
+      /* GOT + real function entry point.  */
+      mem = adjust_address (m_tramp, SImode, 24);
+      emit_move_insn (mem, gotaddr);
+      mem = adjust_address (m_tramp, SImode, 28);
+      emit_move_insn (mem, fnaddr);
+    }
+  else
+    {
+      mem = adjust_address (m_tramp, SImode, TARGET_32BIT ? 8 : 12);
+      emit_move_insn (mem, chain_value);
 
-  mem = adjust_address (m_tramp, SImode, TARGET_32BIT ? 12 : 16);
-  fnaddr = XEXP (DECL_RTL (fndecl), 0);
-  emit_move_insn (mem, fnaddr);
+      mem = adjust_address (m_tramp, SImode, TARGET_32BIT ? 12 : 16);
+      fnaddr = XEXP (DECL_RTL (fndecl), 0);
+      emit_move_insn (mem, fnaddr);
+    }
 
   a_tramp = XEXP (m_tramp, 0);
   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__clear_cache"),
@@ -4020,7 +4085,9 @@ arm_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
 static rtx
 arm_trampoline_adjust_address (rtx addr)
 {
-  if (TARGET_THUMB)
+  /* For FDPIC don't fix trampoline address since it's a function
+     descriptor and not a function address.  */
+  if (TARGET_THUMB && !TARGET_FDPIC)
     addr = expand_simple_binop (Pmode, IOR, addr, const1_rtx,
 				NULL, 0, OPTAB_LIB_WIDEN);
   return addr;
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 4671d64..22a65a1 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -1581,7 +1581,7 @@ typedef struct
 #define INIT_EXPANDERS  arm_init_expanders ()
 
 /* Length in units of the trampoline for entering a nested function.  */
-#define TRAMPOLINE_SIZE  (TARGET_32BIT ? 16 : 20)
+#define TRAMPOLINE_SIZE  (TARGET_FDPIC ? 32 : (TARGET_32BIT ? 16 : 20))
 
 /* Alignment required for a trampoline in bits.  */
 #define TRAMPOLINE_ALIGNMENT  32
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 11/21] [ARM] FDPIC: Add support to unwind FDPIC signal frame
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (7 preceding siblings ...)
  2018-10-11 13:38 ` [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO Christophe Lyon
@ 2018-10-11 13:39 ` Christophe Lyon
  2018-10-11 13:39 ` [ARM/FDPIC v3 09/21] [ARM] FDPIC: Add support for taking address of nested function Christophe Lyon
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:39 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	libgcc/
	* unwind-arm-common.inc (ARM_SET_R7_RT_SIGRETURN)
	(THUMB2_SET_R7_RT_SIGRETURN, FDPIC_LDR_R12_WITH_FUNCDESC)
	(FDPIC_LDR_R9_WITH_GOT, FDPIC_LDR_PC_WITH_RESTORER)
	(FDPIC_FUNCDESC_OFFSET, ARM_NEW_RT_SIGFRAME_UCONTEXT)
	(ARM_UCONTEXT_SIGCONTEXT, ARM_SIGCONTEXT_R0, FDPIC_T2_LDR_R12_WITH_FUNCDESC)
	(FDPIC_T2_LDR_R9_WITH_GOT, FDPIC_T2_LDR_PC_WITH_RESTORER): New.
	(__gnu_personality_sigframe_fdpic): New.
	(get_eit_entry): Add FDPIC signal frame support.

Change-Id: I7f9527cc50665dd1a731b7badf71c319fb38bf57

diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
index 7187edd..08d7b44 100644
--- a/libgcc/unwind-arm-common.inc
+++ b/libgcc/unwind-arm-common.inc
@@ -30,6 +30,26 @@
 #include <sys/sdt.h>
 #endif
 
+#if __FDPIC__
+/* Load r7 with rt_sigreturn value.  */
+#define ARM_SET_R7_RT_SIGRETURN		0xe3a070ad	/* mov   r7, #0xad */
+#define THUMB2_SET_R7_RT_SIGRETURN	0x07adf04f	/* mov.w r7, #0xad */
+
+/* FDPIC jump to restorer sequence.  */
+#define FDPIC_LDR_R12_WITH_FUNCDESC	0xe59fc004	/* ldr   r12, [pc, #4] */
+#define FDPIC_LDR_R9_WITH_GOT		0xe59c9004	/* ldr   r9, [r12, #4] */
+#define FDPIC_LDR_PC_WITH_RESTORER	0xe59cf000	/* ldr   pc, [r12] */
+#define FDPIC_T2_LDR_R12_WITH_FUNCDESC  0xc008f8df	/* ldr.w r12, [pc, #8] */
+#define FDPIC_T2_LDR_R9_WITH_GOT	0x9004f8dc	/* ldr.w r9, [r12, #4] */
+#define FDPIC_T2_LDR_PC_WITH_RESTORER   0xf000f8dc	/* ldr.w pc, [r12] */
+#define FDPIC_FUNCDESC_OFFSET		12
+
+/* Signal frame offsets.  */
+#define ARM_NEW_RT_SIGFRAME_UCONTEXT	0x80
+#define ARM_UCONTEXT_SIGCONTEXT		0x14
+#define ARM_SIGCONTEXT_R0		0xc
+#endif
+
 /* We add a prototype for abort here to avoid creating a dependency on
    target headers.  */
 extern void abort (void);
@@ -198,6 +218,45 @@ search_EIT_table (const __EIT_entry * table, int nrec, _uw return_address)
     }
 }
 
+#if __FDPIC__
+/* VFP is not restored, but this is sufficient to allow unwinding.  */
+static _Unwind_Reason_Code
+__gnu_personality_sigframe_fdpic (_Unwind_State state,
+				  _Unwind_Control_Block *ucbp,
+				  _Unwind_Context *context)
+{
+    unsigned int sp;
+    unsigned int pc;
+    unsigned int funcdesc;
+    unsigned int handler;
+    unsigned int first_handler_instruction;
+    int i;
+
+    _Unwind_VRS_Get (context, _UVRSC_CORE, R_SP, _UVRSD_UINT32, &sp);
+    _Unwind_VRS_Get (context, _UVRSC_CORE, R_PC, _UVRSD_UINT32, &pc);
+
+    funcdesc = *(unsigned int *)((pc & ~1) + FDPIC_FUNCDESC_OFFSET);
+    handler = *(unsigned int *)(funcdesc);
+    first_handler_instruction = *(unsigned int *)(handler & ~1);
+
+    /* Adjust SP to point to the start of registers according to
+       signal type.  */
+    if (first_handler_instruction == ARM_SET_R7_RT_SIGRETURN
+	|| first_handler_instruction == THUMB2_SET_R7_RT_SIGRETURN)
+	sp += ARM_NEW_RT_SIGFRAME_UCONTEXT
+	  + ARM_UCONTEXT_SIGCONTEXT
+	  + ARM_SIGCONTEXT_R0;
+    else
+	sp += ARM_UCONTEXT_SIGCONTEXT
+	  + ARM_SIGCONTEXT_R0;
+    /* Restore regs saved on stack by the kernel.  */
+    for (i = 0; i < 16; i++)
+	_Unwind_VRS_Set (context, _UVRSC_CORE, i, _UVRSD_UINT32, sp + 4 * i);
+
+    return _URC_CONTINUE_UNWIND;
+}
+#endif
+
 /* Find the exception index table eintry for the given address.
    Fill in the relevant fields of the UCB.
    Returns _URC_FAILURE if an error occurred, _URC_OK on success.  */
@@ -221,6 +280,27 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
 							    &nrec);
       if (!eitp)
 	{
+#if __FDPIC__
+	  /* If we are unwinding a signal handler then perhaps we have
+	     reached a trampoline.  Try to detect jump to restorer
+	     sequence.  */
+	  _uw *pc = (_uw *)((return_address+2) & ~1);
+	  if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
+	       && pc[1] == FDPIC_LDR_R9_WITH_GOT
+	       && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
+	      || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
+		  && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
+		  && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
+	    {
+	      struct funcdesc_t *funcdesc
+		= (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
+
+	      UCB_PR_ADDR (ucbp) = funcdesc->ptr;
+	      UCB_PR_GOT (ucbp) = funcdesc->got;
+
+	      return _URC_OK;
+	    }
+#endif
 	  UCB_PR_ADDR (ucbp) = 0;
 	  return _URC_FAILURE;
 	}
@@ -235,6 +315,27 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
 
   if (!eitp)
     {
+#if __FDPIC__
+      /* If we are unwinding a signal handler then perhaps we have
+	 reached a trampoline.  Try to detect jump to restorer
+	 sequence.  */
+      _uw *pc = (_uw *)((return_address+2) & ~1);
+      if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
+	   && pc[1] == FDPIC_LDR_R9_WITH_GOT
+	   && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
+	  || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
+	      && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
+	      && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
+	{
+	  struct funcdesc_t *funcdesc
+	    = (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
+
+	  UCB_PR_ADDR (ucbp) = funcdesc->ptr;
+	  UCB_PR_GOT (ucbp) = funcdesc->got;
+
+	  return _URC_OK;
+	}
+#endif
       UCB_PR_ADDR (ucbp) = 0;
       return _URC_FAILURE;
     }
@@ -243,6 +344,27 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
   /* Can this frame be unwound at all?  */
   if (eitp->content == EXIDX_CANTUNWIND)
     {
+#if __FDPIC__
+      /* If we are unwinding a signal handler then perhaps we have
+	 reached a trampoline.  Try to detect jump to restorer
+	 sequence.  */
+      _uw *pc = (_uw *)((return_address+2) & ~1);
+      if ((pc[0] == FDPIC_LDR_R12_WITH_FUNCDESC
+	   && pc[1] == FDPIC_LDR_R9_WITH_GOT
+	   && pc[2] == FDPIC_LDR_PC_WITH_RESTORER)
+	  || (pc[0] == FDPIC_T2_LDR_R12_WITH_FUNCDESC
+	      && pc[1] == FDPIC_T2_LDR_R9_WITH_GOT
+	      && pc[2] == FDPIC_T2_LDR_PC_WITH_RESTORER))
+	{
+	  struct funcdesc_t *funcdesc
+	    = (struct funcdesc_t *) &__gnu_personality_sigframe_fdpic;
+
+	  UCB_PR_ADDR (ucbp) = funcdesc->ptr;
+	  UCB_PR_GOT (ucbp) = funcdesc->got;
+
+	  return _URC_OK;
+	}
+#endif
       UCB_PR_ADDR (ucbp) = 0;
       return _URC_END_OF_STACK;
     }
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 13/21] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (11 preceding siblings ...)
  2018-10-11 13:40 ` [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp Christophe Lyon
@ 2018-10-11 13:40 ` Christophe Lyon
  2018-10-11 13:41 ` [ARM/FDPIC v3 16/21] [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently produce an ICE Christophe Lyon
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:40 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Without this, when we are unwinding across a signal frame we can jump
to an even address which leads to an exception.

This is needed in __gnu_persnality_sigframe_fdpic() when restoring the
PC from the signal frame since the PC saved by the kernel has the LSB
bit set to zero.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	libgcc/
	* config/arm/unwind-arm.c (_Unwind_VRS_Set): Handle v7m
	architecture.

Change-Id: Ie84de548226bcf1751e19a09e8f091fb3013ccea

diff --git a/libgcc/config/arm/unwind-arm.c b/libgcc/config/arm/unwind-arm.c
index 564e4f13..6da6e3d 100644
--- a/libgcc/config/arm/unwind-arm.c
+++ b/libgcc/config/arm/unwind-arm.c
@@ -198,6 +198,11 @@ _Unwind_VRS_Result _Unwind_VRS_Set (_Unwind_Context *context,
 	return _UVRSR_FAILED;
 
       vrs->core.r[regno] = *(_uw *) valuep;
+#if defined(__ARM_ARCH_7M__)
+      /* Force LSB bit since we always run thumb code.  */
+      if (regno == 15)
+	vrs->core.r[regno] |= 1;
+#endif
       return _UVRSR_OK;
 
     case _UVRSC_VFP:
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (10 preceding siblings ...)
  2018-10-11 13:39 ` [ARM/FDPIC v3 10/21] [ARM] FDPIC: Implement TLS support Christophe Lyon
@ 2018-10-11 13:40 ` Christophe Lyon
  2018-10-19 14:02   ` Christophe Lyon
  2018-10-11 13:40 ` [ARM/FDPIC v3 13/21] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture Christophe Lyon
                   ` (8 subsequent siblings)
  20 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:40 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

We call __aeabi_read_tp() to get the thread pointer. Since this is a
function call, we have to restore the FDPIC register afterwards.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/
	* config/arm/arm.c (arm_load_tp): Add FDPIC support.
	* config/arm/arm.md (load_tp_soft_fdpic): New pattern.
	(load_tp_soft): Disable in FDPIC mode.

Change-Id: I0a2e3466c9afb869ad8e844083ad178de014658e

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index d7b7d99..d3a60cb 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -8646,7 +8646,25 @@ arm_load_tp (rtx target)
 
       rtx tmp;
 
-      emit_insn (gen_load_tp_soft ());
+      if (TARGET_FDPIC)
+	{
+	  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
+
+	  emit_insn (gen_load_tp_soft_fdpic ());
+
+	  /* Restore r9.  */
+	  XVECEXP (par, 0, 0)
+	    = gen_rtx_UNSPEC (VOIDmode,
+			      gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
+					 get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
+			      UNSPEC_PIC_RESTORE);
+	  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	  XVECEXP (par, 0, 2)
+	    = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
+	  emit_insn (par);
+	}
+      else
+	emit_insn (gen_load_tp_soft ());
 
       tmp = gen_rtx_REG (SImode, R0_REGNUM);
       emit_move_insn (target, tmp);
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 09a0701..6fea087 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -11485,12 +11485,25 @@
 )
 
 ;; Doesn't clobber R1-R3.  Must use r0 for the first operand.
+(define_insn "load_tp_soft_fdpic"
+  [(set (reg:SI 0) (unspec:SI [(const_int 0)] UNSPEC_TLS))
+   (clobber (reg:SI 9))
+   (clobber (reg:SI LR_REGNUM))
+   (clobber (reg:SI IP_REGNUM))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_SOFT_TP && TARGET_FDPIC"
+  "bl\\t__aeabi_read_tp\\t@ load_tp_soft"
+  [(set_attr "conds" "clob")
+   (set_attr "type" "branch")]
+)
+
+;; Doesn't clobber R1-R3.  Must use r0 for the first operand.
 (define_insn "load_tp_soft"
   [(set (reg:SI 0) (unspec:SI [(const_int 0)] UNSPEC_TLS))
    (clobber (reg:SI LR_REGNUM))
    (clobber (reg:SI IP_REGNUM))
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_SOFT_TP"
+  "TARGET_SOFT_TP && !TARGET_FDPIC"
   "bl\\t__aeabi_read_tp\\t@ load_tp_soft"
   [(set_attr "conds" "clob")
    (set_attr "type" "branch")]
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 14/21] [ARM][testsuite] FDPIC: Skip unsupported tests
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (13 preceding siblings ...)
  2018-10-11 13:41 ` [ARM/FDPIC v3 16/21] [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently produce an ICE Christophe Lyon
@ 2018-10-11 13:41 ` Christophe Lyon
  2018-10-11 13:41 ` [ARM/FDPIC v3 15/21] [ARM][testsuite] FDPIC: Adjust scan-assembler patterns Christophe Lyon
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:41 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Several tests cannot work on ARM-FDPIC for various reasons: skip them,
or skip some directives.

gcc.dg/20020312-2.c: Skip since it forces -fno-pic.

gcc.target/arm/:
* Skip since r9 is clobbered by assembly code:
  20051215-1.c
  mmx-1.c
  pr61948.c
  pr77933-1.c
  pr77933-2.c

* Skip since the test forces armv5te which is not supported by FDPIC:
  pr40887.c
  pr19599.c

* Skip since FDPIC disables sibcall to external functions:
  sibcall-1.c
  tail-long-call
  vfp-longcall-apcs

* Skip size check since it's different for FDPIC:
  ivopts-2.c
  ivopts-3.c
  ivopts-4.c
  ivopts-5.c
  pr43597.c
  pr43920-2.c

* Disable assembler scanning invalid for FDPIC:
  pr45701-1.c
  pr45701-2.c
  stack-red-zone.c

* gnu2 TLS dialect is not supported by FDPIC:
  tlscall.c

* Test relies on symbols not generated in FDPIC:
  data-rel-2.c
  data-rel-3.c

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/testsuite/
	* gcc.dg/20020312-2.c: Skip on arm*-*-uclinuxfdpiceabi.
	* gcc.target/arm/20051215-1.c: Likewise.
	* gcc.target/arm/mmx-1.c: Likewise.
	* gcc.target/arm/pr19599.c: Likewise.
	* gcc.target/arm/pr40887.c: Likewise.
	* gcc.target/arm/pr61948.c: Likewise.
	* gcc.target/arm/pr77933-1.c: Likewise.
	* gcc.target/arm/pr77933-2.c: Likewise.
	* gcc.target/arm/sibcall-1.c: Likewise.
	* gcc.target/arm/data-rel-2.c: Likewise.
	* gcc.target/arm/data-rel-3.c: Likewise.
	* gcc.target/arm/tail-long-call: Likewise.
	* gcc.target/arm/tlscall.c: Likewise.
	* gcc.target/arm/vfp-longcall-apcs: Likewise.
	* gcc.target/arm/ivopts-2.c: Skip object-size test on
	arm*-*-uclinuxfdpiceabi.
	* gcc.target/arm/ivopts-3.c: Likewise.
	* gcc.target/arm/ivopts-4.c: Likewise.
	* gcc.target/arm/ivopts-5.c: Likewise.
	* gcc.target/arm/pr43597.c: Likewise.
	* gcc.target/arm/pr43920-2.c: Likewise.
	* gcc.target/arm/pr45701-1.c: Skip scan-assembler on
	arm*-*-uclinuxfdpiceabi.
	* gcc.target/arm/pr45701-2.c: Likewise.
	* gcc.target/arm/stack-red-zone.c: Likewise.

Change-Id: Icada7ce52537901fdac10403e7997571b7e2c509

diff --git a/gcc/testsuite/gcc.dg/20020312-2.c b/gcc/testsuite/gcc.dg/20020312-2.c
index 1a8afd8..9cfc829 100644
--- a/gcc/testsuite/gcc.dg/20020312-2.c
+++ b/gcc/testsuite/gcc.dg/20020312-2.c
@@ -9,6 +9,7 @@
 /* { dg-options "-O -fno-pic" } */
 /* { dg-additional-options "-no-pie" { target pie_enabled } } */
 /* { dg-require-effective-target nonlocal_goto } */
+/* { dg-skip-if "" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 
 extern void abort (void);
 
diff --git a/gcc/testsuite/gcc.target/arm/20051215-1.c b/gcc/testsuite/gcc.target/arm/20051215-1.c
index 0519dc7..cc07693 100644
--- a/gcc/testsuite/gcc.target/arm/20051215-1.c
+++ b/gcc/testsuite/gcc.target/arm/20051215-1.c
@@ -3,6 +3,7 @@
    the call would need an output reload.  */
 /* { dg-do run } */
 /* { dg-options "-O2 -fno-omit-frame-pointer" } */
+/* { dg-skip-if "r9 is reserved in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 extern void abort (void);
 typedef void (*callback) (void);
 
diff --git a/gcc/testsuite/gcc.target/arm/data-rel-2.c b/gcc/testsuite/gcc.target/arm/data-rel-2.c
index 6ba47d6..7d37a8c 100644
--- a/gcc/testsuite/gcc.target/arm/data-rel-2.c
+++ b/gcc/testsuite/gcc.target/arm/data-rel-2.c
@@ -1,3 +1,4 @@
+/* { dg-skip-if "Not supported in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-fPIC -mno-pic-data-is-text-relative -mno-single-pic-base" } */
 /* { dg-final { scan-assembler-not "j-\\(.LPIC"  } } */
 /* { dg-final { scan-assembler "_GLOBAL_OFFSET_TABLE_-\\(.LPIC" } } */
diff --git a/gcc/testsuite/gcc.target/arm/data-rel-3.c b/gcc/testsuite/gcc.target/arm/data-rel-3.c
index 2ce1e66..534c6c4 100644
--- a/gcc/testsuite/gcc.target/arm/data-rel-3.c
+++ b/gcc/testsuite/gcc.target/arm/data-rel-3.c
@@ -1,3 +1,4 @@
+/* { dg-skip-if "Not supported in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-fPIC -mpic-data-is-text-relative" } */
 /* { dg-final { scan-assembler "j-\\(.LPIC"  } } */
 /* { dg-final { scan-assembler-not "_GLOBAL_OFFSET_TABLE_-\\(.LPIC" } } */
diff --git a/gcc/testsuite/gcc.target/arm/ivopts-2.c b/gcc/testsuite/gcc.target/arm/ivopts-2.c
index afe91aa..f1d5edb 100644
--- a/gcc/testsuite/gcc.target/arm/ivopts-2.c
+++ b/gcc/testsuite/gcc.target/arm/ivopts-2.c
@@ -14,4 +14,4 @@ tr4 (short array[], int n)
 
 /* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times "PHI <" 1 "ivopts"} } */
-/* { dg-final { object-size text <= 26 { target arm_thumb2 } } } */
+/* { dg-final { object-size text <= 26 { target { arm_thumb2 && { ! arm*-*-uclinuxfdpiceabi } } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/ivopts-3.c b/gcc/testsuite/gcc.target/arm/ivopts-3.c
index faea996..357350c 100644
--- a/gcc/testsuite/gcc.target/arm/ivopts-3.c
+++ b/gcc/testsuite/gcc.target/arm/ivopts-3.c
@@ -16,4 +16,4 @@ tr3 (short array[], unsigned int n)
 /* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */
-/* { dg-final { object-size text <= 30 { target arm_thumb2 } } } */
+/* { dg-final { object-size text <= 30 { target { arm_thumb2 && { ! arm*-*-uclinuxfdpiceabi } } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/ivopts-4.c b/gcc/testsuite/gcc.target/arm/ivopts-4.c
index b8101cb..2e866c0 100644
--- a/gcc/testsuite/gcc.target/arm/ivopts-4.c
+++ b/gcc/testsuite/gcc.target/arm/ivopts-4.c
@@ -17,4 +17,4 @@ tr2 (int array[], int n)
 /* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */
-/* { dg-final { object-size text <= 36 { target arm_thumb2 } } } */
+/* { dg-final { object-size text <= 36 { target { arm_thumb2 && { ! arm*-*-uclinuxfdpiceabi } } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/ivopts-5.c b/gcc/testsuite/gcc.target/arm/ivopts-5.c
index f4f8c2c..4e8e380 100644
--- a/gcc/testsuite/gcc.target/arm/ivopts-5.c
+++ b/gcc/testsuite/gcc.target/arm/ivopts-5.c
@@ -16,4 +16,4 @@ tr1 (int array[], unsigned int n)
 /* { dg-final { scan-tree-dump-times "PHI <ivtmp" 1 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times "PHI <x" 0 "ivopts"} } */
 /* { dg-final { scan-tree-dump-times ", x" 0 "ivopts"} } */
-/* { dg-final { object-size text <= 30 { target arm_thumb2 } } } */
+/* { dg-final { object-size text <= 30 { target { arm_thumb2 && { ! arm*-*-uclinuxfdpiceabi } } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/mmx-1.c b/gcc/testsuite/gcc.target/arm/mmx-1.c
index 6317cc0..8060dbd 100644
--- a/gcc/testsuite/gcc.target/arm/mmx-1.c
+++ b/gcc/testsuite/gcc.target/arm/mmx-1.c
@@ -9,6 +9,7 @@
 /* { dg-require-effective-target arm32 } */
 /* { dg-require-effective-target arm_iwmmxt_ok } */
 /* { dg-final { scan-assembler "push.*ip,\[ ]*pc" } } */
+/* { dg-skip-if "r9 is reserved in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 
 /* This function uses all the call-saved registers, namely r4, r5, r6,
    r7, r8, r9, sl, fp.  Since we also save lr, that leaves an odd
diff --git a/gcc/testsuite/gcc.target/arm/pr19599.c b/gcc/testsuite/gcc.target/arm/pr19599.c
index c3ee220..a536548 100644
--- a/gcc/testsuite/gcc.target/arm/pr19599.c
+++ b/gcc/testsuite/gcc.target/arm/pr19599.c
@@ -1,4 +1,5 @@
 /* { dg-skip-if "need at least armv5te" { *-*-* } { "-march=armv[234]*" "-mthumb" } { "" } } */
+/* { dg-skip-if "FDPIC does not support armv5te" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-O2 -march=armv5te -marm" }  */
 /* { dg-final { scan-assembler "bx" } } */
 
diff --git a/gcc/testsuite/gcc.target/arm/pr40887.c b/gcc/testsuite/gcc.target/arm/pr40887.c
index 8c91cd9..832f676 100644
--- a/gcc/testsuite/gcc.target/arm/pr40887.c
+++ b/gcc/testsuite/gcc.target/arm/pr40887.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-skip-if "need at least armv5" { *-*-* } { "-march=armv[234]*" } { "" } } */
+/* { dg-skip-if "FDPIC does not support armv5te" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-O2" }  */
 /* { dg-add-options arm_arch_v5te } */
diff --git a/gcc/testsuite/gcc.target/arm/pr43597.c b/gcc/testsuite/gcc.target/arm/pr43597.c
index 3fdea98..6c9d419 100644
--- a/gcc/testsuite/gcc.target/arm/pr43597.c
+++ b/gcc/testsuite/gcc.target/arm/pr43597.c
@@ -24,4 +24,4 @@ foo4 ()
 
 /* { dg-final { scan-assembler-times "sub" 1 } } */
 /* { dg-final { scan-assembler-times "cmp" 0 } } */
-/* { dg-final { object-size text <= 30 } } */
+/* { dg-final { object-size text <= 30 { target { ! arm*-*-uclinuxfdpiceabi } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/pr43920-2.c b/gcc/testsuite/gcc.target/arm/pr43920-2.c
index f5e8f48..c367d6b 100644
--- a/gcc/testsuite/gcc.target/arm/pr43920-2.c
+++ b/gcc/testsuite/gcc.target/arm/pr43920-2.c
@@ -29,4 +29,4 @@ int getFileStartAndLength (int fd, int *start_, size_t *length_)
 
 /* { dg-final { scan-assembler-times "pop" 2 } } */
 /* { dg-final { scan-assembler-times "beq" 3 } } */
-/* { dg-final { object-size text <= 54 } } */
+/* { dg-final { object-size text <= 54 { target { ! arm*-*-uclinuxfdpiceabi } } } } */
diff --git a/gcc/testsuite/gcc.target/arm/pr45701-1.c b/gcc/testsuite/gcc.target/arm/pr45701-1.c
index 01db15a..b26011b 100644
--- a/gcc/testsuite/gcc.target/arm/pr45701-1.c
+++ b/gcc/testsuite/gcc.target/arm/pr45701-1.c
@@ -1,8 +1,8 @@
 /* { dg-do compile } */
 /* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
 /* { dg-options "-mthumb -Os" }  */
-/* { dg-final { scan-assembler "push\t\{r3" } } */
-/* { dg-final { scan-assembler-not "\[^\-\]r8" } } */
+/* { dg-final { scan-assembler "push\t\{r3" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler-not "\[^\-\]r8" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
 
 extern int hist_verify;
 extern int a1;
diff --git a/gcc/testsuite/gcc.target/arm/pr45701-2.c b/gcc/testsuite/gcc.target/arm/pr45701-2.c
index ce66d75..32eed4d 100644
--- a/gcc/testsuite/gcc.target/arm/pr45701-2.c
+++ b/gcc/testsuite/gcc.target/arm/pr45701-2.c
@@ -1,8 +1,8 @@
 /* { dg-do compile } */
 /* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
 /* { dg-options "-mthumb -Os" }  */
-/* { dg-final { scan-assembler "push\t\{r3" } } */
-/* { dg-final { scan-assembler-not "\[^\-\]r8" } } */
+/* { dg-final { scan-assembler "push\t\{r3" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler-not "\[^\-\]r8" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
 
 extern int hist_verify;
 extern int a1;
diff --git a/gcc/testsuite/gcc.target/arm/pr61948.c b/gcc/testsuite/gcc.target/arm/pr61948.c
index 411e898..3b2b72a 100644
--- a/gcc/testsuite/gcc.target/arm/pr61948.c
+++ b/gcc/testsuite/gcc.target/arm/pr61948.c
@@ -1,5 +1,6 @@
 /* PR target/61948 */
 /* { dg-do compile } */
+/* { dg-skip-if "r9 is reserved in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_neon_ok } */
 /* { dg-require-effective-target arm_thumb2_ok } */
 /* { dg-options "-O2 -mthumb" } */
diff --git a/gcc/testsuite/gcc.target/arm/pr77933-1.c b/gcc/testsuite/gcc.target/arm/pr77933-1.c
index 95cf68e..86b9507 100644
--- a/gcc/testsuite/gcc.target/arm/pr77933-1.c
+++ b/gcc/testsuite/gcc.target/arm/pr77933-1.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "r9 is reserved in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-O2" } */
 
 __attribute__ ((noinline, noclone)) void
diff --git a/gcc/testsuite/gcc.target/arm/pr77933-2.c b/gcc/testsuite/gcc.target/arm/pr77933-2.c
index 9028c4f..a06c11a 100644
--- a/gcc/testsuite/gcc.target/arm/pr77933-2.c
+++ b/gcc/testsuite/gcc.target/arm/pr77933-2.c
@@ -1,5 +1,6 @@
 /* { dg-do run } */
 /* { dg-skip-if "" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
+/* { dg-skip-if "r9 is reserved in FDPIC" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-mthumb -O2 -mtpcs-leaf-frame" } */
 
 __attribute__ ((noinline, noclone)) void
diff --git a/gcc/testsuite/gcc.target/arm/sibcall-1.c b/gcc/testsuite/gcc.target/arm/sibcall-1.c
index cf352c1..dcdd552 100644
--- a/gcc/testsuite/gcc.target/arm/sibcall-1.c
+++ b/gcc/testsuite/gcc.target/arm/sibcall-1.c
@@ -1,5 +1,6 @@
 /* { dg-do compile { target { arm32 } } } */
 /* { dg-options "-O2" } */
+/* { dg-skip-if "FDPIC does not support sibcall optimization" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 
 #define noinline __attribute__((noinline))
 
diff --git a/gcc/testsuite/gcc.target/arm/stack-red-zone.c b/gcc/testsuite/gcc.target/arm/stack-red-zone.c
index b29ed0b..3385d7d 100644
--- a/gcc/testsuite/gcc.target/arm/stack-red-zone.c
+++ b/gcc/testsuite/gcc.target/arm/stack-red-zone.c
@@ -1,7 +1,7 @@
 /* No stack red zone.  PR38644.  */
 /* { dg-skip-if "incompatible options" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
 /* { dg-options "-mthumb -O2" } */
-/* { dg-final { scan-assembler "ldrb\[^\n\]*\\n\[\t \]*add\[\t \]*sp" } } */
+/* { dg-final { scan-assembler "ldrb\[^\n\]*\\n\[\t \]*add\[\t \]*sp" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
 
 extern int doStreamReadBlock (int *, char *, int size, int);
 
diff --git a/gcc/testsuite/gcc.target/arm/tail-long-call.c b/gcc/testsuite/gcc.target/arm/tail-long-call.c
index 9b27468..f70e9cf 100644
--- a/gcc/testsuite/gcc.target/arm/tail-long-call.c
+++ b/gcc/testsuite/gcc.target/arm/tail-long-call.c
@@ -1,4 +1,5 @@
 /* { dg-skip-if "need at least armv5te" { *-*-* } { "-march=armv[234]*" "-mthumb" } { "" } } */
+/* { dg-skip-if "FDPIC does not support tailcall optimization" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-O2 -march=armv5te -marm" } */
 /* { dg-final { scan-assembler "bx" } } */
 /* { dg-final { scan-assembler-not "blx" } } */
diff --git a/gcc/testsuite/gcc.target/arm/tlscall.c b/gcc/testsuite/gcc.target/arm/tlscall.c
index 366c1ae..5f4d58b 100644
--- a/gcc/testsuite/gcc.target/arm/tlscall.c
+++ b/gcc/testsuite/gcc.target/arm/tlscall.c
@@ -2,6 +2,7 @@
 
 /* { dg-do assemble } */
 /* { dg-options "-O2 -fPIC -mtls-dialect=gnu2" } */
+/* { dg-skip-if "FDPIC does not support gnu2 TLS dialect" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 
 typedef struct _IO_FILE FILE;
 
diff --git a/gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c b/gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c
index fa22b4d..817d5d0 100644
--- a/gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c
+++ b/gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c
@@ -1,4 +1,5 @@
 /* { dg-do run } */
+/* { dg-skip-if "FDPIC does not support sibcall optimization" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-options "-mapcs-frame -O -foptimize-sibling-calls -ffunction-sections" } */
 
 extern void abort (void);
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 15/21] [ARM][testsuite] FDPIC: Adjust scan-assembler patterns.
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (14 preceding siblings ...)
  2018-10-11 13:41 ` [ARM/FDPIC v3 14/21] [ARM][testsuite] FDPIC: Skip unsupported tests Christophe Lyon
@ 2018-10-11 13:41 ` Christophe Lyon
  2018-10-11 13:42 ` [ARM/FDPIC v3 18/21] [ARM][testsuite] FDPIC: Handle *-*-uclinux* Christophe Lyon
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:41 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

In FDPIC mode, r9 is saved in addition to other registers, so update
the expected patterns accordingly.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	* gcc/testsuite/
	* gcc.target/arm/interrupt-1.c: Add scan-assembler pattern for
	arm*-*-uclinuxfdpiceabi.
	* gcc.target/arm/interrupt-2.c: Likewise.
	* gcc.target/arm/pr70830.c: Likewise.

Change-Id: Id946b79bacc32be585c31e60a355191f104cc29e

diff --git a/gcc/testsuite/gcc.target/arm/interrupt-1.c b/gcc/testsuite/gcc.target/arm/interrupt-1.c
index fe94877..493763d 100644
--- a/gcc/testsuite/gcc.target/arm/interrupt-1.c
+++ b/gcc/testsuite/gcc.target/arm/interrupt-1.c
@@ -13,5 +13,7 @@ void foo ()
   bar (0);
 }
 
-/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, fp, ip, lr}" } } */
-/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}\\^" } } */
+/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, fp, ip, lr}" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, fp, ip, pc}\\^" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, r9, fp, ip, lr}" { target arm*-*-uclinuxfdpiceabi } } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, r9, fp, ip, pc}\\^" { target arm*-*-uclinuxfdpiceabi } } } */
diff --git a/gcc/testsuite/gcc.target/arm/interrupt-2.c b/gcc/testsuite/gcc.target/arm/interrupt-2.c
index 289eca0..5be1f16 100644
--- a/gcc/testsuite/gcc.target/arm/interrupt-2.c
+++ b/gcc/testsuite/gcc.target/arm/interrupt-2.c
@@ -15,5 +15,7 @@ void test()
   foo = 0;
 }
 
-/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, ip, lr}" } } */
-/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}\\^" } } */
+/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, ip, lr}" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, ip, pc}\\^" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler "push\t{r0, r1, r2, r3, r4, r5, r6, r9, ip, lr}" { target arm*-*-uclinuxfdpiceabi } } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r5, r6, r9, ip, pc}\\^" { target arm*-*-uclinuxfdpiceabi } } } */
diff --git a/gcc/testsuite/gcc.target/arm/pr70830.c b/gcc/testsuite/gcc.target/arm/pr70830.c
index cad903b..cd84c42 100644
--- a/gcc/testsuite/gcc.target/arm/pr70830.c
+++ b/gcc/testsuite/gcc.target/arm/pr70830.c
@@ -11,4 +11,5 @@ void __attribute__ ((interrupt ("IRQ"))) dm3730_IRQHandler(void)
 {
     prints("IRQ" );
 }
-/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, ip, pc}\\^" } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, ip, pc}\\^" { target { ! arm*-*-uclinuxfdpiceabi } } } } */
+/* { dg-final { scan-assembler "ldmfd\tsp!, {r0, r1, r2, r3, r4, r9, ip, pc}\\^" { target arm*-*-uclinuxfdpiceabi } } } */
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 16/21] [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently produce an ICE
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (12 preceding siblings ...)
  2018-10-11 13:40 ` [ARM/FDPIC v3 13/21] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture Christophe Lyon
@ 2018-10-11 13:41 ` Christophe Lyon
  2018-10-11 13:41 ` [ARM/FDPIC v3 14/21] [ARM][testsuite] FDPIC: Skip unsupported tests Christophe Lyon
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:41 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

v6-M and v8-M are not supported currently in FDPIC mode, it's better
to skip the tests.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
	Mickaël Guêné <mickael.guene@st.com>

	gcc/testsuite/
	* gcc.target/arm/atomic-comp-swap-release-acquire-3.c: Skip on
	arm*-*-uclinuxfdpiceabi.
	* gcc.target/arm/atomic-op-acq_rel-3.c: Likewise.
	* gcc.target/arm/atomic-op-acquire-3.c: Likewise.
	* gcc.target/arm/atomic-op-char-3.c: Likewise.
	* gcc.target/arm/atomic-op-consume-3.c: Likewise.
	* gcc.target/arm/atomic-op-int-3.c: Likewise.
	* gcc.target/arm/atomic-op-relaxed-3.c: Likewise.
	* gcc.target/arm/atomic-op-release-3.c: Likewise.
	* gcc.target/arm/atomic-op-seq_cst-3.c: Likewise.
	* gcc.target/arm/atomic-op-short-3.c: Likewise.
	* gcc.target/arm/pr65647.c: Likewise.

Change-Id: I2357be4c92b5a1a8430ae6617c7bba7bec0ea213

diff --git a/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire-3.c b/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire-3.c
index 0191f7a..81b5c3d 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-comp-swap-release-acquire-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2 -fno-ipa-icf" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c
index f2ed32d..2b03f75 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c
index bba1c27..d315b25 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-char-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-char-3.c
index 17117ee..11e596d 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-char-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-char-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c
index 8352f0c..e5da00b 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-int-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-int-3.c
index d4f1db3..997ab08 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-int-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-int-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c
index 09b5ea9..383a48a 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-release-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-release-3.c
index 2b136f5..3227c75 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-release-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-release-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c
index 7f38d42..77afacb 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/atomic-op-short-3.c b/gcc/testsuite/gcc.target/arm/atomic-op-short-3.c
index 60ae42e..1770cba 100644
--- a/gcc/testsuite/gcc.target/arm/atomic-op-short-3.c
+++ b/gcc/testsuite/gcc.target/arm/atomic-op-short-3.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v8m yet" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v8m_base_ok } */
 /* { dg-options "-O2" } */
 /* { dg-add-options arm_arch_v8m_base } */
diff --git a/gcc/testsuite/gcc.target/arm/pr65647.c b/gcc/testsuite/gcc.target/arm/pr65647.c
index 26b4e39..3ac469d 100644
--- a/gcc/testsuite/gcc.target/arm/pr65647.c
+++ b/gcc/testsuite/gcc.target/arm/pr65647.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-skip-if "FDPIC does not support v6m" { arm*-*-uclinuxfdpiceabi } "*" "" } */
 /* { dg-require-effective-target arm_arch_v6m_ok } */
 /* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } {"-mfloat-abi=soft" } } */
 /* { dg-options "-march=armv6-m -mthumb -O3 -w -mfloat-abi=soft" } */
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 17/21] [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (17 preceding siblings ...)
  2018-10-11 13:42 ` [ARM/FDPIC v3 19/21] [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets Christophe Lyon
@ 2018-10-11 13:42 ` Christophe Lyon
  2018-10-11 13:43 ` [ARM/FDPIC v3 20/21] [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc Christophe Lyon
  2018-10-11 13:56 ` [ARM/FDPIC v3 21/21] [ARM][testsuite] FDPIC: Skip tests using architecture older than v7 Christophe Lyon
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:42 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Some tests fail on arm*-*-uclinuxfdpiceabi because it generates PIC
code and they don't support it: skip them. They also fail on
arm*-linux* when forcing -fPIC.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>

	gcc/testsuite/
	* gcc.target/arm/eliminate.c: Accept only nonpic targets.
	* g++.dg/other/anon5.C: Likewise.

Change-Id: I8efb8d356ce25b020c44a84b07f79a996dca0358

diff --git a/gcc/testsuite/g++.dg/other/anon5.C b/gcc/testsuite/g++.dg/other/anon5.C
index ee4601e..dadd92e 100644
--- a/gcc/testsuite/g++.dg/other/anon5.C
+++ b/gcc/testsuite/g++.dg/other/anon5.C
@@ -1,5 +1,6 @@
 // PR c++/34094
 // { dg-do link { target { ! { *-*-darwin* *-*-hpux* *-*-solaris2.* } } } }
+// { dg-require-effective-target nonpic }
 // { dg-options "-gdwarf-2" }
 // Ignore additional message on powerpc-ibm-aix
 // { dg-prune-output "obtain more information" } */
diff --git a/gcc/testsuite/gcc.target/arm/eliminate.c b/gcc/testsuite/gcc.target/arm/eliminate.c
index f254dd8..299d4df 100644
--- a/gcc/testsuite/gcc.target/arm/eliminate.c
+++ b/gcc/testsuite/gcc.target/arm/eliminate.c
@@ -1,4 +1,4 @@
-/* { dg-do compile } */
+/* { dg-do compile { target { nonpic } } } */
 /* { dg-options "-O2" }  */
 
 struct X
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 19/21] [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (16 preceding siblings ...)
  2018-10-11 13:42 ` [ARM/FDPIC v3 18/21] [ARM][testsuite] FDPIC: Handle *-*-uclinux* Christophe Lyon
@ 2018-10-11 13:42 ` Christophe Lyon
  2018-10-11 13:42 ` [ARM/FDPIC v3 17/21] [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode Christophe Lyon
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:42 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Some tests have the "nonpic" guard, but pass on
arm*-*-uclinuxfdpiceabi because it is in PIE mode by default. Rather
than adding this target to all these tests, add the "pie_enabled"
effective target.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>

	gcc/testsuite/
	* g++.dg/cpp0x/noexcept03.C: Add pie_enabled.
	* g++.dg/ipa/devirt-c-7.C: Likewise.
	* g++.dg/ipa/ivinline-1.C: Likewise.
	* g++.dg/ipa/ivinline-2.C: Likewise.
	* g++.dg/ipa/ivinline-3.C: Likewise.
	* g++.dg/ipa/ivinline-4.C: Likewise.
	* g++.dg/ipa/ivinline-5.C: Likewise.
	* g++.dg/ipa/ivinline-7.C: Likewise.
	* g++.dg/ipa/ivinline-8.C: Likewise.
	* g++.dg/ipa/ivinline-9.C: Likewise.
	* g++.dg/tls/pr79288.C: Likewise.
	* gcc.dg/addr_equal-1.c: Likewise.
	* gcc.dg/const-1.c: Likewise.
	* gcc.dg/ipa/pure-const-1.c: Likewise.
	* gcc.dg/noreturn-8.c: Likewise.
	* gcc.dg/pr33826.c: Likewise.
	* gcc.dg/torture/ipa-pta-1.c: Likewise.
	* gcc.dg/tree-ssa/alias-2.c: Likewise.
	* gcc.dg/tree-ssa/ipa-split-5.c: Likewise.
	* gcc.dg/tree-ssa/loadpre6.c: Likewise.
	* gcc.dg/uninit-19.c: Likewise.

Change-Id: I1a0d836b892c23891f739fccdc467d0f354ab82c

diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept03.C b/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
index 2d37867..906a44d 100644
--- a/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept03.C
@@ -1,6 +1,6 @@
 // Runtime test for noexcept-specification.
 // { dg-options "-Wnoexcept" }
-// { dg-do run { target nonpic } }
+// { dg-do run { target { nonpic || pie_enabled } } }
 // { dg-require-effective-target c++11 }
 
 #include <exception>
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-7.C b/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
index 2e76cbe..efb65c2 100644
--- a/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
+++ b/gcc/testsuite/g++.dg/ipa/devirt-c-7.C
@@ -1,7 +1,6 @@
 /* Verify that ipa-cp will not get confused by placement new constructing an
    object within another one when looking for dynamic type change .  */
-/* { dg-do run } */
-/* { dg-require-effective-target nonpic } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -Wno-attributes"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-1.C b/gcc/testsuite/g++.dg/ipa/ivinline-1.C
index 9b10d20..2d988bc 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-1.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-1.C
@@ -1,6 +1,6 @@
 /* Verify that simple virtual calls are inlined even without early
    inlining.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-2.C b/gcc/testsuite/g++.dg/ipa/ivinline-2.C
index 21cd46f..d978638 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-2.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-2.C
@@ -1,6 +1,6 @@
 /* Verify that simple virtual calls using this pointer are inlined
    even without early inlining..  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-3.C b/gcc/testsuite/g++.dg/ipa/ivinline-3.C
index 1e24644..f756a16 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-3.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-3.C
@@ -1,6 +1,6 @@
 /* Verify that simple virtual calls on an object refrence are inlined
    even without early inlining.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-4.C b/gcc/testsuite/g++.dg/ipa/ivinline-4.C
index cf0d980..5fbd3ef 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-4.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-4.C
@@ -1,7 +1,7 @@
 /* Verify that simple virtual calls are inlined even without early
    inlining, even when a typecast to an ancestor is involved along the
    way.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-5.C b/gcc/testsuite/g++.dg/ipa/ivinline-5.C
index f15ebf2..6c19907 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-5.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-5.C
@@ -1,6 +1,6 @@
 /* Verify that virtual call inlining does not pick a wrong method when
    there is a user defined ancestor in an object.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc/testsuite/g++.dg/ipa/ivinline-7.C
index a7b41e7..fd6aba6 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-7.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-7.C
@@ -1,7 +1,7 @@
 /* Verify that simple virtual calls are inlined even without early
    inlining, even when a typecast to an ancestor is involved along the
    way and that ancestor is not the first one with virtual functions.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-8.C b/gcc/testsuite/g++.dg/ipa/ivinline-8.C
index 5c3299f..bc81abf 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-8.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-8.C
@@ -1,6 +1,6 @@
 /* Verify that virtual calls are inlined (ithout early inlining) even
    when their caller is itself indirectly inlined.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc/testsuite/g++.dg/ipa/ivinline-9.C
index 41b2381..0917f15 100644
--- a/gcc/testsuite/g++.dg/ipa/ivinline-9.C
+++ b/gcc/testsuite/g++.dg/ipa/ivinline-9.C
@@ -2,7 +2,7 @@
    inlining, even when a typecast to an ancestor is involved along the
    way and that ancestor itself has an ancestor wich is not the
    primary base class.  */
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp"  } */
 
 extern "C" void abort (void);
diff --git a/gcc/testsuite/g++.dg/tls/pr79288.C b/gcc/testsuite/g++.dg/tls/pr79288.C
index 9f488df..da6751f 100644
--- a/gcc/testsuite/g++.dg/tls/pr79288.C
+++ b/gcc/testsuite/g++.dg/tls/pr79288.C
@@ -1,5 +1,5 @@
 // PR c++/79288
-// { dg-do compile { target nonpic } }
+// { dg-do compile { target { nonpic || pie_enabled } } }
 // { dg-require-effective-target tls }
 // { dg-options "-O2" }
 // { dg-final { scan-assembler-not "@tpoff" { target i?86-*-* x86_64-*-* } } }
diff --git a/gcc/testsuite/gcc.dg/addr_equal-1.c b/gcc/testsuite/gcc.dg/addr_equal-1.c
index 70fa354..f88b4ef 100644
--- a/gcc/testsuite/gcc.dg/addr_equal-1.c
+++ b/gcc/testsuite/gcc.dg/addr_equal-1.c
@@ -1,5 +1,4 @@
-/* { dg-do run } */
-/* { dg-require-effective-target nonpic } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-require-weak "" } */
 /* { dg-require-alias "" } */
 /* { dg-options "-O2 -fdelete-null-pointer-checks" } */
diff --git a/gcc/testsuite/gcc.dg/const-1.c b/gcc/testsuite/gcc.dg/const-1.c
index a5b2b16..aa20aad 100644
--- a/gcc/testsuite/gcc.dg/const-1.c
+++ b/gcc/testsuite/gcc.dg/const-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target nonpic } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O2 -Wsuggest-attribute=const" } */
 
 extern int extern_const(int a) __attribute__ ((const));
diff --git a/gcc/testsuite/gcc.dg/ipa/pure-const-1.c b/gcc/testsuite/gcc.dg/ipa/pure-const-1.c
index 06b415e..dd58457 100644
--- a/gcc/testsuite/gcc.dg/ipa/pure-const-1.c
+++ b/gcc/testsuite/gcc.dg/ipa/pure-const-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target nonpic } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-tree-local-pure-const1 -fdump-ipa-pure-const -fdump-tree-optimized -fno-early-inlining -fgnu89-inline" } */
 void abort (void);
 int error_code;
diff --git a/gcc/testsuite/gcc.dg/noreturn-8.c b/gcc/testsuite/gcc.dg/noreturn-8.c
index 294800b..ce41cab 100644
--- a/gcc/testsuite/gcc.dg/noreturn-8.c
+++ b/gcc/testsuite/gcc.dg/noreturn-8.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target nonpic } } */
+/* { dg-do run { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O2" } */
 void exit (int);
 void noreturn_autodetection_failed ();
diff --git a/gcc/testsuite/gcc.dg/pr33826.c b/gcc/testsuite/gcc.dg/pr33826.c
index df83915..d222774 100644
--- a/gcc/testsuite/gcc.dg/pr33826.c
+++ b/gcc/testsuite/gcc.dg/pr33826.c
@@ -1,8 +1,7 @@
 /* Regression test for PR middle-end/33826 */
 /* Verify that recursive functions cannot be pure or const.  */
 
-/* { dg-do compile } */
-/* { dg-require-effective-target nonpic } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O1 -fdump-tree-local-pure-const1 -fdump-ipa-pure-const" } */
 
 int recurse1 (int);
diff --git a/gcc/testsuite/gcc.dg/torture/ipa-pta-1.c b/gcc/testsuite/gcc.dg/torture/ipa-pta-1.c
index 1bf4997..30156a3 100644
--- a/gcc/testsuite/gcc.dg/torture/ipa-pta-1.c
+++ b/gcc/testsuite/gcc.dg/torture/ipa-pta-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { nonpic } } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-fipa-pta -fdump-ipa-pta2 -fno-ipa-icf" } */
 /* { dg-skip-if "" { *-*-* } { "-O0" "-fno-fat-lto-objects" } { "" } } */
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-2.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-2.c
index e10a25d..f9d2dd4 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/alias-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-2.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { nonpic } } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O2 -fdump-tree-optimized" } */
 static int a;
 int f;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c
index 2d713d6..3b5a94f 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target nonpic } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O3 -fdump-tree-fnsplit -fdump-tree-optimized --param=builtin-expect-probability=100" } */
 
 struct a {int a,b;};
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c
index 028becd..b4e9296 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target nonpic } } */
+/* { dg-do compile { target { nonpic || pie_enabled } } } */
 /* { dg-options "-O2 -fdump-tree-pre-stats -fdump-tree-fre1" } */
 #include <stddef.h>
 
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 18/21] [ARM][testsuite] FDPIC: Handle *-*-uclinux*
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (15 preceding siblings ...)
  2018-10-11 13:41 ` [ARM/FDPIC v3 15/21] [ARM][testsuite] FDPIC: Adjust scan-assembler patterns Christophe Lyon
@ 2018-10-11 13:42 ` Christophe Lyon
  2018-10-11 13:42 ` [ARM/FDPIC v3 19/21] [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets Christophe Lyon
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:42 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Add *-*-uclinux* to tests that work on this target.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>

	gcc/testsuite/
	* g++.dg/abi/forced.C: Add *-*-uclinux*.
	* g++.dg/abi/guard2.C: Likewise.
	* g++.dg/ext/cleanup-10.C: Likewise.
	* g++.dg/ext/cleanup-11.C: Likewise.
	* g++.dg/ext/cleanup-8.C: Likewise.
	* g++.dg/ext/cleanup-9.C: Likewise.
	* g++.dg/ext/sync-4.C: Likewise.
	* g++.dg/ipa/comdat.C: Likewise.
	* gcc.dg/20041106-1.c: Likewise.
	* gcc.dg/cleanup-10.c: Likewise.
	* gcc.dg/cleanup-11.c: Likewise.
	* gcc.dg/cleanup-8.c: Likewise.
	* gcc.dg/cleanup-9.c: Likewise.
	* gcc.dg/fdata-sections-1.c: Likewise.
	* gcc.dg/fdata-sections-2.c: Likewise.
	* gcc.dg/pr39323-1.c: Likewise.
	* gcc.dg/pr39323-2.c: Likewise.
	* gcc.dg/pr39323-3.c: Likewise.
	* gcc.dg/pr65780-1.c: Likewise.
	* gcc.dg/pr65780-2.c: Likewise.
	* gcc.dg/pr67338.c: Likewise.
	* gcc.dg/pr78185.c: Likewise.
	* gcc.dg/pr83100-1.c: Likewise.
	* gcc.dg/pr83100-4.c: Likewise.
	* gcc.dg/strlenopt-12g.c: Likewise.
	* gcc.dg/strlenopt-14g.c: Likewise.
	* gcc.dg/strlenopt-14gf.c: Likewise.
	* gcc.dg/strlenopt-16g.c: Likewise.
	* gcc.dg/strlenopt-17g.c: Likewise.
	* gcc.dg/strlenopt-18g.c: Likewise.
	* gcc.dg/strlenopt-1f.c: Likewise.
	* gcc.dg/strlenopt-22g.c: Likewise.
	* gcc.dg/strlenopt-2f.c: Likewise.
	* gcc.dg/strlenopt-31g.c: Likewise.
	* gcc.dg/strlenopt-33g.c: Likewise.
	* gcc.dg/strlenopt-4g.c: Likewise.
	* gcc.dg/strlenopt-4gf.c: Likewise.
	* gcc.dg/strncmp-2.c: Likewise.
	* gcc.dg/struct-ret-3.c: Likewise.
	* gcc.dg/torture/pr69760.c: Likewise.
	* gcc.target/arm/div64-unwinding.c: Likewise.
	* gcc.target/arm/stack-checking.c: Likewise.
	* gcc.target/arm/synchronize.c: Likewise.
	* gcc.target/arm/pr66912.c: Add arm*-*-uclinuxfdpiceabi.
	* lib/target-supports.exp (check_effective_target_pie): Likewise.
	(check_effective_target_sync_long_long_runtime): Likewise.
	(check_effective_target_sync_int_long): Likewise.
	(check_effective_target_sync_char_short): Likewise.

Change-Id: I89bfea79d4490c5df0b6470def5a31d7f31ac2cc

diff --git a/gcc/testsuite/g++.dg/abi/forced.C b/gcc/testsuite/g++.dg/abi/forced.C
index 0e6be28..2d1ec53 100644
--- a/gcc/testsuite/g++.dg/abi/forced.C
+++ b/gcc/testsuite/g++.dg/abi/forced.C
@@ -1,4 +1,4 @@
-// { dg-do run { target *-*-linux* *-*-gnu* } }
+// { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } }
 // { dg-options "-pthread" }
 
 #include <pthread.h>
diff --git a/gcc/testsuite/g++.dg/abi/guard2.C b/gcc/testsuite/g++.dg/abi/guard2.C
index c35fa7e..74139a8 100644
--- a/gcc/testsuite/g++.dg/abi/guard2.C
+++ b/gcc/testsuite/g++.dg/abi/guard2.C
@@ -1,6 +1,6 @@
 // PR c++/41611
 // Test that the guard gets its own COMDAT group.
-// { dg-final { scan-assembler "_ZGVZN1A1fEvE1i,comdat" { target *-*-linux* *-*-gnu* } } }
+// { dg-final { scan-assembler "_ZGVZN1A1fEvE1i,comdat" { target *-*-linux* *-*-gnu* *-*-uclinux* } } }
 
 struct A {
   static int f()
diff --git a/gcc/testsuite/g++.dg/ext/cleanup-10.C b/gcc/testsuite/g++.dg/ext/cleanup-10.C
index 66c7b76..56aeb66 100644
--- a/gcc/testsuite/g++.dg/ext/cleanup-10.C
+++ b/gcc/testsuite/g++.dg/ext/cleanup-10.C
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through signal frames
    on alternate stack.  */
diff --git a/gcc/testsuite/g++.dg/ext/cleanup-11.C b/gcc/testsuite/g++.dg/ext/cleanup-11.C
index 6e96521..c6d3560 100644
--- a/gcc/testsuite/g++.dg/ext/cleanup-11.C
+++ b/gcc/testsuite/g++.dg/ext/cleanup-11.C
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through realtime signal
    frames on alternate stack.  */
diff --git a/gcc/testsuite/g++.dg/ext/cleanup-8.C b/gcc/testsuite/g++.dg/ext/cleanup-8.C
index ccf9bef..e99508d 100644
--- a/gcc/testsuite/g++.dg/ext/cleanup-8.C
+++ b/gcc/testsuite/g++.dg/ext/cleanup-8.C
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through signal
    frames.  */
diff --git a/gcc/testsuite/g++.dg/ext/cleanup-9.C b/gcc/testsuite/g++.dg/ext/cleanup-9.C
index dcdfcae..45e5f90 100644
--- a/gcc/testsuite/g++.dg/ext/cleanup-9.C
+++ b/gcc/testsuite/g++.dg/ext/cleanup-9.C
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through realtime
    signal frames.  */
diff --git a/gcc/testsuite/g++.dg/ext/sync-4.C b/gcc/testsuite/g++.dg/ext/sync-4.C
index 47aa1e3..409f526 100644
--- a/gcc/testsuite/g++.dg/ext/sync-4.C
+++ b/gcc/testsuite/g++.dg/ext/sync-4.C
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-require-effective-target sync_long_long_runtime } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* { dg-additional-options "-march=pentium" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
diff --git a/gcc/testsuite/g++.dg/ipa/comdat.C b/gcc/testsuite/g++.dg/ipa/comdat.C
index 1945e32..f3df99a 100644
--- a/gcc/testsuite/g++.dg/ipa/comdat.C
+++ b/gcc/testsuite/g++.dg/ipa/comdat.C
@@ -1,4 +1,4 @@
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-ipa-comdats"  } */
 #include <stdio.h>
 __attribute__ ((noinline))
diff --git a/gcc/testsuite/gcc.dg/20041106-1.c b/gcc/testsuite/gcc.dg/20041106-1.c
index cba4a06..95579ff 100644
--- a/gcc/testsuite/gcc.dg/20041106-1.c
+++ b/gcc/testsuite/gcc.dg/20041106-1.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target *-*-linux* *-*-gnu* *-*-solaris* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-solaris* *-*-uclinux* } } */
 /* { dg-options -O2 } */
 
 #include <sys/types.h>
diff --git a/gcc/testsuite/gcc.dg/cleanup-10.c b/gcc/testsuite/gcc.dg/cleanup-10.c
index 16035b1..a9c0461 100644
--- a/gcc/testsuite/gcc.dg/cleanup-10.c
+++ b/gcc/testsuite/gcc.dg/cleanup-10.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through signal frames
    on alternate stack.  */
diff --git a/gcc/testsuite/gcc.dg/cleanup-11.c b/gcc/testsuite/gcc.dg/cleanup-11.c
index ccc61ed..53d09be 100644
--- a/gcc/testsuite/gcc.dg/cleanup-11.c
+++ b/gcc/testsuite/gcc.dg/cleanup-11.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through realtime signal
    frames on alternate stack.  */
diff --git a/gcc/testsuite/gcc.dg/cleanup-8.c b/gcc/testsuite/gcc.dg/cleanup-8.c
index 553c038..53a6366 100644
--- a/gcc/testsuite/gcc.dg/cleanup-8.c
+++ b/gcc/testsuite/gcc.dg/cleanup-8.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through signal
    frames.  */
diff --git a/gcc/testsuite/gcc.dg/cleanup-9.c b/gcc/testsuite/gcc.dg/cleanup-9.c
index fe28072..e0ab2d1 100644
--- a/gcc/testsuite/gcc.dg/cleanup-9.c
+++ b/gcc/testsuite/gcc.dg/cleanup-9.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */
+/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* *-*-uclinux* } } */
 /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
 /* Verify that cleanups work with exception handling through realtime
    signal frames.  */
diff --git a/gcc/testsuite/gcc.dg/fdata-sections-1.c b/gcc/testsuite/gcc.dg/fdata-sections-1.c
index 51686b9..e8a6639 100644
--- a/gcc/testsuite/gcc.dg/fdata-sections-1.c
+++ b/gcc/testsuite/gcc.dg/fdata-sections-1.c
@@ -1,7 +1,7 @@
 /* PR middle-end/15486 */
 /* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
 
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-fdata-sections" } */
 
 int x;
diff --git a/gcc/testsuite/gcc.dg/fdata-sections-2.c b/gcc/testsuite/gcc.dg/fdata-sections-2.c
index dda90ba7..48d44a2 100644
--- a/gcc/testsuite/gcc.dg/fdata-sections-2.c
+++ b/gcc/testsuite/gcc.dg/fdata-sections-2.c
@@ -4,7 +4,7 @@
 /* This checks that string constants are put in per-function rodata
    sections, so that they can be garbage collected.  */
 
-/* { dg-do compile { target *-*-linux* } } */
+/* { dg-do compile { target *-*-linux* *-*-uclinux* } } */
 /* { dg-options "-O -ffunction-sections -fdata-sections" } */
 
 const char *f1(void) { return "falderalde"; }
diff --git a/gcc/testsuite/gcc.dg/pr39323-1.c b/gcc/testsuite/gcc.dg/pr39323-1.c
index 5e3baec..30f8e97 100644
--- a/gcc/testsuite/gcc.dg/pr39323-1.c
+++ b/gcc/testsuite/gcc.dg/pr39323-1.c
@@ -1,5 +1,5 @@
 /* PR c/39323 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 
 int foo __attribute__ ((aligned(1 << 29))) =  20; /* { dg-error "requested alignment is too large" } */
 typedef int __attribute__ ((aligned(1 << 29))) int29; /* { dg-error "requested alignment is too large" } */
diff --git a/gcc/testsuite/gcc.dg/pr39323-2.c b/gcc/testsuite/gcc.dg/pr39323-2.c
index a870729..6b6cb2e 100644
--- a/gcc/testsuite/gcc.dg/pr39323-2.c
+++ b/gcc/testsuite/gcc.dg/pr39323-2.c
@@ -1,5 +1,5 @@
 /* PR c/39323 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 
 int bar __attribute__ ((aligned(1 << 28))) =  20;
 
diff --git a/gcc/testsuite/gcc.dg/pr39323-3.c b/gcc/testsuite/gcc.dg/pr39323-3.c
index b452d3c..2e2c1a2 100644
--- a/gcc/testsuite/gcc.dg/pr39323-3.c
+++ b/gcc/testsuite/gcc.dg/pr39323-3.c
@@ -1,5 +1,5 @@
 /* PR c/39323 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 
 typedef int __attribute__ ((aligned(1 << 28))) int28;
 int28 foo = 20;
diff --git a/gcc/testsuite/gcc.dg/pr65780-1.c b/gcc/testsuite/gcc.dg/pr65780-1.c
index b586211..5e3226e 100644
--- a/gcc/testsuite/gcc.dg/pr65780-1.c
+++ b/gcc/testsuite/gcc.dg/pr65780-1.c
@@ -1,5 +1,5 @@
 /* PR target/65780 */
-/* { dg-do link { target *-*-linux* *-*-gnu* } } */
+/* { dg-do link { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2" } */
 
 int optopt;
diff --git a/gcc/testsuite/gcc.dg/pr65780-2.c b/gcc/testsuite/gcc.dg/pr65780-2.c
index bff3323..932cbe1 100644
--- a/gcc/testsuite/gcc.dg/pr65780-2.c
+++ b/gcc/testsuite/gcc.dg/pr65780-2.c
@@ -1,5 +1,5 @@
 /* PR target/65780 */
-/* { dg-do link { target *-*-linux* *-*-gnu* } } */
+/* { dg-do link { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-require-effective-target pie } */
 /* { dg-options "-O2 -fpie" } */
 
diff --git a/gcc/testsuite/gcc.dg/pr67338.c b/gcc/testsuite/gcc.dg/pr67338.c
index 0fdc302..7bfbef2 100644
--- a/gcc/testsuite/gcc.dg/pr67338.c
+++ b/gcc/testsuite/gcc.dg/pr67338.c
@@ -1,4 +1,4 @@
 /* PR c/67338 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 
 struct S { __attribute__((aligned (1 << 28))) double a; };
diff --git a/gcc/testsuite/gcc.dg/pr78185.c b/gcc/testsuite/gcc.dg/pr78185.c
index 405f748..d7781b2 100644
--- a/gcc/testsuite/gcc.dg/pr78185.c
+++ b/gcc/testsuite/gcc.dg/pr78185.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O" } */
 
 #include <unistd.h>
diff --git a/gcc/testsuite/gcc.dg/pr83100-1.c b/gcc/testsuite/gcc.dg/pr83100-1.c
index 233c1f6..ccfb8c6 100644
--- a/gcc/testsuite/gcc.dg/pr83100-1.c
+++ b/gcc/testsuite/gcc.dg/pr83100-1.c
@@ -1,5 +1,5 @@
 /* PR target/83100 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fcommon -fdata-sections" } */
 
 const int a;
diff --git a/gcc/testsuite/gcc.dg/pr83100-4.c b/gcc/testsuite/gcc.dg/pr83100-4.c
index bb26735..2f83247 100644
--- a/gcc/testsuite/gcc.dg/pr83100-4.c
+++ b/gcc/testsuite/gcc.dg/pr83100-4.c
@@ -1,5 +1,5 @@
 /* PR target/83100 */
-/* { dg-do compile { target *-*-linux* *-*-gnu* } } */
+/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fno-common -fdata-sections" } */
 
 const int a;
diff --git a/gcc/testsuite/gcc.dg/strlenopt-12g.c b/gcc/testsuite/gcc.dg/strlenopt-12g.c
index f1dec1f..fb0eeb2 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-12g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-12g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-14g.c b/gcc/testsuite/gcc.dg/strlenopt-14g.c
index 62a83bf..8bce645 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-14g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-14g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy and mempcpy functions.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 /* Bionic targets don't have mempcpy */
 /* { dg-require-effective-target non_bionic } */
diff --git a/gcc/testsuite/gcc.dg/strlenopt-14gf.c b/gcc/testsuite/gcc.dg/strlenopt-14gf.c
index 8b126fc..cc9092b 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-14gf.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-14gf.c
@@ -1,6 +1,6 @@
 /* This test needs runtime that provides stpcpy, mempcpy and __*_chk
    functions.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 /* Bionic targets don't have mempcpy */
 /* { dg-require-effective-target non_bionic } */
diff --git a/gcc/testsuite/gcc.dg/strlenopt-16g.c b/gcc/testsuite/gcc.dg/strlenopt-16g.c
index 0cf8410..8b8f0d6 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-16g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-16g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-17g.c b/gcc/testsuite/gcc.dg/strlenopt-17g.c
index 184e530..0d5f559 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-17g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-17g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-18g.c b/gcc/testsuite/gcc.dg/strlenopt-18g.c
index f734675..e3706d2 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-18g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-18g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-1f.c b/gcc/testsuite/gcc.dg/strlenopt-1f.c
index 856774d..bb320ab 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-1f.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-1f.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides __*_chk functions.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinu* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define FORTIFY_SOURCE 2
diff --git a/gcc/testsuite/gcc.dg/strlenopt-22g.c b/gcc/testsuite/gcc.dg/strlenopt-22g.c
index 9c5d020..348903f 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-22g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-22g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-2f.c b/gcc/testsuite/gcc.dg/strlenopt-2f.c
index 1e915da..f61a8ba 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-2f.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-2f.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides __*_chk functions.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define FORTIFY_SOURCE 2
diff --git a/gcc/testsuite/gcc.dg/strlenopt-31g.c b/gcc/testsuite/gcc.dg/strlenopt-31g.c
index 45cc29c..3588b06 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-31g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-31g.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-33g.c b/gcc/testsuite/gcc.dg/strlenopt-33g.c
index 7d24d2b..8566782 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-33g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-33g.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-4g.c b/gcc/testsuite/gcc.dg/strlenopt-4g.c
index 879d566..c6a2d6f 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-4g.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-4g.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy function.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strlenopt-4gf.c b/gcc/testsuite/gcc.dg/strlenopt-4gf.c
index 7f261b7..2783c3b 100644
--- a/gcc/testsuite/gcc.dg/strlenopt-4gf.c
+++ b/gcc/testsuite/gcc.dg/strlenopt-4gf.c
@@ -1,5 +1,5 @@
 /* This test needs runtime that provides stpcpy and __*_chk functions.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2 -fdump-tree-strlen" } */
 
 #define USE_GNU
diff --git a/gcc/testsuite/gcc.dg/strncmp-2.c b/gcc/testsuite/gcc.dg/strncmp-2.c
index f5555ba..6818b30 100644
--- a/gcc/testsuite/gcc.dg/strncmp-2.c
+++ b/gcc/testsuite/gcc.dg/strncmp-2.c
@@ -1,5 +1,5 @@
 /* Test strncmp builtin expansion for compilation and proper execution.  */
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-options "-O2" } */
 /* { dg-require-effective-target ptr32plus } */
 
diff --git a/gcc/testsuite/gcc.dg/struct-ret-3.c b/gcc/testsuite/gcc.dg/struct-ret-3.c
index 4083bb4..4c0a0e6 100644
--- a/gcc/testsuite/gcc.dg/struct-ret-3.c
+++ b/gcc/testsuite/gcc.dg/struct-ret-3.c
@@ -1,7 +1,7 @@
 /* PR middle-end/31309 */
 /* Origin: Peeter Joot <peeterj@ca.ibm.com> */
 
-/* { dg-do run { target *-*-linux* *-*-gnu* } } */
+/* { dg-do run { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
 /* { dg-add-options stack_size } */
  
 #include <sys/mman.h>
diff --git a/gcc/testsuite/gcc.dg/torture/pr69760.c b/gcc/testsuite/gcc.dg/torture/pr69760.c
index 8f24608..53733c7 100644
--- a/gcc/testsuite/gcc.dg/torture/pr69760.c
+++ b/gcc/testsuite/gcc.dg/torture/pr69760.c
@@ -1,5 +1,5 @@
 /* PR tree-optimization/69760 */
-/* { dg-do run { target { { *-*-linux* *-*-gnu* } && mmap } } } */
+/* { dg-do run { target { { *-*-linux* *-*-gnu* *-*-uclinux* } && mmap } } } */
 /* { dg-options "-O2" } */
 
 #include <unistd.h>
diff --git a/gcc/testsuite/gcc.target/arm/div64-unwinding.c b/gcc/testsuite/gcc.target/arm/div64-unwinding.c
index 7f112ee..0944281 100644
--- a/gcc/testsuite/gcc.target/arm/div64-unwinding.c
+++ b/gcc/testsuite/gcc.target/arm/div64-unwinding.c
@@ -1,6 +1,6 @@
 /* Performing a 64-bit division should not pull in the unwinder.  */
 
-/* { dg-do run { target { ! *-*-linux* } } } */
+/* { dg-do run { target { { ! *-*-linux* } && { ! *-*-uclinux* } } } } */
 /* { dg-options "-O0" } */
 
 #include <stdlib.h>
diff --git a/gcc/testsuite/gcc.target/arm/pr66912.c b/gcc/testsuite/gcc.target/arm/pr66912.c
index 27e4c45..7e6294c 100644
--- a/gcc/testsuite/gcc.target/arm/pr66912.c
+++ b/gcc/testsuite/gcc.target/arm/pr66912.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target *-*-linux* } } */
+/* { dg-do compile { target *-*-linux* arm*-*-uclinuxfdpiceabi } } */
 /* { dg-options "-O2 -fpic" } */
 
 __attribute__((visibility("protected")))
diff --git a/gcc/testsuite/gcc.target/arm/stack-checking.c b/gcc/testsuite/gcc.target/arm/stack-checking.c
index 4b53bed..9d1d2b0 100644
--- a/gcc/testsuite/gcc.target/arm/stack-checking.c
+++ b/gcc/testsuite/gcc.target/arm/stack-checking.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target { *-*-linux* } } } */
+/* { dg-do run { target { *-*-linux* *-*-uclinux* } } } */
 /* { dg-require-stack-check "" } */
 /* { dg-options "-fstack-check" } */
 
diff --git a/gcc/testsuite/gcc.target/arm/synchronize.c b/gcc/testsuite/gcc.target/arm/synchronize.c
index 7ef10e2..912f407 100644
--- a/gcc/testsuite/gcc.target/arm/synchronize.c
+++ b/gcc/testsuite/gcc.target/arm/synchronize.c
@@ -1,4 +1,4 @@
-/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-* } } } */
+/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-* arm*-*-uclinux* } } } */
 
 void *foo (void)
 {
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index b82c332..79371d7 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -1168,6 +1168,7 @@ proc check_effective_target_pie { } {
 	 || [istarget *-*-dragonfly*]
 	 || [istarget *-*-freebsd*]
 	 || [istarget *-*-linux*]
+	 || [istarget arm*-*-uclinuxfdpiceabi]
 	 || [istarget *-*-gnu*] } {
 	return 1;
     }
@@ -6520,6 +6521,7 @@ proc check_effective_target_sync_long_long_runtime { } {
 	      } ""
 	  }])
 	 || [istarget aarch64*-*-*]
+	 || [istarget arm*-*-uclinuxfdpiceabi]
 	 || ([istarget arm*-*-linux-*]
 	     && [check_runtime sync_longlong_runtime {
 		 #include <stdlib.h>
@@ -6580,6 +6582,7 @@ proc check_effective_target_sync_int_long { } {
 	     || [istarget aarch64*-*-*]
 	     || [istarget alpha*-*-*] 
 	     || [istarget arm*-*-linux-*] 
+	     || [istarget arm*-*-uclinuxfdpiceabi] 
 	     || ([istarget arm*-*-*]
 		 && [check_effective_target_arm_acq_rel])
 	     || [istarget bfin*-*linux*]
@@ -6604,6 +6607,7 @@ proc check_effective_target_sync_char_short { } {
 	     || [istarget i?86-*-*] || [istarget x86_64-*-*]
 	     || [istarget alpha*-*-*] 
 	     || [istarget arm*-*-linux-*] 
+	     || [istarget arm*-*-uclinuxfdpiceabi] 
 	     || ([istarget arm*-*-*]
 		 && [check_effective_target_arm_acq_rel])
 	     || [istarget hppa*-*linux*]
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 20/21] [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc.
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (18 preceding siblings ...)
  2018-10-11 13:42 ` [ARM/FDPIC v3 17/21] [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode Christophe Lyon
@ 2018-10-11 13:43 ` Christophe Lyon
  2018-10-11 13:56 ` [ARM/FDPIC v3 21/21] [ARM][testsuite] FDPIC: Skip tests using architecture older than v7 Christophe Lyon
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:43 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

uclibc defines bswap_32, so use a different name in this test.

2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>

	gcc/testsuite/
	* gcc.target/arm/pr43698.c (bswap_32): Rename as my_bswap_32.

Change-Id: I2591bd911030814331cabf97ee5cf6cf8124b4f3

diff --git a/gcc/testsuite/gcc.target/arm/pr43698.c b/gcc/testsuite/gcc.target/arm/pr43698.c
index 1fc497c..3b5dad0 100644
--- a/gcc/testsuite/gcc.target/arm/pr43698.c
+++ b/gcc/testsuite/gcc.target/arm/pr43698.c
@@ -6,7 +6,7 @@
 
 char do_reverse_endian = 0;
 
-#  define bswap_32(x) \
+#  define my_bswap_32(x) \
   ((((x) & 0xff000000) >> 24) | \
    (((x) & 0x00ff0000) >>  8) | \
    (((x) & 0x0000ff00) <<  8) | \
@@ -16,7 +16,7 @@ char do_reverse_endian = 0;
   (__extension__ ({ \
       uint64_t __res; \
       if (!do_reverse_endian) {    __res = (X); \
-      } else if (sizeof(X) == 4) { __res = bswap_32((X)); \
+      } else if (sizeof(X) == 4) { __res = my_bswap_32((X)); \
       } \
       __res; \
     }))
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [ARM/FDPIC v3 21/21] [ARM][testsuite] FDPIC: Skip tests using architecture older than v7
  2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
                   ` (19 preceding siblings ...)
  2018-10-11 13:43 ` [ARM/FDPIC v3 20/21] [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc Christophe Lyon
@ 2018-10-11 13:56 ` Christophe Lyon
  20 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:56 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Since FDPIC requires an architecture >=7, these tests fail because
they enforce and older version. They would pass if the compiler didn't
bail out though.

2018-07-13  Christophe Lyon  <christophe.lyon@linaro.org>

	* gcc.target/arm/armv6-unaligned-load-ice.c: Add arm_arch
	effective-target.
	* gcc.target/arm/attr-unaligned-load-ice.c: Likewise.
	* gcc.target/arm/attr_arm-err.c: Likewise.
	* gcc.target/arm/ftest-armv4-arm.c: Likewise.
	* gcc.target/arm/ftest-armv4t-arm.c: Likewise.
	* gcc.target/arm/ftest-armv4t-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv5t-arm.c: Likewise.
	* gcc.target/arm/ftest-armv5t-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv5te-arm.c: Likewise.
	* gcc.target/arm/ftest-armv5te-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv6-arm.c: Likewise.
	* gcc.target/arm/ftest-armv6-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv6k-arm.c: Likewise.
	* gcc.target/arm/ftest-armv6k-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv6m-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv6t2-arm.c: Likewise.
	* gcc.target/arm/ftest-armv6t2-thumb.c: Likewise.
	* gcc.target/arm/ftest-armv6z-arm.c: Likewise.
	* gcc.target/arm/ftest-armv6z-thumb.c: Likewise.
	* gcc.target/arm/g2.c: Likewise.
	* gcc.target/arm/macro_defs1.c: Likewise.
	* gcc.target/arm/pr59858.c: Likewise.
	* gcc.target/arm/pr65647-2.c: Likewise.
	* gcc.target/arm/pr79058.c: Likewise.
	* gcc.target/arm/pr83712.c: Likewise.
	* gcc.target/arm/pragma_arch_switch_2.c: Likewise.
	* gcc.target/arm/scd42-1.c: Likewise.
	* gcc.target/arm/scd42-2.c: Likewise.
	* gcc.target/arm/scd42-3.c: Likewise.

Change-Id: I0845b262b241026561cc52a19ff8bb1659675e49

diff --git a/gcc/testsuite/gcc.target/arm/armv6-unaligned-load-ice.c b/gcc/testsuite/gcc.target/arm/armv6-unaligned-load-ice.c
index 88528f1..4c1568f 100644
--- a/gcc/testsuite/gcc.target/arm/armv6-unaligned-load-ice.c
+++ b/gcc/testsuite/gcc.target/arm/armv6-unaligned-load-ice.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6k" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6k_ok } */
 /* { dg-options "-mthumb -Os -mfloat-abi=softfp" } */
 /* { dg-add-options arm_arch_v6k } */
 
diff --git a/gcc/testsuite/gcc.target/arm/attr-unaligned-load-ice.c b/gcc/testsuite/gcc.target/arm/attr-unaligned-load-ice.c
index e1ed1c1..2eeb522 100644
--- a/gcc/testsuite/gcc.target/arm/attr-unaligned-load-ice.c
+++ b/gcc/testsuite/gcc.target/arm/attr-unaligned-load-ice.c
@@ -2,6 +2,7 @@
    Verify that unaligned_access is correctly with attribute target.  */
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6" } } */
+/* { dg-require-effective-target arm_arch_v6_ok } */
 /* { dg-options "-Os -mfloat-abi=softfp -mtp=soft" } */
 /* { dg-add-options arm_arch_v6 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/attr_arm-err.c b/gcc/testsuite/gcc.target/arm/attr_arm-err.c
index 630c06a..d410056 100644
--- a/gcc/testsuite/gcc.target/arm/attr_arm-err.c
+++ b/gcc/testsuite/gcc.target/arm/attr_arm-err.c
@@ -2,6 +2,7 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target arm_arm_ok } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6-m" } } */
+/* { dg-require-effective-target arm_arch_v6m_ok } */
 /* { dg-add-options arm_arch_v6m } */
 
 int __attribute__((target("arm")))
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c
index 4b48ef8..447a8ec 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv4" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v4_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v4 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c
index 016506f..05db533 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv4t" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v4t_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v4t } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c
index 9ef944e..7857f56 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv4t" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v4t_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v4t } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c
index a9403e9..bea25d09 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv5t" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5t_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v5t } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c
index f3ad07e..6de9389 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv5t" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5t_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v5t } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c
index f98c01a..7b37c7f 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv5te" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v5te } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c
index 5d71787..c056241 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv5te" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v5te } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c
index 88a5089..bfab765 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v6 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c
index 90ef9d2..dc1871c 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v6 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c
index 8de021a..721c9f9 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6k" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6k_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v6k } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c
index c2fc270..bf269c9 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6k" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6k_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v6k } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c
index ee075e2..27f71be 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6-m" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6m_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v6m } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c
index 83b4bc4..259d2b5 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6t2" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6t2_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v6t2 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c
index 1a1cbc5..e624ec5 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6t2" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6t2_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v6t2 } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c b/gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c
index e2df0d4..66380bf 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6z" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6z_ok } */
 /* { dg-options "-marm" } */
 /* { dg-add-options arm_arch_v6z } */
 
diff --git a/gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c b/gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c
index e4b94ef..2f1d6a6 100644
--- a/gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c
+++ b/gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6z" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6z_ok } */
 /* { dg-options "-mthumb" } */
 /* { dg-add-options arm_arch_v6z } */
 
diff --git a/gcc/testsuite/gcc.target/arm/g2.c b/gcc/testsuite/gcc.target/arm/g2.c
index e368017..da68c8b 100644
--- a/gcc/testsuite/gcc.target/arm/g2.c
+++ b/gcc/testsuite/gcc.target/arm/g2.c
@@ -4,6 +4,7 @@
 /* { dg-skip-if "Test is specific to the Xscale" { arm*-*-* } { "-march=*" } { "-march=xscale" } } */
 /* { dg-skip-if "Test is specific to the Xscale" { arm*-*-* } { "-mcpu=*" } { "-mcpu=xscale" } } */
 /* { dg-skip-if "Test is specific to ARM mode" { arm*-*-* } { "-mthumb" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-require-effective-target arm32 } */
 
 /* Brett Gaines' test case. */
diff --git a/gcc/testsuite/gcc.target/arm/macro_defs1.c b/gcc/testsuite/gcc.target/arm/macro_defs1.c
index 4cc9ae6..655ba93 100644
--- a/gcc/testsuite/gcc.target/arm/macro_defs1.c
+++ b/gcc/testsuite/gcc.target/arm/macro_defs1.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-march=*" } { "-march=armv6-m" } } */
 /* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" } { "" } } */
+/* { dg-require-effective-target arm_arch_v6m_ok } */
 /* { dg-options "-march=armv6-m -mthumb" } */
 
 #ifdef __ARM_NEON_FP
diff --git a/gcc/testsuite/gcc.target/arm/pr59858.c b/gcc/testsuite/gcc.target/arm/pr59858.c
index a944b9a..793453e 100644
--- a/gcc/testsuite/gcc.target/arm/pr59858.c
+++ b/gcc/testsuite/gcc.target/arm/pr59858.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-march=armv5te -fno-builtin -mfloat-abi=soft -mthumb -fno-stack-protector -Os -fno-tree-loop-optimize -fno-tree-dominator-opts -fPIC -w" } */
 /* { dg-skip-if "Incompatible command line options: -mfloat-abi=soft -mfloat-abi=hard" { *-*-* } { "-mfloat-abi=hard" } { "" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 
 typedef enum {
  REG_ENOSYS = -1,
diff --git a/gcc/testsuite/gcc.target/arm/pr65647-2.c b/gcc/testsuite/gcc.target/arm/pr65647-2.c
index f2985f8..3d9e75f 100644
--- a/gcc/testsuite/gcc.target/arm/pr65647-2.c
+++ b/gcc/testsuite/gcc.target/arm/pr65647-2.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-require-effective-target arm_arch_v6_ok } */
 /* { dg-options "-O3 -marm -march=armv6 -std=c99" } */
 
 typedef struct {
diff --git a/gcc/testsuite/gcc.target/arm/pr79058.c b/gcc/testsuite/gcc.target/arm/pr79058.c
index 54a1d8a..7d078ac 100644
--- a/gcc/testsuite/gcc.target/arm/pr79058.c
+++ b/gcc/testsuite/gcc.target/arm/pr79058.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target arm_arm_ok } */
+/* { dg-require-effective-target arm_arch_v4_ok } */
 /* { dg-skip-if "do not override -mcpu" { *-*-* } { "-mcpu=*" } { "-mcpu=arm7tdmi" } } */
 /* { dg-options "-Os -mbig-endian -marm -mcpu=arm7tdmi" } */
 
diff --git a/gcc/testsuite/gcc.target/arm/pr83712.c b/gcc/testsuite/gcc.target/arm/pr83712.c
index 8ed8cdf..93d20c2 100644
--- a/gcc/testsuite/gcc.target/arm/pr83712.c
+++ b/gcc/testsuite/gcc.target/arm/pr83712.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-require-effective-target arm_arch_v5t_ok } */
 /* { dg-options "-mfloat-abi=softfp -mthumb -march=armv5t -O2" }  */
 #pragma GCC optimize ("-O2")
 
diff --git a/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c b/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c
index b6211f9..c3361e7 100644
--- a/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c
+++ b/gcc/testsuite/gcc.target/arm/pragma_arch_switch_2.c
@@ -2,6 +2,7 @@
 /* { dg-skip-if "instruction not valid on thumb" { *-*-* } { "-mthumb" } { "" } } */
 /* { dg-do assemble } */
 /* { dg-require-effective-target arm_arm_ok } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-additional-options "-Wall -O2 -march=armv5te -std=gnu99 -marm" } */
 
 #pragma GCC target ("arch=armv6")
diff --git a/gcc/testsuite/gcc.target/arm/scd42-1.c b/gcc/testsuite/gcc.target/arm/scd42-1.c
index be60e64..2b8fc0b 100644
--- a/gcc/testsuite/gcc.target/arm/scd42-1.c
+++ b/gcc/testsuite/gcc.target/arm/scd42-1.c
@@ -3,6 +3,7 @@
 /* { dg-skip-if "Test is specific to Xscale" { arm*-*-* } { "-march=*" } { "-march=xscale" } } */
 /* { dg-skip-if "Test is specific to Xscale" { arm*-*-* } { "-mcpu=*" } { "-mcpu=xscale" } } */
 /* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=softfp" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-mcpu=xscale -O -mfloat-abi=softfp" } */
 
 unsigned load1(void) __attribute__ ((naked));
diff --git a/gcc/testsuite/gcc.target/arm/scd42-2.c b/gcc/testsuite/gcc.target/arm/scd42-2.c
index 6d9e5e1..4181a75 100644
--- a/gcc/testsuite/gcc.target/arm/scd42-2.c
+++ b/gcc/testsuite/gcc.target/arm/scd42-2.c
@@ -4,6 +4,7 @@
 /* { dg-skip-if "Test is specific to the Xscale" { arm*-*-* } { "-mcpu=*" } { "-mcpu=xscale" } } */
 /* { dg-skip-if "Test is specific to ARM mode" { arm*-*-* } { "-mthumb" } { "" } } */
 /* { dg-require-effective-target arm32 } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-mcpu=xscale -O -marm" } */
 
 unsigned load2(void) __attribute__ ((naked));
diff --git a/gcc/testsuite/gcc.target/arm/scd42-3.c b/gcc/testsuite/gcc.target/arm/scd42-3.c
index e566cb2..0afd121 100644
--- a/gcc/testsuite/gcc.target/arm/scd42-3.c
+++ b/gcc/testsuite/gcc.target/arm/scd42-3.c
@@ -3,6 +3,7 @@
 /* { dg-skip-if "Test is specific to Xscale" { arm*-*-* } { "-march=*" } { "-march=xscale" } } */
 /* { dg-skip-if "Test is specific to Xscale" { arm*-*-* } { "-mcpu=*" } { "-mcpu=xscale" } } */
 /* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=softfp" } } */
+/* { dg-require-effective-target arm_arch_v5te_ok } */
 /* { dg-options "-mcpu=xscale -O -mfloat-abi=softfp" } */
 
 unsigned load4(void) __attribute__ ((naked));
-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support
  2018-10-11 13:36 ` [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support Christophe Lyon
@ 2018-10-12 10:01   ` Richard Earnshaw (lists)
  2018-10-17  8:13     ` Sandra Loosemore
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 10:01 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné  <mickael.guene@st.com>
> 
> 	gcc/
> 	* config/arm/arm.opt: Add -mfdpic option.
> 	* doc/invoke.texi: Add documentation for -mfdpic.

This is OK (once the rest of the series is approved).

R.

> 
> diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
> index a1286a4..231c1cb 100644
> --- a/gcc/config/arm/arm.opt
> +++ b/gcc/config/arm/arm.opt
> @@ -302,3 +302,7 @@ When linking for big-endian targets, generate a legacy BE32 format image.
>  mbranch-cost=
>  Target RejectNegative Joined UInteger Var(arm_branch_cost) Init(-1)
>  Cost to assume for a branch insn.
> +
> +mfdpic
> +Target Report Mask(FDPIC)
> +Enable Function Descriptor PIC mode.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 5c95f67..3e33e60 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -684,7 +684,8 @@ Objective-C and Objective-C++ Dialects}.
>  -mrestrict-it @gol
>  -mverbose-cost-dump @gol
>  -mpure-code @gol
> --mcmse}
> +-mcmse @gol
> +-mfdpic}
>  
>  @emph{AVR Options}
>  @gccoptlist{-mmcu=@var{mcu}  -mabsdata  -maccumulate-args @gol
> @@ -17059,6 +17060,13 @@ MOVT instruction.
>  Generate secure code as per the "ARMv8-M Security Extensions: Requirements on
>  Development Tools Engineering Specification", which can be found on
>  @url{http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/ECM0359818_armv8m_security_extensions_reqs_on_dev_tools_1_0.pdf}.
> +
> +@item -mfdpic
> +@opindex mfdpic
> +Select the FDPIC ABI, which uses function descriptors to represent
> +pointers to functions.  Without any PIC/PIE-related options, it
> +implies @option{-fPIE}.
> +
>  @end table
>  
>  @node AVR Options
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
@ 2018-10-12 10:14   ` Richard Earnshaw (lists)
  2018-10-15  8:46     ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 10:14 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> The new arm-uclinuxfdpiceabi target behaves pretty much like
> arm-linux-gnueabi. In order the enable the same set of features, we
> have to update several configure scripts that generally match targets
> like *-*-linux*: in most places, we add *-uclinux* where there is
> already *-linux*, or uclinux* when there is already linux*.
> 
> In gcc/config.gcc and libgcc/config.host we use *-*-uclinuxfdpiceabi
> because there is already a different behaviour for *-*uclinux* target.
> 
> In libtool.m4, we use uclinuxfdpiceabi in cases where ELF shared
> libraries support is required, as uclinux does not guarantee that.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 
> 	config/
> 	* futex.m4: Handle *-uclinux*.
> 	* tls.m4 (GCC_CHECK_TLS): Likewise.
> 
> 	gcc/
> 	* config.gcc: Handle *-*-uclinuxfdpiceabi.
> 
> 	libatomic/
> 	* configure.tgt: Handle arm*-*-uclinux*.
> 	* configure: Regenerate.
> 
> 	libgcc/
> 	* config.host: Handle *-*-uclinuxfdpiceabi.
> 
> 	libitm/
> 	* configure.tgt: Handle *-*-uclinux*.
> 	* configure: Regenerate.
> 
> 	libstdc++-v3/
> 	* acinclude.m4: Handle uclinux*.
> 	* configure: Regenerate.
> 	* configure.host: Handle uclinux*
> 
> 	* libtool.m4: Handle uclinux*.

What testing have you done to ensure that these new uclinux* changes
have not affected existing uclinux configurations?

Also, do you really need to use uclinuxfdpiceabi (which is quite
Arm-specific) everywhere, or would uclinuxfdpic* be better and ease work
for other fdpic targets?

R.
> 
> Change-Id: I6a1fdcd9847d8a82179a214612a3474c1f492916
> 
> diff --git a/config/futex.m4 b/config/futex.m4
> index e95144d..4dffe15 100644
> --- a/config/futex.m4
> +++ b/config/futex.m4
> @@ -9,7 +9,7 @@ AC_DEFUN([GCC_LINUX_FUTEX],[dnl
>  GCC_ENABLE(linux-futex,default, ,[use the Linux futex system call],
>  	   permit yes|no|default)
>  case "$target" in
> -  *-linux*)
> +  *-linux* | *-uclinux*)
>      case "$enable_linux_futex" in
>        default)
>  	# If headers don't have gettid/futex syscalls definition, then
> diff --git a/config/tls.m4 b/config/tls.m4
> index 4e170c8..5a8676e 100644
> --- a/config/tls.m4
> +++ b/config/tls.m4
> @@ -76,7 +76,7 @@ AC_DEFUN([GCC_CHECK_TLS], [
>  	  dnl Shared library options may depend on the host; this check
>  	  dnl is only known to be needed for GNU/Linux.
>  	  case $host in
> -	    *-*-linux*)
> +	    *-*-linux* | -*-uclinux*)
>  	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>  	      ;;
>  	  esac
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 0c579d1..793fc69 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -753,7 +753,7 @@ case ${target} in
>  *-*-fuchsia*)
>    native_system_header_dir=/include
>    ;;
> -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
> +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
>    extra_options="$extra_options gnu-user.opt"
>    gas=yes
>    gnu_ld=yes
> @@ -762,7 +762,7 @@ case ${target} in
>    esac
>    tmake_file="t-slibgcc"
>    case $target in
> -    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu)
> +    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu  | *-*-uclinuxfdpiceabi)
>        :;;
>      *-*-gnu*)
>        native_system_header_dir=/include
> @@ -782,7 +782,7 @@ case ${target} in
>      *-*-*android*)
>        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC"
>        ;;
> -    *-*-*uclibc*)
> +    *-*-*uclibc* | *-*-uclinuxfdpiceabi)
>        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
>        ;;
>      *-*-*musl*)
> @@ -1134,7 +1134,7 @@ arm*-*-netbsdelf*)
>  	tmake_file="${tmake_file} arm/t-arm"
>  	target_cpu_cname="arm6"
>  	;;
> -arm*-*-linux-*)			# ARM GNU/Linux with ELF
> +arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
>  	tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
>  	extra_options="${extra_options} linux-android.opt"
>  	case $target in
> diff --git a/libatomic/configure b/libatomic/configure
> index b902e2c..5b3ef8e 100755
> --- a/libatomic/configure
> +++ b/libatomic/configure
> @@ -5819,7 +5819,7 @@ irix5* | irix6* | nonstopux*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    lt_cv_deplibs_check_method=pass_all
>    ;;
>  
> @@ -8305,7 +8305,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>        lt_prog_compiler_static='-non_shared'
>        ;;
>  
> -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>        case $cc_basename in
>        # old Intel for x86_64 which still supported -KPIC.
>        ecc*)
> @@ -8900,7 +8900,7 @@ _LT_EOF
>        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>        ;;
>  
> -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>        tmp_diet=no
>        if test "$host_os" = linux-dietlibc; then
>  	case $cc_basename in
> @@ -10431,7 +10431,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
> index ea8c34f..c1a608f 100644
> --- a/libatomic/configure.tgt
> +++ b/libatomic/configure.tgt
> @@ -124,7 +124,7 @@ case "${target}" in
>  	config_path="${config_path} linux/aarch64 posix"
>  	;;
>  
> -  arm*-*-linux*)
> +  arm*-*-linux* | arm*-*-uclinux*)
>  	# OS support for atomic primitives.
>  	config_path="${config_path} linux/arm posix"
>  	;;
> diff --git a/libgcc/config.host b/libgcc/config.host
> index 029f656..28f3c14 100644
> --- a/libgcc/config.host
> +++ b/libgcc/config.host
> @@ -238,7 +238,7 @@ case ${host} in
>    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia"
>    extra_parts="crtbegin.o crtend.o"
>    ;;
> -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
> +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
>    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
>    extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
>    if test x$enable_vtable_verify = xyes; then
> @@ -424,7 +424,7 @@ arm*-*-fuchsia*)
>  arm*-*-netbsdelf*)
>  	tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
>  	;;
> -arm*-*-linux*)			# ARM GNU/Linux with ELF
> +arm*-*-linux* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
>  	tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
>  	tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
>  	tm_file="$tm_file arm/bpabi-lib.h"
> diff --git a/libitm/configure b/libitm/configure
> index dbf386d..fd82500 100644
> --- a/libitm/configure
> +++ b/libitm/configure
> @@ -6494,7 +6494,7 @@ irix5* | irix6* | nonstopux*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    lt_cv_deplibs_check_method=pass_all
>    ;;
>  
> @@ -8981,7 +8981,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>        lt_prog_compiler_static='-non_shared'
>        ;;
>  
> -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>        case $cc_basename in
>        # old Intel for x86_64 which still supported -KPIC.
>        ecc*)
> @@ -9576,7 +9576,7 @@ _LT_EOF
>        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>        ;;
>  
> -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>        tmp_diet=no
>        if test "$host_os" = linux-dietlibc; then
>  	case $cc_basename in
> @@ -11107,7 +11107,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> @@ -13008,7 +13008,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
>          inherit_rpath_CXX=yes
>          ;;
>  
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>          case $cc_basename in
>            KCC*)
>  	    # Kuck and Associates, Inc. (KAI) C++ Compiler
> @@ -13595,7 +13595,7 @@ interix[3-9]*)
>    postdeps_CXX=
>    ;;
>  
> -linux*)
> +linux* | uclinux*)
>    case `$CC -V 2>&1 | sed 5q` in
>    *Sun\ C*)
>      # Sun C++ 5.9
> @@ -13846,7 +13846,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>  	    ;;
>  	esac
>  	;;
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>  	case $cc_basename in
>  	  KCC*)
>  	    # KAI C++ Compiler
> @@ -14767,7 +14767,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> @@ -16239,7 +16239,7 @@ fi
>  
>  
>  case "$target" in
> -  *-linux*)
> +  *-linux* | *-uclinux*)
>      case "$enable_linux_futex" in
>        default)
>  	# If headers don't have gettid/futex syscalls definition, then
> @@ -16362,7 +16362,7 @@ _ACEOF
>  if ac_fn_c_try_link "$LINENO"; then :
>    chktls_save_LDFLAGS="$LDFLAGS"
>  	  	  	  case $host in
> -	    *-*-linux*)
> +	    *-*-linux* | -*-uclinux*)
>  	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>  	      ;;
>  	  esac
> diff --git a/libitm/configure.tgt b/libitm/configure.tgt
> index 0cbb097..bc6c3ca 100644
> --- a/libitm/configure.tgt
> +++ b/libitm/configure.tgt
> @@ -127,7 +127,7 @@ config_path="$ARCH posix generic"
>  
>  # Other system configury
>  case "${target}" in
> -  *-*-linux*)
> +  *-*-linux* | *-*-uclinux*)
>  	if test "$enable_linux_futex" = yes; then
>  	  config_path="linux/$ARCH linux $config_path"
>  	fi
> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
> index 6d68e90..2e18049 100644
> --- a/libstdc++-v3/acinclude.m4
> +++ b/libstdc++-v3/acinclude.m4
> @@ -1395,7 +1395,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
>          ac_has_nanosleep=yes
>          ac_has_sched_yield=yes
>          ;;
> -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>          AC_MSG_CHECKING([for at least GNU libc 2.17])
>          AC_TRY_COMPILE(
>            [#include <features.h>],
> @@ -1517,7 +1517,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
>  
>    if test x"$ac_has_clock_monotonic" != x"yes"; then
>      case ${target_os} in
> -      linux*)
> +      linux* | uclinux*)
>  	AC_MSG_CHECKING([for clock_gettime syscall])
>  	AC_TRY_COMPILE(
>  	  [#include <unistd.h>
> @@ -2402,7 +2402,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
>    # Default to "generic".
>    if test $enable_clocale_flag = auto; then
>      case ${target_os} in
> -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>  	enable_clocale_flag=gnu
>  	;;
>        darwin*)
> @@ -2648,7 +2648,7 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
>    # Default to "new".
>    if test $enable_libstdcxx_allocator_flag = auto; then
>      case ${target_os} in
> -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>  	enable_libstdcxx_allocator_flag=new
>  	;;
>        *)
> @@ -4282,7 +4282,7 @@ AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
>        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
>          enable_libstdcxx_filesystem_ts=yes
>          ;;
> -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>          enable_libstdcxx_filesystem_ts=yes
>          ;;
>        rtems*)
> @@ -4430,7 +4430,7 @@ dnl
>      AC_MSG_CHECKING([for sendfile that can copy files])
>      AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
>        case "${target_os}" in
> -        gnu* | linux* | solaris*)
> +        gnu* | linux* | solaris* | uclinux*)
>            GCC_TRY_COMPILE_OR_LINK(
>              [#include <sys/sendfile.h>],
>              [sendfile(1, 2, (off_t*)0, sizeof 1);],
> diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
> index d33081d..7780679 100755
> --- a/libstdc++-v3/configure
> +++ b/libstdc++-v3/configure
> @@ -6413,7 +6413,7 @@ irix5* | irix6* | nonstopux*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    lt_cv_deplibs_check_method=pass_all
>    ;;
>  
> @@ -8765,7 +8765,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>        lt_prog_compiler_static='-non_shared'
>        ;;
>  
> -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>        case $cc_basename in
>        # old Intel for x86_64 which still supported -KPIC.
>        ecc*)
> @@ -9360,7 +9360,7 @@ _LT_EOF
>        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>        ;;
>  
> -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>        tmp_diet=no
>        if test "$host_os" = linux-dietlibc; then
>  	case $cc_basename in
> @@ -10900,7 +10900,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> @@ -12825,7 +12825,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
>          inherit_rpath_CXX=yes
>          ;;
>  
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>          case $cc_basename in
>            KCC*)
>  	    # Kuck and Associates, Inc. (KAI) C++ Compiler
> @@ -13412,7 +13412,7 @@ interix[3-9]*)
>    postdeps_CXX=
>    ;;
>  
> -linux*)
> +linux* | uclinux*)
>    case `$CC -V 2>&1 | sed 5q` in
>    *Sun\ C*)
>      # Sun C++ 5.9
> @@ -13663,7 +13663,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>  	    ;;
>  	esac
>  	;;
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>  	case $cc_basename in
>  	  KCC*)
>  	    # KAI C++ Compiler
> @@ -14584,7 +14584,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> @@ -15833,7 +15833,7 @@ fi
>    # Default to "generic".
>    if test $enable_clocale_flag = auto; then
>      case ${target_os} in
> -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>  	enable_clocale_flag=gnu
>  	;;
>        darwin*)
> @@ -16250,7 +16250,7 @@ fi
>    # Default to "new".
>    if test $enable_libstdcxx_allocator_flag = auto; then
>      case ${target_os} in
> -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>  	enable_libstdcxx_allocator_flag=new
>  	;;
>        *)
> @@ -20526,7 +20526,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
>          ac_has_nanosleep=yes
>          ac_has_sched_yield=yes
>          ;;
> -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at least GNU libc 2.17" >&5
>  $as_echo_n "checking for at least GNU libc 2.17... " >&6; }
>          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -21026,7 +21026,7 @@ $as_echo "$ac_has_nanosleep" >&6; }
>  
>    if test x"$ac_has_clock_monotonic" != x"yes"; then
>      case ${target_os} in
> -      linux*)
> +      linux* | uclinux*)
>  	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall" >&5
>  $as_echo_n "checking for clock_gettime syscall... " >&6; }
>  	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> @@ -27918,7 +27918,7 @@ _ACEOF
>  if ac_fn_c_try_link "$LINENO"; then :
>    chktls_save_LDFLAGS="$LDFLAGS"
>  	  	  	  case $host in
> -	    *-*-linux*)
> +	    *-*-linux* | -*-uclinux*)
>  	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>  	      ;;
>  	  esac
> @@ -53578,7 +53578,7 @@ _ACEOF
>  if ac_fn_c_try_link "$LINENO"; then :
>    chktls_save_LDFLAGS="$LDFLAGS"
>  	  	  	  case $host in
> -	    *-*-linux*)
> +	    *-*-linux* | -*-uclinux*)
>  	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>  	      ;;
>  	  esac
> @@ -59771,7 +59771,7 @@ _ACEOF
>  if ac_fn_c_try_link "$LINENO"; then :
>    chktls_save_LDFLAGS="$LDFLAGS"
>  	  	  	  case $host in
> -	    *-*-linux*)
> +	    *-*-linux* | -*-uclinux*)
>  	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>  	      ;;
>  	  esac
> @@ -78397,7 +78397,7 @@ fi
>  
>  
>  case "$target" in
> -  *-linux*)
> +  *-linux* | *-uclinux*)
>      case "$enable_linux_futex" in
>        default)
>  	# If headers don't have gettid/futex syscalls definition, then
> @@ -80033,7 +80033,7 @@ $as_echo_n "checking whether to build Filesystem TS support... " >&6; }
>        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
>          enable_libstdcxx_filesystem_ts=yes
>          ;;
> -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>          enable_libstdcxx_filesystem_ts=yes
>          ;;
>        rtems*)
> @@ -80457,7 +80457,7 @@ $as_echo_n "checking for sendfile that can copy files... " >&6; }
>    $as_echo_n "(cached) " >&6
>  else
>          case "${target_os}" in
> -        gnu* | linux* | solaris*)
> +        gnu* | linux* | solaris* | uclinux*)
>            if test x$gcc_no_link = xyes; then
>    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>  /* end confdefs.h.  */
> diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
> index 155a3cd..1c298ab 100644
> --- a/libstdc++-v3/configure.host
> +++ b/libstdc++-v3/configure.host
> @@ -264,7 +264,7 @@ case "${host_os}" in
>    linux-musl*)
>      os_include_dir="os/generic"
>      ;;
> -  gnu* | linux* | kfreebsd*-gnu)
> +  gnu* | linux* | kfreebsd*-gnu | uclinux*)
>      if [ "$uclibc" = "yes" ]; then
>        os_include_dir="os/uclibc"
>      elif [ "$bionic" = "yes" ]; then
> @@ -327,7 +327,7 @@ esac
>  # Set any OS-dependent and CPU-dependent bits.
>  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
>  case "${host}" in
> -  *-*-linux*)
> +  *-*-linux* | *-*-uclinux*)
>      case "${host_cpu}" in
>        i[567]86)
>          abi_baseline_pair=i486-linux-gnu
> @@ -358,7 +358,7 @@ case "${host}" in
>          fi
>      esac
>      case "${host}" in
> -      arm*-*-linux-*)
> +      arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
>  	port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
>  	;;
>      esac
> diff --git a/libtool.m4 b/libtool.m4
> index 940faaa..49ab293 100644
> --- a/libtool.m4
> +++ b/libtool.m4
> @@ -2449,7 +2449,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    version_type=linux
>    need_lib_prefix=no
>    need_version=no
> @@ -3089,7 +3089,7 @@ irix5* | irix6* | nonstopux*)
>    ;;
>  
>  # This must be Linux ELF.
> -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>    lt_cv_deplibs_check_method=pass_all
>    ;;
>  
> @@ -3734,7 +3734,7 @@ m4_if([$1], [CXX], [
>  	    ;;
>  	esac
>  	;;
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>  	case $cc_basename in
>  	  KCC*)
>  	    # KAI C++ Compiler
> @@ -4032,7 +4032,7 @@ m4_if([$1], [CXX], [
>        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
>        ;;
>  
> -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>        case $cc_basename in
>        # old Intel for x86_64 which still supported -KPIC.
>        ecc*)
> @@ -4449,7 +4449,7 @@ _LT_EOF
>        _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>        ;;
>  
> -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>        tmp_diet=no
>        if test "$host_os" = linux-dietlibc; then
>  	case $cc_basename in
> @@ -5946,7 +5946,7 @@ if test "$_lt_caught_CXX_error" != yes; then
>          _LT_TAGVAR(inherit_rpath, $1)=yes
>          ;;
>  
> -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>          case $cc_basename in
>            KCC*)
>  	    # Kuck and Associates, Inc. (KAI) C++ Compiler
> @@ -6598,7 +6598,7 @@ interix[[3-9]]*)
>    _LT_TAGVAR(postdeps,$1)=
>    ;;
>  
> -linux*)
> +linux* | uclinux*)
>    case `$CC -V 2>&1 | sed 5q` in
>    *Sun\ C*)
>      # Sun C++ 5.9
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-11 13:37 ` [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided Christophe Lyon
@ 2018-10-12 10:46   ` Richard Earnshaw (lists)
  2018-10-15 10:35     ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 10:46 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> In FDPIC mode, we set -fPIE unless the user provides -fno-PIE, -fpie,
> -fPIC or -fpic: indeed FDPIC code is PIC, but we want to generate code
> for executables rather than shared libraries by default.
> 
> We also make sure to use the --fdpic assembler option, and select the
> appropriate linker emulation.
> 
> At link time, we also default to -pie, unless we are generating a
> shared library or a relocatable file (-r). Note that even for static
> link, we must specify the dynamic linker because the executable still
> has to relocate itself at startup.
> 
> We also force 'now' binding since lazy binding is not supported.
> 
> We should also apply the same behavior for -Wl,-Ur as for -r, but I
> couldn't find how to describe that in the specs fragment.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	gcc/
> 	* config.gcc: Handle arm*-*-uclinuxfdpiceabi.
> 	* config/arm/bpabi.h (TARGET_FDPIC_ASM_SPEC): New.
> 	(SUBTARGET_EXTRA_ASM_SPEC): Use TARGET_FDPIC_ASM_SPEC.
> 	* config/arm/linux-eabi.h (FDPIC_CC1_SPEC): New.
> 	(CC1_SPEC): Use FDPIC_CC1_SPEC.
> 	* config/arm/uclinuxfdpiceabi.h: New file.
> 
> 	libsanitizer/
> 	* configure.tgt (arm*-*-uclinuxfdpiceabi): Sanitizers are
> 	unsupported in this configuration.

The documentation (in patch 1) seems to imply that -mfdpic is available
in all configurations and has certain effects (such as enabling -fPIE),
but this patch set suggests that such behaviours are only available when
the compiler is configured explicitly for an fdpic target.

I think this needs to be resolved.  Either -mfdpic works everywhere, or
the option should only be available when configured for -mfdpic.

R.

> 
> Change-Id: If369e0a10bb916fd72e38f71498d3c640fa85c4c
> 
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 793fc69..a4f4331 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1144,6 +1144,11 @@ arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)			# ARM GNU/Linux with ELF
>  	esac
>  	tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
>  	tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h"
> +	case $target in
> +	arm*-*-uclinuxfdpiceabi)
> +	    tm_file="$tm_file arm/uclinuxfdpiceabi.h"
> +	    ;;
> +	esac
>  	# Generation of floating-point instructions requires at least ARMv5te.
>  	if [ "$with_float" = "hard" -o "$with_float" = "softfp" ] ; then
>  	    target_cpu_cname="arm10e"
> diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
> index 1e3ecfb..5901154 100644
> --- a/gcc/config/arm/bpabi.h
> +++ b/gcc/config/arm/bpabi.h
> @@ -55,6 +55,8 @@
>  #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
>    "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
>  
> +#define TARGET_FDPIC_ASM_SPEC  ""
> +
>  #define BE8_LINK_SPEC							\
>    "%{!r:%{!mbe32:%:be8_linkopt(%{mlittle-endian:little}"		\
>    "			       %{mbig-endian:big}"			\
> @@ -64,7 +66,7 @@
>  /* Tell the assembler to build BPABI binaries.  */
>  #undef  SUBTARGET_EXTRA_ASM_SPEC
>  #define SUBTARGET_EXTRA_ASM_SPEC \
> -  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC
> +  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC TARGET_FDPIC_ASM_SPEC
>  
>  #ifndef SUBTARGET_EXTRA_LINK_SPEC
>  #define SUBTARGET_EXTRA_LINK_SPEC ""
> diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
> index 8585fde..4cee958 100644
> --- a/gcc/config/arm/linux-eabi.h
> +++ b/gcc/config/arm/linux-eabi.h
> @@ -98,11 +98,14 @@
>  #undef  ASAN_CC1_SPEC
>  #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
>  
> +#define FDPIC_CC1_SPEC ""
> +
>  #undef  CC1_SPEC
>  #define CC1_SPEC							\
> -  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,	\
> +  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "	\
> +		       FDPIC_CC1_SPEC,					\
>  		       GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "	\
> -		       ANDROID_CC1_SPEC)
> +		       ANDROID_CC1_SPEC "" FDPIC_CC1_SPEC)
>  
>  #define CC1PLUS_SPEC \
>    LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
> diff --git a/gcc/config/arm/uclinuxfdpiceabi.h b/gcc/config/arm/uclinuxfdpiceabi.h
> new file mode 100644
> index 0000000..43a17de
> --- /dev/null
> +++ b/gcc/config/arm/uclinuxfdpiceabi.h
> @@ -0,0 +1,53 @@
> +/* Configuration file for ARM GNU/Linux FDPIC EABI targets.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   Contributed by STMicroelectronics.
> +
> +   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/>.  */
> +
> +/* On uClibc EABI GNU/Linux, we want to force -mfdpic by default,
> +   which also means we produce PIE code by default.  */
> +#undef FDPIC_CC1_SPEC
> +#define FDPIC_CC1_SPEC \
> +  "%{!mno-fdpic:-mfdpic %{!no-PIE:%{!fpie:%{!fPIC:%{!fpic: -fPIE}}}}}"
> +
> +/* Add --fdpic assembler flag by default.  */
> +#undef TARGET_FDPIC_ASM_SPEC
> +#define TARGET_FDPIC_ASM_SPEC  "%{!mno-fdpic: --fdpic}"
> +
> +/* TARGET_BIG_ENDIAN_DEFAULT is set in
> +   config.gcc for big endian configurations.  */
> +#if TARGET_BIG_ENDIAN_DEFAULT
> +#define TARGET_FDPIC_LINKER_EMULATION "armelfb_linux_fdpiceabi"
> +#else
> +#define TARGET_FDPIC_LINKER_EMULATION "armelf_linux_fdpiceabi"
> +#endif
> +
> +/* Unless we generate a shared library or a relocatable object, we
> +   force -pie.  */
> +/* Even with -static, we have to define the dynamic-linker, as we
> +   have some relocations to resolve at load time.  */
> +#undef  SUBTARGET_EXTRA_LINK_SPEC
> +#define SUBTARGET_EXTRA_LINK_SPEC			    \
> +  "%{!mno-fdpic: -m " TARGET_FDPIC_LINKER_EMULATION	    \
> +   "%{!shared:%{!r: -pie}}				    \
> +    %{static:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" \
> +  "%{mno-fdpic: -m " TARGET_LINKER_EMULATION "}"	    \
> +  "%{!r:%{!mno-fdpic: -z now}}"
> +
> +#undef	STARTFILE_SPEC
> +#define STARTFILE_SPEC "%{!mno-fdpic:%{!shared:crtreloc.o%s}} " \
> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
> diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
> index 1dce1e6..dff34cd 100644
> --- a/libsanitizer/configure.tgt
> +++ b/libsanitizer/configure.tgt
> @@ -43,6 +43,9 @@ case "${target}" in
>  	;;
>    s390*-*-linux*)
>  	;;
> +  arm*-*-uclinuxfdpiceabi)
> +	UNSUPPORTED=1
> +	;;
>    arm*-*-linux*)
>  	;;
>    mips*64*-*-linux*)
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-11 13:37 ` [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture Christophe Lyon
@ 2018-10-12 11:02   ` Richard Earnshaw (lists)
  2018-10-19 13:57     ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 11:02 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> The FDPIC register is hard-coded to r9, as defined in the ABI.
> 
> We have to disable tailcall optimizations if we don't know if the
> target function is in the same module. If not, we have to set r9 to
> the value associated with the target module.
> 
> When generating a symbol address, we have to take into account whether
> it is a pointer to data or to a function, because different
> relocations are needed.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	* config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
> 	in FDPIC mode.
> 	* config/arm/arm-protos.h (arm_load_function_descriptor): Declare
> 	new function.
> 	* config/arm/arm.c (arm_option_override): Define pic register to
> 	FDPIC_REGNUM.
> 	(arm_function_ok_for_sibcall) Disable sibcall optimization if we

Missing colon.

> 	have no decl or go through PLT.
> 	(arm_load_pic_register): Handle TARGET_FDPIC.
> 	(arm_is_segment_info_known): New function.
> 	(arm_pic_static_addr): Add support for FDPIC.
> 	(arm_load_function_descriptor): New function.
> 	(arm_assemble_integer): Add support for FDPIC.
> 	* config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
> 	Define. (FDPIC_REGNUM): New define.
> 	* config/arm/arm.md (call): Add support for FDPIC.
> 	(call_value): Likewise.
> 	(*restore_pic_register_after_call): New pattern.
> 	(untyped_call): Disable if FDPIC.
> 	(untyped_return): Likewise.
> 	* config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
> 

Other comments inline.

> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
> index 4471f79..90733cc 100644
> --- a/gcc/config/arm/arm-c.c
> +++ b/gcc/config/arm/arm-c.c
> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
>        builtin_define ("__ARM_EABI__");
>      }
>  
> +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
> +
>    def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
>    def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
>  
> diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
> index 0dfb3ac..28cafa8 100644
> --- a/gcc/config/arm/arm-protos.h
> +++ b/gcc/config/arm/arm-protos.h
> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
>  extern int arm_const_double_inline_cost (rtx);
>  extern bool arm_const_double_by_parts (rtx);
>  extern bool arm_const_double_by_immediates (rtx);
> +extern rtx arm_load_function_descriptor (rtx funcdesc);
>  extern void arm_emit_call_insn (rtx, rtx, bool);
>  bool detect_cmse_nonsecure_call (tree);
>  extern const char *output_call (rtx *);
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index 8810df5..92ae24b 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -3470,6 +3470,14 @@ arm_option_override (void)
>    if (flag_pic && TARGET_VXWORKS_RTP)
>      arm_pic_register = 9;
>  
> +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
> +  if (TARGET_FDPIC)
> +    {
> +      arm_pic_register = FDPIC_REGNUM;
> +      if (TARGET_ARM_ARCH < 7)
> +	error ("FDPIC mode is not supported on architectures older than Armv7");

What properties of FDPIC impose this requirement?  Does it also apply to
Armv8-m.baseline?

> +    }
> +
>    if (arm_pic_register_string != NULL)
>      {
>        int pic_register = decode_reg_name (arm_pic_register_string);
> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>    if (cfun->machine->sibcall_blocked)
>      return false;
>  
> +  if (TARGET_FDPIC)
> +    {
> +      /* In FDPIC, never tailcall something for which we have no decl:
> +	 the target function could be in a different module, requiring
> +	 a different FDPIC register value.  */
> +      if (decl == NULL)
> +	return false;
> +
> +      /* Don't tailcall if we go through the PLT since the FDPIC
> +	 register is then corrupted and we don't restore it after
> +	 static function calls.  */
> +      if (!targetm.binds_local_p (decl))
> +	return false;
> +    }
> +
>    /* Never tailcall something if we are generating code for Thumb-1.  */
>    if (TARGET_THUMB1)
>      return false;
> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
>  {
>    rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
>  
> -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
> +  if (crtl->uses_pic_offset_table == 0
> +      || TARGET_SINGLE_PIC_BASE
> +      || TARGET_FDPIC)
>      return;
>  
>    gcc_assert (flag_pic);
> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
>    emit_use (pic_reg);
>  }
>  
> +/* Try to know if the object will go in text or data segment. This is

"Try to determine whether an object, referenced via ORIG, will be placed
in the text or data segment."
> +   used in FDPIC mode, to decide which relocations to use when
> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only

Two spaces after a period.

> +   location, false otherwise.  */

You've missed the documentation of the return value: does returning true
mean text vs data, or does it mean we know which it will go in, but
don't have to return that information here.

Generally, won't this break big time if users compile with
-ffunction-sections or -fdata-sections?  Is it sufficient to match
.text.* as being text and .data.* for data?


> +static bool
> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
> +{
> +  bool res = false;
> +
> +  *is_readonly = false;
> +
> +  if (GET_CODE (orig) == LABEL_REF)
> +    {
> +      res = true;
> +      *is_readonly = true;
> +    }
> +  else if (SYMBOL_REF_P (orig))
> +    {
> +      if (CONSTANT_POOL_ADDRESS_P (orig))
> +	{
> +	  res = true;
> +	  *is_readonly = true;
> +	}
> +      else if (SYMBOL_REF_LOCAL_P (orig)
> +	       && !SYMBOL_REF_EXTERNAL_P (orig)
> +	       && SYMBOL_REF_DECL (orig)
> +	       && (!DECL_P (SYMBOL_REF_DECL (orig))
> +		   || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
> +	{
> +	  tree decl = SYMBOL_REF_DECL (orig);
> +	  tree init = (TREE_CODE (decl) == VAR_DECL)
> +	    ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
> +	    ? decl : 0;
> +	  int reloc = 0;
> +	  bool named_section, readonly;
> +
> +	  if (init && init != error_mark_node)
> +	    reloc = compute_reloc_for_constant (init);
> +
> +	  named_section = TREE_CODE (decl) == VAR_DECL
> +	    && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
> +	  readonly = decl_readonly_section (decl, reloc);
> +
> +	  /* We don't know where the link script will put a named
> +	     section, so return false in such a case.  */
> +	  res = !named_section;
> +
> +	  if (!named_section)
> +	    *is_readonly = readonly;
> +	}
> +      else
> +	{
> +	  /* We don't know.  */
> +	  res = false;
> +	}
> +    }
> +  else
> +    gcc_unreachable ();
> +
> +  return res;
> +}
> +
>  /* Generate code to load the address of a static var when flag_pic is set.  */
>  static rtx_insn *
>  arm_pic_static_addr (rtx orig, rtx reg)
>  {
>    rtx l1, labelno, offset_rtx;
> +  rtx_insn *insn;
>  
>    gcc_assert (flag_pic);
>  
> -  /* We use an UNSPEC rather than a LABEL_REF because this label
> -     never appears in the code stream.  */
> -  labelno = GEN_INT (pic_labelno++);
> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
> -  l1 = gen_rtx_CONST (VOIDmode, l1);
> +  bool is_readonly = false;
> +  bool info_known = false;
>  
> -  /* On the ARM the PC register contains 'dot + 8' at the time of the
> -     addition, on the Thumb it is 'dot + 4'.  */
> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
> -                               UNSPEC_SYMBOL_OFFSET);
> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> +  if (TARGET_FDPIC
> +      && SYMBOL_REF_P (orig)
> +      && !SYMBOL_REF_FUNCTION_P (orig))
> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
>  
> -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx, labelno));
> +  if (TARGET_FDPIC
> +      && SYMBOL_REF_P (orig)
> +      && !SYMBOL_REF_FUNCTION_P (orig)
> +      && !info_known)
> +    {
> +      /* We don't know where orig is stored, so we have be
> +	 pessimistic and use a GOT relocation.  */
> +      rtx pat;
> +      rtx mem;
> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> +
> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
> +
> +      /* Make the MEM as close to a constant as possible.  */
> +      mem = SET_SRC (pat);
> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
> +      MEM_READONLY_P (mem) = 1;
> +      MEM_NOTRAP_P (mem) = 1;
> +
> +      insn = emit_insn (pat);
> +    }
> +  else if (TARGET_FDPIC
> +	   && SYMBOL_REF_P (orig)
> +	   && (SYMBOL_REF_FUNCTION_P (orig)
> +	       || (info_known && !is_readonly)))
> +    {
> +      /* We use the GOTOFF relocation.  */
> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> +
> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig), UNSPEC_PIC_SYM);
> +      emit_insn (gen_movsi (reg, l1));
> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
> +    }
> +  else
> +    {
> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
> +	 PC-relative access.  */
> +      /* We use an UNSPEC rather than a LABEL_REF because this label
> +	 never appears in the code stream.  */
> +      labelno = GEN_INT (pic_labelno++);
> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
> +      l1 = gen_rtx_CONST (VOIDmode, l1);
> +
> +      /* On the ARM the PC register contains 'dot + 8' at the time of the
> +	 addition, on the Thumb it is 'dot + 4'.  */
> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
> +				   UNSPEC_SYMBOL_OFFSET);
> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> +
> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
> +						   labelno));
> +    }
> +
> +  return insn;
>  }
>  
>  /* Return nonzero if X is valid as an ARM state addressing register.  */
> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
>    return 0;
>  }
>  
> +/* Emit insns to load the function address from FUNCDESC (an FDPIC
> +   function descriptor) into a register and the GOT address into the
> +   FDPIC register, returning an rtx for the register holding the
> +   function address.  */
> +
> +rtx
> +arm_load_function_descriptor (rtx funcdesc)
> +{
> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc, 4));
> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> +
> +  emit_move_insn (fnaddr_reg, fnaddr);
> +  /* The ABI requires the entry point address to be loaded first, so
> +     prevent the load from being moved after that of the GOT
> +     address.  */
> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> +					gen_rtvec (2, pic_reg, gotaddr),
> +					UNSPEC_PIC_RESTORE);
> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM))> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG
(Pmode, FDPIC_REGNUM));

Shouldn't one of these be fnaddr_reg and the other pic_reg?

> +  emit_insn (par);
> +
> +  return fnaddr_reg;
> +}
> +
>  /* Return the maximum amount of padding that will be inserted before
>     label LABEL.  */
> -
>  static HOST_WIDE_INT
>  get_label_padding (rtx label)
>  {
> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
>  		  && (!SYMBOL_REF_LOCAL_P (x)
>  		      || (SYMBOL_REF_DECL (x)
>  			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
> -	    fputs ("(GOT)", asm_out_file);
> +	    {
> +	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> +		fputs ("(GOTFUNCDESC)", asm_out_file);
> +	      else
> +		fputs ("(GOT)", asm_out_file);
> +	    }
>  	  else
> -	    fputs ("(GOTOFF)", asm_out_file);
> +	    {
> +	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> +		fputs ("(GOTOFFFUNCDESC)", asm_out_file);
> +	      else
> +		{
> +		  bool is_readonly;
> +
> +		  if (arm_is_segment_info_known (x, &is_readonly))
> +		    fputs ("(GOTOFF)", asm_out_file);
> +		  else
> +		    fputs ("(GOT)", asm_out_file);
> +		}
> +	    }
> +	}
> +
> +      /* For FDPIC we also have to mark symbol for .data section.  */
> +      if (TARGET_FDPIC
> +	  && NEED_GOT_RELOC
> +	  && flag_pic
> +	  && !making_const_table
> +	  && SYMBOL_REF_P (x))
> +	{
> +	  if (SYMBOL_REF_FUNCTION_P (x))
> +	    fputs ("(FUNCDESC)", asm_out_file);
>  	}
>        fputc ('\n', asm_out_file);
>        return true;
> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> index 34894c0..4671d64 100644
> --- a/gcc/config/arm/arm.h
> +++ b/gcc/config/arm/arm.h
> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
>     Pascal), so the following is not true.  */
>  #define STATIC_CHAIN_REGNUM	12
>  
> +/* r9 is the FDPIC register (base register for GOT and FUNCDESC accesses).  */
> +#define FDPIC_REGNUM		9
> +
>  /* Define this to be where the real frame pointer is if it is not possible to
>     work out the offset between the frame pointer and the automatic variables
>     until after register allocation has taken place.  FRAME_POINTER_REGNUM
> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
>     data addresses in memory.  */
>  #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
>  
> +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
> +   entries would need to handle saving and restoring it).  */
> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
> +
>  /* We can't directly access anything that contains a symbol,
>     nor can we indirect via the constant pool.  One exception is
>     UNSPEC_TLS, which is always PIC.  */
> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> index 270b8e4..09a0701 100644
> --- a/gcc/config/arm/arm.md
> +++ b/gcc/config/arm/arm.md
> @@ -8031,6 +8031,23 @@
>      rtx callee, pat;
>      tree addr = MEM_EXPR (operands[0]);
>      
> +    /* Force FDPIC register (r9) before call.  */
> +    if (TARGET_FDPIC)
> +      {
> +	/* No need to update r9 if calling a static function.
> +	   In other words: set r9 for indirect or non-local calls.  */
> +	callee = XEXP (operands[0], 0);
> +	if (!SYMBOL_REF_P (callee)
> +	    || !SYMBOL_REF_LOCAL_P (callee)
> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> +	  {
> +	    emit_insn (gen_blockage ());
> +	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> +	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
> +	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> +	 }
> +      }
> +
>      /* In an untyped call, we can get NULL for operand 2.  */
>      if (operands[2] == NULL_RTX)
>        operands[2] = const0_rtx;
> @@ -8044,6 +8061,13 @@
>  	: !REG_P (callee))
>        XEXP (operands[0], 0) = force_reg (Pmode, callee);
>  
> +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
> +      {
> +	/* Indirect call: set r9 with FDPIC value of callee.  */
> +	XEXP (operands[0], 0)
> +	  = arm_load_function_descriptor (XEXP (operands[0], 0));
> +      }
> +
>      if (detect_cmse_nonsecure_call (addr))
>        {
>  	pat = gen_nonsecure_call_internal (operands[0], operands[1],
> @@ -8055,10 +8079,38 @@
>  	pat = gen_call_internal (operands[0], operands[1], operands[2]);
>  	arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
>        }
> +
> +    /* Restore FDPIC register (r9) after call.  */
> +    if (TARGET_FDPIC)
> +      {
> +	/* No need to update r9 if calling a static function.  */
> +	if (!SYMBOL_REF_P (callee)
> +	    || !SYMBOL_REF_LOCAL_P (callee)
> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> +	  {
> +	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> +	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
> +	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> +	    emit_insn (gen_blockage ());
> +	  }
> +      }
>      DONE;
>    }"
>  )
>  
> +(define_insn "*restore_pic_register_after_call"
> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
> +		       (match_operand:SI 1 "nonimmediate_operand" "r,m")]
> +	       UNSPEC_PIC_RESTORE)
> +	      (use (match_dup 0))
> +	      (clobber (match_dup 0))])
> +  ]
> +  ""
> +  "@
> +  mov\t%0, %1
> +  ldr\t%0, %1"
> +)
> +
>  (define_expand "call_internal"
>    [(parallel [(call (match_operand 0 "memory_operand" "")
>  	            (match_operand 1 "general_operand" ""))
> @@ -8119,6 +8171,30 @@
>      rtx pat, callee;
>      tree addr = MEM_EXPR (operands[1]);
>      
> +    /* Force FDPIC register (r9) before call.  */
> +    if (TARGET_FDPIC)
> +      {
> +	/* No need to update the FDPIC register (r9) if calling a static function.
> +	   In other words: set r9 for indirect or non-local calls.  */
> +	callee = XEXP (operands[1], 0);
> +	if (!SYMBOL_REF_P (callee)
> +	    || !SYMBOL_REF_LOCAL_P (callee)
> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> +	  {
> +	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> +
> +	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> +		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> +			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> +		UNSPEC_PIC_RESTORE);
> +	    XVECEXP (par, 0, 1)
> +	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> +	    XVECEXP (par, 0, 2)
> +	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));

Again, this looks suspicious.

> +	    emit_insn (par);
> +	  }
> +      }
> +
>      /* In an untyped call, we can get NULL for operand 2.  */
>      if (operands[3] == 0)
>        operands[3] = const0_rtx;
> @@ -8132,6 +8208,14 @@
>  	: !REG_P (callee))
>        XEXP (operands[1], 0) = force_reg (Pmode, callee);
>  
> +    if (TARGET_FDPIC
> +	&& !SYMBOL_REF_P (XEXP (operands[1], 0)))
> +      {
> +	/* Indirect call: set r9 with FDPIC value of callee.  */
> +	XEXP (operands[1], 0)
> +	  = arm_load_function_descriptor (XEXP (operands[1], 0));
> +      }
> +
>      if (detect_cmse_nonsecure_call (addr))
>        {
>  	pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
> @@ -8144,6 +8228,28 @@
>  				       operands[2], operands[3]);
>  	arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
>        }
> +    /* Restore FDPIC register (r9) after call.  */
> +    if (TARGET_FDPIC)
> +      {
> +	/* No need to update r9 if calling a static function.  */
> +	if (!SYMBOL_REF_P (callee)
> +	    || !SYMBOL_REF_LOCAL_P (callee)
> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> +	  {
> +	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> +
> +	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> +		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> +			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> +		UNSPEC_PIC_RESTORE);
> +	    XVECEXP (par, 0, 1)
> +	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> +	    XVECEXP (par, 0, 2)
> +	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));

And again.

> +	    emit_insn (par);
> +	  }
> +      }
> +
>      DONE;
>    }"
>  )
> @@ -8486,7 +8592,7 @@
>  		    (const_int 0))
>  	      (match_operand 1 "" "")
>  	      (match_operand 2 "" "")])]
> -  "TARGET_EITHER"
> +  "TARGET_EITHER && !TARGET_FDPIC"
>    "
>    {
>      int i;
> @@ -8553,7 +8659,7 @@
>  (define_expand "untyped_return"
>    [(match_operand:BLK 0 "memory_operand" "")
>     (match_operand 1 "" "")]
> -  "TARGET_EITHER"
> +  "TARGET_EITHER && !TARGET_FDPIC"
>    "
>    {
>      int i;
> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
> index 1941673..349ae0e 100644
> --- a/gcc/config/arm/unspecs.md
> +++ b/gcc/config/arm/unspecs.md
> @@ -86,6 +86,7 @@
>    UNSPEC_PROBE_STACK    ; Probe stack memory reference
>    UNSPEC_NONSECURE_MEM	; Represent non-secure memory in ARMv8-M with
>  			; security extension
> +  UNSPEC_PIC_RESTORE	; Use to restore fdpic register
>  ])
>  
>  (define_c_enum "unspec" [
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation
  2018-10-11 13:37 ` [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation Christophe Lyon
@ 2018-10-12 11:29   ` Richard Earnshaw (lists)
  0 siblings, 0 replies; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 11:29 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches, ian; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> In FDPIC, we need to make sure __do_global_dtors_aux and frame_dummy
> are referenced by their address, not by pointers to the function
> descriptors.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	* libgcc/crtstuff.c: Add support for FDPIC.
> 

This looks a little bit hacky; and since it's to a generic file I'd like
a second opinion from the libgcc maintainer.

At the very least, don't you need an alignment directive before the entries?

R.

> Change-Id: Iff3aec3815e8ebd87276c0107752f00908a22100
> 
> diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c
> index d81c527..ad40719 100644
> --- a/libgcc/crtstuff.c
> +++ b/libgcc/crtstuff.c
> @@ -429,9 +429,17 @@ __do_global_dtors_aux (void)
>  #ifdef FINI_SECTION_ASM_OP
>  CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
>  #elif defined (FINI_ARRAY_SECTION_ASM_OP)
> +#if defined(__FDPIC__)
> +__asm__(
> +    "   .section .fini_array\n"
> +    "   .word __do_global_dtors_aux\n"
> +);
> +asm (TEXT_SECTION_ASM_OP);
> +#else /* defined(__FDPIC__) */
>  static func_ptr __do_global_dtors_aux_fini_array_entry[]
>    __attribute__ ((__used__, section(".fini_array"), aligned(sizeof(func_ptr))))
>    = { __do_global_dtors_aux };
> +#endif /* defined(__FDPIC__) */
>  #else /* !FINI_SECTION_ASM_OP && !FINI_ARRAY_SECTION_ASM_OP */
>  static void __attribute__((used))
>  __do_global_dtors_aux_1 (void)
> @@ -473,9 +481,17 @@ frame_dummy (void)
>  #ifdef __LIBGCC_INIT_SECTION_ASM_OP__
>  CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__, frame_dummy)
>  #else /* defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
> +#if defined(__FDPIC__)
> +__asm__(
> +    "   .section .init_array\n"
> +    "   .word frame_dummy\n"
> +);
> +asm (TEXT_SECTION_ASM_OP);
> +#else /* defined(__FDPIC__) */
>  static func_ptr __frame_dummy_init_array_entry[]
>    __attribute__ ((__used__, section(".init_array"), aligned(sizeof(func_ptr))))
>    = { frame_dummy };
> +#endif /* defined(__FDPIC__) */
>  #endif /* !defined(__LIBGCC_INIT_SECTION_ASM_OP__) */
>  #endif /* USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY */
>  
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions
  2018-10-11 13:38 ` [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions Christophe Lyon
@ 2018-10-12 11:54   ` Richard Earnshaw (lists)
  2018-10-15 14:22     ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 11:54 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> The main difference with existing support is that function addresses
> are function descriptor addresses instead. This means that all code
> dealing with function pointers now has to cope with function
> descriptors instead.
> 
> For the same reason, Linux kernel helpers can no longer be called by
> dereferencing their address, so we implement the same functionality as
> a regular function here.
> 
> When restoring a function address, we also have to restore the FDPIC
> register value (r9).
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	gcc/
> 	* ginclude/unwind-arm-common.h (unwinder_cache): Add reserved5
> 	field.
> 	(FDPIC_REGNUM): New define.
> 
> 	libgcc/
> 	* config/arm/linux-atomic.c (__kernel_cmpxchg): Add FDPIC support.
> 	(__kernel_dmb): Likewise.
> 	(__fdpic_cmpxchg): New function.
> 	(__fdpic_dmb): New function.
> 	* config/arm/unwind-arm.h (gnu_Unwind_Find_got): New function.
> 	(_Unwind_decode_typeinfo_ptr): Add FDPIC support.
> 	* unwindo-arm-common.inc (UCB_PR_GOT): New.
> 	(funcdesc_t): New struct.
> 	(get_eit_entry): Add FDPIC support.
> 	(unwind_phase2): Likewise.
> 	(unwind_phase2_forced): Likewise.
> 	(__gnu_Unwind_RaiseException): Likewise.
> 	(__gnu_Unwind_Resume): Likewise.
> 	(__gnu_Unwind_Backtrace): Likewise.
> 	* unwind-pe.h (read_encoded_value_with_base): Likewise.
> 
> 	libstdc++/
> 	* libsupc++/eh_personality.cc (get_ttype_entry): Add FDPIC
> 	support.
> 
> Change-Id: I517a49ff18fae21c686cd1c6008ea7974515b347
> 
> diff --git a/gcc/ginclude/unwind-arm-common.h b/gcc/ginclude/unwind-arm-common.h
> index 8a1a919..f663891 100644
> --- a/gcc/ginclude/unwind-arm-common.h
> +++ b/gcc/ginclude/unwind-arm-common.h
> @@ -91,7 +91,7 @@ extern "C" {
>  	  _uw reserved2;  /* Personality routine address */
>  	  _uw reserved3;  /* Saved callsite address */
>  	  _uw reserved4;  /* Forced unwind stop arg */
> -	  _uw reserved5;
> +	  _uw reserved5;  /* Personality routine GOT value in FDPIC mode.  */
>  	}
>        unwinder_cache;
>        /* Propagation barrier cache (valid after phase 1): */
> @@ -247,4 +247,6 @@ typedef unsigned long _uleb128_t;
>  }   /* extern "C" */
>  #endif
>  
> +#define FDPIC_REGNUM 9

Looking at the rest of this file, I think it can end up being included
in user code.  So you have to put predefines into the reserved
namespace.  Why do you need this here anyway?

> +
>  #endif /* defined UNWIND_ARM_COMMON_H */
> diff --git a/libgcc/config/arm/linux-atomic.c b/libgcc/config/arm/linux-atomic.c
> index d334c58..161d1ce 100644
> --- a/libgcc/config/arm/linux-atomic.c
> +++ b/libgcc/config/arm/linux-atomic.c
> @@ -25,11 +25,49 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  
>  /* Kernel helper for compare-and-exchange.  */
>  typedef int (__kernel_cmpxchg_t) (int oldval, int newval, int *ptr);
> +#if __FDPIC__
> +/* Non-FDPIC ABIs call __kernel_cmpxchg directly by dereferencing its
> +   address, but under FDPIC we would generate a broken call
> +   sequence. That's why we have to implement __kernel_cmpxchg and
> +   __kernel_dmb here: this way, the FDPIC call sequence works.  */
> +#define __kernel_cmpxchg __fdpic_cmpxchg
> +#else
>  #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
> +#endif
>  
>  /* Kernel helper for memory barrier.  */
>  typedef void (__kernel_dmb_t) (void);
> +#if __FDPIC__
> +#define __kernel_dmb __fdpic_dmb
> +#else
>  #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0)
> +#endif
> +
> +#if __FDPIC__
> +static int __fdpic_cmpxchg (int oldval, int newval, int *ptr)
> +{
> +  int result;
> +
> +  asm volatile ("1: ldrex r3, [%[ptr]]\n\t"
> +		"subs  r3, r3, %[oldval]\n\t"
> +		"itt eq\n\t"
> +		"strexeq r3, %[newval], [%[ptr]]\n\t"
> +		"teqeq r3, #1\n\t"
> +		"it eq\n\t"
> +		"beq 1b\n\t"
> +		"rsbs  %[result], r3, #0\n\t"
> +		: [result] "=r" (result)
> +		: [oldval] "r" (oldval) , [newval] "r" (newval), [ptr] "r" (ptr)
> +		: "r3");
> +    return result;
> +}
> +
> +static void __fdpic_dmb ()
> +{
> +  asm volatile ("dmb\n\t");
> +}
> +

The whole point of __kernel_dmb and __kernel_cmpxchg is that the kernel
can map in a code sequence specific to the runtime CPU.  This ensures
that the right sequence is used for that CPU.  This breaks that
principle entirely.

> +#endif
>  
>  /* Note: we implement byte, short and int versions of atomic operations using
>     the above kernel helpers; see linux-atomic-64bit.c for "long long" (64-bit)
> diff --git a/libgcc/config/arm/unwind-arm.h b/libgcc/config/arm/unwind-arm.h
> index 9f7d3f2..db5dfa2 100644
> --- a/libgcc/config/arm/unwind-arm.h
> +++ b/libgcc/config/arm/unwind-arm.h
> @@ -33,9 +33,31 @@
>  /* Use IP as a scratch register within the personality routine.  */
>  #define UNWIND_POINTER_REG 12
>  
> +#define STR(x) #x
> +#define XSTR(x) STR(x)
> +
>  #ifdef __cplusplus
>  extern "C" {
>  #endif
> +_Unwind_Ptr __attribute__((weak)) __gnu_Unwind_Find_got (_Unwind_Ptr);
> +
> +static inline _Unwind_Ptr gnu_Unwind_Find_got (_Unwind_Ptr ptr)
> +{
> +    _Unwind_Ptr res;
> +
> +    if (__gnu_Unwind_Find_got)
> +	res =  __gnu_Unwind_Find_got (ptr);
> +    else
> +      {
> +	asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
> +		      : [result]"=r" (res)
> +		      :
> +		      :);
> +      }
> +
> +    return res;
> +}
> +
>    /* Decode an R_ARM_TARGET2 relocation.  */
>    static inline _Unwind_Word
>    _Unwind_decode_typeinfo_ptr (_Unwind_Word base __attribute__ ((unused)),
> @@ -48,7 +70,12 @@ extern "C" {
>        if (!tmp)
>  	return 0;
>  
> -#if (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
> +#if __FDPIC__
> +      /* For FDPIC, we store the offset of the GOT entry.  */
> +      /* So, first get GOT from dynamic linker and then use indirect access.  */
> +      tmp += gnu_Unwind_Find_got (ptr);
> +      tmp = *(_Unwind_Word *) tmp;
> +#elif (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
>      || defined(__FreeBSD__) || defined(__fuchsia__)
>        /* Pc-relative indirect.  */
>  #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel | DW_EH_PE_indirect)
> diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
> index 76f8fc3..7187edd 100644
> --- a/libgcc/unwind-arm-common.inc
> +++ b/libgcc/unwind-arm-common.inc
> @@ -62,6 +62,7 @@ __gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
>  #define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2)
>  #define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3)
>  #define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4)
> +#define UCB_PR_GOT(ucbp) ((ucbp)->unwinder_cache.reserved5)
>  
>  /* Unwind descriptors.  */
>  
> @@ -85,6 +86,15 @@ typedef struct __EIT_entry
>    _uw content;
>  } __EIT_entry;
>  
> +#ifdef __FDPIC__
> +
> +/* Only used in FDPIC case.  */
> +struct funcdesc_t {
> +    unsigned int ptr;
> +    unsigned int got;
> +};

This isn't in GNU style.

> +#endif
> +
>  /* Assembly helper functions.  */
>  
>  /* Restore core register state.  Never returns.  */
> @@ -259,7 +269,21 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
>      {
>        /* One of the predefined standard routines.  */
>        _uw idx = (*(_uw *) ucbp->pr_cache.ehtp >> 24) & 0xf;
> +#if __FDPIC__
> +      {
> +	struct funcdesc_t *funcdesc
> +	  = (struct funcdesc_t *) __gnu_unwind_get_pr_addr (idx);
> +	if (funcdesc)
> +	  {
> +	    UCB_PR_ADDR (ucbp) = funcdesc->ptr;
> +	    UCB_PR_GOT (ucbp) = funcdesc->got;
> +	  }
> +	else
> +	  UCB_PR_ADDR (ucbp) = 0;
> +      }
> +#else
>        UCB_PR_ADDR (ucbp) = __gnu_unwind_get_pr_addr (idx);
> +#endif
>        if (UCB_PR_ADDR (ucbp) == 0)
>  	{
>  	  /* Failed */
> @@ -270,6 +294,10 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw return_address)
>      {
>        /* Execute region offset to PR */
>        UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
> +#if __FDPIC__
> +      UCB_PR_GOT (ucbp)
> +	= (unsigned int) gnu_Unwind_Find_got ((_Unwind_Ptr) UCB_PR_ADDR (ucbp));
> +#endif
>      }
>    return _URC_OK;
>  }
> @@ -291,14 +319,29 @@ unwind_phase2 (_Unwind_Control_Block * ucbp, phase2_vrs * vrs)
>        UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC(vrs);
>  
>        /* Call the pr to decide what to do.  */
> +#if __FDPIC__
> +      {
> +	volatile struct funcdesc_t funcdesc;
> +	funcdesc.ptr = UCB_PR_ADDR (ucbp);
> +	funcdesc.got = UCB_PR_GOT (ucbp);
> +	pr_result = ((personality_routine) &funcdesc)
> +	  (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
> +      }
> +#else
>        pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
>  	(_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
> +#endif
>      }
>    while (pr_result == _URC_CONTINUE_UNWIND);
>    
>    if (pr_result != _URC_INSTALL_CONTEXT)
>      abort();
>  
> +#if __FDPIC__
> +  /* r9 could have been lost due to PLT jump.  Restore correct value.  */
> +  vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (vrs));
> +#endif
> +
>    uw_restore_core_regs (vrs, &vrs->core);
>  }
>  
> @@ -346,8 +389,18 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
>  	  next_vrs = saved_vrs;
>  
>  	  /* Call the pr to decide what to do.  */
> +#if __FDPIC__
> +	  {
> +	    volatile struct funcdesc_t funcdesc;
> +	    funcdesc.ptr = UCB_PR_ADDR (ucbp);
> +	    funcdesc.got = UCB_PR_GOT (ucbp);
> +	    pr_result = ((personality_routine) &funcdesc)
> +	      (action, ucbp, (void *) &next_vrs);
> +	  }
> +#else
>  	  pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
>  	    (action, ucbp, (void *) &next_vrs);
> +#endif
>  
>  	  saved_vrs.prev_sp = VRS_SP (&next_vrs);
>  	}
> @@ -384,6 +437,11 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp, phase2_vrs *entry_vrs,
>        return _URC_FAILURE;
>      }
>  
> +#if __FDPIC__
> +  /* r9 could have been lost due to PLT jump.  Restore correct value.  */
> +  saved_vrs.core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (&saved_vrs));
> +#endif
> +
>    uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
>  }
>  
> @@ -429,8 +487,18 @@ __gnu_Unwind_RaiseException (_Unwind_Control_Block * ucbp,
>  	return _URC_FAILURE;
>  
>        /* Call the pr to decide what to do.  */
> +#if __FDPIC__
> +      {
> +	volatile struct funcdesc_t funcdesc;
> +	funcdesc.ptr = UCB_PR_ADDR (ucbp);
> +	funcdesc.got = UCB_PR_GOT (ucbp);
> +	pr_result = ((personality_routine) &funcdesc)
> +	  (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
> +      }
> +#else
>        pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
>  	(_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
> +#endif
>      }
>    while (pr_result == _URC_CONTINUE_UNWIND);
>  
> @@ -488,13 +556,27 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp, phase2_vrs * entry_vrs)
>      }
>  
>    /* Call the cached PR.  */
> +#if __FDPIC__
> +  {
> +    volatile struct funcdesc_t funcdesc;
> +    funcdesc.ptr = UCB_PR_ADDR (ucbp);
> +    funcdesc.got = UCB_PR_GOT (ucbp);
> +    pr_result = ((personality_routine) &funcdesc)
> +      (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
> +  }
> +#else
>    pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
>  	(_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
> +#endif
>  
>    switch (pr_result)
>      {
>      case _URC_INSTALL_CONTEXT:
>        /* Upload the registers to enter the landing pad.  */
> +#if __FDPIC__
> +      /* r9 could have been lost due to PLT jump.  Restore correct value.  */
> +      entry_vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (entry_vrs));
> +#endif
>        uw_restore_core_regs (entry_vrs, &entry_vrs->core);
>  
>      case _URC_CONTINUE_UNWIND:
> @@ -586,9 +668,20 @@ __gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
>  	}
>  
>        /* Call the pr to decide what to do.  */
> +#if __FDPIC__
> +      {
> +	volatile struct funcdesc_t funcdesc;
> +	funcdesc.ptr = UCB_PR_ADDR (ucbp);
> +	funcdesc.got = UCB_PR_GOT (ucbp);
> +	code = ((personality_routine) &funcdesc)
> +	  (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
> +	   ucbp, (void *) &saved_vrs);
> +      }
> +#else
>        code = ((personality_routine) UCB_PR_ADDR (ucbp))
>  	(_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND, 
>  	 ucbp, (void *) &saved_vrs);
> +#endif
>      }
>    while (code != _URC_END_OF_STACK
>  	 && code != _URC_FAILURE);
> diff --git a/libgcc/unwind-pe.h b/libgcc/unwind-pe.h
> index dd5ae95..9c5177f 100644
> --- a/libgcc/unwind-pe.h
> +++ b/libgcc/unwind-pe.h
> @@ -259,10 +259,27 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
>  
>        if (result != 0)
>  	{
> +#if __FDPIC__
> +	  /* FDPIC relative addresses imply taking the GOT address
> +	     into account.  */
> +	  if ((encoding & DW_EH_PE_pcrel) && (encoding & DW_EH_PE_indirect))
> +	    {
> +	      result += gnu_Unwind_Find_got ((_Unwind_Ptr) u);
> +	      result = *(_Unwind_Internal_Ptr *) result;
> +	    }
> +	  else
> +	    {
> +	      result += ((encoding & 0x70) == DW_EH_PE_pcrel
> +			 ? (_Unwind_Internal_Ptr) u : base);
> +	      if (encoding & DW_EH_PE_indirect)
> +		result = *(_Unwind_Internal_Ptr *) result;
> +	    }
> +#else
>  	  result += ((encoding & 0x70) == DW_EH_PE_pcrel
>  		     ? (_Unwind_Internal_Ptr) u : base);
>  	  if (encoding & DW_EH_PE_indirect)
>  	    result = *(_Unwind_Internal_Ptr *) result;
> +#endif
>  	}
>      }
>  
> diff --git a/libstdc++-v3/libsupc++/eh_personality.cc b/libstdc++-v3/libsupc++/eh_personality.cc
> index 1b336c7..7b26b8d 100644
> --- a/libstdc++-v3/libsupc++/eh_personality.cc
> +++ b/libstdc++-v3/libsupc++/eh_personality.cc
> @@ -93,7 +93,15 @@ get_ttype_entry (lsda_header_info *info, _uleb128_t i)
>    _Unwind_Ptr ptr;
>  
>    i *= size_of_encoded_value (info->ttype_encoding);
> -  read_encoded_value_with_base (info->ttype_encoding, info->ttype_base,
> +  read_encoded_value_with_base (
> +#if __FDPIC__
> +				/* Force these flags to nake sure to
> +				   take the GOT into account.  */
> +				(DW_EH_PE_pcrel | DW_EH_PE_indirect),
> +#else
> +				info->ttype_encoding,
> +#endif
> +				info->ttype_base,
>  				info->TType - i, &ptr);
>  
>    return reinterpret_cast<const std::type_info *>(ptr);
> 

Nearly all of the above is outside of my comfort zone...  I can't help
feeling that there ought to be a less invasive way to do this, but
without being particularly familiar with the code it's difficult to be sure.

The last two files patched will need approval from a relevant component
maintainer.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO
  2018-10-11 13:38 ` [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO Christophe Lyon
@ 2018-10-12 12:21   ` Richard Earnshaw (lists)
  2018-10-15 14:30     ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 12:21 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	gcc/
> 	* config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Handle
> 	FDPIC.
> 	(thumb1_compute_save_core_reg_mask): Likewise.

The hunk for this bit is missing.

> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index 92ae24b..a6dce36 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -19470,7 +19470,7 @@ arm_compute_save_reg0_reg12_mask (void)
>  
>        /* Also save the pic base register if necessary.  */
>        if (flag_pic
> -	  && !TARGET_SINGLE_PIC_BASE
> +	  && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
>  	  && arm_pic_register != INVALID_REGNUM
>  	  && crtl->uses_pic_offset_table)
>  	save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
> @@ -19504,7 +19504,7 @@ arm_compute_save_reg0_reg12_mask (void)
>        /* If we aren't loading the PIC register,
>  	 don't stack it even though it may be live.  */
>        if (flag_pic
> -	  && !TARGET_SINGLE_PIC_BASE
> +	  && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
>  	  && arm_pic_register != INVALID_REGNUM
>  	  && (df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)
>  	      || crtl->uses_pic_offset_table))
> 

	flag_pic
	  && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
  	  && arm_pic_register != INVALID_REGNUM

Might be worth lifting this out into a macro.

R.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors
  2018-10-11 13:38 ` [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors Christophe Lyon
@ 2018-10-12 12:39   ` Richard Earnshaw (lists)
  0 siblings, 0 replies; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-12 12:39 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 11/10/18 14:34, Christophe Lyon wrote:
> Use local binding rules to decide whether we can use GOTOFFFUNCDESC to
> compute the function address.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	gcc/
> 	* config/arm/arm.c (arm_local_funcdesc_p): New function.
> 	(legitimize_pic_address): Ensure binding rules on function

Enforce?

> 	pointers in FDPIC mode.
> 	(arm_assemble_integer): Likewise.
> 
> Change-Id: I3fa0b63bc0f672903f405aa72cc46052de1c0feb
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index a6dce36..d0144fd 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -3768,6 +3768,42 @@ arm_options_perform_arch_sanity_checks (void)
>      }
>  }
>  
> +/* Test whether a local function descriptor is canonical, i.e.,
> +   whether we can use GOTOFFFUNCDESC to compute the address of the
> +   function.  */
> +static bool
> +arm_local_funcdesc_p (rtx fnx)

Given that this function doesn't return what it's name implies when not
FDPIC, I think the name should reflect that.  Please rename to
arm_fdpic_local...

> +{
> +  tree fn;
> +  enum symbol_visibility vis;
> +  bool ret;
> +
> +  if (!TARGET_FDPIC)
> +    return TRUE;
> +
> +  if (! SYMBOL_REF_LOCAL_P (fnx))
> +    return FALSE;
> +
> +  fn = SYMBOL_REF_DECL (fnx);
> +
> +  if (! fn)
> +    return FALSE;
> +
> +  vis = DECL_VISIBILITY (fn);
> +
> +  if (vis == VISIBILITY_PROTECTED)
> +    /* Private function descriptors for protected functions are not
> +       canonical.  Temporarily change the visibility to global so that
> +       we can ensure unicity of funcdesc pointers.  */

s/unicity/uniqueness/

> +    DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT;
> +
> +  ret = default_binds_local_p_1 (fn, flag_pic);
> +
> +  DECL_VISIBILITY (fn) = vis;
> +
> +  return ret;
> +}
> +
>  static void
>  arm_add_gc_roots (void)
>  {
> @@ -7485,7 +7521,9 @@ legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
>  	   || (GET_CODE (orig) == SYMBOL_REF
>  	       && SYMBOL_REF_LOCAL_P (orig)
>  	       && (SYMBOL_REF_DECL (orig)
> -		   ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)))
> +		   ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)
> +	       && (!SYMBOL_REF_FUNCTION_P(orig)

space before parenthesis

> +		   || arm_local_funcdesc_p (orig))))
>  	  && NEED_GOT_RELOC
>  	  && arm_pic_data_is_text_relative)
>  	insn = arm_pic_static_addr (orig, reg);
> @@ -23053,7 +23091,9 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
>  	      || (GET_CODE (x) == SYMBOL_REF
>  		  && (!SYMBOL_REF_LOCAL_P (x)
>  		      || (SYMBOL_REF_DECL (x)
> -			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
> +			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0)
> +		      || (SYMBOL_REF_FUNCTION_P (x)
> +			  && !arm_local_funcdesc_p (x)))))
>  	    {
>  	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>  		fputs ("(GOTFUNCDESC)", asm_out_file);
> 

OK with those changes.

R.

[gonna have to stop now and I'm OoO next week]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  2018-10-12 10:14   ` Richard Earnshaw (lists)
@ 2018-10-15  8:46     ` Christophe Lyon
  2018-11-09 12:31       ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-15  8:46 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Fri, 12 Oct 2018 at 11:54, Richard Earnshaw (lists) <
Richard.Earnshaw@arm.com> wrote:

> On 11/10/18 14:34, Christophe Lyon wrote:
> > The new arm-uclinuxfdpiceabi target behaves pretty much like
> > arm-linux-gnueabi. In order the enable the same set of features, we
> > have to update several configure scripts that generally match targets
> > like *-*-linux*: in most places, we add *-uclinux* where there is
> > already *-linux*, or uclinux* when there is already linux*.
> >
> > In gcc/config.gcc and libgcc/config.host we use *-*-uclinuxfdpiceabi
> > because there is already a different behaviour for *-*uclinux* target.
> >
> > In libtool.m4, we use uclinuxfdpiceabi in cases where ELF shared
> > libraries support is required, as uclinux does not guarantee that.
> >
> > 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >
> >       config/
> >       * futex.m4: Handle *-uclinux*.
> >       * tls.m4 (GCC_CHECK_TLS): Likewise.
> >
> >       gcc/
> >       * config.gcc: Handle *-*-uclinuxfdpiceabi.
> >
> >       libatomic/
> >       * configure.tgt: Handle arm*-*-uclinux*.
> >       * configure: Regenerate.
> >
> >       libgcc/
> >       * config.host: Handle *-*-uclinuxfdpiceabi.
> >
> >       libitm/
> >       * configure.tgt: Handle *-*-uclinux*.
> >       * configure: Regenerate.
> >
> >       libstdc++-v3/
> >       * acinclude.m4: Handle uclinux*.
> >       * configure: Regenerate.
> >       * configure.host: Handle uclinux*
> >
> >       * libtool.m4: Handle uclinux*.
>
> What testing have you done to ensure that these new uclinux* changes
> have not affected existing uclinux configurations?
>
> Also, do you really need to use uclinuxfdpiceabi (which is quite
> Arm-specific) everywhere, or would uclinuxfdpic* be better and ease work
> for other fdpic targets?
>
>
This patch became necessary when I was asked to change the target name
from  arm-linux-uclibceabi to arm-uclinuxfdpiceabi.
Changing it implied that many features were disabled and tests regressed
because the new target name didn't match the regexps in configure scripts.

I iterated over the regressions to see which features were now missing, and
I updated the configure scripts accordingly.

When the feature being tested was generic, I used the general *-*-uclinux*
form, because it seemed reasonable that it was OK for other targets.
When the test was arm-related, I used the stricter uclinuxfdpiceabi form,
and specifically not uclinuxfdpic* to avoid breaking other fdpic targets.
When in doubt, I preferred to stay on the safe side.

To answer you first question, I do not have the setup to test other uclinux
configs, I'm not even sure of the list.
So I tested arm-uclinuxfdpiceabi, made sure I got the same results as with
our previous target name, and that
the whole series didn't regress on arm-linux-gnueabi*.

I hope other uclinux/fdpic target maintainers comment on this patch if
something looks wrong to them.

Christophe

R.
> >
> > Change-Id: I6a1fdcd9847d8a82179a214612a3474c1f492916
> >
> > diff --git a/config/futex.m4 b/config/futex.m4
> > index e95144d..4dffe15 100644
> > --- a/config/futex.m4
> > +++ b/config/futex.m4
> > @@ -9,7 +9,7 @@ AC_DEFUN([GCC_LINUX_FUTEX],[dnl
> >  GCC_ENABLE(linux-futex,default, ,[use the Linux futex system call],
> >          permit yes|no|default)
> >  case "$target" in
> > -  *-linux*)
> > +  *-linux* | *-uclinux*)
> >      case "$enable_linux_futex" in
> >        default)
> >       # If headers don't have gettid/futex syscalls definition, then
> > diff --git a/config/tls.m4 b/config/tls.m4
> > index 4e170c8..5a8676e 100644
> > --- a/config/tls.m4
> > +++ b/config/tls.m4
> > @@ -76,7 +76,7 @@ AC_DEFUN([GCC_CHECK_TLS], [
> >         dnl Shared library options may depend on the host; this check
> >         dnl is only known to be needed for GNU/Linux.
> >         case $host in
> > -         *-*-linux*)
> > +         *-*-linux* | -*-uclinux*)
> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
> >             ;;
> >         esac
> > diff --git a/gcc/config.gcc b/gcc/config.gcc
> > index 0c579d1..793fc69 100644
> > --- a/gcc/config.gcc
> > +++ b/gcc/config.gcc
> > @@ -753,7 +753,7 @@ case ${target} in
> >  *-*-fuchsia*)
> >    native_system_header_dir=/include
> >    ;;
> > -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* |
> *-*-kopensolaris*-gnu)
> > +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* |
> *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
> >    extra_options="$extra_options gnu-user.opt"
> >    gas=yes
> >    gnu_ld=yes
> > @@ -762,7 +762,7 @@ case ${target} in
> >    esac
> >    tmake_file="t-slibgcc"
> >    case $target in
> > -    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu |
> *-*-kopensolaris*-gnu)
> > +    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu |
> *-*-kopensolaris*-gnu  | *-*-uclinuxfdpiceabi)
> >        :;;
> >      *-*-gnu*)
> >        native_system_header_dir=/include
> > @@ -782,7 +782,7 @@ case ${target} in
> >      *-*-*android*)
> >        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC"
> >        ;;
> > -    *-*-*uclibc*)
> > +    *-*-*uclibc* | *-*-uclinuxfdpiceabi)
> >        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
> >        ;;
> >      *-*-*musl*)
> > @@ -1134,7 +1134,7 @@ arm*-*-netbsdelf*)
> >       tmake_file="${tmake_file} arm/t-arm"
> >       target_cpu_cname="arm6"
> >       ;;
> > -arm*-*-linux-*)                      # ARM GNU/Linux with ELF
> > +arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)                    # ARM
> GNU/Linux with ELF
> >       tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h
> glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
> >       extra_options="${extra_options} linux-android.opt"
> >       case $target in
> > diff --git a/libatomic/configure b/libatomic/configure
> > index b902e2c..5b3ef8e 100755
> > --- a/libatomic/configure
> > +++ b/libatomic/configure
> > @@ -5819,7 +5819,7 @@ irix5* | irix6* | nonstopux*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    lt_cv_deplibs_check_method=pass_all
> >    ;;
> >
> > @@ -8305,7 +8305,7 @@ $as_echo_n "checking for $compiler option to
> produce PIC... " >&6; }
> >        lt_prog_compiler_static='-non_shared'
> >        ;;
> >
> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >        case $cc_basename in
> >        # old Intel for x86_64 which still supported -KPIC.
> >        ecc*)
> > @@ -8900,7 +8900,7 @@ _LT_EOF
> >        archive_expsym_cmds='sed "s,^,_," $export_symbols
> >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs
> $compiler_flags ${wl}-h,$soname
> ${wl}--retain-symbols-file,$output_objdir/$soname.expsym
> ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o
> $lib'
> >        ;;
> >
> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu |
> uclinuxfdpiceabi)
> >        tmp_diet=no
> >        if test "$host_os" = linux-dietlibc; then
> >       case $cc_basename in
> > @@ -10431,7 +10431,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
> > index ea8c34f..c1a608f 100644
> > --- a/libatomic/configure.tgt
> > +++ b/libatomic/configure.tgt
> > @@ -124,7 +124,7 @@ case "${target}" in
> >       config_path="${config_path} linux/aarch64 posix"
> >       ;;
> >
> > -  arm*-*-linux*)
> > +  arm*-*-linux* | arm*-*-uclinux*)
> >       # OS support for atomic primitives.
> >       config_path="${config_path} linux/arm posix"
> >       ;;
> > diff --git a/libgcc/config.host b/libgcc/config.host
> > index 029f656..28f3c14 100644
> > --- a/libgcc/config.host
> > +++ b/libgcc/config.host
> > @@ -238,7 +238,7 @@ case ${host} in
> >    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip
> t-slibgcc t-slibgcc-fuchsia"
> >    extra_parts="crtbegin.o crtend.o"
> >    ;;
> > -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* |
> *-*-kopensolaris*-gnu)
> > +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* |
> *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
> >    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip
> t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
> >    extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
> >    if test x$enable_vtable_verify = xyes; then
> > @@ -424,7 +424,7 @@ arm*-*-fuchsia*)
> >  arm*-*-netbsdelf*)
> >       tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
> >       ;;
> > -arm*-*-linux*)                       # ARM GNU/Linux with ELF
> > +arm*-*-linux* | arm*-*-uclinuxfdpiceabi)                     # ARM
> GNU/Linux with ELF
> >       tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix
> t-crtfm"
> >       tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi
> t-slibgcc-libgcc"
> >       tm_file="$tm_file arm/bpabi-lib.h"
> > diff --git a/libitm/configure b/libitm/configure
> > index dbf386d..fd82500 100644
> > --- a/libitm/configure
> > +++ b/libitm/configure
> > @@ -6494,7 +6494,7 @@ irix5* | irix6* | nonstopux*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    lt_cv_deplibs_check_method=pass_all
> >    ;;
> >
> > @@ -8981,7 +8981,7 @@ $as_echo_n "checking for $compiler option to
> produce PIC... " >&6; }
> >        lt_prog_compiler_static='-non_shared'
> >        ;;
> >
> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >        case $cc_basename in
> >        # old Intel for x86_64 which still supported -KPIC.
> >        ecc*)
> > @@ -9576,7 +9576,7 @@ _LT_EOF
> >        archive_expsym_cmds='sed "s,^,_," $export_symbols
> >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs
> $compiler_flags ${wl}-h,$soname
> ${wl}--retain-symbols-file,$output_objdir/$soname.expsym
> ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o
> $lib'
> >        ;;
> >
> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu |
> uclinuxfdpiceabi)
> >        tmp_diet=no
> >        if test "$host_os" = linux-dietlibc; then
> >       case $cc_basename in
> > @@ -11107,7 +11107,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > @@ -13008,7 +13008,7 @@ if test -z "$aix_libpath"; then
> aix_libpath="/usr/lib:/lib"; fi
> >          inherit_rpath_CXX=yes
> >          ;;
> >
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >          case $cc_basename in
> >            KCC*)
> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
> > @@ -13595,7 +13595,7 @@ interix[3-9]*)
> >    postdeps_CXX=
> >    ;;
> >
> > -linux*)
> > +linux* | uclinux*)
> >    case `$CC -V 2>&1 | sed 5q` in
> >    *Sun\ C*)
> >      # Sun C++ 5.9
> > @@ -13846,7 +13846,7 @@ $as_echo_n "checking for $compiler option to
> produce PIC... " >&6; }
> >           ;;
> >       esac
> >       ;;
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >       case $cc_basename in
> >         KCC*)
> >           # KAI C++ Compiler
> > @@ -14767,7 +14767,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > @@ -16239,7 +16239,7 @@ fi
> >
> >
> >  case "$target" in
> > -  *-linux*)
> > +  *-linux* | *-uclinux*)
> >      case "$enable_linux_futex" in
> >        default)
> >       # If headers don't have gettid/futex syscalls definition, then
> > @@ -16362,7 +16362,7 @@ _ACEOF
> >  if ac_fn_c_try_link "$LINENO"; then :
> >    chktls_save_LDFLAGS="$LDFLAGS"
> >                         case $host in
> > -         *-*-linux*)
> > +         *-*-linux* | -*-uclinux*)
> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
> >             ;;
> >         esac
> > diff --git a/libitm/configure.tgt b/libitm/configure.tgt
> > index 0cbb097..bc6c3ca 100644
> > --- a/libitm/configure.tgt
> > +++ b/libitm/configure.tgt
> > @@ -127,7 +127,7 @@ config_path="$ARCH posix generic"
> >
> >  # Other system configury
> >  case "${target}" in
> > -  *-*-linux*)
> > +  *-*-linux* | *-*-uclinux*)
> >       if test "$enable_linux_futex" = yes; then
> >         config_path="linux/$ARCH linux $config_path"
> >       fi
> > diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
> > index 6d68e90..2e18049 100644
> > --- a/libstdc++-v3/acinclude.m4
> > +++ b/libstdc++-v3/acinclude.m4
> > @@ -1395,7 +1395,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
> >          ac_has_nanosleep=yes
> >          ac_has_sched_yield=yes
> >          ;;
> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >          AC_MSG_CHECKING([for at least GNU libc 2.17])
> >          AC_TRY_COMPILE(
> >            [#include <features.h>],
> > @@ -1517,7 +1517,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
> >
> >    if test x"$ac_has_clock_monotonic" != x"yes"; then
> >      case ${target_os} in
> > -      linux*)
> > +      linux* | uclinux*)
> >       AC_MSG_CHECKING([for clock_gettime syscall])
> >       AC_TRY_COMPILE(
> >         [#include <unistd.h>
> > @@ -2402,7 +2402,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
> >    # Default to "generic".
> >    if test $enable_clocale_flag = auto; then
> >      case ${target_os} in
> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >       enable_clocale_flag=gnu
> >       ;;
> >        darwin*)
> > @@ -2648,7 +2648,7 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
> >    # Default to "new".
> >    if test $enable_libstdcxx_allocator_flag = auto; then
> >      case ${target_os} in
> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >       enable_libstdcxx_allocator_flag=new
> >       ;;
> >        *)
> > @@ -4282,7 +4282,7 @@ AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
> >        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
> >          enable_libstdcxx_filesystem_ts=yes
> >          ;;
> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >          enable_libstdcxx_filesystem_ts=yes
> >          ;;
> >        rtems*)
> > @@ -4430,7 +4430,7 @@ dnl
> >      AC_MSG_CHECKING([for sendfile that can copy files])
> >      AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
> >        case "${target_os}" in
> > -        gnu* | linux* | solaris*)
> > +        gnu* | linux* | solaris* | uclinux*)
> >            GCC_TRY_COMPILE_OR_LINK(
> >              [#include <sys/sendfile.h>],
> >              [sendfile(1, 2, (off_t*)0, sizeof 1);],
> > diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
> > index d33081d..7780679 100755
> > --- a/libstdc++-v3/configure
> > +++ b/libstdc++-v3/configure
> > @@ -6413,7 +6413,7 @@ irix5* | irix6* | nonstopux*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    lt_cv_deplibs_check_method=pass_all
> >    ;;
> >
> > @@ -8765,7 +8765,7 @@ $as_echo_n "checking for $compiler option to
> produce PIC... " >&6; }
> >        lt_prog_compiler_static='-non_shared'
> >        ;;
> >
> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >        case $cc_basename in
> >        # old Intel for x86_64 which still supported -KPIC.
> >        ecc*)
> > @@ -9360,7 +9360,7 @@ _LT_EOF
> >        archive_expsym_cmds='sed "s,^,_," $export_symbols
> >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs
> $compiler_flags ${wl}-h,$soname
> ${wl}--retain-symbols-file,$output_objdir/$soname.expsym
> ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o
> $lib'
> >        ;;
> >
> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu |
> uclinuxfdpiceabi)
> >        tmp_diet=no
> >        if test "$host_os" = linux-dietlibc; then
> >       case $cc_basename in
> > @@ -10900,7 +10900,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > @@ -12825,7 +12825,7 @@ if test -z "$aix_libpath"; then
> aix_libpath="/usr/lib:/lib"; fi
> >          inherit_rpath_CXX=yes
> >          ;;
> >
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >          case $cc_basename in
> >            KCC*)
> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
> > @@ -13412,7 +13412,7 @@ interix[3-9]*)
> >    postdeps_CXX=
> >    ;;
> >
> > -linux*)
> > +linux* | uclinux*)
> >    case `$CC -V 2>&1 | sed 5q` in
> >    *Sun\ C*)
> >      # Sun C++ 5.9
> > @@ -13663,7 +13663,7 @@ $as_echo_n "checking for $compiler option to
> produce PIC... " >&6; }
> >           ;;
> >       esac
> >       ;;
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >       case $cc_basename in
> >         KCC*)
> >           # KAI C++ Compiler
> > @@ -14584,7 +14584,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > @@ -15833,7 +15833,7 @@ fi
> >    # Default to "generic".
> >    if test $enable_clocale_flag = auto; then
> >      case ${target_os} in
> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >       enable_clocale_flag=gnu
> >       ;;
> >        darwin*)
> > @@ -16250,7 +16250,7 @@ fi
> >    # Default to "new".
> >    if test $enable_libstdcxx_allocator_flag = auto; then
> >      case ${target_os} in
> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >       enable_libstdcxx_allocator_flag=new
> >       ;;
> >        *)
> > @@ -20526,7 +20526,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> >          ac_has_nanosleep=yes
> >          ac_has_sched_yield=yes
> >          ;;
> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at least
> GNU libc 2.17" >&5
> >  $as_echo_n "checking for at least GNU libc 2.17... " >&6; }
> >          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> > @@ -21026,7 +21026,7 @@ $as_echo "$ac_has_nanosleep" >&6; }
> >
> >    if test x"$ac_has_clock_monotonic" != x"yes"; then
> >      case ${target_os} in
> > -      linux*)
> > +      linux* | uclinux*)
> >       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for
> clock_gettime syscall" >&5
> >  $as_echo_n "checking for clock_gettime syscall... " >&6; }
> >       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> > @@ -27918,7 +27918,7 @@ _ACEOF
> >  if ac_fn_c_try_link "$LINENO"; then :
> >    chktls_save_LDFLAGS="$LDFLAGS"
> >                         case $host in
> > -         *-*-linux*)
> > +         *-*-linux* | -*-uclinux*)
> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
> >             ;;
> >         esac
> > @@ -53578,7 +53578,7 @@ _ACEOF
> >  if ac_fn_c_try_link "$LINENO"; then :
> >    chktls_save_LDFLAGS="$LDFLAGS"
> >                         case $host in
> > -         *-*-linux*)
> > +         *-*-linux* | -*-uclinux*)
> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
> >             ;;
> >         esac
> > @@ -59771,7 +59771,7 @@ _ACEOF
> >  if ac_fn_c_try_link "$LINENO"; then :
> >    chktls_save_LDFLAGS="$LDFLAGS"
> >                         case $host in
> > -         *-*-linux*)
> > +         *-*-linux* | -*-uclinux*)
> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
> >             ;;
> >         esac
> > @@ -78397,7 +78397,7 @@ fi
> >
> >
> >  case "$target" in
> > -  *-linux*)
> > +  *-linux* | *-uclinux*)
> >      case "$enable_linux_futex" in
> >        default)
> >       # If headers don't have gettid/futex syscalls definition, then
> > @@ -80033,7 +80033,7 @@ $as_echo_n "checking whether to build Filesystem
> TS support... " >&6; }
> >        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
> >          enable_libstdcxx_filesystem_ts=yes
> >          ;;
> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
> >          enable_libstdcxx_filesystem_ts=yes
> >          ;;
> >        rtems*)
> > @@ -80457,7 +80457,7 @@ $as_echo_n "checking for sendfile that can copy
> files... " >&6; }
> >    $as_echo_n "(cached) " >&6
> >  else
> >          case "${target_os}" in
> > -        gnu* | linux* | solaris*)
> > +        gnu* | linux* | solaris* | uclinux*)
> >            if test x$gcc_no_link = xyes; then
> >    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> >  /* end confdefs.h.  */
> > diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
> > index 155a3cd..1c298ab 100644
> > --- a/libstdc++-v3/configure.host
> > +++ b/libstdc++-v3/configure.host
> > @@ -264,7 +264,7 @@ case "${host_os}" in
> >    linux-musl*)
> >      os_include_dir="os/generic"
> >      ;;
> > -  gnu* | linux* | kfreebsd*-gnu)
> > +  gnu* | linux* | kfreebsd*-gnu | uclinux*)
> >      if [ "$uclibc" = "yes" ]; then
> >        os_include_dir="os/uclibc"
> >      elif [ "$bionic" = "yes" ]; then
> > @@ -327,7 +327,7 @@ esac
> >  # Set any OS-dependent and CPU-dependent bits.
> >  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
> >  case "${host}" in
> > -  *-*-linux*)
> > +  *-*-linux* | *-*-uclinux*)
> >      case "${host_cpu}" in
> >        i[567]86)
> >          abi_baseline_pair=i486-linux-gnu
> > @@ -358,7 +358,7 @@ case "${host}" in
> >          fi
> >      esac
> >      case "${host}" in
> > -      arm*-*-linux-*)
> > +      arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
> >
>  port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
> >       ;;
> >      esac
> > diff --git a/libtool.m4 b/libtool.m4
> > index 940faaa..49ab293 100644
> > --- a/libtool.m4
> > +++ b/libtool.m4
> > @@ -2449,7 +2449,7 @@ linux*oldld* | linux*aout* | linux*coff*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    version_type=linux
> >    need_lib_prefix=no
> >    need_version=no
> > @@ -3089,7 +3089,7 @@ irix5* | irix6* | nonstopux*)
> >    ;;
> >
> >  # This must be Linux ELF.
> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >    lt_cv_deplibs_check_method=pass_all
> >    ;;
> >
> > @@ -3734,7 +3734,7 @@ m4_if([$1], [CXX], [
> >           ;;
> >       esac
> >       ;;
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >       case $cc_basename in
> >         KCC*)
> >           # KAI C++ Compiler
> > @@ -4032,7 +4032,7 @@ m4_if([$1], [CXX], [
> >        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
> >        ;;
> >
> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
> >        case $cc_basename in
> >        # old Intel for x86_64 which still supported -KPIC.
> >        ecc*)
> > @@ -4449,7 +4449,7 @@ _LT_EOF
> >        _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols
> >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs
> $compiler_flags ${wl}-h,$soname
> ${wl}--retain-symbols-file,$output_objdir/$soname.expsym
> ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o
> $lib'
> >        ;;
> >
> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu |
> uclinuxfdpiceabi)
> >        tmp_diet=no
> >        if test "$host_os" = linux-dietlibc; then
> >       case $cc_basename in
> > @@ -5946,7 +5946,7 @@ if test "$_lt_caught_CXX_error" != yes; then
> >          _LT_TAGVAR(inherit_rpath, $1)=yes
> >          ;;
> >
> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
> >          case $cc_basename in
> >            KCC*)
> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
> > @@ -6598,7 +6598,7 @@ interix[[3-9]]*)
> >    _LT_TAGVAR(postdeps,$1)=
> >    ;;
> >
> > -linux*)
> > +linux* | uclinux*)
> >    case `$CC -V 2>&1 | sed 5q` in
> >    *Sun\ C*)
> >      # Sun C++ 5.9
> >
>
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-12 10:46   ` Richard Earnshaw (lists)
@ 2018-10-15 10:35     ` Christophe Lyon
  2018-10-23 15:01       ` Richard Earnshaw (lists)
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-15 10:35 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Fri, 12 Oct 2018 at 12:01, Richard Earnshaw (lists) <
Richard.Earnshaw@arm.com> wrote:

> On 11/10/18 14:34, Christophe Lyon wrote:
> > In FDPIC mode, we set -fPIE unless the user provides -fno-PIE, -fpie,
> > -fPIC or -fpic: indeed FDPIC code is PIC, but we want to generate code
> > for executables rather than shared libraries by default.
> >
> > We also make sure to use the --fdpic assembler option, and select the
> > appropriate linker emulation.
> >
> > At link time, we also default to -pie, unless we are generating a
> > shared library or a relocatable file (-r). Note that even for static
> > link, we must specify the dynamic linker because the executable still
> > has to relocate itself at startup.
> >
> > We also force 'now' binding since lazy binding is not supported.
> >
> > We should also apply the same behavior for -Wl,-Ur as for -r, but I
> > couldn't find how to describe that in the specs fragment.
> >
> > 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >       Mickaël Guêné <mickael.guene@st.com>
> >
> >       gcc/
> >       * config.gcc: Handle arm*-*-uclinuxfdpiceabi.
> >       * config/arm/bpabi.h (TARGET_FDPIC_ASM_SPEC): New.
> >       (SUBTARGET_EXTRA_ASM_SPEC): Use TARGET_FDPIC_ASM_SPEC.
> >       * config/arm/linux-eabi.h (FDPIC_CC1_SPEC): New.
> >       (CC1_SPEC): Use FDPIC_CC1_SPEC.
> >       * config/arm/uclinuxfdpiceabi.h: New file.
> >
> >       libsanitizer/
> >       * configure.tgt (arm*-*-uclinuxfdpiceabi): Sanitizers are
> >       unsupported in this configuration.
>
> The documentation (in patch 1) seems to imply that -mfdpic is available
> in all configurations and has certain effects (such as enabling -fPIE),
> but this patch set suggests that such behaviours are only available when
> the compiler is configured explicitly for an fdpic target.
>
> I think this needs to be resolved.  Either -mfdpic works everywhere, or
> the option should only be available when configured for -mfdpic.
>
>
You are right, this is not clear. I tried to follow what other fdpic
targets do,
but it's not consistent either, it seems.

So, at present, -mfdpic alone is in general not sufficient, and the user has
to use -fpic/-fPIC/-fpie/-fPIE as needed. When configured for
arm-uclinuxfdpiceabi,
this is done implicitly (thanks to this patch).

One possibility is to rephrase the doc, and say that -fPIE is only implied
when GCC
is configured for arm-uclinuxfdpiceabi.

Do you mean to also make -mfdpic non-existent/rejected when GCC is not
configured
for arm-uclinuxfdpiceabi? How to achieve that?


R.
>
> >
> > Change-Id: If369e0a10bb916fd72e38f71498d3c640fa85c4c
> >
> > diff --git a/gcc/config.gcc b/gcc/config.gcc
> > index 793fc69..a4f4331 100644
> > --- a/gcc/config.gcc
> > +++ b/gcc/config.gcc
> > @@ -1144,6 +1144,11 @@ arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
>               # ARM GNU/Linux with ELF
> >       esac
> >       tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi
> arm/t-linux-eabi"
> >       tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h
> arm/arm.h"
> > +     case $target in
> > +     arm*-*-uclinuxfdpiceabi)
> > +         tm_file="$tm_file arm/uclinuxfdpiceabi.h"
> > +         ;;
> > +     esac
> >       # Generation of floating-point instructions requires at least
> ARMv5te.
> >       if [ "$with_float" = "hard" -o "$with_float" = "softfp" ] ; then
> >           target_cpu_cname="arm10e"
> > diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
> > index 1e3ecfb..5901154 100644
> > --- a/gcc/config/arm/bpabi.h
> > +++ b/gcc/config/arm/bpabi.h
> > @@ -55,6 +55,8 @@
> >  #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
> >    "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
> >
> > +#define TARGET_FDPIC_ASM_SPEC  ""
> > +
> >  #define BE8_LINK_SPEC
>       \
> >    "%{!r:%{!mbe32:%:be8_linkopt(%{mlittle-endian:little}"             \
> >    "                         %{mbig-endian:big}"                      \
> > @@ -64,7 +66,7 @@
> >  /* Tell the assembler to build BPABI binaries.  */
> >  #undef  SUBTARGET_EXTRA_ASM_SPEC
> >  #define SUBTARGET_EXTRA_ASM_SPEC \
> > -  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}"
> TARGET_FIX_V4BX_SPEC
> > +  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}"
> TARGET_FIX_V4BX_SPEC TARGET_FDPIC_ASM_SPEC
> >
> >  #ifndef SUBTARGET_EXTRA_LINK_SPEC
> >  #define SUBTARGET_EXTRA_LINK_SPEC ""
> > diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
> > index 8585fde..4cee958 100644
> > --- a/gcc/config/arm/linux-eabi.h
> > +++ b/gcc/config/arm/linux-eabi.h
> > @@ -98,11 +98,14 @@
> >  #undef  ASAN_CC1_SPEC
> >  #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
> >
> > +#define FDPIC_CC1_SPEC ""
> > +
> >  #undef  CC1_SPEC
> >  #define CC1_SPEC                                                     \
> > -  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,   \
> > +  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "
>       \
> > +                    FDPIC_CC1_SPEC,                                  \
> >                      GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "   \
> > -                    ANDROID_CC1_SPEC)
> > +                    ANDROID_CC1_SPEC "" FDPIC_CC1_SPEC)
> >
> >  #define CC1PLUS_SPEC \
> >    LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
> > diff --git a/gcc/config/arm/uclinuxfdpiceabi.h
> b/gcc/config/arm/uclinuxfdpiceabi.h
> > new file mode 100644
> > index 0000000..43a17de
> > --- /dev/null
> > +++ b/gcc/config/arm/uclinuxfdpiceabi.h
> > @@ -0,0 +1,53 @@
> > +/* Configuration file for ARM GNU/Linux FDPIC EABI targets.
> > +   Copyright (C) 2018 Free Software Foundation, Inc.
> > +   Contributed by STMicroelectronics.
> > +
> > +   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/>.  */
> > +
> > +/* On uClibc EABI GNU/Linux, we want to force -mfdpic by default,
> > +   which also means we produce PIE code by default.  */
> > +#undef FDPIC_CC1_SPEC
> > +#define FDPIC_CC1_SPEC \
> > +  "%{!mno-fdpic:-mfdpic %{!no-PIE:%{!fpie:%{!fPIC:%{!fpic: -fPIE}}}}}"
> > +
> > +/* Add --fdpic assembler flag by default.  */
> > +#undef TARGET_FDPIC_ASM_SPEC
> > +#define TARGET_FDPIC_ASM_SPEC  "%{!mno-fdpic: --fdpic}"
> > +
> > +/* TARGET_BIG_ENDIAN_DEFAULT is set in
> > +   config.gcc for big endian configurations.  */
> > +#if TARGET_BIG_ENDIAN_DEFAULT
> > +#define TARGET_FDPIC_LINKER_EMULATION "armelfb_linux_fdpiceabi"
> > +#else
> > +#define TARGET_FDPIC_LINKER_EMULATION "armelf_linux_fdpiceabi"
> > +#endif
> > +
> > +/* Unless we generate a shared library or a relocatable object, we
> > +   force -pie.  */
> > +/* Even with -static, we have to define the dynamic-linker, as we
> > +   have some relocations to resolve at load time.  */
> > +#undef  SUBTARGET_EXTRA_LINK_SPEC
> > +#define SUBTARGET_EXTRA_LINK_SPEC                        \
> > +  "%{!mno-fdpic: -m " TARGET_FDPIC_LINKER_EMULATION      \
> > +   "%{!shared:%{!r: -pie}}                               \
> > +    %{static:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" \
> > +  "%{mno-fdpic: -m " TARGET_LINKER_EMULATION "}"         \
> > +  "%{!r:%{!mno-fdpic: -z now}}"
> > +
> > +#undef       STARTFILE_SPEC
> > +#define STARTFILE_SPEC "%{!mno-fdpic:%{!shared:crtreloc.o%s}} " \
> > +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC,
> ANDROID_STARTFILE_SPEC)
> > diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
> > index 1dce1e6..dff34cd 100644
> > --- a/libsanitizer/configure.tgt
> > +++ b/libsanitizer/configure.tgt
> > @@ -43,6 +43,9 @@ case "${target}" in
> >       ;;
> >    s390*-*-linux*)
> >       ;;
> > +  arm*-*-uclinuxfdpiceabi)
> > +     UNSUPPORTED=1
> > +     ;;
> >    arm*-*-linux*)
> >       ;;
> >    mips*64*-*-linux*)
> >
>
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions
  2018-10-12 11:54   ` Richard Earnshaw (lists)
@ 2018-10-15 14:22     ` Christophe Lyon
  0 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-15 14:22 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Fri, 12 Oct 2018 at 13:37, Richard Earnshaw (lists) <
Richard.Earnshaw@arm.com> wrote:

> On 11/10/18 14:34, Christophe Lyon wrote:
> > The main difference with existing support is that function addresses
> > are function descriptor addresses instead. This means that all code
> > dealing with function pointers now has to cope with function
> > descriptors instead.
> >
> > For the same reason, Linux kernel helpers can no longer be called by
> > dereferencing their address, so we implement the same functionality as
> > a regular function here.
> >
> > When restoring a function address, we also have to restore the FDPIC
> > register value (r9).
> >
> > 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >       Mickaël Guêné <mickael.guene@st.com>
> >
> >       gcc/
> >       * ginclude/unwind-arm-common.h (unwinder_cache): Add reserved5
> >       field.
> >       (FDPIC_REGNUM): New define.
> >
> >       libgcc/
> >       * config/arm/linux-atomic.c (__kernel_cmpxchg): Add FDPIC support.
> >       (__kernel_dmb): Likewise.
> >       (__fdpic_cmpxchg): New function.
> >       (__fdpic_dmb): New function.
> >       * config/arm/unwind-arm.h (gnu_Unwind_Find_got): New function.
> >       (_Unwind_decode_typeinfo_ptr): Add FDPIC support.
> >       * unwindo-arm-common.inc (UCB_PR_GOT): New.
> >       (funcdesc_t): New struct.
> >       (get_eit_entry): Add FDPIC support.
> >       (unwind_phase2): Likewise.
> >       (unwind_phase2_forced): Likewise.
> >       (__gnu_Unwind_RaiseException): Likewise.
> >       (__gnu_Unwind_Resume): Likewise.
> >       (__gnu_Unwind_Backtrace): Likewise.
> >       * unwind-pe.h (read_encoded_value_with_base): Likewise.
> >
> >       libstdc++/
> >       * libsupc++/eh_personality.cc (get_ttype_entry): Add FDPIC
> >       support.
> >
> > Change-Id: I517a49ff18fae21c686cd1c6008ea7974515b347
> >
> > diff --git a/gcc/ginclude/unwind-arm-common.h
> b/gcc/ginclude/unwind-arm-common.h
> > index 8a1a919..f663891 100644
> > --- a/gcc/ginclude/unwind-arm-common.h
> > +++ b/gcc/ginclude/unwind-arm-common.h
> > @@ -91,7 +91,7 @@ extern "C" {
> >         _uw reserved2;  /* Personality routine address */
> >         _uw reserved3;  /* Saved callsite address */
> >         _uw reserved4;  /* Forced unwind stop arg */
> > -       _uw reserved5;
> > +       _uw reserved5;  /* Personality routine GOT value in FDPIC mode.
> */
> >       }
> >        unwinder_cache;
> >        /* Propagation barrier cache (valid after phase 1): */
> > @@ -247,4 +247,6 @@ typedef unsigned long _uleb128_t;
> >  }   /* extern "C" */
> >  #endif
> >
> > +#define FDPIC_REGNUM 9
>
> Looking at the rest of this file, I think it can end up being included
> in user code.  So you have to put predefines into the reserved
> namespace.  Why do you need this here anyway?
>
> That was to address a comment I got on v2 of this patch: I was requested
to avoid hardcoding "r9" in unwind-arm.h, and to use FDPIC_REGNUM.
I needed the definition to be visible in both unwind-arm.h and
unwind-arm-common.inc, but I moved it at a too high level. I'll fix this.

> +
> >  #endif /* defined UNWIND_ARM_COMMON_H */
> > diff --git a/libgcc/config/arm/linux-atomic.c
> b/libgcc/config/arm/linux-atomic.c
> > index d334c58..161d1ce 100644
> > --- a/libgcc/config/arm/linux-atomic.c
> > +++ b/libgcc/config/arm/linux-atomic.c
> > @@ -25,11 +25,49 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
> >
> >  /* Kernel helper for compare-and-exchange.  */
> >  typedef int (__kernel_cmpxchg_t) (int oldval, int newval, int *ptr);
> > +#if __FDPIC__
> > +/* Non-FDPIC ABIs call __kernel_cmpxchg directly by dereferencing its
> > +   address, but under FDPIC we would generate a broken call
> > +   sequence. That's why we have to implement __kernel_cmpxchg and
> > +   __kernel_dmb here: this way, the FDPIC call sequence works.  */
> > +#define __kernel_cmpxchg __fdpic_cmpxchg
> > +#else
> >  #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *) 0xffff0fc0)
> > +#endif
> >
> >  /* Kernel helper for memory barrier.  */
> >  typedef void (__kernel_dmb_t) (void);
> > +#if __FDPIC__
> > +#define __kernel_dmb __fdpic_dmb
> > +#else
> >  #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0)
> > +#endif
> > +
> > +#if __FDPIC__
> > +static int __fdpic_cmpxchg (int oldval, int newval, int *ptr)
> > +{
> > +  int result;
> > +
> > +  asm volatile ("1: ldrex r3, [%[ptr]]\n\t"
> > +             "subs  r3, r3, %[oldval]\n\t"
> > +             "itt eq\n\t"
> > +             "strexeq r3, %[newval], [%[ptr]]\n\t"
> > +             "teqeq r3, #1\n\t"
> > +             "it eq\n\t"
> > +             "beq 1b\n\t"
> > +             "rsbs  %[result], r3, #0\n\t"
> > +             : [result] "=r" (result)
> > +             : [oldval] "r" (oldval) , [newval] "r" (newval), [ptr] "r"
> (ptr)
> > +             : "r3");
> > +    return result;
> > +}
> > +
> > +static void __fdpic_dmb ()
> > +{
> > +  asm volatile ("dmb\n\t");
> > +}
> > +
>
> The whole point of __kernel_dmb and __kernel_cmpxchg is that the kernel
> can map in a code sequence specific to the runtime CPU.  This ensures
> that the right sequence is used for that CPU.  This breaks that
> principle entirely.
>
> Right, I guess we had v7-only in mind.
I'll check how we can fix that.


> > +#endif
> >
> >  /* Note: we implement byte, short and int versions of atomic operations
> using
> >     the above kernel helpers; see linux-atomic-64bit.c for "long long"
> (64-bit)
> > diff --git a/libgcc/config/arm/unwind-arm.h
> b/libgcc/config/arm/unwind-arm.h
> > index 9f7d3f2..db5dfa2 100644
> > --- a/libgcc/config/arm/unwind-arm.h
> > +++ b/libgcc/config/arm/unwind-arm.h
> > @@ -33,9 +33,31 @@
> >  /* Use IP as a scratch register within the personality routine.  */
> >  #define UNWIND_POINTER_REG 12
> >
> > +#define STR(x) #x
> > +#define XSTR(x) STR(x)
> > +
> >  #ifdef __cplusplus
> >  extern "C" {
> >  #endif
> > +_Unwind_Ptr __attribute__((weak)) __gnu_Unwind_Find_got (_Unwind_Ptr);
> > +
> > +static inline _Unwind_Ptr gnu_Unwind_Find_got (_Unwind_Ptr ptr)
> > +{
> > +    _Unwind_Ptr res;
> > +
> > +    if (__gnu_Unwind_Find_got)
> > +     res =  __gnu_Unwind_Find_got (ptr);
> > +    else
> > +      {
> > +     asm volatile ("mov %[result], r" XSTR(FDPIC_REGNUM)
> > +                   : [result]"=r" (res)
> > +                   :
> > +                   :);
> > +      }
> > +
> > +    return res;
> > +}
> > +
> >    /* Decode an R_ARM_TARGET2 relocation.  */
> >    static inline _Unwind_Word
> >    _Unwind_decode_typeinfo_ptr (_Unwind_Word base __attribute__
> ((unused)),
> > @@ -48,7 +70,12 @@ extern "C" {
> >        if (!tmp)
> >       return 0;
> >
> > -#if (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
> > +#if __FDPIC__
> > +      /* For FDPIC, we store the offset of the GOT entry.  */
> > +      /* So, first get GOT from dynamic linker and then use indirect
> access.  */
> > +      tmp += gnu_Unwind_Find_got (ptr);
> > +      tmp = *(_Unwind_Word *) tmp;
> > +#elif (defined(linux) && !defined(__uClinux__)) || defined(__NetBSD__) \
> >      || defined(__FreeBSD__) || defined(__fuchsia__)
> >        /* Pc-relative indirect.  */
> >  #define _GLIBCXX_OVERRIDE_TTYPE_ENCODING (DW_EH_PE_pcrel |
> DW_EH_PE_indirect)
> > diff --git a/libgcc/unwind-arm-common.inc b/libgcc/unwind-arm-common.inc
> > index 76f8fc3..7187edd 100644
> > --- a/libgcc/unwind-arm-common.inc
> > +++ b/libgcc/unwind-arm-common.inc
> > @@ -62,6 +62,7 @@ __gnu_Unwind_Find_exidx (_Unwind_Ptr, int *);
> >  #define UCB_PR_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved2)
> >  #define UCB_SAVED_CALLSITE_ADDR(ucbp) ((ucbp)->unwinder_cache.reserved3)
> >  #define UCB_FORCED_STOP_ARG(ucbp) ((ucbp)->unwinder_cache.reserved4)
> > +#define UCB_PR_GOT(ucbp) ((ucbp)->unwinder_cache.reserved5)
> >
> >  /* Unwind descriptors.  */
> >
> > @@ -85,6 +86,15 @@ typedef struct __EIT_entry
> >    _uw content;
> >  } __EIT_entry;
> >
> > +#ifdef __FDPIC__
> > +
> > +/* Only used in FDPIC case.  */
> > +struct funcdesc_t {
> > +    unsigned int ptr;
> > +    unsigned int got;
> > +};
>
> This isn't in GNU style.
>
> OK


> > +#endif
> > +
> >  /* Assembly helper functions.  */
> >
> >  /* Restore core register state.  Never returns.  */
> > @@ -259,7 +269,21 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw
> return_address)
> >      {
> >        /* One of the predefined standard routines.  */
> >        _uw idx = (*(_uw *) ucbp->pr_cache.ehtp >> 24) & 0xf;
> > +#if __FDPIC__
> > +      {
> > +     struct funcdesc_t *funcdesc
> > +       = (struct funcdesc_t *) __gnu_unwind_get_pr_addr (idx);
> > +     if (funcdesc)
> > +       {
> > +         UCB_PR_ADDR (ucbp) = funcdesc->ptr;
> > +         UCB_PR_GOT (ucbp) = funcdesc->got;
> > +       }
> > +     else
> > +       UCB_PR_ADDR (ucbp) = 0;
> > +      }
> > +#else
> >        UCB_PR_ADDR (ucbp) = __gnu_unwind_get_pr_addr (idx);
> > +#endif
> >        if (UCB_PR_ADDR (ucbp) == 0)
> >       {
> >         /* Failed */
> > @@ -270,6 +294,10 @@ get_eit_entry (_Unwind_Control_Block *ucbp, _uw
> return_address)
> >      {
> >        /* Execute region offset to PR */
> >        UCB_PR_ADDR (ucbp) = selfrel_offset31 (ucbp->pr_cache.ehtp);
> > +#if __FDPIC__
> > +      UCB_PR_GOT (ucbp)
> > +     = (unsigned int) gnu_Unwind_Find_got ((_Unwind_Ptr) UCB_PR_ADDR
> (ucbp));
> > +#endif
> >      }
> >    return _URC_OK;
> >  }
> > @@ -291,14 +319,29 @@ unwind_phase2 (_Unwind_Control_Block * ucbp,
> phase2_vrs * vrs)
> >        UCB_SAVED_CALLSITE_ADDR (ucbp) = VRS_PC(vrs);
> >
> >        /* Call the pr to decide what to do.  */
> > +#if __FDPIC__
> > +      {
> > +     volatile struct funcdesc_t funcdesc;
> > +     funcdesc.ptr = UCB_PR_ADDR (ucbp);
> > +     funcdesc.got = UCB_PR_GOT (ucbp);
> > +     pr_result = ((personality_routine) &funcdesc)
> > +       (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
> > +      }
> > +#else
> >        pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
> >       (_US_UNWIND_FRAME_STARTING, ucbp, (_Unwind_Context *) vrs);
> > +#endif
> >      }
> >    while (pr_result == _URC_CONTINUE_UNWIND);
> >
> >    if (pr_result != _URC_INSTALL_CONTEXT)
> >      abort();
> >
> > +#if __FDPIC__
> > +  /* r9 could have been lost due to PLT jump.  Restore correct value.
> */
> > +  vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC (vrs));
> > +#endif
> > +
> >    uw_restore_core_regs (vrs, &vrs->core);
> >  }
> >
> > @@ -346,8 +389,18 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp,
> phase2_vrs *entry_vrs,
> >         next_vrs = saved_vrs;
> >
> >         /* Call the pr to decide what to do.  */
> > +#if __FDPIC__
> > +       {
> > +         volatile struct funcdesc_t funcdesc;
> > +         funcdesc.ptr = UCB_PR_ADDR (ucbp);
> > +         funcdesc.got = UCB_PR_GOT (ucbp);
> > +         pr_result = ((personality_routine) &funcdesc)
> > +           (action, ucbp, (void *) &next_vrs);
> > +       }
> > +#else
> >         pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
> >           (action, ucbp, (void *) &next_vrs);
> > +#endif
> >
> >         saved_vrs.prev_sp = VRS_SP (&next_vrs);
> >       }
> > @@ -384,6 +437,11 @@ unwind_phase2_forced (_Unwind_Control_Block *ucbp,
> phase2_vrs *entry_vrs,
> >        return _URC_FAILURE;
> >      }
> >
> > +#if __FDPIC__
> > +  /* r9 could have been lost due to PLT jump.  Restore correct value.
> */
> > +  saved_vrs.core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC
> (&saved_vrs));
> > +#endif
> > +
> >    uw_restore_core_regs (&saved_vrs, &saved_vrs.core);
> >  }
> >
> > @@ -429,8 +487,18 @@ __gnu_Unwind_RaiseException (_Unwind_Control_Block
> * ucbp,
> >       return _URC_FAILURE;
> >
> >        /* Call the pr to decide what to do.  */
> > +#if __FDPIC__
> > +      {
> > +     volatile struct funcdesc_t funcdesc;
> > +     funcdesc.ptr = UCB_PR_ADDR (ucbp);
> > +     funcdesc.got = UCB_PR_GOT (ucbp);
> > +     pr_result = ((personality_routine) &funcdesc)
> > +       (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
> > +      }
> > +#else
> >        pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
> >       (_US_VIRTUAL_UNWIND_FRAME, ucbp, (void *) &saved_vrs);
> > +#endif
> >      }
> >    while (pr_result == _URC_CONTINUE_UNWIND);
> >
> > @@ -488,13 +556,27 @@ __gnu_Unwind_Resume (_Unwind_Control_Block * ucbp,
> phase2_vrs * entry_vrs)
> >      }
> >
> >    /* Call the cached PR.  */
> > +#if __FDPIC__
> > +  {
> > +    volatile struct funcdesc_t funcdesc;
> > +    funcdesc.ptr = UCB_PR_ADDR (ucbp);
> > +    funcdesc.got = UCB_PR_GOT (ucbp);
> > +    pr_result = ((personality_routine) &funcdesc)
> > +      (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
> > +  }
> > +#else
> >    pr_result = ((personality_routine) UCB_PR_ADDR (ucbp))
> >       (_US_UNWIND_FRAME_RESUME, ucbp, (_Unwind_Context *) entry_vrs);
> > +#endif
> >
> >    switch (pr_result)
> >      {
> >      case _URC_INSTALL_CONTEXT:
> >        /* Upload the registers to enter the landing pad.  */
> > +#if __FDPIC__
> > +      /* r9 could have been lost due to PLT jump.  Restore correct
> value.  */
> > +      entry_vrs->core.r[FDPIC_REGNUM] = gnu_Unwind_Find_got (VRS_PC
> (entry_vrs));
> > +#endif
> >        uw_restore_core_regs (entry_vrs, &entry_vrs->core);
> >
> >      case _URC_CONTINUE_UNWIND:
> > @@ -586,9 +668,20 @@ __gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void
> * trace_argument,
> >       }
> >
> >        /* Call the pr to decide what to do.  */
> > +#if __FDPIC__
> > +      {
> > +     volatile struct funcdesc_t funcdesc;
> > +     funcdesc.ptr = UCB_PR_ADDR (ucbp);
> > +     funcdesc.got = UCB_PR_GOT (ucbp);
> > +     code = ((personality_routine) &funcdesc)
> > +       (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
> > +        ucbp, (void *) &saved_vrs);
> > +      }
> > +#else
> >        code = ((personality_routine) UCB_PR_ADDR (ucbp))
> >       (_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND,
> >        ucbp, (void *) &saved_vrs);
> > +#endif
> >      }
> >    while (code != _URC_END_OF_STACK
> >        && code != _URC_FAILURE);
> > diff --git a/libgcc/unwind-pe.h b/libgcc/unwind-pe.h
> > index dd5ae95..9c5177f 100644
> > --- a/libgcc/unwind-pe.h
> > +++ b/libgcc/unwind-pe.h
> > @@ -259,10 +259,27 @@ read_encoded_value_with_base (unsigned char
> encoding, _Unwind_Ptr base,
> >
> >        if (result != 0)
> >       {
> > +#if __FDPIC__
> > +       /* FDPIC relative addresses imply taking the GOT address
> > +          into account.  */
> > +       if ((encoding & DW_EH_PE_pcrel) && (encoding &
> DW_EH_PE_indirect))
> > +         {
> > +           result += gnu_Unwind_Find_got ((_Unwind_Ptr) u);
> > +           result = *(_Unwind_Internal_Ptr *) result;
> > +         }
> > +       else
> > +         {
> > +           result += ((encoding & 0x70) == DW_EH_PE_pcrel
> > +                      ? (_Unwind_Internal_Ptr) u : base);
> > +           if (encoding & DW_EH_PE_indirect)
> > +             result = *(_Unwind_Internal_Ptr *) result;
> > +         }
> > +#else
> >         result += ((encoding & 0x70) == DW_EH_PE_pcrel
> >                    ? (_Unwind_Internal_Ptr) u : base);
> >         if (encoding & DW_EH_PE_indirect)
> >           result = *(_Unwind_Internal_Ptr *) result;
> > +#endif
> >       }
> >      }
> >
> > diff --git a/libstdc++-v3/libsupc++/eh_personality.cc
> b/libstdc++-v3/libsupc++/eh_personality.cc
> > index 1b336c7..7b26b8d 100644
> > --- a/libstdc++-v3/libsupc++/eh_personality.cc
> > +++ b/libstdc++-v3/libsupc++/eh_personality.cc
> > @@ -93,7 +93,15 @@ get_ttype_entry (lsda_header_info *info, _uleb128_t i)
> >    _Unwind_Ptr ptr;
> >
> >    i *= size_of_encoded_value (info->ttype_encoding);
> > -  read_encoded_value_with_base (info->ttype_encoding, info->ttype_base,
> > +  read_encoded_value_with_base (
> > +#if __FDPIC__
> > +                             /* Force these flags to nake sure to
> > +                                take the GOT into account.  */
> > +                             (DW_EH_PE_pcrel | DW_EH_PE_indirect),
> > +#else
> > +                             info->ttype_encoding,
> > +#endif
> > +                             info->ttype_base,
> >                               info->TType - i, &ptr);
> >
> >    return reinterpret_cast<const std::type_info *>(ptr);
> >
>
> Nearly all of the above is outside of my comfort zone...  I can't help
> feeling that there ought to be a less invasive way to do this, but
> without being particularly familiar with the code it's difficult to be
> sure.
>
> The last two files patched will need approval from a relevant component
> maintainer.
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO
  2018-10-12 12:21   ` Richard Earnshaw (lists)
@ 2018-10-15 14:30     ` Christophe Lyon
  0 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-15 14:30 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Fri, 12 Oct 2018 at 13:45, Richard Earnshaw (lists)
<Richard.Earnshaw@arm.com> wrote:
>
> On 11/10/18 14:34, Christophe Lyon wrote:
> > 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >       Mickaël Guêné <mickael.guene@st.com>
> >
> >       gcc/
> >       * config/arm/arm.c (arm_compute_save_reg0_reg12_mask): Handle
> >       FDPIC.
> >       (thumb1_compute_save_core_reg_mask): Likewise.
>
> The hunk for this bit is missing.
>
Sigh, I forgot to remove it when I removed the code from v2.

>
> >
> > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > index 92ae24b..a6dce36 100644
> > --- a/gcc/config/arm/arm.c
> > +++ b/gcc/config/arm/arm.c
> > @@ -19470,7 +19470,7 @@ arm_compute_save_reg0_reg12_mask (void)
> >
> >        /* Also save the pic base register if necessary.  */
> >        if (flag_pic
> > -       && !TARGET_SINGLE_PIC_BASE
> > +       && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
> >         && arm_pic_register != INVALID_REGNUM
> >         && crtl->uses_pic_offset_table)
> >       save_reg_mask |= 1 << PIC_OFFSET_TABLE_REGNUM;
> > @@ -19504,7 +19504,7 @@ arm_compute_save_reg0_reg12_mask (void)
> >        /* If we aren't loading the PIC register,
> >        don't stack it even though it may be live.  */
> >        if (flag_pic
> > -       && !TARGET_SINGLE_PIC_BASE
> > +       && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
> >         && arm_pic_register != INVALID_REGNUM
> >         && (df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM)
> >             || crtl->uses_pic_offset_table))
> >
>
>         flag_pic
>           && !TARGET_SINGLE_PIC_BASE && !TARGET_FDPIC
>           && arm_pic_register != INVALID_REGNUM
>
> Might be worth lifting this out into a macro.
>
> R.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support
  2018-10-12 10:01   ` Richard Earnshaw (lists)
@ 2018-10-17  8:13     ` Sandra Loosemore
  0 siblings, 0 replies; 47+ messages in thread
From: Sandra Loosemore @ 2018-10-17  8:13 UTC (permalink / raw)
  To: Richard Earnshaw (lists), Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 10/12/2018 03:52 AM, Richard Earnshaw (lists) wrote:
> On 11/10/18 14:34, Christophe Lyon wrote:
>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>> 	Mickaël Guêné  <mickael.guene@st.com>
>>
>> 	gcc/
>> 	* config/arm/arm.opt: Add -mfdpic option.
>> 	* doc/invoke.texi: Add documentation for -mfdpic.
> 
> This is OK (once the rest of the series is approved).

The documentation looks fine to me too.

-Sandra

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-12 11:02   ` Richard Earnshaw (lists)
@ 2018-10-19 13:57     ` Christophe Lyon
  2018-10-23 15:12       ` Richard Earnshaw (lists)
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-19 13:57 UTC (permalink / raw)
  To: Richard Earnshaw (lists), gcc-patches; +Cc: christophe.lyon

On 12/10/2018 12:45, Richard Earnshaw (lists) wrote:
> On 11/10/18 14:34, Christophe Lyon wrote:
>> The FDPIC register is hard-coded to r9, as defined in the ABI.
>>
>> We have to disable tailcall optimizations if we don't know if the
>> target function is in the same module. If not, we have to set r9 to
>> the value associated with the target module.
>>
>> When generating a symbol address, we have to take into account whether
>> it is a pointer to data or to a function, because different
>> relocations are needed.
>>
>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>> 	Mickaël Guêné <mickael.guene@st.com>
>>
>> 	* config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
>> 	in FDPIC mode.
>> 	* config/arm/arm-protos.h (arm_load_function_descriptor): Declare
>> 	new function.
>> 	* config/arm/arm.c (arm_option_override): Define pic register to
>> 	FDPIC_REGNUM.
>> 	(arm_function_ok_for_sibcall) Disable sibcall optimization if we
> 
> Missing colon.
> 
>> 	have no decl or go through PLT.
>> 	(arm_load_pic_register): Handle TARGET_FDPIC.
>> 	(arm_is_segment_info_known): New function.
>> 	(arm_pic_static_addr): Add support for FDPIC.
>> 	(arm_load_function_descriptor): New function.
>> 	(arm_assemble_integer): Add support for FDPIC.
>> 	* config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
>> 	Define. (FDPIC_REGNUM): New define.
>> 	* config/arm/arm.md (call): Add support for FDPIC.
>> 	(call_value): Likewise.
>> 	(*restore_pic_register_after_call): New pattern.
>> 	(untyped_call): Disable if FDPIC.
>> 	(untyped_return): Likewise.
>> 	* config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
>>
> 
> Other comments inline.
> 
>> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
>> index 4471f79..90733cc 100644
>> --- a/gcc/config/arm/arm-c.c
>> +++ b/gcc/config/arm/arm-c.c
>> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
>>         builtin_define ("__ARM_EABI__");
>>       }
>>   
>> +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
>> +
>>     def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
>>     def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
>>   
>> diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
>> index 0dfb3ac..28cafa8 100644
>> --- a/gcc/config/arm/arm-protos.h
>> +++ b/gcc/config/arm/arm-protos.h
>> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
>>   extern int arm_const_double_inline_cost (rtx);
>>   extern bool arm_const_double_by_parts (rtx);
>>   extern bool arm_const_double_by_immediates (rtx);
>> +extern rtx arm_load_function_descriptor (rtx funcdesc);
>>   extern void arm_emit_call_insn (rtx, rtx, bool);
>>   bool detect_cmse_nonsecure_call (tree);
>>   extern const char *output_call (rtx *);
>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
>> index 8810df5..92ae24b 100644
>> --- a/gcc/config/arm/arm.c
>> +++ b/gcc/config/arm/arm.c
>> @@ -3470,6 +3470,14 @@ arm_option_override (void)
>>     if (flag_pic && TARGET_VXWORKS_RTP)
>>       arm_pic_register = 9;
>>   
>> +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
>> +  if (TARGET_FDPIC)
>> +    {
>> +      arm_pic_register = FDPIC_REGNUM;
>> +      if (TARGET_ARM_ARCH < 7)
>> +	error ("FDPIC mode is not supported on architectures older than Armv7");
> 
> What properties of FDPIC impose this requirement?  Does it also apply to
> Armv8-m.baseline?
> 
In fact, there was miscommunication on my side, resulting in a misunderstanding between Kyrill and myself, which I badly translated into this condition.

My initial plan was to submit a patch series tested on v7, and send the patches needed to support older architectures as a follow-up. The proper restriction is actually "CPUs that do not support ARM or Thumb2". As you may have noticed during the iterations of this patch series, I had failed to remove partial Thumb1 support hunks.

So really this should be rephrased, and rewritten as "FDPIC mode is supported on architecture versions that support ARM or Thumb-2", if that suits you. And the condition should thus be:
if (! TARGET_ARM && ! TARGET_THUMB2)
   error ("...")

This would also exclude Armv8-m.baseline, since it doesn't support Thumb2.
As a side note, I tried to build GCC master (without my patches) --with-cpu=cortex-m23, and both targets arm-eabi and arm-linux-gnueabi failed to buid.

For arm-eabi, there are problems in newlib:
newlib/libc/sys/arm/crt0.S:145: Error: lo register required -- `add sl,r2,#256'
newlib/libc/sys/arm/trap.S:88: Error: lo register required -- `sub ip,sp,ip'

For arm-linux-gnueabi, the failure happens while building libgcc:
/home/christophe.lyon/src/GCC/sources/newlib/newlib/libc/machine/arm/setjmp.S:169: Error: selected processor does not support ARM opcodes
/newlib/newlib/libc/machine/arm/setjmp.S:176: Error: attempt to use an ARM instruction on a Thumb-only processor -- `stmea a1!,{ v1-v7,fp,ip,sp,lr }'
/newlib/newlib/libc/machine/arm/setjmp.S:186: Error: attempt to use an ARM instruction on a Thumb-only processor -- `mov a1,#0'
/newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an ARM instruction on a Thumb-only processor -- `tst lr,#1'
/newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an ARM instruction on a Thumb-only processor -- `moveq pc,lr'
/newlib/newlib/libc/machine/arm/setjmp.S:194: Error: selected processor does not support ARM opcodes
/newlib/newlib/libc/machine/arm/setjmp.S:203: Error: attempt to use an ARM instruction on a Thumb-only processor -- `ldmfd a1!,{ v1-v7,fp,ip,sp,lr }'
/newlib/newlib/libc/machine/arm/setjmp.S:214: Error: attempt to use an ARM instruction on a Thumb-only processor -- `movs a1,a2'
/newlib/newlib/libc/machine/arm/setjmp.S:218: Error: attempt to use an ARM instruction on a Thumb-only processor -- `moveq a1,#1'
/newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an ARM instruction on a Thumb-only processor -- `tst lr,#1'
/newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an ARM instruction on a Thumb-only processor -- `moveq pc,lr'


>> +    }
>> +
>>     if (arm_pic_register_string != NULL)
>>       {
>>         int pic_register = decode_reg_name (arm_pic_register_string);
>> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>>     if (cfun->machine->sibcall_blocked)
>>       return false;
>>   
>> +  if (TARGET_FDPIC)
>> +    {
>> +      /* In FDPIC, never tailcall something for which we have no decl:
>> +	 the target function could be in a different module, requiring
>> +	 a different FDPIC register value.  */
>> +      if (decl == NULL)
>> +	return false;
>> +
>> +      /* Don't tailcall if we go through the PLT since the FDPIC
>> +	 register is then corrupted and we don't restore it after
>> +	 static function calls.  */
>> +      if (!targetm.binds_local_p (decl))
>> +	return false;
>> +    }
>> +
>>     /* Never tailcall something if we are generating code for Thumb-1.  */
>>     if (TARGET_THUMB1)
>>       return false;
>> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
>>   {
>>     rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
>>   
>> -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
>> +  if (crtl->uses_pic_offset_table == 0
>> +      || TARGET_SINGLE_PIC_BASE
>> +      || TARGET_FDPIC)
>>       return;
>>   
>>     gcc_assert (flag_pic);
>> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
>>     emit_use (pic_reg);
>>   }
>>   
>> +/* Try to know if the object will go in text or data segment. This is
> 
> "Try to determine whether an object, referenced via ORIG, will be placed
> in the text or data segment."
>> +   used in FDPIC mode, to decide which relocations to use when
>> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
> 
> Two spaces after a period.
> 
>> +   location, false otherwise.  */
> 
> You've missed the documentation of the return value: does returning true
> mean text vs data, or does it mean we know which it will go in, but
> don't have to return that information here.
> 
> Generally, won't this break big time if users compile with
> -ffunction-sections or -fdata-sections?  Is it sufficient to match
> .text.* as being text and .data.* for data?
> 

I compiled a small testcase with -ffunction-sections and -fdata-sections and noticed no problem.
The code below does not attempt to match section names, I'm not sure to understand your question?

> 
>> +static bool
>> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
>> +{
>> +  bool res = false;
>> +
>> +  *is_readonly = false;
>> +
>> +  if (GET_CODE (orig) == LABEL_REF)
>> +    {
>> +      res = true;
>> +      *is_readonly = true;
>> +    }
>> +  else if (SYMBOL_REF_P (orig))
>> +    {
>> +      if (CONSTANT_POOL_ADDRESS_P (orig))
>> +	{
>> +	  res = true;
>> +	  *is_readonly = true;
>> +	}
>> +      else if (SYMBOL_REF_LOCAL_P (orig)
>> +	       && !SYMBOL_REF_EXTERNAL_P (orig)
>> +	       && SYMBOL_REF_DECL (orig)
>> +	       && (!DECL_P (SYMBOL_REF_DECL (orig))
>> +		   || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
>> +	{
>> +	  tree decl = SYMBOL_REF_DECL (orig);
>> +	  tree init = (TREE_CODE (decl) == VAR_DECL)
>> +	    ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
>> +	    ? decl : 0;
>> +	  int reloc = 0;
>> +	  bool named_section, readonly;
>> +
>> +	  if (init && init != error_mark_node)
>> +	    reloc = compute_reloc_for_constant (init);
>> +
>> +	  named_section = TREE_CODE (decl) == VAR_DECL
>> +	    && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
>> +	  readonly = decl_readonly_section (decl, reloc);
>> +
>> +	  /* We don't know where the link script will put a named
>> +	     section, so return false in such a case.  */
>> +	  res = !named_section;
>> +
>> +	  if (!named_section)
>> +	    *is_readonly = readonly;
>> +	}
>> +      else
>> +	{
>> +	  /* We don't know.  */
>> +	  res = false;
>> +	}
>> +    }
>> +  else
>> +    gcc_unreachable ();
>> +
>> +  return res;
>> +}
>> +
>>   /* Generate code to load the address of a static var when flag_pic is set.  */
>>   static rtx_insn *
>>   arm_pic_static_addr (rtx orig, rtx reg)
>>   {
>>     rtx l1, labelno, offset_rtx;
>> +  rtx_insn *insn;
>>   
>>     gcc_assert (flag_pic);
>>   
>> -  /* We use an UNSPEC rather than a LABEL_REF because this label
>> -     never appears in the code stream.  */
>> -  labelno = GEN_INT (pic_labelno++);
>> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
>> -  l1 = gen_rtx_CONST (VOIDmode, l1);
>> +  bool is_readonly = false;
>> +  bool info_known = false;
>>   
>> -  /* On the ARM the PC register contains 'dot + 8' at the time of the
>> -     addition, on the Thumb it is 'dot + 4'.  */
>> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
>> -                               UNSPEC_SYMBOL_OFFSET);
>> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>> +  if (TARGET_FDPIC
>> +      && SYMBOL_REF_P (orig)
>> +      && !SYMBOL_REF_FUNCTION_P (orig))
>> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
>>   
>> -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx, labelno));
>> +  if (TARGET_FDPIC
>> +      && SYMBOL_REF_P (orig)
>> +      && !SYMBOL_REF_FUNCTION_P (orig)
>> +      && !info_known)
>> +    {
>> +      /* We don't know where orig is stored, so we have be
>> +	 pessimistic and use a GOT relocation.  */
>> +      rtx pat;
>> +      rtx mem;
>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>> +
>> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
>> +
>> +      /* Make the MEM as close to a constant as possible.  */
>> +      mem = SET_SRC (pat);
>> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
>> +      MEM_READONLY_P (mem) = 1;
>> +      MEM_NOTRAP_P (mem) = 1;
>> +
>> +      insn = emit_insn (pat);
>> +    }
>> +  else if (TARGET_FDPIC
>> +	   && SYMBOL_REF_P (orig)
>> +	   && (SYMBOL_REF_FUNCTION_P (orig)
>> +	       || (info_known && !is_readonly)))
>> +    {
>> +      /* We use the GOTOFF relocation.  */
>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>> +
>> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig), UNSPEC_PIC_SYM);
>> +      emit_insn (gen_movsi (reg, l1));
>> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
>> +    }
>> +  else
>> +    {
>> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
>> +	 PC-relative access.  */
>> +      /* We use an UNSPEC rather than a LABEL_REF because this label
>> +	 never appears in the code stream.  */
>> +      labelno = GEN_INT (pic_labelno++);
>> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), UNSPEC_PIC_LABEL);
>> +      l1 = gen_rtx_CONST (VOIDmode, l1);
>> +
>> +      /* On the ARM the PC register contains 'dot + 8' at the time of the
>> +	 addition, on the Thumb it is 'dot + 4'.  */
>> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
>> +				   UNSPEC_SYMBOL_OFFSET);
>> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>> +
>> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
>> +						   labelno));
>> +    }
>> +
>> +  return insn;
>>   }
>>   
>>   /* Return nonzero if X is valid as an ARM state addressing register.  */
>> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
>>     return 0;
>>   }
>>   
>> +/* Emit insns to load the function address from FUNCDESC (an FDPIC
>> +   function descriptor) into a register and the GOT address into the
>> +   FDPIC register, returning an rtx for the register holding the
>> +   function address.  */
>> +
>> +rtx
>> +arm_load_function_descriptor (rtx funcdesc)
>> +{
>> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
>> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
>> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc, 4));
>> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>> +
>> +  emit_move_insn (fnaddr_reg, fnaddr);
>> +  /* The ABI requires the entry point address to be loaded first, so
>> +     prevent the load from being moved after that of the GOT
>> +     address.  */
>> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>> +					gen_rtvec (2, pic_reg, gotaddr),
>> +					UNSPEC_PIC_RESTORE);
>> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM))
>> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> 
> Shouldn't one of these be fnaddr_reg and the other pic_reg?
I think the USE should be gotaddr, and CLOBBER should be pic_reg, thanks.

> 
>> +  emit_insn (par);
>> +
>> +  return fnaddr_reg;
>> +}
>> +
>>   /* Return the maximum amount of padding that will be inserted before
>>      label LABEL.  */
>> -
>>   static HOST_WIDE_INT
>>   get_label_padding (rtx label)
>>   {
>> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
>>   		  && (!SYMBOL_REF_LOCAL_P (x)
>>   		      || (SYMBOL_REF_DECL (x)
>>   			  ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
>> -	    fputs ("(GOT)", asm_out_file);
>> +	    {
>> +	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>> +		fputs ("(GOTFUNCDESC)", asm_out_file);
>> +	      else
>> +		fputs ("(GOT)", asm_out_file);
>> +	    }
>>   	  else
>> -	    fputs ("(GOTOFF)", asm_out_file);
>> +	    {
>> +	      if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>> +		fputs ("(GOTOFFFUNCDESC)", asm_out_file);
>> +	      else
>> +		{
>> +		  bool is_readonly;
>> +
>> +		  if (arm_is_segment_info_known (x, &is_readonly))
>> +		    fputs ("(GOTOFF)", asm_out_file);
>> +		  else
>> +		    fputs ("(GOT)", asm_out_file);
>> +		}
>> +	    }
>> +	}
>> +
>> +      /* For FDPIC we also have to mark symbol for .data section.  */
>> +      if (TARGET_FDPIC
>> +	  && NEED_GOT_RELOC
>> +	  && flag_pic
>> +	  && !making_const_table
>> +	  && SYMBOL_REF_P (x))
>> +	{
>> +	  if (SYMBOL_REF_FUNCTION_P (x))
>> +	    fputs ("(FUNCDESC)", asm_out_file);
>>   	}
>>         fputc ('\n', asm_out_file);
>>         return true;
>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
>> index 34894c0..4671d64 100644
>> --- a/gcc/config/arm/arm.h
>> +++ b/gcc/config/arm/arm.h
>> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
>>      Pascal), so the following is not true.  */
>>   #define STATIC_CHAIN_REGNUM	12
>>   
>> +/* r9 is the FDPIC register (base register for GOT and FUNCDESC accesses).  */
>> +#define FDPIC_REGNUM		9
>> +
>>   /* Define this to be where the real frame pointer is if it is not possible to
>>      work out the offset between the frame pointer and the automatic variables
>>      until after register allocation has taken place.  FRAME_POINTER_REGNUM
>> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
>>      data addresses in memory.  */
>>   #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
>>   
>> +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
>> +   entries would need to handle saving and restoring it).  */
>> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
>> +
>>   /* We can't directly access anything that contains a symbol,
>>      nor can we indirect via the constant pool.  One exception is
>>      UNSPEC_TLS, which is always PIC.  */
>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
>> index 270b8e4..09a0701 100644
>> --- a/gcc/config/arm/arm.md
>> +++ b/gcc/config/arm/arm.md
>> @@ -8031,6 +8031,23 @@
>>       rtx callee, pat;
>>       tree addr = MEM_EXPR (operands[0]);
>>       
>> +    /* Force FDPIC register (r9) before call.  */
>> +    if (TARGET_FDPIC)
>> +      {
>> +	/* No need to update r9 if calling a static function.
>> +	   In other words: set r9 for indirect or non-local calls.  */
>> +	callee = XEXP (operands[0], 0);
>> +	if (!SYMBOL_REF_P (callee)
>> +	    || !SYMBOL_REF_LOCAL_P (callee)
>> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>> +	  {
>> +	    emit_insn (gen_blockage ());
>> +	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>> +	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
>> +	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>> +	 }
>> +      }
>> +
>>       /* In an untyped call, we can get NULL for operand 2.  */
>>       if (operands[2] == NULL_RTX)
>>         operands[2] = const0_rtx;
>> @@ -8044,6 +8061,13 @@
>>   	: !REG_P (callee))
>>         XEXP (operands[0], 0) = force_reg (Pmode, callee);
>>   
>> +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
>> +      {
>> +	/* Indirect call: set r9 with FDPIC value of callee.  */
>> +	XEXP (operands[0], 0)
>> +	  = arm_load_function_descriptor (XEXP (operands[0], 0));
>> +      }
>> +
>>       if (detect_cmse_nonsecure_call (addr))
>>         {
>>   	pat = gen_nonsecure_call_internal (operands[0], operands[1],
>> @@ -8055,10 +8079,38 @@
>>   	pat = gen_call_internal (operands[0], operands[1], operands[2]);
>>   	arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
>>         }
>> +
>> +    /* Restore FDPIC register (r9) after call.  */
>> +    if (TARGET_FDPIC)
>> +      {
>> +	/* No need to update r9 if calling a static function.  */
>> +	if (!SYMBOL_REF_P (callee)
>> +	    || !SYMBOL_REF_LOCAL_P (callee)
>> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>> +	  {
>> +	    rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>> +	    emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode, FDPIC_REGNUM));
>> +	    emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>> +	    emit_insn (gen_blockage ());
>> +	  }
>> +      }
>>       DONE;
>>     }"
>>   )
>>   
>> +(define_insn "*restore_pic_register_after_call"
>> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
>> +		       (match_operand:SI 1 "nonimmediate_operand" "r,m")]
>> +	       UNSPEC_PIC_RESTORE)
>> +	      (use (match_dup 0))
>> +	      (clobber (match_dup 0))])
>> +  ]
>> +  ""
>> +  "@
>> +  mov\t%0, %1
>> +  ldr\t%0, %1"
>> +)
>> +
>>   (define_expand "call_internal"
>>     [(parallel [(call (match_operand 0 "memory_operand" "")
>>   	            (match_operand 1 "general_operand" ""))
>> @@ -8119,6 +8171,30 @@
>>       rtx pat, callee;
>>       tree addr = MEM_EXPR (operands[1]);
>>       
>> +    /* Force FDPIC register (r9) before call.  */
>> +    if (TARGET_FDPIC)
>> +      {
>> +	/* No need to update the FDPIC register (r9) if calling a static function.
>> +	   In other words: set r9 for indirect or non-local calls.  */
>> +	callee = XEXP (operands[1], 0);
>> +	if (!SYMBOL_REF_P (callee)
>> +	    || !SYMBOL_REF_LOCAL_P (callee)
>> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>> +	  {
>> +	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>> +
>> +	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>> +		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>> +			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>> +		UNSPEC_PIC_RESTORE);
>> +	    XVECEXP (par, 0, 1)
>> +	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>> +	    XVECEXP (par, 0, 2)
>> +	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> 
> Again, this looks suspicious.
> 
Yes, fixed for follow-up patch, with
USE for get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)
CLOBBER for gen_rtx_REG (Pmode, FDPIC_REGNUM)

>> +	    emit_insn (par);
>> +	  }
>> +      }
>> +
>>       /* In an untyped call, we can get NULL for operand 2.  */
>>       if (operands[3] == 0)
>>         operands[3] = const0_rtx;
>> @@ -8132,6 +8208,14 @@
>>   	: !REG_P (callee))
>>         XEXP (operands[1], 0) = force_reg (Pmode, callee);
>>   
>> +    if (TARGET_FDPIC
>> +	&& !SYMBOL_REF_P (XEXP (operands[1], 0)))
>> +      {
>> +	/* Indirect call: set r9 with FDPIC value of callee.  */
>> +	XEXP (operands[1], 0)
>> +	  = arm_load_function_descriptor (XEXP (operands[1], 0));
>> +      }
>> +
>>       if (detect_cmse_nonsecure_call (addr))
>>         {
>>   	pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
>> @@ -8144,6 +8228,28 @@
>>   				       operands[2], operands[3]);
>>   	arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
>>         }
>> +    /* Restore FDPIC register (r9) after call.  */
>> +    if (TARGET_FDPIC)
>> +      {
>> +	/* No need to update r9 if calling a static function.  */
>> +	if (!SYMBOL_REF_P (callee)
>> +	    || !SYMBOL_REF_LOCAL_P (callee)
>> +	    || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>> +	  {
>> +	    rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>> +
>> +	    XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>> +		gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>> +			   get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>> +		UNSPEC_PIC_RESTORE);
>> +	    XVECEXP (par, 0, 1)
>> +	      = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>> +	    XVECEXP (par, 0, 2)
>> +	      = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> 
> And again.
Yes

> 
>> +	    emit_insn (par);
>> +	  }
>> +      }
>> +
>>       DONE;
>>     }"
>>   )
>> @@ -8486,7 +8592,7 @@
>>   		    (const_int 0))
>>   	      (match_operand 1 "" "")
>>   	      (match_operand 2 "" "")])]
>> -  "TARGET_EITHER"
>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>     "
>>     {
>>       int i;
>> @@ -8553,7 +8659,7 @@
>>   (define_expand "untyped_return"
>>     [(match_operand:BLK 0 "memory_operand" "")
>>      (match_operand 1 "" "")]
>> -  "TARGET_EITHER"
>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>     "
>>     {
>>       int i;
>> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
>> index 1941673..349ae0e 100644
>> --- a/gcc/config/arm/unspecs.md
>> +++ b/gcc/config/arm/unspecs.md
>> @@ -86,6 +86,7 @@
>>     UNSPEC_PROBE_STACK    ; Probe stack memory reference
>>     UNSPEC_NONSECURE_MEM	; Represent non-secure memory in ARMv8-M with
>>   			; security extension
>> +  UNSPEC_PIC_RESTORE	; Use to restore fdpic register
>>   ])
>>   
>>   (define_c_enum "unspec" [
>>
> 
> .
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp
  2018-10-11 13:40 ` [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp Christophe Lyon
@ 2018-10-19 14:02   ` Christophe Lyon
  0 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-19 14:02 UTC (permalink / raw)
  To: gcc-patches

On 11/10/2018 15:34, Christophe Lyon wrote:
> We call __aeabi_read_tp() to get the thread pointer. Since this is a
> function call, we have to restore the FDPIC register afterwards.
> 
> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> 	Mickaël Guêné <mickael.guene@st.com>
> 
> 	gcc/
> 	* config/arm/arm.c (arm_load_tp): Add FDPIC support.
> 	* config/arm/arm.md (load_tp_soft_fdpic): New pattern.
> 	(load_tp_soft): Disable in FDPIC mode.
> 
> Change-Id: I0a2e3466c9afb869ad8e844083ad178de014658e
> 
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index d7b7d99..d3a60cb 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -8646,7 +8646,25 @@ arm_load_tp (rtx target)
>   
>         rtx tmp;
>   
> -      emit_insn (gen_load_tp_soft ());
> +      if (TARGET_FDPIC)
> +	{
> +	  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> +
> +	  emit_insn (gen_load_tp_soft_fdpic ());
> +
> +	  /* Restore r9.  */
> +	  XVECEXP (par, 0, 0)
> +	    = gen_rtx_UNSPEC (VOIDmode,
> +			      gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> +					 get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> +			      UNSPEC_PIC_RESTORE);
> +	  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> +	  XVECEXP (par, 0, 2)
> +	    = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));

There is the same problem here as in patch 04/21, fixed in follow-up version.

> +	  emit_insn (par);
> +	}
> +      else
> +	emit_insn (gen_load_tp_soft ());
>   
>         tmp = gen_rtx_REG (SImode, R0_REGNUM);
>         emit_move_insn (target, tmp);
> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> index 09a0701..6fea087 100644
> --- a/gcc/config/arm/arm.md
> +++ b/gcc/config/arm/arm.md
> @@ -11485,12 +11485,25 @@
>   )
>   
>   ;; Doesn't clobber R1-R3.  Must use r0 for the first operand.
> +(define_insn "load_tp_soft_fdpic"
> +  [(set (reg:SI 0) (unspec:SI [(const_int 0)] UNSPEC_TLS))
> +   (clobber (reg:SI 9))
> +   (clobber (reg:SI LR_REGNUM))
> +   (clobber (reg:SI IP_REGNUM))
> +   (clobber (reg:CC CC_REGNUM))]
> +  "TARGET_SOFT_TP && TARGET_FDPIC"
> +  "bl\\t__aeabi_read_tp\\t@ load_tp_soft"
> +  [(set_attr "conds" "clob")
> +   (set_attr "type" "branch")]
> +)
> +
> +;; Doesn't clobber R1-R3.  Must use r0 for the first operand.
>   (define_insn "load_tp_soft"
>     [(set (reg:SI 0) (unspec:SI [(const_int 0)] UNSPEC_TLS))
>      (clobber (reg:SI LR_REGNUM))
>      (clobber (reg:SI IP_REGNUM))
>      (clobber (reg:CC CC_REGNUM))]
> -  "TARGET_SOFT_TP"
> +  "TARGET_SOFT_TP && !TARGET_FDPIC"
>     "bl\\t__aeabi_read_tp\\t@ load_tp_soft"
>     [(set_attr "conds" "clob")
>      (set_attr "type" "branch")]
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-15 10:35     ` Christophe Lyon
@ 2018-10-23 15:01       ` Richard Earnshaw (lists)
  2018-10-23 15:42         ` Segher Boessenkool
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-23 15:01 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: christophe lyon St, gcc Patches

On 15/10/2018 11:10, Christophe Lyon wrote:
> On Fri, 12 Oct 2018 at 12:01, Richard Earnshaw (lists) <
> Richard.Earnshaw@arm.com> wrote:
> 
>> On 11/10/18 14:34, Christophe Lyon wrote:
>>> In FDPIC mode, we set -fPIE unless the user provides -fno-PIE, -fpie,
>>> -fPIC or -fpic: indeed FDPIC code is PIC, but we want to generate code
>>> for executables rather than shared libraries by default.
>>>
>>> We also make sure to use the --fdpic assembler option, and select the
>>> appropriate linker emulation.
>>>
>>> At link time, we also default to -pie, unless we are generating a
>>> shared library or a relocatable file (-r). Note that even for static
>>> link, we must specify the dynamic linker because the executable still
>>> has to relocate itself at startup.
>>>
>>> We also force 'now' binding since lazy binding is not supported.
>>>
>>> We should also apply the same behavior for -Wl,-Ur as for -r, but I
>>> couldn't find how to describe that in the specs fragment.
>>>
>>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>>>       Mickaël Guêné <mickael.guene@st.com>
>>>
>>>       gcc/
>>>       * config.gcc: Handle arm*-*-uclinuxfdpiceabi.
>>>       * config/arm/bpabi.h (TARGET_FDPIC_ASM_SPEC): New.
>>>       (SUBTARGET_EXTRA_ASM_SPEC): Use TARGET_FDPIC_ASM_SPEC.
>>>       * config/arm/linux-eabi.h (FDPIC_CC1_SPEC): New.
>>>       (CC1_SPEC): Use FDPIC_CC1_SPEC.
>>>       * config/arm/uclinuxfdpiceabi.h: New file.
>>>
>>>       libsanitizer/
>>>       * configure.tgt (arm*-*-uclinuxfdpiceabi): Sanitizers are
>>>       unsupported in this configuration.
>>
>> The documentation (in patch 1) seems to imply that -mfdpic is available
>> in all configurations and has certain effects (such as enabling -fPIE),
>> but this patch set suggests that such behaviours are only available when
>> the compiler is configured explicitly for an fdpic target.
>>
>> I think this needs to be resolved.  Either -mfdpic works everywhere, or
>> the option should only be available when configured for -mfdpic.
>>
>>
> You are right, this is not clear. I tried to follow what other fdpic
> targets do,
> but it's not consistent either, it seems.
> 
> So, at present, -mfdpic alone is in general not sufficient, and the user has
> to use -fpic/-fPIC/-fpie/-fPIE as needed. When configured for
> arm-uclinuxfdpiceabi,
> this is done implicitly (thanks to this patch).
> 
> One possibility is to rephrase the doc, and say that -fPIE is only implied
> when GCC
> is configured for arm-uclinuxfdpiceabi.
> 
> Do you mean to also make -mfdpic non-existent/rejected when GCC is not
> configured
> for arm-uclinuxfdpiceabi? 

Ideally doesn't exist, so that it doesn't show up in things like --help
when it doesn't work.

> How to achieve that?

Good question, I'm not sure, off hand.  It might be possible to make the
config machinery add additional opt files, but it's not something I've
tried.  You might want to try adding an additional opt file to
extra_options for fdpic targets.

R.

> 
> 
> R.
>>
>>>
>>> Change-Id: If369e0a10bb916fd72e38f71498d3c640fa85c4c
>>>
>>> diff --git a/gcc/config.gcc b/gcc/config.gcc
>>> index 793fc69..a4f4331 100644
>>> --- a/gcc/config.gcc
>>> +++ b/gcc/config.gcc
>>> @@ -1144,6 +1144,11 @@ arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
>>               # ARM GNU/Linux with ELF
>>>       esac
>>>       tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi
>> arm/t-linux-eabi"
>>>       tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h
>> arm/arm.h"
>>> +     case $target in
>>> +     arm*-*-uclinuxfdpiceabi)
>>> +         tm_file="$tm_file arm/uclinuxfdpiceabi.h"
>>> +         ;;
>>> +     esac
>>>       # Generation of floating-point instructions requires at least
>> ARMv5te.
>>>       if [ "$with_float" = "hard" -o "$with_float" = "softfp" ] ; then
>>>           target_cpu_cname="arm10e"
>>> diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
>>> index 1e3ecfb..5901154 100644
>>> --- a/gcc/config/arm/bpabi.h
>>> +++ b/gcc/config/arm/bpabi.h
>>> @@ -55,6 +55,8 @@
>>>  #define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
>>>    "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
>>>
>>> +#define TARGET_FDPIC_ASM_SPEC  ""
>>> +
>>>  #define BE8_LINK_SPEC
>>       \
>>>    "%{!r:%{!mbe32:%:be8_linkopt(%{mlittle-endian:little}"             \
>>>    "                         %{mbig-endian:big}"                      \
>>> @@ -64,7 +66,7 @@
>>>  /* Tell the assembler to build BPABI binaries.  */
>>>  #undef  SUBTARGET_EXTRA_ASM_SPEC
>>>  #define SUBTARGET_EXTRA_ASM_SPEC \
>>> -  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}"
>> TARGET_FIX_V4BX_SPEC
>>> +  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}"
>> TARGET_FIX_V4BX_SPEC TARGET_FDPIC_ASM_SPEC
>>>
>>>  #ifndef SUBTARGET_EXTRA_LINK_SPEC
>>>  #define SUBTARGET_EXTRA_LINK_SPEC ""
>>> diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
>>> index 8585fde..4cee958 100644
>>> --- a/gcc/config/arm/linux-eabi.h
>>> +++ b/gcc/config/arm/linux-eabi.h
>>> @@ -98,11 +98,14 @@
>>>  #undef  ASAN_CC1_SPEC
>>>  #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
>>>
>>> +#define FDPIC_CC1_SPEC ""
>>> +
>>>  #undef  CC1_SPEC
>>>  #define CC1_SPEC                                                     \
>>> -  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,   \
>>> +  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "
>>       \
>>> +                    FDPIC_CC1_SPEC,                                  \
>>>                      GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "   \
>>> -                    ANDROID_CC1_SPEC)
>>> +                    ANDROID_CC1_SPEC "" FDPIC_CC1_SPEC)
>>>
>>>  #define CC1PLUS_SPEC \
>>>    LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
>>> diff --git a/gcc/config/arm/uclinuxfdpiceabi.h
>> b/gcc/config/arm/uclinuxfdpiceabi.h
>>> new file mode 100644
>>> index 0000000..43a17de
>>> --- /dev/null
>>> +++ b/gcc/config/arm/uclinuxfdpiceabi.h
>>> @@ -0,0 +1,53 @@
>>> +/* Configuration file for ARM GNU/Linux FDPIC EABI targets.
>>> +   Copyright (C) 2018 Free Software Foundation, Inc.
>>> +   Contributed by STMicroelectronics.
>>> +
>>> +   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/>.  */
>>> +
>>> +/* On uClibc EABI GNU/Linux, we want to force -mfdpic by default,
>>> +   which also means we produce PIE code by default.  */
>>> +#undef FDPIC_CC1_SPEC
>>> +#define FDPIC_CC1_SPEC \
>>> +  "%{!mno-fdpic:-mfdpic %{!no-PIE:%{!fpie:%{!fPIC:%{!fpic: -fPIE}}}}}"
>>> +
>>> +/* Add --fdpic assembler flag by default.  */
>>> +#undef TARGET_FDPIC_ASM_SPEC
>>> +#define TARGET_FDPIC_ASM_SPEC  "%{!mno-fdpic: --fdpic}"
>>> +
>>> +/* TARGET_BIG_ENDIAN_DEFAULT is set in
>>> +   config.gcc for big endian configurations.  */
>>> +#if TARGET_BIG_ENDIAN_DEFAULT
>>> +#define TARGET_FDPIC_LINKER_EMULATION "armelfb_linux_fdpiceabi"
>>> +#else
>>> +#define TARGET_FDPIC_LINKER_EMULATION "armelf_linux_fdpiceabi"
>>> +#endif
>>> +
>>> +/* Unless we generate a shared library or a relocatable object, we
>>> +   force -pie.  */
>>> +/* Even with -static, we have to define the dynamic-linker, as we
>>> +   have some relocations to resolve at load time.  */
>>> +#undef  SUBTARGET_EXTRA_LINK_SPEC
>>> +#define SUBTARGET_EXTRA_LINK_SPEC                        \
>>> +  "%{!mno-fdpic: -m " TARGET_FDPIC_LINKER_EMULATION      \
>>> +   "%{!shared:%{!r: -pie}}                               \
>>> +    %{static:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" \
>>> +  "%{mno-fdpic: -m " TARGET_LINKER_EMULATION "}"         \
>>> +  "%{!r:%{!mno-fdpic: -z now}}"
>>> +
>>> +#undef       STARTFILE_SPEC
>>> +#define STARTFILE_SPEC "%{!mno-fdpic:%{!shared:crtreloc.o%s}} " \
>>> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC,
>> ANDROID_STARTFILE_SPEC)
>>> diff --git a/libsanitizer/configure.tgt b/libsanitizer/configure.tgt
>>> index 1dce1e6..dff34cd 100644
>>> --- a/libsanitizer/configure.tgt
>>> +++ b/libsanitizer/configure.tgt
>>> @@ -43,6 +43,9 @@ case "${target}" in
>>>       ;;
>>>    s390*-*-linux*)
>>>       ;;
>>> +  arm*-*-uclinuxfdpiceabi)
>>> +     UNSUPPORTED=1
>>> +     ;;
>>>    arm*-*-linux*)
>>>       ;;
>>>    mips*64*-*-linux*)
>>>
>>
>>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-19 13:57     ` Christophe Lyon
@ 2018-10-23 15:12       ` Richard Earnshaw (lists)
  2018-10-26 16:34         ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-23 15:12 UTC (permalink / raw)
  To: Christophe Lyon, gcc-patches; +Cc: christophe.lyon

On 19/10/2018 14:40, Christophe Lyon wrote:
> On 12/10/2018 12:45, Richard Earnshaw (lists) wrote:
>> On 11/10/18 14:34, Christophe Lyon wrote:
>>> The FDPIC register is hard-coded to r9, as defined in the ABI.
>>>
>>> We have to disable tailcall optimizations if we don't know if the
>>> target function is in the same module. If not, we have to set r9 to
>>> the value associated with the target module.
>>>
>>> When generating a symbol address, we have to take into account whether
>>> it is a pointer to data or to a function, because different
>>> relocations are needed.
>>>
>>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>>>     Mickaël Guêné <mickael.guene@st.com>
>>>
>>>     * config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
>>>     in FDPIC mode.
>>>     * config/arm/arm-protos.h (arm_load_function_descriptor): Declare
>>>     new function.
>>>     * config/arm/arm.c (arm_option_override): Define pic register to
>>>     FDPIC_REGNUM.
>>>     (arm_function_ok_for_sibcall) Disable sibcall optimization if we
>>
>> Missing colon.
>>
>>>     have no decl or go through PLT.
>>>     (arm_load_pic_register): Handle TARGET_FDPIC.
>>>     (arm_is_segment_info_known): New function.
>>>     (arm_pic_static_addr): Add support for FDPIC.
>>>     (arm_load_function_descriptor): New function.
>>>     (arm_assemble_integer): Add support for FDPIC.
>>>     * config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
>>>     Define. (FDPIC_REGNUM): New define.
>>>     * config/arm/arm.md (call): Add support for FDPIC.
>>>     (call_value): Likewise.
>>>     (*restore_pic_register_after_call): New pattern.
>>>     (untyped_call): Disable if FDPIC.
>>>     (untyped_return): Likewise.
>>>     * config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
>>>
>>
>> Other comments inline.
>>
>>> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
>>> index 4471f79..90733cc 100644
>>> --- a/gcc/config/arm/arm-c.c
>>> +++ b/gcc/config/arm/arm-c.c
>>> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
>>>         builtin_define ("__ARM_EABI__");
>>>       }
>>>   +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
>>> +
>>>     def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
>>>     def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
>>>   diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
>>> index 0dfb3ac..28cafa8 100644
>>> --- a/gcc/config/arm/arm-protos.h
>>> +++ b/gcc/config/arm/arm-protos.h
>>> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
>>>   extern int arm_const_double_inline_cost (rtx);
>>>   extern bool arm_const_double_by_parts (rtx);
>>>   extern bool arm_const_double_by_immediates (rtx);
>>> +extern rtx arm_load_function_descriptor (rtx funcdesc);
>>>   extern void arm_emit_call_insn (rtx, rtx, bool);
>>>   bool detect_cmse_nonsecure_call (tree);
>>>   extern const char *output_call (rtx *);
>>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
>>> index 8810df5..92ae24b 100644
>>> --- a/gcc/config/arm/arm.c
>>> +++ b/gcc/config/arm/arm.c
>>> @@ -3470,6 +3470,14 @@ arm_option_override (void)
>>>     if (flag_pic && TARGET_VXWORKS_RTP)
>>>       arm_pic_register = 9;
>>>   +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
>>> +  if (TARGET_FDPIC)
>>> +    {
>>> +      arm_pic_register = FDPIC_REGNUM;
>>> +      if (TARGET_ARM_ARCH < 7)
>>> +    error ("FDPIC mode is not supported on architectures older than
>>> Armv7");
>>
>> What properties of FDPIC impose this requirement?  Does it also apply to
>> Armv8-m.baseline?
>>
> In fact, there was miscommunication on my side, resulting in a
> misunderstanding between Kyrill and myself, which I badly translated
> into this condition.
> 
> My initial plan was to submit a patch series tested on v7, and send the
> patches needed to support older architectures as a follow-up. The proper
> restriction is actually "CPUs that do not support ARM or Thumb2". As you
> may have noticed during the iterations of this patch series, I had
> failed to remove partial Thumb1 support hunks.
> 
> So really this should be rephrased, and rewritten as "FDPIC mode is
> supported on architecture versions that support ARM or Thumb-2", if that
> suits you. And the condition should thus be:
> if (! TARGET_ARM && ! TARGET_THUMB2)
>   error ("...")
> 
> This would also exclude Armv8-m.baseline, since it doesn't support Thumb2.

When we get to v8-m.baseline the thumb1/2 distinction starts to become a
lot more blurred.  A lot of thumb2 features needed for stand-alone
systems are then available.  So what feature is it that you require in
order to make fdpic work in (traditional) thumb2 that isn't in
(traditional) thumb1?



> As a side note, I tried to build GCC master (without my patches)
> --with-cpu=cortex-m23, and both targets arm-eabi and arm-linux-gnueabi
> failed to buid.
> 
> For arm-eabi, there are problems in newlib:
> newlib/libc/sys/arm/crt0.S:145: Error: lo register required -- `add
> sl,r2,#256'
> newlib/libc/sys/arm/trap.S:88: Error: lo register required -- `sub
> ip,sp,ip'
> 

These all sound like basic CPU detection issues in newlib and need to be
fixed at some point (it's probably still using some pre-ACLE macros to
detect system capabilities).

R.

> For arm-linux-gnueabi, the failure happens while building libgcc:
> /home/christophe.lyon/src/GCC/sources/newlib/newlib/libc/machine/arm/setjmp.S:169:
> Error: selected processor does not support ARM opcodes
> /newlib/newlib/libc/machine/arm/setjmp.S:176: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `stmea a1!,{
> v1-v7,fp,ip,sp,lr }'
> /newlib/newlib/libc/machine/arm/setjmp.S:186: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `mov a1,#0'
> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `tst lr,#1'
> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> /newlib/newlib/libc/machine/arm/setjmp.S:194: Error: selected processor
> does not support ARM opcodes
> /newlib/newlib/libc/machine/arm/setjmp.S:203: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `ldmfd a1!,{
> v1-v7,fp,ip,sp,lr }'
> /newlib/newlib/libc/machine/arm/setjmp.S:214: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `movs a1,a2'
> /newlib/newlib/libc/machine/arm/setjmp.S:218: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `moveq a1,#1'
> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `tst lr,#1'
> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> 
> 
>>> +    }
>>> +
>>>     if (arm_pic_register_string != NULL)
>>>       {
>>>         int pic_register = decode_reg_name (arm_pic_register_string);
>>> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>>>     if (cfun->machine->sibcall_blocked)
>>>       return false;
>>>   +  if (TARGET_FDPIC)
>>> +    {
>>> +      /* In FDPIC, never tailcall something for which we have no decl:
>>> +     the target function could be in a different module, requiring
>>> +     a different FDPIC register value.  */
>>> +      if (decl == NULL)
>>> +    return false;
>>> +
>>> +      /* Don't tailcall if we go through the PLT since the FDPIC
>>> +     register is then corrupted and we don't restore it after
>>> +     static function calls.  */
>>> +      if (!targetm.binds_local_p (decl))
>>> +    return false;
>>> +    }
>>> +
>>>     /* Never tailcall something if we are generating code for
>>> Thumb-1.  */
>>>     if (TARGET_THUMB1)
>>>       return false;
>>> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs
>>> ATTRIBUTE_UNUSED)
>>>   {
>>>     rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
>>>   -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
>>> +  if (crtl->uses_pic_offset_table == 0
>>> +      || TARGET_SINGLE_PIC_BASE
>>> +      || TARGET_FDPIC)
>>>       return;
>>>       gcc_assert (flag_pic);
>>> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long
>>> saved_regs ATTRIBUTE_UNUSED)
>>>     emit_use (pic_reg);
>>>   }
>>>   +/* Try to know if the object will go in text or data segment. This is
>>
>> "Try to determine whether an object, referenced via ORIG, will be placed
>> in the text or data segment."
>>> +   used in FDPIC mode, to decide which relocations to use when
>>> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
>>
>> Two spaces after a period.
>>
>>> +   location, false otherwise.  */
>>
>> You've missed the documentation of the return value: does returning true
>> mean text vs data, or does it mean we know which it will go in, but
>> don't have to return that information here.
>>
>> Generally, won't this break big time if users compile with
>> -ffunction-sections or -fdata-sections?  Is it sufficient to match
>> .text.* as being text and .data.* for data?
>>
> 
> I compiled a small testcase with -ffunction-sections and -fdata-sections
> and noticed no problem.
> The code below does not attempt to match section names, I'm not sure to
> understand your question?
> 
>>
>>> +static bool
>>> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
>>> +{
>>> +  bool res = false;
>>> +
>>> +  *is_readonly = false;
>>> +
>>> +  if (GET_CODE (orig) == LABEL_REF)
>>> +    {
>>> +      res = true;
>>> +      *is_readonly = true;
>>> +    }
>>> +  else if (SYMBOL_REF_P (orig))
>>> +    {
>>> +      if (CONSTANT_POOL_ADDRESS_P (orig))
>>> +    {
>>> +      res = true;
>>> +      *is_readonly = true;
>>> +    }
>>> +      else if (SYMBOL_REF_LOCAL_P (orig)
>>> +           && !SYMBOL_REF_EXTERNAL_P (orig)
>>> +           && SYMBOL_REF_DECL (orig)
>>> +           && (!DECL_P (SYMBOL_REF_DECL (orig))
>>> +           || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
>>> +    {
>>> +      tree decl = SYMBOL_REF_DECL (orig);
>>> +      tree init = (TREE_CODE (decl) == VAR_DECL)
>>> +        ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
>>> +        ? decl : 0;
>>> +      int reloc = 0;
>>> +      bool named_section, readonly;
>>> +
>>> +      if (init && init != error_mark_node)
>>> +        reloc = compute_reloc_for_constant (init);
>>> +
>>> +      named_section = TREE_CODE (decl) == VAR_DECL
>>> +        && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
>>> +      readonly = decl_readonly_section (decl, reloc);
>>> +
>>> +      /* We don't know where the link script will put a named
>>> +         section, so return false in such a case.  */
>>> +      res = !named_section;
>>> +
>>> +      if (!named_section)
>>> +        *is_readonly = readonly;
>>> +    }
>>> +      else
>>> +    {
>>> +      /* We don't know.  */
>>> +      res = false;
>>> +    }
>>> +    }
>>> +  else
>>> +    gcc_unreachable ();
>>> +
>>> +  return res;
>>> +}
>>> +
>>>   /* Generate code to load the address of a static var when flag_pic
>>> is set.  */
>>>   static rtx_insn *
>>>   arm_pic_static_addr (rtx orig, rtx reg)
>>>   {
>>>     rtx l1, labelno, offset_rtx;
>>> +  rtx_insn *insn;
>>>       gcc_assert (flag_pic);
>>>   -  /* We use an UNSPEC rather than a LABEL_REF because this label
>>> -     never appears in the code stream.  */
>>> -  labelno = GEN_INT (pic_labelno++);
>>> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
>>> UNSPEC_PIC_LABEL);
>>> -  l1 = gen_rtx_CONST (VOIDmode, l1);
>>> +  bool is_readonly = false;
>>> +  bool info_known = false;
>>>   -  /* On the ARM the PC register contains 'dot + 8' at the time of the
>>> -     addition, on the Thumb it is 'dot + 4'.  */
>>> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>>> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
>>> -                               UNSPEC_SYMBOL_OFFSET);
>>> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>>> +  if (TARGET_FDPIC
>>> +      && SYMBOL_REF_P (orig)
>>> +      && !SYMBOL_REF_FUNCTION_P (orig))
>>> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
>>>   -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
>>> labelno));
>>> +  if (TARGET_FDPIC
>>> +      && SYMBOL_REF_P (orig)
>>> +      && !SYMBOL_REF_FUNCTION_P (orig)
>>> +      && !info_known)
>>> +    {
>>> +      /* We don't know where orig is stored, so we have be
>>> +     pessimistic and use a GOT relocation.  */
>>> +      rtx pat;
>>> +      rtx mem;
>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>> +
>>> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
>>> +
>>> +      /* Make the MEM as close to a constant as possible.  */
>>> +      mem = SET_SRC (pat);
>>> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
>>> +      MEM_READONLY_P (mem) = 1;
>>> +      MEM_NOTRAP_P (mem) = 1;
>>> +
>>> +      insn = emit_insn (pat);
>>> +    }
>>> +  else if (TARGET_FDPIC
>>> +       && SYMBOL_REF_P (orig)
>>> +       && (SYMBOL_REF_FUNCTION_P (orig)
>>> +           || (info_known && !is_readonly)))
>>> +    {
>>> +      /* We use the GOTOFF relocation.  */
>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>> +
>>> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
>>> UNSPEC_PIC_SYM);
>>> +      emit_insn (gen_movsi (reg, l1));
>>> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
>>> +    }
>>> +  else
>>> +    {
>>> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
>>> +     PC-relative access.  */
>>> +      /* We use an UNSPEC rather than a LABEL_REF because this label
>>> +     never appears in the code stream.  */
>>> +      labelno = GEN_INT (pic_labelno++);
>>> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
>>> UNSPEC_PIC_LABEL);
>>> +      l1 = gen_rtx_CONST (VOIDmode, l1);
>>> +
>>> +      /* On the ARM the PC register contains 'dot + 8' at the time
>>> of the
>>> +     addition, on the Thumb it is 'dot + 4'.  */
>>> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>>> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig,
>>> offset_rtx),
>>> +                   UNSPEC_SYMBOL_OFFSET);
>>> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>>> +
>>> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
>>> +                           labelno));
>>> +    }
>>> +
>>> +  return insn;
>>>   }
>>>     /* Return nonzero if X is valid as an ARM state addressing
>>> register.  */
>>> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
>>>     return 0;
>>>   }
>>>   +/* Emit insns to load the function address from FUNCDESC (an FDPIC
>>> +   function descriptor) into a register and the GOT address into the
>>> +   FDPIC register, returning an rtx for the register holding the
>>> +   function address.  */
>>> +
>>> +rtx
>>> +arm_load_function_descriptor (rtx funcdesc)
>>> +{
>>> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
>>> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
>>> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc,
>>> 4));
>>> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>> +
>>> +  emit_move_insn (fnaddr_reg, fnaddr);
>>> +  /* The ABI requires the entry point address to be loaded first, so
>>> +     prevent the load from being moved after that of the GOT
>>> +     address.  */
>>> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>> +                    gen_rtvec (2, pic_reg, gotaddr),
>>> +                    UNSPEC_PIC_RESTORE);
>>> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode,
>>> FDPIC_REGNUM))
>>> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG
>>> (Pmode, FDPIC_REGNUM));
>>
>> Shouldn't one of these be fnaddr_reg and the other pic_reg?
> I think the USE should be gotaddr, and CLOBBER should be pic_reg, thanks.
> 
>>
>>> +  emit_insn (par);
>>> +
>>> +  return fnaddr_reg;
>>> +}
>>> +
>>>   /* Return the maximum amount of padding that will be inserted before
>>>      label LABEL.  */
>>> -
>>>   static HOST_WIDE_INT
>>>   get_label_padding (rtx label)
>>>   {
>>> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int
>>> size, int aligned_p)
>>>             && (!SYMBOL_REF_LOCAL_P (x)
>>>                 || (SYMBOL_REF_DECL (x)
>>>                 ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
>>> -        fputs ("(GOT)", asm_out_file);
>>> +        {
>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>>> +        fputs ("(GOTFUNCDESC)", asm_out_file);
>>> +          else
>>> +        fputs ("(GOT)", asm_out_file);
>>> +        }
>>>         else
>>> -        fputs ("(GOTOFF)", asm_out_file);
>>> +        {
>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>>> +        fputs ("(GOTOFFFUNCDESC)", asm_out_file);
>>> +          else
>>> +        {
>>> +          bool is_readonly;
>>> +
>>> +          if (arm_is_segment_info_known (x, &is_readonly))
>>> +            fputs ("(GOTOFF)", asm_out_file);
>>> +          else
>>> +            fputs ("(GOT)", asm_out_file);
>>> +        }
>>> +        }
>>> +    }
>>> +
>>> +      /* For FDPIC we also have to mark symbol for .data section.  */
>>> +      if (TARGET_FDPIC
>>> +      && NEED_GOT_RELOC
>>> +      && flag_pic
>>> +      && !making_const_table
>>> +      && SYMBOL_REF_P (x))
>>> +    {
>>> +      if (SYMBOL_REF_FUNCTION_P (x))
>>> +        fputs ("(FUNCDESC)", asm_out_file);
>>>       }
>>>         fputc ('\n', asm_out_file);
>>>         return true;
>>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
>>> index 34894c0..4671d64 100644
>>> --- a/gcc/config/arm/arm.h
>>> +++ b/gcc/config/arm/arm.h
>>> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
>>>      Pascal), so the following is not true.  */
>>>   #define STATIC_CHAIN_REGNUM    12
>>>   +/* r9 is the FDPIC register (base register for GOT and FUNCDESC
>>> accesses).  */
>>> +#define FDPIC_REGNUM        9
>>> +
>>>   /* Define this to be where the real frame pointer is if it is not
>>> possible to
>>>      work out the offset between the frame pointer and the automatic
>>> variables
>>>      until after register allocation has taken place. 
>>> FRAME_POINTER_REGNUM
>>> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
>>>      data addresses in memory.  */
>>>   #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
>>>   +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
>>> +   entries would need to handle saving and restoring it).  */
>>> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
>>> +
>>>   /* We can't directly access anything that contains a symbol,
>>>      nor can we indirect via the constant pool.  One exception is
>>>      UNSPEC_TLS, which is always PIC.  */
>>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
>>> index 270b8e4..09a0701 100644
>>> --- a/gcc/config/arm/arm.md
>>> +++ b/gcc/config/arm/arm.md
>>> @@ -8031,6 +8031,23 @@
>>>       rtx callee, pat;
>>>       tree addr = MEM_EXPR (operands[0]);
>>>       +    /* Force FDPIC register (r9) before call.  */
>>> +    if (TARGET_FDPIC)
>>> +      {
>>> +    /* No need to update r9 if calling a static function.
>>> +       In other words: set r9 for indirect or non-local calls.  */
>>> +    callee = XEXP (operands[0], 0);
>>> +    if (!SYMBOL_REF_P (callee)
>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>> +      {
>>> +        emit_insn (gen_blockage ());
>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
>>> FDPIC_REGNUM));
>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>>> +     }
>>> +      }
>>> +
>>>       /* In an untyped call, we can get NULL for operand 2.  */
>>>       if (operands[2] == NULL_RTX)
>>>         operands[2] = const0_rtx;
>>> @@ -8044,6 +8061,13 @@
>>>       : !REG_P (callee))
>>>         XEXP (operands[0], 0) = force_reg (Pmode, callee);
>>>   +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
>>> +      {
>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
>>> +    XEXP (operands[0], 0)
>>> +      = arm_load_function_descriptor (XEXP (operands[0], 0));
>>> +      }
>>> +
>>>       if (detect_cmse_nonsecure_call (addr))
>>>         {
>>>       pat = gen_nonsecure_call_internal (operands[0], operands[1],
>>> @@ -8055,10 +8079,38 @@
>>>       pat = gen_call_internal (operands[0], operands[1], operands[2]);
>>>       arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
>>>         }
>>> +
>>> +    /* Restore FDPIC register (r9) after call.  */
>>> +    if (TARGET_FDPIC)
>>> +      {
>>> +    /* No need to update r9 if calling a static function.  */
>>> +    if (!SYMBOL_REF_P (callee)
>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>> +      {
>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
>>> FDPIC_REGNUM));
>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>>> +        emit_insn (gen_blockage ());
>>> +      }
>>> +      }
>>>       DONE;
>>>     }"
>>>   )
>>>   +(define_insn "*restore_pic_register_after_call"
>>> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
>>> +               (match_operand:SI 1 "nonimmediate_operand" "r,m")]
>>> +           UNSPEC_PIC_RESTORE)
>>> +          (use (match_dup 0))
>>> +          (clobber (match_dup 0))])
>>> +  ]
>>> +  ""
>>> +  "@
>>> +  mov\t%0, %1
>>> +  ldr\t%0, %1"
>>> +)
>>> +
>>>   (define_expand "call_internal"
>>>     [(parallel [(call (match_operand 0 "memory_operand" "")
>>>                   (match_operand 1 "general_operand" ""))
>>> @@ -8119,6 +8171,30 @@
>>>       rtx pat, callee;
>>>       tree addr = MEM_EXPR (operands[1]);
>>>       +    /* Force FDPIC register (r9) before call.  */
>>> +    if (TARGET_FDPIC)
>>> +      {
>>> +    /* No need to update the FDPIC register (r9) if calling a static
>>> function.
>>> +       In other words: set r9 for indirect or non-local calls.  */
>>> +    callee = XEXP (operands[1], 0);
>>> +    if (!SYMBOL_REF_P (callee)
>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>> +      {
>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>> +
>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>>> +        UNSPEC_PIC_RESTORE);
>>> +        XVECEXP (par, 0, 1)
>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>>> +        XVECEXP (par, 0, 2)
>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
>>> FDPIC_REGNUM));
>>
>> Again, this looks suspicious.
>>
> Yes, fixed for follow-up patch, with
> USE for get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)
> CLOBBER for gen_rtx_REG (Pmode, FDPIC_REGNUM)
> 
>>> +        emit_insn (par);
>>> +      }
>>> +      }
>>> +
>>>       /* In an untyped call, we can get NULL for operand 2.  */
>>>       if (operands[3] == 0)
>>>         operands[3] = const0_rtx;
>>> @@ -8132,6 +8208,14 @@
>>>       : !REG_P (callee))
>>>         XEXP (operands[1], 0) = force_reg (Pmode, callee);
>>>   +    if (TARGET_FDPIC
>>> +    && !SYMBOL_REF_P (XEXP (operands[1], 0)))
>>> +      {
>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
>>> +    XEXP (operands[1], 0)
>>> +      = arm_load_function_descriptor (XEXP (operands[1], 0));
>>> +      }
>>> +
>>>       if (detect_cmse_nonsecure_call (addr))
>>>         {
>>>       pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
>>> @@ -8144,6 +8228,28 @@
>>>                          operands[2], operands[3]);
>>>       arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
>>>         }
>>> +    /* Restore FDPIC register (r9) after call.  */
>>> +    if (TARGET_FDPIC)
>>> +      {
>>> +    /* No need to update r9 if calling a static function.  */
>>> +    if (!SYMBOL_REF_P (callee)
>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>> +      {
>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>> +
>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>>> +        UNSPEC_PIC_RESTORE);
>>> +        XVECEXP (par, 0, 1)
>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>>> +        XVECEXP (par, 0, 2)
>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
>>> FDPIC_REGNUM));
>>
>> And again.
> Yes
> 
>>
>>> +        emit_insn (par);
>>> +      }
>>> +      }
>>> +
>>>       DONE;
>>>     }"
>>>   )
>>> @@ -8486,7 +8592,7 @@
>>>               (const_int 0))
>>>             (match_operand 1 "" "")
>>>             (match_operand 2 "" "")])]
>>> -  "TARGET_EITHER"
>>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>>     "
>>>     {
>>>       int i;
>>> @@ -8553,7 +8659,7 @@
>>>   (define_expand "untyped_return"
>>>     [(match_operand:BLK 0 "memory_operand" "")
>>>      (match_operand 1 "" "")]
>>> -  "TARGET_EITHER"
>>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>>     "
>>>     {
>>>       int i;
>>> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
>>> index 1941673..349ae0e 100644
>>> --- a/gcc/config/arm/unspecs.md
>>> +++ b/gcc/config/arm/unspecs.md
>>> @@ -86,6 +86,7 @@
>>>     UNSPEC_PROBE_STACK    ; Probe stack memory reference
>>>     UNSPEC_NONSECURE_MEM    ; Represent non-secure memory in ARMv8-M
>>> with
>>>               ; security extension
>>> +  UNSPEC_PIC_RESTORE    ; Use to restore fdpic register
>>>   ])
>>>     (define_c_enum "unspec" [
>>>
>>
>> .
>>
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-23 15:01       ` Richard Earnshaw (lists)
@ 2018-10-23 15:42         ` Segher Boessenkool
  2018-10-26 15:33           ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Segher Boessenkool @ 2018-10-23 15:42 UTC (permalink / raw)
  To: Richard Earnshaw (lists); +Cc: Christophe Lyon, christophe lyon St, gcc Patches

On Tue, Oct 23, 2018 at 02:58:21PM +0100, Richard Earnshaw (lists) wrote:
> On 15/10/2018 11:10, Christophe Lyon wrote:
> > Do you mean to also make -mfdpic non-existent/rejected when GCC is not
> > configured
> > for arm-uclinuxfdpiceabi? 
> 
> Ideally doesn't exist, so that it doesn't show up in things like --help
> when it doesn't work.
> 
> > How to achieve that?
> 
> Good question, I'm not sure, off hand.  It might be possible to make the
> config machinery add additional opt files, but it's not something I've
> tried.  You might want to try adding an additional opt file to
> extra_options for fdpic targets.

That should work yes.  You could look at how 476.opt is added for powerpc,
it is a comparable situation.


Segher

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-23 15:42         ` Segher Boessenkool
@ 2018-10-26 15:33           ` Christophe Lyon
  2018-10-29 14:25             ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-26 15:33 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: Richard Earnshaw, christophe lyon St, gcc Patches

On Tue, 23 Oct 2018 at 17:14, Segher Boessenkool
<segher@kernel.crashing.org> wrote:
>
> On Tue, Oct 23, 2018 at 02:58:21PM +0100, Richard Earnshaw (lists) wrote:
> > On 15/10/2018 11:10, Christophe Lyon wrote:
> > > Do you mean to also make -mfdpic non-existent/rejected when GCC is not
> > > configured
> > > for arm-uclinuxfdpiceabi?
> >
> > Ideally doesn't exist, so that it doesn't show up in things like --help
> > when it doesn't work.
> >
> > > How to achieve that?
> >
> > Good question, I'm not sure, off hand.  It might be possible to make the
> > config machinery add additional opt files, but it's not something I've
> > tried.  You might want to try adding an additional opt file to
> > extra_options for fdpic targets.
>
> That should work yes.  You could look at how 476.opt is added for powerpc,
> it is a comparable situation.
>

Thanks, I got it to work.

Now back to Richard's original question:
> I think this needs to be resolved.  Either -mfdpic works everywhere, or
> the option should only be available when configured for -mfdpic.
It's not that -mfdpic does not work everywhere, rather it is not sufficient
to use it alone: it should be used along with fpic/fPIC/fpie/fPIE depending
on the use case.

In practice I don't know if we want to be able to use -mfdpic with a
arm-linux-gnueabi
toolchain, or if we are ok to have to use two different toolchains
when we want to make
tests/compare code generation in both cases.

The 1st option means I should improve the documentation patch. For the 2nd one,
I have patches in progress (which also imply reworking the doc since the option
would not also be available)

Christophe


>
> Segher

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-23 15:12       ` Richard Earnshaw (lists)
@ 2018-10-26 16:34         ` Christophe Lyon
  2018-10-26 16:41           ` Richard Earnshaw (lists)
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-26 16:34 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Tue, 23 Oct 2018 at 16:07, Richard Earnshaw (lists)
<Richard.Earnshaw@arm.com> wrote:
>
> On 19/10/2018 14:40, Christophe Lyon wrote:
> > On 12/10/2018 12:45, Richard Earnshaw (lists) wrote:
> >> On 11/10/18 14:34, Christophe Lyon wrote:
> >>> The FDPIC register is hard-coded to r9, as defined in the ABI.
> >>>
> >>> We have to disable tailcall optimizations if we don't know if the
> >>> target function is in the same module. If not, we have to set r9 to
> >>> the value associated with the target module.
> >>>
> >>> When generating a symbol address, we have to take into account whether
> >>> it is a pointer to data or to a function, because different
> >>> relocations are needed.
> >>>
> >>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >>>     Mickaël Guêné <mickael.guene@st.com>
> >>>
> >>>     * config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
> >>>     in FDPIC mode.
> >>>     * config/arm/arm-protos.h (arm_load_function_descriptor): Declare
> >>>     new function.
> >>>     * config/arm/arm.c (arm_option_override): Define pic register to
> >>>     FDPIC_REGNUM.
> >>>     (arm_function_ok_for_sibcall) Disable sibcall optimization if we
> >>
> >> Missing colon.
> >>
> >>>     have no decl or go through PLT.
> >>>     (arm_load_pic_register): Handle TARGET_FDPIC.
> >>>     (arm_is_segment_info_known): New function.
> >>>     (arm_pic_static_addr): Add support for FDPIC.
> >>>     (arm_load_function_descriptor): New function.
> >>>     (arm_assemble_integer): Add support for FDPIC.
> >>>     * config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
> >>>     Define. (FDPIC_REGNUM): New define.
> >>>     * config/arm/arm.md (call): Add support for FDPIC.
> >>>     (call_value): Likewise.
> >>>     (*restore_pic_register_after_call): New pattern.
> >>>     (untyped_call): Disable if FDPIC.
> >>>     (untyped_return): Likewise.
> >>>     * config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
> >>>
> >>
> >> Other comments inline.
> >>
> >>> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
> >>> index 4471f79..90733cc 100644
> >>> --- a/gcc/config/arm/arm-c.c
> >>> +++ b/gcc/config/arm/arm-c.c
> >>> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
> >>>         builtin_define ("__ARM_EABI__");
> >>>       }
> >>>   +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
> >>> +
> >>>     def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
> >>>     def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
> >>>   diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
> >>> index 0dfb3ac..28cafa8 100644
> >>> --- a/gcc/config/arm/arm-protos.h
> >>> +++ b/gcc/config/arm/arm-protos.h
> >>> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
> >>>   extern int arm_const_double_inline_cost (rtx);
> >>>   extern bool arm_const_double_by_parts (rtx);
> >>>   extern bool arm_const_double_by_immediates (rtx);
> >>> +extern rtx arm_load_function_descriptor (rtx funcdesc);
> >>>   extern void arm_emit_call_insn (rtx, rtx, bool);
> >>>   bool detect_cmse_nonsecure_call (tree);
> >>>   extern const char *output_call (rtx *);
> >>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> >>> index 8810df5..92ae24b 100644
> >>> --- a/gcc/config/arm/arm.c
> >>> +++ b/gcc/config/arm/arm.c
> >>> @@ -3470,6 +3470,14 @@ arm_option_override (void)
> >>>     if (flag_pic && TARGET_VXWORKS_RTP)
> >>>       arm_pic_register = 9;
> >>>   +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
> >>> +  if (TARGET_FDPIC)
> >>> +    {
> >>> +      arm_pic_register = FDPIC_REGNUM;
> >>> +      if (TARGET_ARM_ARCH < 7)
> >>> +    error ("FDPIC mode is not supported on architectures older than
> >>> Armv7");
> >>
> >> What properties of FDPIC impose this requirement?  Does it also apply to
> >> Armv8-m.baseline?
> >>
> > In fact, there was miscommunication on my side, resulting in a
> > misunderstanding between Kyrill and myself, which I badly translated
> > into this condition.
> >
> > My initial plan was to submit a patch series tested on v7, and send the
> > patches needed to support older architectures as a follow-up. The proper
> > restriction is actually "CPUs that do not support ARM or Thumb2". As you
> > may have noticed during the iterations of this patch series, I had
> > failed to remove partial Thumb1 support hunks.
> >
> > So really this should be rephrased, and rewritten as "FDPIC mode is
> > supported on architecture versions that support ARM or Thumb-2", if that
> > suits you. And the condition should thus be:
> > if (! TARGET_ARM && ! TARGET_THUMB2)
> >   error ("...")
> >
> > This would also exclude Armv8-m.baseline, since it doesn't support Thumb2.
>
> When we get to v8-m.baseline the thumb1/2 distinction starts to become a
> lot more blurred.  A lot of thumb2 features needed for stand-alone
> systems are then available.  So what feature is it that you require in
> order to make fdpic work in (traditional) thumb2 that isn't in
> (traditional) thumb1?
>
At the moment I'm not sure about what feature is missing. It's rather
that we haven't made it work it although there were preliminary attempts.

Since building GCC --with-cpu=cortex-m{0,23} --target arm-linux-gnueabi
currently fails, I tried using a fdpic toolchain built --with-cpu=cortex-m4,
forcing -mcpu=cortex-m{0,23} while building uClibc-ng. I noticed two kinds
of failures:
- parts of assembly files do not support Thumb-1, so they need porting at least
(ldso/ldso/arm/dl-startup.h)
- ICEs for lack of .md patterns (cortex-m4 uses pic_load_addr_32bit which is
missing for m{0,23}

There are probably other problems that would be discovered at runtime.

So it can probably be made to work, but I think that would be an enhancement
for later (not sure there's a real need: can we reasonably think about
running Linux on such small cores?)

>
>
> > As a side note, I tried to build GCC master (without my patches)
> > --with-cpu=cortex-m23, and both targets arm-eabi and arm-linux-gnueabi
> > failed to buid.
> >
> > For arm-eabi, there are problems in newlib:
> > newlib/libc/sys/arm/crt0.S:145: Error: lo register required -- `add
> > sl,r2,#256'
> > newlib/libc/sys/arm/trap.S:88: Error: lo register required -- `sub
> > ip,sp,ip'
> >
>
> These all sound like basic CPU detection issues in newlib and need to be
> fixed at some point (it's probably still using some pre-ACLE macros to
> detect system capabilities).
>
> R.
>
> > For arm-linux-gnueabi, the failure happens while building libgcc:
> > /home/christophe.lyon/src/GCC/sources/newlib/newlib/libc/machine/arm/setjmp.S:169:
> > Error: selected processor does not support ARM opcodes
> > /newlib/newlib/libc/machine/arm/setjmp.S:176: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `stmea a1!,{
> > v1-v7,fp,ip,sp,lr }'
> > /newlib/newlib/libc/machine/arm/setjmp.S:186: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `mov a1,#0'
> > /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `tst lr,#1'
> > /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> > /newlib/newlib/libc/machine/arm/setjmp.S:194: Error: selected processor
> > does not support ARM opcodes
> > /newlib/newlib/libc/machine/arm/setjmp.S:203: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `ldmfd a1!,{
> > v1-v7,fp,ip,sp,lr }'
> > /newlib/newlib/libc/machine/arm/setjmp.S:214: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `movs a1,a2'
> > /newlib/newlib/libc/machine/arm/setjmp.S:218: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `moveq a1,#1'
> > /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `tst lr,#1'
> > /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> > ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> >
> >
> >>> +    }
> >>> +
> >>>     if (arm_pic_register_string != NULL)
> >>>       {
> >>>         int pic_register = decode_reg_name (arm_pic_register_string);
> >>> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
> >>>     if (cfun->machine->sibcall_blocked)
> >>>       return false;
> >>>   +  if (TARGET_FDPIC)
> >>> +    {
> >>> +      /* In FDPIC, never tailcall something for which we have no decl:
> >>> +     the target function could be in a different module, requiring
> >>> +     a different FDPIC register value.  */
> >>> +      if (decl == NULL)
> >>> +    return false;
> >>> +
> >>> +      /* Don't tailcall if we go through the PLT since the FDPIC
> >>> +     register is then corrupted and we don't restore it after
> >>> +     static function calls.  */
> >>> +      if (!targetm.binds_local_p (decl))
> >>> +    return false;
> >>> +    }
> >>> +
> >>>     /* Never tailcall something if we are generating code for
> >>> Thumb-1.  */
> >>>     if (TARGET_THUMB1)
> >>>       return false;
> >>> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs
> >>> ATTRIBUTE_UNUSED)
> >>>   {
> >>>     rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
> >>>   -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
> >>> +  if (crtl->uses_pic_offset_table == 0
> >>> +      || TARGET_SINGLE_PIC_BASE
> >>> +      || TARGET_FDPIC)
> >>>       return;
> >>>       gcc_assert (flag_pic);
> >>> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long
> >>> saved_regs ATTRIBUTE_UNUSED)
> >>>     emit_use (pic_reg);
> >>>   }
> >>>   +/* Try to know if the object will go in text or data segment. This is
> >>
> >> "Try to determine whether an object, referenced via ORIG, will be placed
> >> in the text or data segment."
> >>> +   used in FDPIC mode, to decide which relocations to use when
> >>> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
> >>
> >> Two spaces after a period.
> >>
> >>> +   location, false otherwise.  */
> >>
> >> You've missed the documentation of the return value: does returning true
> >> mean text vs data, or does it mean we know which it will go in, but
> >> don't have to return that information here.
> >>
> >> Generally, won't this break big time if users compile with
> >> -ffunction-sections or -fdata-sections?  Is it sufficient to match
> >> .text.* as being text and .data.* for data?
> >>
> >
> > I compiled a small testcase with -ffunction-sections and -fdata-sections
> > and noticed no problem.
> > The code below does not attempt to match section names, I'm not sure to
> > understand your question?
> >
> >>
> >>> +static bool
> >>> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
> >>> +{
> >>> +  bool res = false;
> >>> +
> >>> +  *is_readonly = false;
> >>> +
> >>> +  if (GET_CODE (orig) == LABEL_REF)
> >>> +    {
> >>> +      res = true;
> >>> +      *is_readonly = true;
> >>> +    }
> >>> +  else if (SYMBOL_REF_P (orig))
> >>> +    {
> >>> +      if (CONSTANT_POOL_ADDRESS_P (orig))
> >>> +    {
> >>> +      res = true;
> >>> +      *is_readonly = true;
> >>> +    }
> >>> +      else if (SYMBOL_REF_LOCAL_P (orig)
> >>> +           && !SYMBOL_REF_EXTERNAL_P (orig)
> >>> +           && SYMBOL_REF_DECL (orig)
> >>> +           && (!DECL_P (SYMBOL_REF_DECL (orig))
> >>> +           || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
> >>> +    {
> >>> +      tree decl = SYMBOL_REF_DECL (orig);
> >>> +      tree init = (TREE_CODE (decl) == VAR_DECL)
> >>> +        ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
> >>> +        ? decl : 0;
> >>> +      int reloc = 0;
> >>> +      bool named_section, readonly;
> >>> +
> >>> +      if (init && init != error_mark_node)
> >>> +        reloc = compute_reloc_for_constant (init);
> >>> +
> >>> +      named_section = TREE_CODE (decl) == VAR_DECL
> >>> +        && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
> >>> +      readonly = decl_readonly_section (decl, reloc);
> >>> +
> >>> +      /* We don't know where the link script will put a named
> >>> +         section, so return false in such a case.  */
> >>> +      res = !named_section;
> >>> +
> >>> +      if (!named_section)
> >>> +        *is_readonly = readonly;
> >>> +    }
> >>> +      else
> >>> +    {
> >>> +      /* We don't know.  */
> >>> +      res = false;
> >>> +    }
> >>> +    }
> >>> +  else
> >>> +    gcc_unreachable ();
> >>> +
> >>> +  return res;
> >>> +}
> >>> +
> >>>   /* Generate code to load the address of a static var when flag_pic
> >>> is set.  */
> >>>   static rtx_insn *
> >>>   arm_pic_static_addr (rtx orig, rtx reg)
> >>>   {
> >>>     rtx l1, labelno, offset_rtx;
> >>> +  rtx_insn *insn;
> >>>       gcc_assert (flag_pic);
> >>>   -  /* We use an UNSPEC rather than a LABEL_REF because this label
> >>> -     never appears in the code stream.  */
> >>> -  labelno = GEN_INT (pic_labelno++);
> >>> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
> >>> UNSPEC_PIC_LABEL);
> >>> -  l1 = gen_rtx_CONST (VOIDmode, l1);
> >>> +  bool is_readonly = false;
> >>> +  bool info_known = false;
> >>>   -  /* On the ARM the PC register contains 'dot + 8' at the time of the
> >>> -     addition, on the Thumb it is 'dot + 4'.  */
> >>> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> >>> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
> >>> -                               UNSPEC_SYMBOL_OFFSET);
> >>> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> >>> +  if (TARGET_FDPIC
> >>> +      && SYMBOL_REF_P (orig)
> >>> +      && !SYMBOL_REF_FUNCTION_P (orig))
> >>> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
> >>>   -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
> >>> labelno));
> >>> +  if (TARGET_FDPIC
> >>> +      && SYMBOL_REF_P (orig)
> >>> +      && !SYMBOL_REF_FUNCTION_P (orig)
> >>> +      && !info_known)
> >>> +    {
> >>> +      /* We don't know where orig is stored, so we have be
> >>> +     pessimistic and use a GOT relocation.  */
> >>> +      rtx pat;
> >>> +      rtx mem;
> >>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>> +
> >>> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
> >>> +
> >>> +      /* Make the MEM as close to a constant as possible.  */
> >>> +      mem = SET_SRC (pat);
> >>> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
> >>> +      MEM_READONLY_P (mem) = 1;
> >>> +      MEM_NOTRAP_P (mem) = 1;
> >>> +
> >>> +      insn = emit_insn (pat);
> >>> +    }
> >>> +  else if (TARGET_FDPIC
> >>> +       && SYMBOL_REF_P (orig)
> >>> +       && (SYMBOL_REF_FUNCTION_P (orig)
> >>> +           || (info_known && !is_readonly)))
> >>> +    {
> >>> +      /* We use the GOTOFF relocation.  */
> >>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>> +
> >>> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
> >>> UNSPEC_PIC_SYM);
> >>> +      emit_insn (gen_movsi (reg, l1));
> >>> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
> >>> +    }
> >>> +  else
> >>> +    {
> >>> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
> >>> +     PC-relative access.  */
> >>> +      /* We use an UNSPEC rather than a LABEL_REF because this label
> >>> +     never appears in the code stream.  */
> >>> +      labelno = GEN_INT (pic_labelno++);
> >>> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
> >>> UNSPEC_PIC_LABEL);
> >>> +      l1 = gen_rtx_CONST (VOIDmode, l1);
> >>> +
> >>> +      /* On the ARM the PC register contains 'dot + 8' at the time
> >>> of the
> >>> +     addition, on the Thumb it is 'dot + 4'.  */
> >>> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> >>> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig,
> >>> offset_rtx),
> >>> +                   UNSPEC_SYMBOL_OFFSET);
> >>> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> >>> +
> >>> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
> >>> +                           labelno));
> >>> +    }
> >>> +
> >>> +  return insn;
> >>>   }
> >>>     /* Return nonzero if X is valid as an ARM state addressing
> >>> register.  */
> >>> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
> >>>     return 0;
> >>>   }
> >>>   +/* Emit insns to load the function address from FUNCDESC (an FDPIC
> >>> +   function descriptor) into a register and the GOT address into the
> >>> +   FDPIC register, returning an rtx for the register holding the
> >>> +   function address.  */
> >>> +
> >>> +rtx
> >>> +arm_load_function_descriptor (rtx funcdesc)
> >>> +{
> >>> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
> >>> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
> >>> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc,
> >>> 4));
> >>> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>> +
> >>> +  emit_move_insn (fnaddr_reg, fnaddr);
> >>> +  /* The ABI requires the entry point address to be loaded first, so
> >>> +     prevent the load from being moved after that of the GOT
> >>> +     address.  */
> >>> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>> +                    gen_rtvec (2, pic_reg, gotaddr),
> >>> +                    UNSPEC_PIC_RESTORE);
> >>> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode,
> >>> FDPIC_REGNUM))
> >>> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG
> >>> (Pmode, FDPIC_REGNUM));
> >>
> >> Shouldn't one of these be fnaddr_reg and the other pic_reg?
> > I think the USE should be gotaddr, and CLOBBER should be pic_reg, thanks.
> >
> >>
> >>> +  emit_insn (par);
> >>> +
> >>> +  return fnaddr_reg;
> >>> +}
> >>> +
> >>>   /* Return the maximum amount of padding that will be inserted before
> >>>      label LABEL.  */
> >>> -
> >>>   static HOST_WIDE_INT
> >>>   get_label_padding (rtx label)
> >>>   {
> >>> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int
> >>> size, int aligned_p)
> >>>             && (!SYMBOL_REF_LOCAL_P (x)
> >>>                 || (SYMBOL_REF_DECL (x)
> >>>                 ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
> >>> -        fputs ("(GOT)", asm_out_file);
> >>> +        {
> >>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> >>> +        fputs ("(GOTFUNCDESC)", asm_out_file);
> >>> +          else
> >>> +        fputs ("(GOT)", asm_out_file);
> >>> +        }
> >>>         else
> >>> -        fputs ("(GOTOFF)", asm_out_file);
> >>> +        {
> >>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> >>> +        fputs ("(GOTOFFFUNCDESC)", asm_out_file);
> >>> +          else
> >>> +        {
> >>> +          bool is_readonly;
> >>> +
> >>> +          if (arm_is_segment_info_known (x, &is_readonly))
> >>> +            fputs ("(GOTOFF)", asm_out_file);
> >>> +          else
> >>> +            fputs ("(GOT)", asm_out_file);
> >>> +        }
> >>> +        }
> >>> +    }
> >>> +
> >>> +      /* For FDPIC we also have to mark symbol for .data section.  */
> >>> +      if (TARGET_FDPIC
> >>> +      && NEED_GOT_RELOC
> >>> +      && flag_pic
> >>> +      && !making_const_table
> >>> +      && SYMBOL_REF_P (x))
> >>> +    {
> >>> +      if (SYMBOL_REF_FUNCTION_P (x))
> >>> +        fputs ("(FUNCDESC)", asm_out_file);
> >>>       }
> >>>         fputc ('\n', asm_out_file);
> >>>         return true;
> >>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> >>> index 34894c0..4671d64 100644
> >>> --- a/gcc/config/arm/arm.h
> >>> +++ b/gcc/config/arm/arm.h
> >>> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
> >>>      Pascal), so the following is not true.  */
> >>>   #define STATIC_CHAIN_REGNUM    12
> >>>   +/* r9 is the FDPIC register (base register for GOT and FUNCDESC
> >>> accesses).  */
> >>> +#define FDPIC_REGNUM        9
> >>> +
> >>>   /* Define this to be where the real frame pointer is if it is not
> >>> possible to
> >>>      work out the offset between the frame pointer and the automatic
> >>> variables
> >>>      until after register allocation has taken place.
> >>> FRAME_POINTER_REGNUM
> >>> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
> >>>      data addresses in memory.  */
> >>>   #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
> >>>   +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
> >>> +   entries would need to handle saving and restoring it).  */
> >>> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
> >>> +
> >>>   /* We can't directly access anything that contains a symbol,
> >>>      nor can we indirect via the constant pool.  One exception is
> >>>      UNSPEC_TLS, which is always PIC.  */
> >>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> >>> index 270b8e4..09a0701 100644
> >>> --- a/gcc/config/arm/arm.md
> >>> +++ b/gcc/config/arm/arm.md
> >>> @@ -8031,6 +8031,23 @@
> >>>       rtx callee, pat;
> >>>       tree addr = MEM_EXPR (operands[0]);
> >>>       +    /* Force FDPIC register (r9) before call.  */
> >>> +    if (TARGET_FDPIC)
> >>> +      {
> >>> +    /* No need to update r9 if calling a static function.
> >>> +       In other words: set r9 for indirect or non-local calls.  */
> >>> +    callee = XEXP (operands[0], 0);
> >>> +    if (!SYMBOL_REF_P (callee)
> >>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>> +      {
> >>> +        emit_insn (gen_blockage ());
> >>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
> >>> FDPIC_REGNUM));
> >>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> >>> +     }
> >>> +      }
> >>> +
> >>>       /* In an untyped call, we can get NULL for operand 2.  */
> >>>       if (operands[2] == NULL_RTX)
> >>>         operands[2] = const0_rtx;
> >>> @@ -8044,6 +8061,13 @@
> >>>       : !REG_P (callee))
> >>>         XEXP (operands[0], 0) = force_reg (Pmode, callee);
> >>>   +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
> >>> +      {
> >>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
> >>> +    XEXP (operands[0], 0)
> >>> +      = arm_load_function_descriptor (XEXP (operands[0], 0));
> >>> +      }
> >>> +
> >>>       if (detect_cmse_nonsecure_call (addr))
> >>>         {
> >>>       pat = gen_nonsecure_call_internal (operands[0], operands[1],
> >>> @@ -8055,10 +8079,38 @@
> >>>       pat = gen_call_internal (operands[0], operands[1], operands[2]);
> >>>       arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
> >>>         }
> >>> +
> >>> +    /* Restore FDPIC register (r9) after call.  */
> >>> +    if (TARGET_FDPIC)
> >>> +      {
> >>> +    /* No need to update r9 if calling a static function.  */
> >>> +    if (!SYMBOL_REF_P (callee)
> >>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>> +      {
> >>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
> >>> FDPIC_REGNUM));
> >>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> >>> +        emit_insn (gen_blockage ());
> >>> +      }
> >>> +      }
> >>>       DONE;
> >>>     }"
> >>>   )
> >>>   +(define_insn "*restore_pic_register_after_call"
> >>> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
> >>> +               (match_operand:SI 1 "nonimmediate_operand" "r,m")]
> >>> +           UNSPEC_PIC_RESTORE)
> >>> +          (use (match_dup 0))
> >>> +          (clobber (match_dup 0))])
> >>> +  ]
> >>> +  ""
> >>> +  "@
> >>> +  mov\t%0, %1
> >>> +  ldr\t%0, %1"
> >>> +)
> >>> +
> >>>   (define_expand "call_internal"
> >>>     [(parallel [(call (match_operand 0 "memory_operand" "")
> >>>                   (match_operand 1 "general_operand" ""))
> >>> @@ -8119,6 +8171,30 @@
> >>>       rtx pat, callee;
> >>>       tree addr = MEM_EXPR (operands[1]);
> >>>       +    /* Force FDPIC register (r9) before call.  */
> >>> +    if (TARGET_FDPIC)
> >>> +      {
> >>> +    /* No need to update the FDPIC register (r9) if calling a static
> >>> function.
> >>> +       In other words: set r9 for indirect or non-local calls.  */
> >>> +    callee = XEXP (operands[1], 0);
> >>> +    if (!SYMBOL_REF_P (callee)
> >>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>> +      {
> >>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>> +
> >>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> >>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> >>> +        UNSPEC_PIC_RESTORE);
> >>> +        XVECEXP (par, 0, 1)
> >>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> >>> +        XVECEXP (par, 0, 2)
> >>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
> >>> FDPIC_REGNUM));
> >>
> >> Again, this looks suspicious.
> >>
> > Yes, fixed for follow-up patch, with
> > USE for get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)
> > CLOBBER for gen_rtx_REG (Pmode, FDPIC_REGNUM)
> >
> >>> +        emit_insn (par);
> >>> +      }
> >>> +      }
> >>> +
> >>>       /* In an untyped call, we can get NULL for operand 2.  */
> >>>       if (operands[3] == 0)
> >>>         operands[3] = const0_rtx;
> >>> @@ -8132,6 +8208,14 @@
> >>>       : !REG_P (callee))
> >>>         XEXP (operands[1], 0) = force_reg (Pmode, callee);
> >>>   +    if (TARGET_FDPIC
> >>> +    && !SYMBOL_REF_P (XEXP (operands[1], 0)))
> >>> +      {
> >>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
> >>> +    XEXP (operands[1], 0)
> >>> +      = arm_load_function_descriptor (XEXP (operands[1], 0));
> >>> +      }
> >>> +
> >>>       if (detect_cmse_nonsecure_call (addr))
> >>>         {
> >>>       pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
> >>> @@ -8144,6 +8228,28 @@
> >>>                          operands[2], operands[3]);
> >>>       arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
> >>>         }
> >>> +    /* Restore FDPIC register (r9) after call.  */
> >>> +    if (TARGET_FDPIC)
> >>> +      {
> >>> +    /* No need to update r9 if calling a static function.  */
> >>> +    if (!SYMBOL_REF_P (callee)
> >>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>> +      {
> >>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>> +
> >>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> >>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> >>> +        UNSPEC_PIC_RESTORE);
> >>> +        XVECEXP (par, 0, 1)
> >>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> >>> +        XVECEXP (par, 0, 2)
> >>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
> >>> FDPIC_REGNUM));
> >>
> >> And again.
> > Yes
> >
> >>
> >>> +        emit_insn (par);
> >>> +      }
> >>> +      }
> >>> +
> >>>       DONE;
> >>>     }"
> >>>   )
> >>> @@ -8486,7 +8592,7 @@
> >>>               (const_int 0))
> >>>             (match_operand 1 "" "")
> >>>             (match_operand 2 "" "")])]
> >>> -  "TARGET_EITHER"
> >>> +  "TARGET_EITHER && !TARGET_FDPIC"
> >>>     "
> >>>     {
> >>>       int i;
> >>> @@ -8553,7 +8659,7 @@
> >>>   (define_expand "untyped_return"
> >>>     [(match_operand:BLK 0 "memory_operand" "")
> >>>      (match_operand 1 "" "")]
> >>> -  "TARGET_EITHER"
> >>> +  "TARGET_EITHER && !TARGET_FDPIC"
> >>>     "
> >>>     {
> >>>       int i;
> >>> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
> >>> index 1941673..349ae0e 100644
> >>> --- a/gcc/config/arm/unspecs.md
> >>> +++ b/gcc/config/arm/unspecs.md
> >>> @@ -86,6 +86,7 @@
> >>>     UNSPEC_PROBE_STACK    ; Probe stack memory reference
> >>>     UNSPEC_NONSECURE_MEM    ; Represent non-secure memory in ARMv8-M
> >>> with
> >>>               ; security extension
> >>> +  UNSPEC_PIC_RESTORE    ; Use to restore fdpic register
> >>>   ])
> >>>     (define_c_enum "unspec" [
> >>>
> >>
> >> .
> >>
> >
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-26 16:34         ` Christophe Lyon
@ 2018-10-26 16:41           ` Richard Earnshaw (lists)
  2018-10-29 10:31             ` Christophe Lyon
  0 siblings, 1 reply; 47+ messages in thread
From: Richard Earnshaw (lists) @ 2018-10-26 16:41 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: christophe lyon St, gcc Patches

On 26/10/2018 16:25, Christophe Lyon wrote:
> On Tue, 23 Oct 2018 at 16:07, Richard Earnshaw (lists)
> <Richard.Earnshaw@arm.com> wrote:
>>
>> On 19/10/2018 14:40, Christophe Lyon wrote:
>>> On 12/10/2018 12:45, Richard Earnshaw (lists) wrote:
>>>> On 11/10/18 14:34, Christophe Lyon wrote:
>>>>> The FDPIC register is hard-coded to r9, as defined in the ABI.
>>>>>
>>>>> We have to disable tailcall optimizations if we don't know if the
>>>>> target function is in the same module. If not, we have to set r9 to
>>>>> the value associated with the target module.
>>>>>
>>>>> When generating a symbol address, we have to take into account whether
>>>>> it is a pointer to data or to a function, because different
>>>>> relocations are needed.
>>>>>
>>>>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>>>>>     Mickaël Guêné <mickael.guene@st.com>
>>>>>
>>>>>     * config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
>>>>>     in FDPIC mode.
>>>>>     * config/arm/arm-protos.h (arm_load_function_descriptor): Declare
>>>>>     new function.
>>>>>     * config/arm/arm.c (arm_option_override): Define pic register to
>>>>>     FDPIC_REGNUM.
>>>>>     (arm_function_ok_for_sibcall) Disable sibcall optimization if we
>>>>
>>>> Missing colon.
>>>>
>>>>>     have no decl or go through PLT.
>>>>>     (arm_load_pic_register): Handle TARGET_FDPIC.
>>>>>     (arm_is_segment_info_known): New function.
>>>>>     (arm_pic_static_addr): Add support for FDPIC.
>>>>>     (arm_load_function_descriptor): New function.
>>>>>     (arm_assemble_integer): Add support for FDPIC.
>>>>>     * config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
>>>>>     Define. (FDPIC_REGNUM): New define.
>>>>>     * config/arm/arm.md (call): Add support for FDPIC.
>>>>>     (call_value): Likewise.
>>>>>     (*restore_pic_register_after_call): New pattern.
>>>>>     (untyped_call): Disable if FDPIC.
>>>>>     (untyped_return): Likewise.
>>>>>     * config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
>>>>>
>>>>
>>>> Other comments inline.
>>>>
>>>>> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
>>>>> index 4471f79..90733cc 100644
>>>>> --- a/gcc/config/arm/arm-c.c
>>>>> +++ b/gcc/config/arm/arm-c.c
>>>>> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
>>>>>         builtin_define ("__ARM_EABI__");
>>>>>       }
>>>>>   +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
>>>>> +
>>>>>     def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
>>>>>     def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
>>>>>   diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
>>>>> index 0dfb3ac..28cafa8 100644
>>>>> --- a/gcc/config/arm/arm-protos.h
>>>>> +++ b/gcc/config/arm/arm-protos.h
>>>>> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
>>>>>   extern int arm_const_double_inline_cost (rtx);
>>>>>   extern bool arm_const_double_by_parts (rtx);
>>>>>   extern bool arm_const_double_by_immediates (rtx);
>>>>> +extern rtx arm_load_function_descriptor (rtx funcdesc);
>>>>>   extern void arm_emit_call_insn (rtx, rtx, bool);
>>>>>   bool detect_cmse_nonsecure_call (tree);
>>>>>   extern const char *output_call (rtx *);
>>>>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
>>>>> index 8810df5..92ae24b 100644
>>>>> --- a/gcc/config/arm/arm.c
>>>>> +++ b/gcc/config/arm/arm.c
>>>>> @@ -3470,6 +3470,14 @@ arm_option_override (void)
>>>>>     if (flag_pic && TARGET_VXWORKS_RTP)
>>>>>       arm_pic_register = 9;
>>>>>   +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
>>>>> +  if (TARGET_FDPIC)
>>>>> +    {
>>>>> +      arm_pic_register = FDPIC_REGNUM;
>>>>> +      if (TARGET_ARM_ARCH < 7)
>>>>> +    error ("FDPIC mode is not supported on architectures older than
>>>>> Armv7");
>>>>
>>>> What properties of FDPIC impose this requirement?  Does it also apply to
>>>> Armv8-m.baseline?
>>>>
>>> In fact, there was miscommunication on my side, resulting in a
>>> misunderstanding between Kyrill and myself, which I badly translated
>>> into this condition.
>>>
>>> My initial plan was to submit a patch series tested on v7, and send the
>>> patches needed to support older architectures as a follow-up. The proper
>>> restriction is actually "CPUs that do not support ARM or Thumb2". As you
>>> may have noticed during the iterations of this patch series, I had
>>> failed to remove partial Thumb1 support hunks.
>>>
>>> So really this should be rephrased, and rewritten as "FDPIC mode is
>>> supported on architecture versions that support ARM or Thumb-2", if that
>>> suits you. And the condition should thus be:
>>> if (! TARGET_ARM && ! TARGET_THUMB2)
>>>   error ("...")
>>>
>>> This would also exclude Armv8-m.baseline, since it doesn't support Thumb2.
>>
>> When we get to v8-m.baseline the thumb1/2 distinction starts to become a
>> lot more blurred.  A lot of thumb2 features needed for stand-alone
>> systems are then available.  So what feature is it that you require in
>> order to make fdpic work in (traditional) thumb2 that isn't in
>> (traditional) thumb1?
>>
> At the moment I'm not sure about what feature is missing. It's rather
> that we haven't made it work it although there were preliminary attempts.
> 
> Since building GCC --with-cpu=cortex-m{0,23} --target arm-linux-gnueabi
> currently fails, I tried using a fdpic toolchain built --with-cpu=cortex-m4,
> forcing -mcpu=cortex-m{0,23} while building uClibc-ng. I noticed two kinds
> of failures:
> - parts of assembly files do not support Thumb-1, so they need porting at least
> (ldso/ldso/arm/dl-startup.h)
> - ICEs for lack of .md patterns (cortex-m4 uses pic_load_addr_32bit which is
> missing for m{0,23}
> 
> There are probably other problems that would be discovered at runtime.
> 
> So it can probably be made to work, but I think that would be an enhancement
> for later (not sure there's a real need: can we reasonably think about
> running Linux on such small cores?)

So would a sorry() call be more appropriate?

R.

> 
>>
>>
>>> As a side note, I tried to build GCC master (without my patches)
>>> --with-cpu=cortex-m23, and both targets arm-eabi and arm-linux-gnueabi
>>> failed to buid.
>>>
>>> For arm-eabi, there are problems in newlib:
>>> newlib/libc/sys/arm/crt0.S:145: Error: lo register required -- `add
>>> sl,r2,#256'
>>> newlib/libc/sys/arm/trap.S:88: Error: lo register required -- `sub
>>> ip,sp,ip'
>>>
>>
>> These all sound like basic CPU detection issues in newlib and need to be
>> fixed at some point (it's probably still using some pre-ACLE macros to
>> detect system capabilities).
>>
>> R.
>>
>>> For arm-linux-gnueabi, the failure happens while building libgcc:
>>> /home/christophe.lyon/src/GCC/sources/newlib/newlib/libc/machine/arm/setjmp.S:169:
>>> Error: selected processor does not support ARM opcodes
>>> /newlib/newlib/libc/machine/arm/setjmp.S:176: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `stmea a1!,{
>>> v1-v7,fp,ip,sp,lr }'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:186: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `mov a1,#0'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `tst lr,#1'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:194: Error: selected processor
>>> does not support ARM opcodes
>>> /newlib/newlib/libc/machine/arm/setjmp.S:203: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `ldmfd a1!,{
>>> v1-v7,fp,ip,sp,lr }'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:214: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `movs a1,a2'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:218: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `moveq a1,#1'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `tst lr,#1'
>>> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
>>> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
>>>
>>>
>>>>> +    }
>>>>> +
>>>>>     if (arm_pic_register_string != NULL)
>>>>>       {
>>>>>         int pic_register = decode_reg_name (arm_pic_register_string);
>>>>> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
>>>>>     if (cfun->machine->sibcall_blocked)
>>>>>       return false;
>>>>>   +  if (TARGET_FDPIC)
>>>>> +    {
>>>>> +      /* In FDPIC, never tailcall something for which we have no decl:
>>>>> +     the target function could be in a different module, requiring
>>>>> +     a different FDPIC register value.  */
>>>>> +      if (decl == NULL)
>>>>> +    return false;
>>>>> +
>>>>> +      /* Don't tailcall if we go through the PLT since the FDPIC
>>>>> +     register is then corrupted and we don't restore it after
>>>>> +     static function calls.  */
>>>>> +      if (!targetm.binds_local_p (decl))
>>>>> +    return false;
>>>>> +    }
>>>>> +
>>>>>     /* Never tailcall something if we are generating code for
>>>>> Thumb-1.  */
>>>>>     if (TARGET_THUMB1)
>>>>>       return false;
>>>>> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs
>>>>> ATTRIBUTE_UNUSED)
>>>>>   {
>>>>>     rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
>>>>>   -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
>>>>> +  if (crtl->uses_pic_offset_table == 0
>>>>> +      || TARGET_SINGLE_PIC_BASE
>>>>> +      || TARGET_FDPIC)
>>>>>       return;
>>>>>       gcc_assert (flag_pic);
>>>>> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long
>>>>> saved_regs ATTRIBUTE_UNUSED)
>>>>>     emit_use (pic_reg);
>>>>>   }
>>>>>   +/* Try to know if the object will go in text or data segment. This is
>>>>
>>>> "Try to determine whether an object, referenced via ORIG, will be placed
>>>> in the text or data segment."
>>>>> +   used in FDPIC mode, to decide which relocations to use when
>>>>> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
>>>>
>>>> Two spaces after a period.
>>>>
>>>>> +   location, false otherwise.  */
>>>>
>>>> You've missed the documentation of the return value: does returning true
>>>> mean text vs data, or does it mean we know which it will go in, but
>>>> don't have to return that information here.
>>>>
>>>> Generally, won't this break big time if users compile with
>>>> -ffunction-sections or -fdata-sections?  Is it sufficient to match
>>>> .text.* as being text and .data.* for data?
>>>>
>>>
>>> I compiled a small testcase with -ffunction-sections and -fdata-sections
>>> and noticed no problem.
>>> The code below does not attempt to match section names, I'm not sure to
>>> understand your question?
>>>
>>>>
>>>>> +static bool
>>>>> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
>>>>> +{
>>>>> +  bool res = false;
>>>>> +
>>>>> +  *is_readonly = false;
>>>>> +
>>>>> +  if (GET_CODE (orig) == LABEL_REF)
>>>>> +    {
>>>>> +      res = true;
>>>>> +      *is_readonly = true;
>>>>> +    }
>>>>> +  else if (SYMBOL_REF_P (orig))
>>>>> +    {
>>>>> +      if (CONSTANT_POOL_ADDRESS_P (orig))
>>>>> +    {
>>>>> +      res = true;
>>>>> +      *is_readonly = true;
>>>>> +    }
>>>>> +      else if (SYMBOL_REF_LOCAL_P (orig)
>>>>> +           && !SYMBOL_REF_EXTERNAL_P (orig)
>>>>> +           && SYMBOL_REF_DECL (orig)
>>>>> +           && (!DECL_P (SYMBOL_REF_DECL (orig))
>>>>> +           || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
>>>>> +    {
>>>>> +      tree decl = SYMBOL_REF_DECL (orig);
>>>>> +      tree init = (TREE_CODE (decl) == VAR_DECL)
>>>>> +        ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
>>>>> +        ? decl : 0;
>>>>> +      int reloc = 0;
>>>>> +      bool named_section, readonly;
>>>>> +
>>>>> +      if (init && init != error_mark_node)
>>>>> +        reloc = compute_reloc_for_constant (init);
>>>>> +
>>>>> +      named_section = TREE_CODE (decl) == VAR_DECL
>>>>> +        && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
>>>>> +      readonly = decl_readonly_section (decl, reloc);
>>>>> +
>>>>> +      /* We don't know where the link script will put a named
>>>>> +         section, so return false in such a case.  */
>>>>> +      res = !named_section;
>>>>> +
>>>>> +      if (!named_section)
>>>>> +        *is_readonly = readonly;
>>>>> +    }
>>>>> +      else
>>>>> +    {
>>>>> +      /* We don't know.  */
>>>>> +      res = false;
>>>>> +    }
>>>>> +    }
>>>>> +  else
>>>>> +    gcc_unreachable ();
>>>>> +
>>>>> +  return res;
>>>>> +}
>>>>> +
>>>>>   /* Generate code to load the address of a static var when flag_pic
>>>>> is set.  */
>>>>>   static rtx_insn *
>>>>>   arm_pic_static_addr (rtx orig, rtx reg)
>>>>>   {
>>>>>     rtx l1, labelno, offset_rtx;
>>>>> +  rtx_insn *insn;
>>>>>       gcc_assert (flag_pic);
>>>>>   -  /* We use an UNSPEC rather than a LABEL_REF because this label
>>>>> -     never appears in the code stream.  */
>>>>> -  labelno = GEN_INT (pic_labelno++);
>>>>> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
>>>>> UNSPEC_PIC_LABEL);
>>>>> -  l1 = gen_rtx_CONST (VOIDmode, l1);
>>>>> +  bool is_readonly = false;
>>>>> +  bool info_known = false;
>>>>>   -  /* On the ARM the PC register contains 'dot + 8' at the time of the
>>>>> -     addition, on the Thumb it is 'dot + 4'.  */
>>>>> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>>>>> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
>>>>> -                               UNSPEC_SYMBOL_OFFSET);
>>>>> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>>>>> +  if (TARGET_FDPIC
>>>>> +      && SYMBOL_REF_P (orig)
>>>>> +      && !SYMBOL_REF_FUNCTION_P (orig))
>>>>> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
>>>>>   -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
>>>>> labelno));
>>>>> +  if (TARGET_FDPIC
>>>>> +      && SYMBOL_REF_P (orig)
>>>>> +      && !SYMBOL_REF_FUNCTION_P (orig)
>>>>> +      && !info_known)
>>>>> +    {
>>>>> +      /* We don't know where orig is stored, so we have be
>>>>> +     pessimistic and use a GOT relocation.  */
>>>>> +      rtx pat;
>>>>> +      rtx mem;
>>>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>>>> +
>>>>> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
>>>>> +
>>>>> +      /* Make the MEM as close to a constant as possible.  */
>>>>> +      mem = SET_SRC (pat);
>>>>> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
>>>>> +      MEM_READONLY_P (mem) = 1;
>>>>> +      MEM_NOTRAP_P (mem) = 1;
>>>>> +
>>>>> +      insn = emit_insn (pat);
>>>>> +    }
>>>>> +  else if (TARGET_FDPIC
>>>>> +       && SYMBOL_REF_P (orig)
>>>>> +       && (SYMBOL_REF_FUNCTION_P (orig)
>>>>> +           || (info_known && !is_readonly)))
>>>>> +    {
>>>>> +      /* We use the GOTOFF relocation.  */
>>>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>>>> +
>>>>> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
>>>>> UNSPEC_PIC_SYM);
>>>>> +      emit_insn (gen_movsi (reg, l1));
>>>>> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
>>>>> +    }
>>>>> +  else
>>>>> +    {
>>>>> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
>>>>> +     PC-relative access.  */
>>>>> +      /* We use an UNSPEC rather than a LABEL_REF because this label
>>>>> +     never appears in the code stream.  */
>>>>> +      labelno = GEN_INT (pic_labelno++);
>>>>> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
>>>>> UNSPEC_PIC_LABEL);
>>>>> +      l1 = gen_rtx_CONST (VOIDmode, l1);
>>>>> +
>>>>> +      /* On the ARM the PC register contains 'dot + 8' at the time
>>>>> of the
>>>>> +     addition, on the Thumb it is 'dot + 4'.  */
>>>>> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
>>>>> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig,
>>>>> offset_rtx),
>>>>> +                   UNSPEC_SYMBOL_OFFSET);
>>>>> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
>>>>> +
>>>>> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
>>>>> +                           labelno));
>>>>> +    }
>>>>> +
>>>>> +  return insn;
>>>>>   }
>>>>>     /* Return nonzero if X is valid as an ARM state addressing
>>>>> register.  */
>>>>> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
>>>>>     return 0;
>>>>>   }
>>>>>   +/* Emit insns to load the function address from FUNCDESC (an FDPIC
>>>>> +   function descriptor) into a register and the GOT address into the
>>>>> +   FDPIC register, returning an rtx for the register holding the
>>>>> +   function address.  */
>>>>> +
>>>>> +rtx
>>>>> +arm_load_function_descriptor (rtx funcdesc)
>>>>> +{
>>>>> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
>>>>> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>>>> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
>>>>> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc,
>>>>> 4));
>>>>> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>>>> +
>>>>> +  emit_move_insn (fnaddr_reg, fnaddr);
>>>>> +  /* The ABI requires the entry point address to be loaded first, so
>>>>> +     prevent the load from being moved after that of the GOT
>>>>> +     address.  */
>>>>> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>>>> +                    gen_rtvec (2, pic_reg, gotaddr),
>>>>> +                    UNSPEC_PIC_RESTORE);
>>>>> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode,
>>>>> FDPIC_REGNUM))
>>>>> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG
>>>>> (Pmode, FDPIC_REGNUM));
>>>>
>>>> Shouldn't one of these be fnaddr_reg and the other pic_reg?
>>> I think the USE should be gotaddr, and CLOBBER should be pic_reg, thanks.
>>>
>>>>
>>>>> +  emit_insn (par);
>>>>> +
>>>>> +  return fnaddr_reg;
>>>>> +}
>>>>> +
>>>>>   /* Return the maximum amount of padding that will be inserted before
>>>>>      label LABEL.  */
>>>>> -
>>>>>   static HOST_WIDE_INT
>>>>>   get_label_padding (rtx label)
>>>>>   {
>>>>> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int
>>>>> size, int aligned_p)
>>>>>             && (!SYMBOL_REF_LOCAL_P (x)
>>>>>                 || (SYMBOL_REF_DECL (x)
>>>>>                 ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
>>>>> -        fputs ("(GOT)", asm_out_file);
>>>>> +        {
>>>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>>>>> +        fputs ("(GOTFUNCDESC)", asm_out_file);
>>>>> +          else
>>>>> +        fputs ("(GOT)", asm_out_file);
>>>>> +        }
>>>>>         else
>>>>> -        fputs ("(GOTOFF)", asm_out_file);
>>>>> +        {
>>>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
>>>>> +        fputs ("(GOTOFFFUNCDESC)", asm_out_file);
>>>>> +          else
>>>>> +        {
>>>>> +          bool is_readonly;
>>>>> +
>>>>> +          if (arm_is_segment_info_known (x, &is_readonly))
>>>>> +            fputs ("(GOTOFF)", asm_out_file);
>>>>> +          else
>>>>> +            fputs ("(GOT)", asm_out_file);
>>>>> +        }
>>>>> +        }
>>>>> +    }
>>>>> +
>>>>> +      /* For FDPIC we also have to mark symbol for .data section.  */
>>>>> +      if (TARGET_FDPIC
>>>>> +      && NEED_GOT_RELOC
>>>>> +      && flag_pic
>>>>> +      && !making_const_table
>>>>> +      && SYMBOL_REF_P (x))
>>>>> +    {
>>>>> +      if (SYMBOL_REF_FUNCTION_P (x))
>>>>> +        fputs ("(FUNCDESC)", asm_out_file);
>>>>>       }
>>>>>         fputc ('\n', asm_out_file);
>>>>>         return true;
>>>>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
>>>>> index 34894c0..4671d64 100644
>>>>> --- a/gcc/config/arm/arm.h
>>>>> +++ b/gcc/config/arm/arm.h
>>>>> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
>>>>>      Pascal), so the following is not true.  */
>>>>>   #define STATIC_CHAIN_REGNUM    12
>>>>>   +/* r9 is the FDPIC register (base register for GOT and FUNCDESC
>>>>> accesses).  */
>>>>> +#define FDPIC_REGNUM        9
>>>>> +
>>>>>   /* Define this to be where the real frame pointer is if it is not
>>>>> possible to
>>>>>      work out the offset between the frame pointer and the automatic
>>>>> variables
>>>>>      until after register allocation has taken place.
>>>>> FRAME_POINTER_REGNUM
>>>>> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
>>>>>      data addresses in memory.  */
>>>>>   #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
>>>>>   +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
>>>>> +   entries would need to handle saving and restoring it).  */
>>>>> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
>>>>> +
>>>>>   /* We can't directly access anything that contains a symbol,
>>>>>      nor can we indirect via the constant pool.  One exception is
>>>>>      UNSPEC_TLS, which is always PIC.  */
>>>>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
>>>>> index 270b8e4..09a0701 100644
>>>>> --- a/gcc/config/arm/arm.md
>>>>> +++ b/gcc/config/arm/arm.md
>>>>> @@ -8031,6 +8031,23 @@
>>>>>       rtx callee, pat;
>>>>>       tree addr = MEM_EXPR (operands[0]);
>>>>>       +    /* Force FDPIC register (r9) before call.  */
>>>>> +    if (TARGET_FDPIC)
>>>>> +      {
>>>>> +    /* No need to update r9 if calling a static function.
>>>>> +       In other words: set r9 for indirect or non-local calls.  */
>>>>> +    callee = XEXP (operands[0], 0);
>>>>> +    if (!SYMBOL_REF_P (callee)
>>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>>>> +      {
>>>>> +        emit_insn (gen_blockage ());
>>>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
>>>>> FDPIC_REGNUM));
>>>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>>>>> +     }
>>>>> +      }
>>>>> +
>>>>>       /* In an untyped call, we can get NULL for operand 2.  */
>>>>>       if (operands[2] == NULL_RTX)
>>>>>         operands[2] = const0_rtx;
>>>>> @@ -8044,6 +8061,13 @@
>>>>>       : !REG_P (callee))
>>>>>         XEXP (operands[0], 0) = force_reg (Pmode, callee);
>>>>>   +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
>>>>> +      {
>>>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
>>>>> +    XEXP (operands[0], 0)
>>>>> +      = arm_load_function_descriptor (XEXP (operands[0], 0));
>>>>> +      }
>>>>> +
>>>>>       if (detect_cmse_nonsecure_call (addr))
>>>>>         {
>>>>>       pat = gen_nonsecure_call_internal (operands[0], operands[1],
>>>>> @@ -8055,10 +8079,38 @@
>>>>>       pat = gen_call_internal (operands[0], operands[1], operands[2]);
>>>>>       arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
>>>>>         }
>>>>> +
>>>>> +    /* Restore FDPIC register (r9) after call.  */
>>>>> +    if (TARGET_FDPIC)
>>>>> +      {
>>>>> +    /* No need to update r9 if calling a static function.  */
>>>>> +    if (!SYMBOL_REF_P (callee)
>>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>>>> +      {
>>>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
>>>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
>>>>> FDPIC_REGNUM));
>>>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
>>>>> +        emit_insn (gen_blockage ());
>>>>> +      }
>>>>> +      }
>>>>>       DONE;
>>>>>     }"
>>>>>   )
>>>>>   +(define_insn "*restore_pic_register_after_call"
>>>>> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
>>>>> +               (match_operand:SI 1 "nonimmediate_operand" "r,m")]
>>>>> +           UNSPEC_PIC_RESTORE)
>>>>> +          (use (match_dup 0))
>>>>> +          (clobber (match_dup 0))])
>>>>> +  ]
>>>>> +  ""
>>>>> +  "@
>>>>> +  mov\t%0, %1
>>>>> +  ldr\t%0, %1"
>>>>> +)
>>>>> +
>>>>>   (define_expand "call_internal"
>>>>>     [(parallel [(call (match_operand 0 "memory_operand" "")
>>>>>                   (match_operand 1 "general_operand" ""))
>>>>> @@ -8119,6 +8171,30 @@
>>>>>       rtx pat, callee;
>>>>>       tree addr = MEM_EXPR (operands[1]);
>>>>>       +    /* Force FDPIC register (r9) before call.  */
>>>>> +    if (TARGET_FDPIC)
>>>>> +      {
>>>>> +    /* No need to update the FDPIC register (r9) if calling a static
>>>>> function.
>>>>> +       In other words: set r9 for indirect or non-local calls.  */
>>>>> +    callee = XEXP (operands[1], 0);
>>>>> +    if (!SYMBOL_REF_P (callee)
>>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>>>> +      {
>>>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>>>> +
>>>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>>>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>>>>> +        UNSPEC_PIC_RESTORE);
>>>>> +        XVECEXP (par, 0, 1)
>>>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>>>>> +        XVECEXP (par, 0, 2)
>>>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
>>>>> FDPIC_REGNUM));
>>>>
>>>> Again, this looks suspicious.
>>>>
>>> Yes, fixed for follow-up patch, with
>>> USE for get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)
>>> CLOBBER for gen_rtx_REG (Pmode, FDPIC_REGNUM)
>>>
>>>>> +        emit_insn (par);
>>>>> +      }
>>>>> +      }
>>>>> +
>>>>>       /* In an untyped call, we can get NULL for operand 2.  */
>>>>>       if (operands[3] == 0)
>>>>>         operands[3] = const0_rtx;
>>>>> @@ -8132,6 +8208,14 @@
>>>>>       : !REG_P (callee))
>>>>>         XEXP (operands[1], 0) = force_reg (Pmode, callee);
>>>>>   +    if (TARGET_FDPIC
>>>>> +    && !SYMBOL_REF_P (XEXP (operands[1], 0)))
>>>>> +      {
>>>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
>>>>> +    XEXP (operands[1], 0)
>>>>> +      = arm_load_function_descriptor (XEXP (operands[1], 0));
>>>>> +      }
>>>>> +
>>>>>       if (detect_cmse_nonsecure_call (addr))
>>>>>         {
>>>>>       pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
>>>>> @@ -8144,6 +8228,28 @@
>>>>>                          operands[2], operands[3]);
>>>>>       arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
>>>>>         }
>>>>> +    /* Restore FDPIC register (r9) after call.  */
>>>>> +    if (TARGET_FDPIC)
>>>>> +      {
>>>>> +    /* No need to update r9 if calling a static function.  */
>>>>> +    if (!SYMBOL_REF_P (callee)
>>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
>>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
>>>>> +      {
>>>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
>>>>> +
>>>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
>>>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
>>>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
>>>>> +        UNSPEC_PIC_RESTORE);
>>>>> +        XVECEXP (par, 0, 1)
>>>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
>>>>> +        XVECEXP (par, 0, 2)
>>>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
>>>>> FDPIC_REGNUM));
>>>>
>>>> And again.
>>> Yes
>>>
>>>>
>>>>> +        emit_insn (par);
>>>>> +      }
>>>>> +      }
>>>>> +
>>>>>       DONE;
>>>>>     }"
>>>>>   )
>>>>> @@ -8486,7 +8592,7 @@
>>>>>               (const_int 0))
>>>>>             (match_operand 1 "" "")
>>>>>             (match_operand 2 "" "")])]
>>>>> -  "TARGET_EITHER"
>>>>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>>>>     "
>>>>>     {
>>>>>       int i;
>>>>> @@ -8553,7 +8659,7 @@
>>>>>   (define_expand "untyped_return"
>>>>>     [(match_operand:BLK 0 "memory_operand" "")
>>>>>      (match_operand 1 "" "")]
>>>>> -  "TARGET_EITHER"
>>>>> +  "TARGET_EITHER && !TARGET_FDPIC"
>>>>>     "
>>>>>     {
>>>>>       int i;
>>>>> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
>>>>> index 1941673..349ae0e 100644
>>>>> --- a/gcc/config/arm/unspecs.md
>>>>> +++ b/gcc/config/arm/unspecs.md
>>>>> @@ -86,6 +86,7 @@
>>>>>     UNSPEC_PROBE_STACK    ; Probe stack memory reference
>>>>>     UNSPEC_NONSECURE_MEM    ; Represent non-secure memory in ARMv8-M
>>>>> with
>>>>>               ; security extension
>>>>> +  UNSPEC_PIC_RESTORE    ; Use to restore fdpic register
>>>>>   ])
>>>>>     (define_c_enum "unspec" [
>>>>>
>>>>
>>>> .
>>>>
>>>
>>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture
  2018-10-26 16:41           ` Richard Earnshaw (lists)
@ 2018-10-29 10:31             ` Christophe Lyon
  0 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-29 10:31 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

On Fri, 26 Oct 2018 at 17:42, Richard Earnshaw (lists)
<Richard.Earnshaw@arm.com> wrote:
>
> On 26/10/2018 16:25, Christophe Lyon wrote:
> > On Tue, 23 Oct 2018 at 16:07, Richard Earnshaw (lists)
> > <Richard.Earnshaw@arm.com> wrote:
> >>
> >> On 19/10/2018 14:40, Christophe Lyon wrote:
> >>> On 12/10/2018 12:45, Richard Earnshaw (lists) wrote:
> >>>> On 11/10/18 14:34, Christophe Lyon wrote:
> >>>>> The FDPIC register is hard-coded to r9, as defined in the ABI.
> >>>>>
> >>>>> We have to disable tailcall optimizations if we don't know if the
> >>>>> target function is in the same module. If not, we have to set r9 to
> >>>>> the value associated with the target module.
> >>>>>
> >>>>> When generating a symbol address, we have to take into account whether
> >>>>> it is a pointer to data or to a function, because different
> >>>>> relocations are needed.
> >>>>>
> >>>>> 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
> >>>>>     Mickaël Guêné <mickael.guene@st.com>
> >>>>>
> >>>>>     * config/arm/arm-c.c (__FDPIC__): Define new pre-processor macro
> >>>>>     in FDPIC mode.
> >>>>>     * config/arm/arm-protos.h (arm_load_function_descriptor): Declare
> >>>>>     new function.
> >>>>>     * config/arm/arm.c (arm_option_override): Define pic register to
> >>>>>     FDPIC_REGNUM.
> >>>>>     (arm_function_ok_for_sibcall) Disable sibcall optimization if we
> >>>>
> >>>> Missing colon.
> >>>>
> >>>>>     have no decl or go through PLT.
> >>>>>     (arm_load_pic_register): Handle TARGET_FDPIC.
> >>>>>     (arm_is_segment_info_known): New function.
> >>>>>     (arm_pic_static_addr): Add support for FDPIC.
> >>>>>     (arm_load_function_descriptor): New function.
> >>>>>     (arm_assemble_integer): Add support for FDPIC.
> >>>>>     * config/arm/arm.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED):
> >>>>>     Define. (FDPIC_REGNUM): New define.
> >>>>>     * config/arm/arm.md (call): Add support for FDPIC.
> >>>>>     (call_value): Likewise.
> >>>>>     (*restore_pic_register_after_call): New pattern.
> >>>>>     (untyped_call): Disable if FDPIC.
> >>>>>     (untyped_return): Likewise.
> >>>>>     * config/arm/unspecs.md (UNSPEC_PIC_RESTORE): New.
> >>>>>
> >>>>
> >>>> Other comments inline.
> >>>>
> >>>>> diff --git a/gcc/config/arm/arm-c.c b/gcc/config/arm/arm-c.c
> >>>>> index 4471f79..90733cc 100644
> >>>>> --- a/gcc/config/arm/arm-c.c
> >>>>> +++ b/gcc/config/arm/arm-c.c
> >>>>> @@ -202,6 +202,8 @@ arm_cpu_builtins (struct cpp_reader* pfile)
> >>>>>         builtin_define ("__ARM_EABI__");
> >>>>>       }
> >>>>>   +  def_or_undef_macro (pfile, "__FDPIC__", TARGET_FDPIC);
> >>>>> +
> >>>>>     def_or_undef_macro (pfile, "__ARM_ARCH_EXT_IDIV__", TARGET_IDIV);
> >>>>>     def_or_undef_macro (pfile, "__ARM_FEATURE_IDIV", TARGET_IDIV);
> >>>>>   diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
> >>>>> index 0dfb3ac..28cafa8 100644
> >>>>> --- a/gcc/config/arm/arm-protos.h
> >>>>> +++ b/gcc/config/arm/arm-protos.h
> >>>>> @@ -136,6 +136,7 @@ extern int arm_max_const_double_inline_cost (void);
> >>>>>   extern int arm_const_double_inline_cost (rtx);
> >>>>>   extern bool arm_const_double_by_parts (rtx);
> >>>>>   extern bool arm_const_double_by_immediates (rtx);
> >>>>> +extern rtx arm_load_function_descriptor (rtx funcdesc);
> >>>>>   extern void arm_emit_call_insn (rtx, rtx, bool);
> >>>>>   bool detect_cmse_nonsecure_call (tree);
> >>>>>   extern const char *output_call (rtx *);
> >>>>> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> >>>>> index 8810df5..92ae24b 100644
> >>>>> --- a/gcc/config/arm/arm.c
> >>>>> +++ b/gcc/config/arm/arm.c
> >>>>> @@ -3470,6 +3470,14 @@ arm_option_override (void)
> >>>>>     if (flag_pic && TARGET_VXWORKS_RTP)
> >>>>>       arm_pic_register = 9;
> >>>>>   +  /* If in FDPIC mode then force arm_pic_register to be r9.  */
> >>>>> +  if (TARGET_FDPIC)
> >>>>> +    {
> >>>>> +      arm_pic_register = FDPIC_REGNUM;
> >>>>> +      if (TARGET_ARM_ARCH < 7)
> >>>>> +    error ("FDPIC mode is not supported on architectures older than
> >>>>> Armv7");
> >>>>
> >>>> What properties of FDPIC impose this requirement?  Does it also apply to
> >>>> Armv8-m.baseline?
> >>>>
> >>> In fact, there was miscommunication on my side, resulting in a
> >>> misunderstanding between Kyrill and myself, which I badly translated
> >>> into this condition.
> >>>
> >>> My initial plan was to submit a patch series tested on v7, and send the
> >>> patches needed to support older architectures as a follow-up. The proper
> >>> restriction is actually "CPUs that do not support ARM or Thumb2". As you
> >>> may have noticed during the iterations of this patch series, I had
> >>> failed to remove partial Thumb1 support hunks.
> >>>
> >>> So really this should be rephrased, and rewritten as "FDPIC mode is
> >>> supported on architecture versions that support ARM or Thumb-2", if that
> >>> suits you. And the condition should thus be:
> >>> if (! TARGET_ARM && ! TARGET_THUMB2)
> >>>   error ("...")
> >>>
> >>> This would also exclude Armv8-m.baseline, since it doesn't support Thumb2.
> >>
> >> When we get to v8-m.baseline the thumb1/2 distinction starts to become a
> >> lot more blurred.  A lot of thumb2 features needed for stand-alone
> >> systems are then available.  So what feature is it that you require in
> >> order to make fdpic work in (traditional) thumb2 that isn't in
> >> (traditional) thumb1?
> >>
> > At the moment I'm not sure about what feature is missing. It's rather
> > that we haven't made it work it although there were preliminary attempts.
> >
> > Since building GCC --with-cpu=cortex-m{0,23} --target arm-linux-gnueabi
> > currently fails, I tried using a fdpic toolchain built --with-cpu=cortex-m4,
> > forcing -mcpu=cortex-m{0,23} while building uClibc-ng. I noticed two kinds
> > of failures:
> > - parts of assembly files do not support Thumb-1, so they need porting at least
> > (ldso/ldso/arm/dl-startup.h)
> > - ICEs for lack of .md patterns (cortex-m4 uses pic_load_addr_32bit which is
> > missing for m{0,23}
> >
> > There are probably other problems that would be discovered at runtime.
> >
> > So it can probably be made to work, but I think that would be an enhancement
> > for later (not sure there's a real need: can we reasonably think about
> > running Linux on such small cores?)
>
> So would a sorry() call be more appropriate?
>
Yes, you are right. I'll do that.

> R.
>
> >
> >>
> >>
> >>> As a side note, I tried to build GCC master (without my patches)
> >>> --with-cpu=cortex-m23, and both targets arm-eabi and arm-linux-gnueabi
> >>> failed to buid.
> >>>
> >>> For arm-eabi, there are problems in newlib:
> >>> newlib/libc/sys/arm/crt0.S:145: Error: lo register required -- `add
> >>> sl,r2,#256'
> >>> newlib/libc/sys/arm/trap.S:88: Error: lo register required -- `sub
> >>> ip,sp,ip'
> >>>
> >>
> >> These all sound like basic CPU detection issues in newlib and need to be
> >> fixed at some point (it's probably still using some pre-ACLE macros to
> >> detect system capabilities).
> >>
> >> R.
> >>
> >>> For arm-linux-gnueabi, the failure happens while building libgcc:
> >>> /home/christophe.lyon/src/GCC/sources/newlib/newlib/libc/machine/arm/setjmp.S:169:
> >>> Error: selected processor does not support ARM opcodes
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:176: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `stmea a1!,{
> >>> v1-v7,fp,ip,sp,lr }'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:186: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `mov a1,#0'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `tst lr,#1'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:188: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:194: Error: selected processor
> >>> does not support ARM opcodes
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:203: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `ldmfd a1!,{
> >>> v1-v7,fp,ip,sp,lr }'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:214: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `movs a1,a2'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:218: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `moveq a1,#1'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `tst lr,#1'
> >>> /newlib/newlib/libc/machine/arm/setjmp.S:220: Error: attempt to use an
> >>> ARM instruction on a Thumb-only processor -- `moveq pc,lr'
> >>>
> >>>
> >>>>> +    }
> >>>>> +
> >>>>>     if (arm_pic_register_string != NULL)
> >>>>>       {
> >>>>>         int pic_register = decode_reg_name (arm_pic_register_string);
> >>>>> @@ -7251,6 +7259,21 @@ arm_function_ok_for_sibcall (tree decl, tree exp)
> >>>>>     if (cfun->machine->sibcall_blocked)
> >>>>>       return false;
> >>>>>   +  if (TARGET_FDPIC)
> >>>>> +    {
> >>>>> +      /* In FDPIC, never tailcall something for which we have no decl:
> >>>>> +     the target function could be in a different module, requiring
> >>>>> +     a different FDPIC register value.  */
> >>>>> +      if (decl == NULL)
> >>>>> +    return false;
> >>>>> +
> >>>>> +      /* Don't tailcall if we go through the PLT since the FDPIC
> >>>>> +     register is then corrupted and we don't restore it after
> >>>>> +     static function calls.  */
> >>>>> +      if (!targetm.binds_local_p (decl))
> >>>>> +    return false;
> >>>>> +    }
> >>>>> +
> >>>>>     /* Never tailcall something if we are generating code for
> >>>>> Thumb-1.  */
> >>>>>     if (TARGET_THUMB1)
> >>>>>       return false;
> >>>>> @@ -7629,7 +7652,9 @@ arm_load_pic_register (unsigned long saved_regs
> >>>>> ATTRIBUTE_UNUSED)
> >>>>>   {
> >>>>>     rtx l1, labelno, pic_tmp, pic_rtx, pic_reg;
> >>>>>   -  if (crtl->uses_pic_offset_table == 0 || TARGET_SINGLE_PIC_BASE)
> >>>>> +  if (crtl->uses_pic_offset_table == 0
> >>>>> +      || TARGET_SINGLE_PIC_BASE
> >>>>> +      || TARGET_FDPIC)
> >>>>>       return;
> >>>>>       gcc_assert (flag_pic);
> >>>>> @@ -7697,28 +7722,140 @@ arm_load_pic_register (unsigned long
> >>>>> saved_regs ATTRIBUTE_UNUSED)
> >>>>>     emit_use (pic_reg);
> >>>>>   }
> >>>>>   +/* Try to know if the object will go in text or data segment. This is
> >>>>
> >>>> "Try to determine whether an object, referenced via ORIG, will be placed
> >>>> in the text or data segment."
> >>>>> +   used in FDPIC mode, to decide which relocations to use when
> >>>>> +   accessing ORIG. IS_READONLY is set to true if ORIG is a read-only
> >>>>
> >>>> Two spaces after a period.
> >>>>
> >>>>> +   location, false otherwise.  */
> >>>>
> >>>> You've missed the documentation of the return value: does returning true
> >>>> mean text vs data, or does it mean we know which it will go in, but
> >>>> don't have to return that information here.
> >>>>
> >>>> Generally, won't this break big time if users compile with
> >>>> -ffunction-sections or -fdata-sections?  Is it sufficient to match
> >>>> .text.* as being text and .data.* for data?
> >>>>
> >>>
> >>> I compiled a small testcase with -ffunction-sections and -fdata-sections
> >>> and noticed no problem.
> >>> The code below does not attempt to match section names, I'm not sure to
> >>> understand your question?
> >>>
> >>>>
> >>>>> +static bool
> >>>>> +arm_is_segment_info_known (rtx orig, bool *is_readonly)
> >>>>> +{
> >>>>> +  bool res = false;
> >>>>> +
> >>>>> +  *is_readonly = false;
> >>>>> +
> >>>>> +  if (GET_CODE (orig) == LABEL_REF)
> >>>>> +    {
> >>>>> +      res = true;
> >>>>> +      *is_readonly = true;
> >>>>> +    }
> >>>>> +  else if (SYMBOL_REF_P (orig))
> >>>>> +    {
> >>>>> +      if (CONSTANT_POOL_ADDRESS_P (orig))
> >>>>> +    {
> >>>>> +      res = true;
> >>>>> +      *is_readonly = true;
> >>>>> +    }
> >>>>> +      else if (SYMBOL_REF_LOCAL_P (orig)
> >>>>> +           && !SYMBOL_REF_EXTERNAL_P (orig)
> >>>>> +           && SYMBOL_REF_DECL (orig)
> >>>>> +           && (!DECL_P (SYMBOL_REF_DECL (orig))
> >>>>> +           || !DECL_COMMON (SYMBOL_REF_DECL (orig))))
> >>>>> +    {
> >>>>> +      tree decl = SYMBOL_REF_DECL (orig);
> >>>>> +      tree init = (TREE_CODE (decl) == VAR_DECL)
> >>>>> +        ? DECL_INITIAL (decl) : (TREE_CODE (decl) == CONSTRUCTOR)
> >>>>> +        ? decl : 0;
> >>>>> +      int reloc = 0;
> >>>>> +      bool named_section, readonly;
> >>>>> +
> >>>>> +      if (init && init != error_mark_node)
> >>>>> +        reloc = compute_reloc_for_constant (init);
> >>>>> +
> >>>>> +      named_section = TREE_CODE (decl) == VAR_DECL
> >>>>> +        && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
> >>>>> +      readonly = decl_readonly_section (decl, reloc);
> >>>>> +
> >>>>> +      /* We don't know where the link script will put a named
> >>>>> +         section, so return false in such a case.  */
> >>>>> +      res = !named_section;
> >>>>> +
> >>>>> +      if (!named_section)
> >>>>> +        *is_readonly = readonly;
> >>>>> +    }
> >>>>> +      else
> >>>>> +    {
> >>>>> +      /* We don't know.  */
> >>>>> +      res = false;
> >>>>> +    }
> >>>>> +    }
> >>>>> +  else
> >>>>> +    gcc_unreachable ();
> >>>>> +
> >>>>> +  return res;
> >>>>> +}
> >>>>> +
> >>>>>   /* Generate code to load the address of a static var when flag_pic
> >>>>> is set.  */
> >>>>>   static rtx_insn *
> >>>>>   arm_pic_static_addr (rtx orig, rtx reg)
> >>>>>   {
> >>>>>     rtx l1, labelno, offset_rtx;
> >>>>> +  rtx_insn *insn;
> >>>>>       gcc_assert (flag_pic);
> >>>>>   -  /* We use an UNSPEC rather than a LABEL_REF because this label
> >>>>> -     never appears in the code stream.  */
> >>>>> -  labelno = GEN_INT (pic_labelno++);
> >>>>> -  l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
> >>>>> UNSPEC_PIC_LABEL);
> >>>>> -  l1 = gen_rtx_CONST (VOIDmode, l1);
> >>>>> +  bool is_readonly = false;
> >>>>> +  bool info_known = false;
> >>>>>   -  /* On the ARM the PC register contains 'dot + 8' at the time of the
> >>>>> -     addition, on the Thumb it is 'dot + 4'.  */
> >>>>> -  offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> >>>>> -  offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig, offset_rtx),
> >>>>> -                               UNSPEC_SYMBOL_OFFSET);
> >>>>> -  offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> >>>>> +  if (TARGET_FDPIC
> >>>>> +      && SYMBOL_REF_P (orig)
> >>>>> +      && !SYMBOL_REF_FUNCTION_P (orig))
> >>>>> +      info_known = arm_is_segment_info_known (orig, &is_readonly);
> >>>>>   -  return emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
> >>>>> labelno));
> >>>>> +  if (TARGET_FDPIC
> >>>>> +      && SYMBOL_REF_P (orig)
> >>>>> +      && !SYMBOL_REF_FUNCTION_P (orig)
> >>>>> +      && !info_known)
> >>>>> +    {
> >>>>> +      /* We don't know where orig is stored, so we have be
> >>>>> +     pessimistic and use a GOT relocation.  */
> >>>>> +      rtx pat;
> >>>>> +      rtx mem;
> >>>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>>>> +
> >>>>> +      pat = gen_calculate_pic_address (reg, pic_reg, orig);
> >>>>> +
> >>>>> +      /* Make the MEM as close to a constant as possible.  */
> >>>>> +      mem = SET_SRC (pat);
> >>>>> +      gcc_assert (MEM_P (mem) && !MEM_VOLATILE_P (mem));
> >>>>> +      MEM_READONLY_P (mem) = 1;
> >>>>> +      MEM_NOTRAP_P (mem) = 1;
> >>>>> +
> >>>>> +      insn = emit_insn (pat);
> >>>>> +    }
> >>>>> +  else if (TARGET_FDPIC
> >>>>> +       && SYMBOL_REF_P (orig)
> >>>>> +       && (SYMBOL_REF_FUNCTION_P (orig)
> >>>>> +           || (info_known && !is_readonly)))
> >>>>> +    {
> >>>>> +      /* We use the GOTOFF relocation.  */
> >>>>> +      rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>>>> +
> >>>>> +      rtx l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
> >>>>> UNSPEC_PIC_SYM);
> >>>>> +      emit_insn (gen_movsi (reg, l1));
> >>>>> +      insn = emit_insn (gen_addsi3 (reg, reg, pic_reg));
> >>>>> +    }
> >>>>> +  else
> >>>>> +    {
> >>>>> +      /* Not FDPIC, not SYMBOL_REF_P or readonly: we can use
> >>>>> +     PC-relative access.  */
> >>>>> +      /* We use an UNSPEC rather than a LABEL_REF because this label
> >>>>> +     never appears in the code stream.  */
> >>>>> +      labelno = GEN_INT (pic_labelno++);
> >>>>> +      l1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno),
> >>>>> UNSPEC_PIC_LABEL);
> >>>>> +      l1 = gen_rtx_CONST (VOIDmode, l1);
> >>>>> +
> >>>>> +      /* On the ARM the PC register contains 'dot + 8' at the time
> >>>>> of the
> >>>>> +     addition, on the Thumb it is 'dot + 4'.  */
> >>>>> +      offset_rtx = plus_constant (Pmode, l1, TARGET_ARM ? 8 : 4);
> >>>>> +      offset_rtx = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, orig,
> >>>>> offset_rtx),
> >>>>> +                   UNSPEC_SYMBOL_OFFSET);
> >>>>> +      offset_rtx = gen_rtx_CONST (Pmode, offset_rtx);
> >>>>> +
> >>>>> +      insn = emit_insn (gen_pic_load_addr_unified (reg, offset_rtx,
> >>>>> +                           labelno));
> >>>>> +    }
> >>>>> +
> >>>>> +  return insn;
> >>>>>   }
> >>>>>     /* Return nonzero if X is valid as an ARM state addressing
> >>>>> register.  */
> >>>>> @@ -15933,9 +16070,36 @@ get_jump_table_size (rtx_jump_table_data *insn)
> >>>>>     return 0;
> >>>>>   }
> >>>>>   +/* Emit insns to load the function address from FUNCDESC (an FDPIC
> >>>>> +   function descriptor) into a register and the GOT address into the
> >>>>> +   FDPIC register, returning an rtx for the register holding the
> >>>>> +   function address.  */
> >>>>> +
> >>>>> +rtx
> >>>>> +arm_load_function_descriptor (rtx funcdesc)
> >>>>> +{
> >>>>> +  rtx fnaddr_reg = gen_reg_rtx (Pmode);
> >>>>> +  rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>>>> +  rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
> >>>>> +  rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc,
> >>>>> 4));
> >>>>> +  rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>>>> +
> >>>>> +  emit_move_insn (fnaddr_reg, fnaddr);
> >>>>> +  /* The ABI requires the entry point address to be loaded first, so
> >>>>> +     prevent the load from being moved after that of the GOT
> >>>>> +     address.  */
> >>>>> +  XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>>>> +                    gen_rtvec (2, pic_reg, gotaddr),
> >>>>> +                    UNSPEC_PIC_RESTORE);
> >>>>> +  XVECEXP (par, 0, 1) = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode,
> >>>>> FDPIC_REGNUM))
> >>>>> +  XVECEXP (par, 0, 2) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG
> >>>>> (Pmode, FDPIC_REGNUM));
> >>>>
> >>>> Shouldn't one of these be fnaddr_reg and the other pic_reg?
> >>> I think the USE should be gotaddr, and CLOBBER should be pic_reg, thanks.
> >>>
> >>>>
> >>>>> +  emit_insn (par);
> >>>>> +
> >>>>> +  return fnaddr_reg;
> >>>>> +}
> >>>>> +
> >>>>>   /* Return the maximum amount of padding that will be inserted before
> >>>>>      label LABEL.  */
> >>>>> -
> >>>>>   static HOST_WIDE_INT
> >>>>>   get_label_padding (rtx label)
> >>>>>   {
> >>>>> @@ -22890,9 +23054,37 @@ arm_assemble_integer (rtx x, unsigned int
> >>>>> size, int aligned_p)
> >>>>>             && (!SYMBOL_REF_LOCAL_P (x)
> >>>>>                 || (SYMBOL_REF_DECL (x)
> >>>>>                 ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
> >>>>> -        fputs ("(GOT)", asm_out_file);
> >>>>> +        {
> >>>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> >>>>> +        fputs ("(GOTFUNCDESC)", asm_out_file);
> >>>>> +          else
> >>>>> +        fputs ("(GOT)", asm_out_file);
> >>>>> +        }
> >>>>>         else
> >>>>> -        fputs ("(GOTOFF)", asm_out_file);
> >>>>> +        {
> >>>>> +          if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> >>>>> +        fputs ("(GOTOFFFUNCDESC)", asm_out_file);
> >>>>> +          else
> >>>>> +        {
> >>>>> +          bool is_readonly;
> >>>>> +
> >>>>> +          if (arm_is_segment_info_known (x, &is_readonly))
> >>>>> +            fputs ("(GOTOFF)", asm_out_file);
> >>>>> +          else
> >>>>> +            fputs ("(GOT)", asm_out_file);
> >>>>> +        }
> >>>>> +        }
> >>>>> +    }
> >>>>> +
> >>>>> +      /* For FDPIC we also have to mark symbol for .data section.  */
> >>>>> +      if (TARGET_FDPIC
> >>>>> +      && NEED_GOT_RELOC
> >>>>> +      && flag_pic
> >>>>> +      && !making_const_table
> >>>>> +      && SYMBOL_REF_P (x))
> >>>>> +    {
> >>>>> +      if (SYMBOL_REF_FUNCTION_P (x))
> >>>>> +        fputs ("(FUNCDESC)", asm_out_file);
> >>>>>       }
> >>>>>         fputc ('\n', asm_out_file);
> >>>>>         return true;
> >>>>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> >>>>> index 34894c0..4671d64 100644
> >>>>> --- a/gcc/config/arm/arm.h
> >>>>> +++ b/gcc/config/arm/arm.h
> >>>>> @@ -871,6 +871,9 @@ extern int arm_arch_cmse;
> >>>>>      Pascal), so the following is not true.  */
> >>>>>   #define STATIC_CHAIN_REGNUM    12
> >>>>>   +/* r9 is the FDPIC register (base register for GOT and FUNCDESC
> >>>>> accesses).  */
> >>>>> +#define FDPIC_REGNUM        9
> >>>>> +
> >>>>>   /* Define this to be where the real frame pointer is if it is not
> >>>>> possible to
> >>>>>      work out the offset between the frame pointer and the automatic
> >>>>> variables
> >>>>>      until after register allocation has taken place.
> >>>>> FRAME_POINTER_REGNUM
> >>>>> @@ -1927,6 +1930,10 @@ extern unsigned arm_pic_register;
> >>>>>      data addresses in memory.  */
> >>>>>   #define PIC_OFFSET_TABLE_REGNUM arm_pic_register
> >>>>>   +/* For FDPIC, the FDPIC register is call-clobbered (otherwise PLT
> >>>>> +   entries would need to handle saving and restoring it).  */
> >>>>> +#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED TARGET_FDPIC
> >>>>> +
> >>>>>   /* We can't directly access anything that contains a symbol,
> >>>>>      nor can we indirect via the constant pool.  One exception is
> >>>>>      UNSPEC_TLS, which is always PIC.  */
> >>>>> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> >>>>> index 270b8e4..09a0701 100644
> >>>>> --- a/gcc/config/arm/arm.md
> >>>>> +++ b/gcc/config/arm/arm.md
> >>>>> @@ -8031,6 +8031,23 @@
> >>>>>       rtx callee, pat;
> >>>>>       tree addr = MEM_EXPR (operands[0]);
> >>>>>       +    /* Force FDPIC register (r9) before call.  */
> >>>>> +    if (TARGET_FDPIC)
> >>>>> +      {
> >>>>> +    /* No need to update r9 if calling a static function.
> >>>>> +       In other words: set r9 for indirect or non-local calls.  */
> >>>>> +    callee = XEXP (operands[0], 0);
> >>>>> +    if (!SYMBOL_REF_P (callee)
> >>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>>>> +      {
> >>>>> +        emit_insn (gen_blockage ());
> >>>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
> >>>>> FDPIC_REGNUM));
> >>>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> >>>>> +     }
> >>>>> +      }
> >>>>> +
> >>>>>       /* In an untyped call, we can get NULL for operand 2.  */
> >>>>>       if (operands[2] == NULL_RTX)
> >>>>>         operands[2] = const0_rtx;
> >>>>> @@ -8044,6 +8061,13 @@
> >>>>>       : !REG_P (callee))
> >>>>>         XEXP (operands[0], 0) = force_reg (Pmode, callee);
> >>>>>   +    if (TARGET_FDPIC && !SYMBOL_REF_P (XEXP (operands[0], 0)))
> >>>>> +      {
> >>>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
> >>>>> +    XEXP (operands[0], 0)
> >>>>> +      = arm_load_function_descriptor (XEXP (operands[0], 0));
> >>>>> +      }
> >>>>> +
> >>>>>       if (detect_cmse_nonsecure_call (addr))
> >>>>>         {
> >>>>>       pat = gen_nonsecure_call_internal (operands[0], operands[1],
> >>>>> @@ -8055,10 +8079,38 @@
> >>>>>       pat = gen_call_internal (operands[0], operands[1], operands[2]);
> >>>>>       arm_emit_call_insn (pat, XEXP (operands[0], 0), false);
> >>>>>         }
> >>>>> +
> >>>>> +    /* Restore FDPIC register (r9) after call.  */
> >>>>> +    if (TARGET_FDPIC)
> >>>>> +      {
> >>>>> +    /* No need to update r9 if calling a static function.  */
> >>>>> +    if (!SYMBOL_REF_P (callee)
> >>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>>>> +      {
> >>>>> +        rtx pic_reg = gen_rtx_REG (Pmode, FDPIC_REGNUM);
> >>>>> +        emit_move_insn (pic_reg, get_hard_reg_initial_val (Pmode,
> >>>>> FDPIC_REGNUM));
> >>>>> +        emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
> >>>>> +        emit_insn (gen_blockage ());
> >>>>> +      }
> >>>>> +      }
> >>>>>       DONE;
> >>>>>     }"
> >>>>>   )
> >>>>>   +(define_insn "*restore_pic_register_after_call"
> >>>>> +  [(parallel [(unspec [(match_operand:SI 0 "s_register_operand" "=r,r")
> >>>>> +               (match_operand:SI 1 "nonimmediate_operand" "r,m")]
> >>>>> +           UNSPEC_PIC_RESTORE)
> >>>>> +          (use (match_dup 0))
> >>>>> +          (clobber (match_dup 0))])
> >>>>> +  ]
> >>>>> +  ""
> >>>>> +  "@
> >>>>> +  mov\t%0, %1
> >>>>> +  ldr\t%0, %1"
> >>>>> +)
> >>>>> +
> >>>>>   (define_expand "call_internal"
> >>>>>     [(parallel [(call (match_operand 0 "memory_operand" "")
> >>>>>                   (match_operand 1 "general_operand" ""))
> >>>>> @@ -8119,6 +8171,30 @@
> >>>>>       rtx pat, callee;
> >>>>>       tree addr = MEM_EXPR (operands[1]);
> >>>>>       +    /* Force FDPIC register (r9) before call.  */
> >>>>> +    if (TARGET_FDPIC)
> >>>>> +      {
> >>>>> +    /* No need to update the FDPIC register (r9) if calling a static
> >>>>> function.
> >>>>> +       In other words: set r9 for indirect or non-local calls.  */
> >>>>> +    callee = XEXP (operands[1], 0);
> >>>>> +    if (!SYMBOL_REF_P (callee)
> >>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>>>> +      {
> >>>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>>>> +
> >>>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> >>>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> >>>>> +        UNSPEC_PIC_RESTORE);
> >>>>> +        XVECEXP (par, 0, 1)
> >>>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> >>>>> +        XVECEXP (par, 0, 2)
> >>>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
> >>>>> FDPIC_REGNUM));
> >>>>
> >>>> Again, this looks suspicious.
> >>>>
> >>> Yes, fixed for follow-up patch, with
> >>> USE for get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)
> >>> CLOBBER for gen_rtx_REG (Pmode, FDPIC_REGNUM)
> >>>
> >>>>> +        emit_insn (par);
> >>>>> +      }
> >>>>> +      }
> >>>>> +
> >>>>>       /* In an untyped call, we can get NULL for operand 2.  */
> >>>>>       if (operands[3] == 0)
> >>>>>         operands[3] = const0_rtx;
> >>>>> @@ -8132,6 +8208,14 @@
> >>>>>       : !REG_P (callee))
> >>>>>         XEXP (operands[1], 0) = force_reg (Pmode, callee);
> >>>>>   +    if (TARGET_FDPIC
> >>>>> +    && !SYMBOL_REF_P (XEXP (operands[1], 0)))
> >>>>> +      {
> >>>>> +    /* Indirect call: set r9 with FDPIC value of callee.  */
> >>>>> +    XEXP (operands[1], 0)
> >>>>> +      = arm_load_function_descriptor (XEXP (operands[1], 0));
> >>>>> +      }
> >>>>> +
> >>>>>       if (detect_cmse_nonsecure_call (addr))
> >>>>>         {
> >>>>>       pat = gen_nonsecure_call_value_internal (operands[0], operands[1],
> >>>>> @@ -8144,6 +8228,28 @@
> >>>>>                          operands[2], operands[3]);
> >>>>>       arm_emit_call_insn (pat, XEXP (operands[1], 0), false);
> >>>>>         }
> >>>>> +    /* Restore FDPIC register (r9) after call.  */
> >>>>> +    if (TARGET_FDPIC)
> >>>>> +      {
> >>>>> +    /* No need to update r9 if calling a static function.  */
> >>>>> +    if (!SYMBOL_REF_P (callee)
> >>>>> +        || !SYMBOL_REF_LOCAL_P (callee)
> >>>>> +        || arm_is_long_call_p (SYMBOL_REF_DECL (callee)))
> >>>>> +      {
> >>>>> +        rtx par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (3));
> >>>>> +
> >>>>> +        XVECEXP (par, 0, 0) = gen_rtx_UNSPEC (VOIDmode,
> >>>>> +        gen_rtvec (2, gen_rtx_REG (Pmode, FDPIC_REGNUM),
> >>>>> +               get_hard_reg_initial_val (Pmode, FDPIC_REGNUM)),
> >>>>> +        UNSPEC_PIC_RESTORE);
> >>>>> +        XVECEXP (par, 0, 1)
> >>>>> +          = gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, FDPIC_REGNUM));
> >>>>> +        XVECEXP (par, 0, 2)
> >>>>> +          = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode,
> >>>>> FDPIC_REGNUM));
> >>>>
> >>>> And again.
> >>> Yes
> >>>
> >>>>
> >>>>> +        emit_insn (par);
> >>>>> +      }
> >>>>> +      }
> >>>>> +
> >>>>>       DONE;
> >>>>>     }"
> >>>>>   )
> >>>>> @@ -8486,7 +8592,7 @@
> >>>>>               (const_int 0))
> >>>>>             (match_operand 1 "" "")
> >>>>>             (match_operand 2 "" "")])]
> >>>>> -  "TARGET_EITHER"
> >>>>> +  "TARGET_EITHER && !TARGET_FDPIC"
> >>>>>     "
> >>>>>     {
> >>>>>       int i;
> >>>>> @@ -8553,7 +8659,7 @@
> >>>>>   (define_expand "untyped_return"
> >>>>>     [(match_operand:BLK 0 "memory_operand" "")
> >>>>>      (match_operand 1 "" "")]
> >>>>> -  "TARGET_EITHER"
> >>>>> +  "TARGET_EITHER && !TARGET_FDPIC"
> >>>>>     "
> >>>>>     {
> >>>>>       int i;
> >>>>> diff --git a/gcc/config/arm/unspecs.md b/gcc/config/arm/unspecs.md
> >>>>> index 1941673..349ae0e 100644
> >>>>> --- a/gcc/config/arm/unspecs.md
> >>>>> +++ b/gcc/config/arm/unspecs.md
> >>>>> @@ -86,6 +86,7 @@
> >>>>>     UNSPEC_PROBE_STACK    ; Probe stack memory reference
> >>>>>     UNSPEC_NONSECURE_MEM    ; Represent non-secure memory in ARMv8-M
> >>>>> with
> >>>>>               ; security extension
> >>>>> +  UNSPEC_PIC_RESTORE    ; Use to restore fdpic register
> >>>>>   ])
> >>>>>     (define_c_enum "unspec" [
> >>>>>
> >>>>
> >>>> .
> >>>>
> >>>
> >>
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-26 15:33           ` Christophe Lyon
@ 2018-10-29 14:25             ` Christophe Lyon
  2018-10-29 23:15               ` Segher Boessenkool
  0 siblings, 1 reply; 47+ messages in thread
From: Christophe Lyon @ 2018-10-29 14:25 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: Richard Earnshaw, christophe lyon St, gcc Patches

On Fri, 26 Oct 2018 at 17:07, Christophe Lyon
<christophe.lyon@linaro.org> wrote:
>
> On Tue, 23 Oct 2018 at 17:14, Segher Boessenkool
> <segher@kernel.crashing.org> wrote:
> >
> > On Tue, Oct 23, 2018 at 02:58:21PM +0100, Richard Earnshaw (lists) wrote:
> > > On 15/10/2018 11:10, Christophe Lyon wrote:
> > > > Do you mean to also make -mfdpic non-existent/rejected when GCC is not
> > > > configured
> > > > for arm-uclinuxfdpiceabi?
> > >
> > > Ideally doesn't exist, so that it doesn't show up in things like --help
> > > when it doesn't work.
> > >
> > > > How to achieve that?
> > >
> > > Good question, I'm not sure, off hand.  It might be possible to make the
> > > config machinery add additional opt files, but it's not something I've
> > > tried.  You might want to try adding an additional opt file to
> > > extra_options for fdpic targets.
> >
> > That should work yes.  You could look at how 476.opt is added for powerpc,
> > it is a comparable situation.
> >
>
> Thanks, I got it to work.
>
> Now back to Richard's original question:
> > I think this needs to be resolved.  Either -mfdpic works everywhere, or
> > the option should only be available when configured for -mfdpic.
> It's not that -mfdpic does not work everywhere, rather it is not sufficient
> to use it alone: it should be used along with fpic/fPIC/fpie/fPIE depending
> on the use case.
>
> In practice I don't know if we want to be able to use -mfdpic with a
> arm-linux-gnueabi
> toolchain, or if we are ok to have to use two different toolchains
> when we want to make
> tests/compare code generation in both cases.
>
> The 1st option means I should improve the documentation patch. For the 2nd one,
> I have patches in progress (which also imply reworking the doc since the option
> would not also be available)
>

Here is an updated doc proposal (that would go in patch #1, without
changing this one):
@item -mfdpic
@opindex mfdpic
Select the FDPIC ABI, which uses function descriptors to represent
pointers to functions.  When the compiler is configured for
@code{arm-*-uclinuxfdpiceabi} targets, this option is on by default
and implies @option{-fPIE} if none of the PIC/PIE-related options is
provided.  On other targets, it only enables the FDPIC-specific code
generation features, and the user should explicitly provide the
PIC/PIE-related options as needed.

The opposite @option{-mno-fdpic} option is useful (and required) to
build the Linux kernel using the same toolchain as the one used to
build the userland programs.

Is it clearer? Does it read OK?

Thanks

> Christophe
>
>
> >
> > Segher

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  2018-10-29 14:25             ` Christophe Lyon
@ 2018-10-29 23:15               ` Segher Boessenkool
  0 siblings, 0 replies; 47+ messages in thread
From: Segher Boessenkool @ 2018-10-29 23:15 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: Richard Earnshaw, christophe lyon St, gcc Patches

On Mon, Oct 29, 2018 at 02:45:20PM +0100, Christophe Lyon wrote:
> Here is an updated doc proposal (that would go in patch #1, without
> changing this one):
> @item -mfdpic
> @opindex mfdpic
> Select the FDPIC ABI, which uses function descriptors to represent
> pointers to functions.  When the compiler is configured for
> @code{arm-*-uclinuxfdpiceabi} targets, this option is on by default
> and implies @option{-fPIE} if none of the PIC/PIE-related options is
> provided.  On other targets, it only enables the FDPIC-specific code
> generation features, and the user should explicitly provide the
> PIC/PIE-related options as needed.

Most other things seem to put -mno-fdpic in an @itemx and mno-fdpic in
an @opindex as well, in similar cases.

> The opposite @option{-mno-fdpic} option is useful (and required) to
> build the Linux kernel using the same toolchain as the one used to
> build the userland programs.
> 
> Is it clearer? Does it read OK?

It reads fine I think.


Segher

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  2018-10-15  8:46     ` Christophe Lyon
@ 2018-11-09 12:31       ` Christophe Lyon
  0 siblings, 0 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-11-09 12:31 UTC (permalink / raw)
  To: Richard Earnshaw; +Cc: christophe lyon St, gcc Patches

[-- Attachment #1: Type: text/plain, Size: 28255 bytes --]

On Mon, 15 Oct 2018 at 10:12, Christophe Lyon
<christophe.lyon@linaro.org> wrote:
>
>
>
> On Fri, 12 Oct 2018 at 11:54, Richard Earnshaw (lists) <Richard.Earnshaw@arm.com> wrote:
>>
>> On 11/10/18 14:34, Christophe Lyon wrote:
>> > The new arm-uclinuxfdpiceabi target behaves pretty much like
>> > arm-linux-gnueabi. In order the enable the same set of features, we
>> > have to update several configure scripts that generally match targets
>> > like *-*-linux*: in most places, we add *-uclinux* where there is
>> > already *-linux*, or uclinux* when there is already linux*.
>> >
>> > In gcc/config.gcc and libgcc/config.host we use *-*-uclinuxfdpiceabi
>> > because there is already a different behaviour for *-*uclinux* target.
>> >
>> > In libtool.m4, we use uclinuxfdpiceabi in cases where ELF shared
>> > libraries support is required, as uclinux does not guarantee that.
>> >
>> > 2018-XX-XX  Christophe Lyon  <christophe.lyon@st.com>
>> >
>> >       config/
>> >       * futex.m4: Handle *-uclinux*.
>> >       * tls.m4 (GCC_CHECK_TLS): Likewise.
>> >
>> >       gcc/
>> >       * config.gcc: Handle *-*-uclinuxfdpiceabi.
>> >
>> >       libatomic/
>> >       * configure.tgt: Handle arm*-*-uclinux*.
>> >       * configure: Regenerate.
>> >
>> >       libgcc/
>> >       * config.host: Handle *-*-uclinuxfdpiceabi.
>> >
>> >       libitm/
>> >       * configure.tgt: Handle *-*-uclinux*.
>> >       * configure: Regenerate.
>> >
>> >       libstdc++-v3/
>> >       * acinclude.m4: Handle uclinux*.
>> >       * configure: Regenerate.
>> >       * configure.host: Handle uclinux*
>> >
>> >       * libtool.m4: Handle uclinux*.
>>
>> What testing have you done to ensure that these new uclinux* changes
>> have not affected existing uclinux configurations?
>>
>> Also, do you really need to use uclinuxfdpiceabi (which is quite
>> Arm-specific) everywhere, or would uclinuxfdpic* be better and ease work
>> for other fdpic targets?
>>

Thanks to the help I received in
https://gcc.gnu.org/ml/gcc/2018-10/msg00154.html
https://gcc.gnu.org/ml/gcc/2018-11/msg00012.html
I managed to build an xtensa-buildroot-uclinux-uclibc toolchain
(r265582), and run 'make check'.
Then I applied this patch, rebuilt the toolchain (from scratch) and
ran 'make check' again.
compare_test says:
Tests that now fail, but worked before (54 tests):
[...]
Tests that now work, but didn't before (2 tests):
23_containers/map/requirements/exception/propagation_consistent.cc
execution test
ext/mt_allocator/deallocate_global_thread-3.cc execution test

New tests that FAIL (4 tests):
27_io/filesystem/path/native/string.cc (test for excess errors)
30_threads/condition_variable_any/50862.cc execution test
30_threads/condition_variable_any/53830.cc execution test
experimental/filesystem/path/native/string.cc (test for excess errors)

New tests that PASS (301 tests):
[...]

(all the diffs are in libstdc++ obviously)
I've attached the details to this email.

>
> This patch became necessary when I was asked to change the target name from  arm-linux-uclibceabi to arm-uclinuxfdpiceabi.
> Changing it implied that many features were disabled and tests regressed because the new target name didn't match the regexps in configure scripts.
>
> I iterated over the regressions to see which features were now missing, and I updated the configure scripts accordingly.
>
> When the feature being tested was generic, I used the general *-*-uclinux* form, because it seemed reasonable that it was OK for other targets.
> When the test was arm-related, I used the stricter uclinuxfdpiceabi form, and specifically not uclinuxfdpic* to avoid breaking other fdpic targets. When in doubt, I preferred to stay on the safe side.
>
> To answer you first question, I do not have the setup to test other uclinux configs, I'm not even sure of the list.
> So I tested arm-uclinuxfdpiceabi, made sure I got the same results as with our previous target name, and that
> the whole series didn't regress on arm-linux-gnueabi*.
>
> I hope other uclinux/fdpic target maintainers comment on this patch if something looks wrong to them.
>
> Christophe
>
>> R.
>> >
>> > Change-Id: I6a1fdcd9847d8a82179a214612a3474c1f492916
>> >
>> > diff --git a/config/futex.m4 b/config/futex.m4
>> > index e95144d..4dffe15 100644
>> > --- a/config/futex.m4
>> > +++ b/config/futex.m4
>> > @@ -9,7 +9,7 @@ AC_DEFUN([GCC_LINUX_FUTEX],[dnl
>> >  GCC_ENABLE(linux-futex,default, ,[use the Linux futex system call],
>> >          permit yes|no|default)
>> >  case "$target" in
>> > -  *-linux*)
>> > +  *-linux* | *-uclinux*)
>> >      case "$enable_linux_futex" in
>> >        default)
>> >       # If headers don't have gettid/futex syscalls definition, then
>> > diff --git a/config/tls.m4 b/config/tls.m4
>> > index 4e170c8..5a8676e 100644
>> > --- a/config/tls.m4
>> > +++ b/config/tls.m4
>> > @@ -76,7 +76,7 @@ AC_DEFUN([GCC_CHECK_TLS], [
>> >         dnl Shared library options may depend on the host; this check
>> >         dnl is only known to be needed for GNU/Linux.
>> >         case $host in
>> > -         *-*-linux*)
>> > +         *-*-linux* | -*-uclinux*)
>> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>> >             ;;
>> >         esac
>> > diff --git a/gcc/config.gcc b/gcc/config.gcc
>> > index 0c579d1..793fc69 100644
>> > --- a/gcc/config.gcc
>> > +++ b/gcc/config.gcc
>> > @@ -753,7 +753,7 @@ case ${target} in
>> >  *-*-fuchsia*)
>> >    native_system_header_dir=/include
>> >    ;;
>> > -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
>> > +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
>> >    extra_options="$extra_options gnu-user.opt"
>> >    gas=yes
>> >    gnu_ld=yes
>> > @@ -762,7 +762,7 @@ case ${target} in
>> >    esac
>> >    tmake_file="t-slibgcc"
>> >    case $target in
>> > -    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu)
>> > +    *-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-kopensolaris*-gnu  | *-*-uclinuxfdpiceabi)
>> >        :;;
>> >      *-*-gnu*)
>> >        native_system_header_dir=/include
>> > @@ -782,7 +782,7 @@ case ${target} in
>> >      *-*-*android*)
>> >        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC"
>> >        ;;
>> > -    *-*-*uclibc*)
>> > +    *-*-*uclibc* | *-*-uclinuxfdpiceabi)
>> >        tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
>> >        ;;
>> >      *-*-*musl*)
>> > @@ -1134,7 +1134,7 @@ arm*-*-netbsdelf*)
>> >       tmake_file="${tmake_file} arm/t-arm"
>> >       target_cpu_cname="arm6"
>> >       ;;
>> > -arm*-*-linux-*)                      # ARM GNU/Linux with ELF
>> > +arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)                    # ARM GNU/Linux with ELF
>> >       tm_file="dbxelf.h elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h arm/elf.h arm/linux-gas.h arm/linux-elf.h"
>> >       extra_options="${extra_options} linux-android.opt"
>> >       case $target in
>> > diff --git a/libatomic/configure b/libatomic/configure
>> > index b902e2c..5b3ef8e 100755
>> > --- a/libatomic/configure
>> > +++ b/libatomic/configure
>> > @@ -5819,7 +5819,7 @@ irix5* | irix6* | nonstopux*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    lt_cv_deplibs_check_method=pass_all
>> >    ;;
>> >
>> > @@ -8305,7 +8305,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>> >        lt_prog_compiler_static='-non_shared'
>> >        ;;
>> >
>> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >        case $cc_basename in
>> >        # old Intel for x86_64 which still supported -KPIC.
>> >        ecc*)
>> > @@ -8900,7 +8900,7 @@ _LT_EOF
>> >        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>> >        ;;
>> >
>> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >        tmp_diet=no
>> >        if test "$host_os" = linux-dietlibc; then
>> >       case $cc_basename in
>> > @@ -10431,7 +10431,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt
>> > index ea8c34f..c1a608f 100644
>> > --- a/libatomic/configure.tgt
>> > +++ b/libatomic/configure.tgt
>> > @@ -124,7 +124,7 @@ case "${target}" in
>> >       config_path="${config_path} linux/aarch64 posix"
>> >       ;;
>> >
>> > -  arm*-*-linux*)
>> > +  arm*-*-linux* | arm*-*-uclinux*)
>> >       # OS support for atomic primitives.
>> >       config_path="${config_path} linux/arm posix"
>> >       ;;
>> > diff --git a/libgcc/config.host b/libgcc/config.host
>> > index 029f656..28f3c14 100644
>> > --- a/libgcc/config.host
>> > +++ b/libgcc/config.host
>> > @@ -238,7 +238,7 @@ case ${host} in
>> >    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia"
>> >    extra_parts="crtbegin.o crtend.o"
>> >    ;;
>> > -*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu)
>> > +*-*-linux* | frv-*-*linux* | *-*-kfreebsd*-gnu | *-*-gnu* | *-*-kopensolaris*-gnu | *-*-uclinuxfdpiceabi)
>> >    tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
>> >    extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
>> >    if test x$enable_vtable_verify = xyes; then
>> > @@ -424,7 +424,7 @@ arm*-*-fuchsia*)
>> >  arm*-*-netbsdelf*)
>> >       tmake_file="$tmake_file arm/t-arm arm/t-netbsd t-slibgcc-gld-nover"
>> >       ;;
>> > -arm*-*-linux*)                       # ARM GNU/Linux with ELF
>> > +arm*-*-linux* | arm*-*-uclinuxfdpiceabi)                     # ARM GNU/Linux with ELF
>> >       tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
>> >       tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
>> >       tm_file="$tm_file arm/bpabi-lib.h"
>> > diff --git a/libitm/configure b/libitm/configure
>> > index dbf386d..fd82500 100644
>> > --- a/libitm/configure
>> > +++ b/libitm/configure
>> > @@ -6494,7 +6494,7 @@ irix5* | irix6* | nonstopux*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    lt_cv_deplibs_check_method=pass_all
>> >    ;;
>> >
>> > @@ -8981,7 +8981,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>> >        lt_prog_compiler_static='-non_shared'
>> >        ;;
>> >
>> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >        case $cc_basename in
>> >        # old Intel for x86_64 which still supported -KPIC.
>> >        ecc*)
>> > @@ -9576,7 +9576,7 @@ _LT_EOF
>> >        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>> >        ;;
>> >
>> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >        tmp_diet=no
>> >        if test "$host_os" = linux-dietlibc; then
>> >       case $cc_basename in
>> > @@ -11107,7 +11107,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > @@ -13008,7 +13008,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
>> >          inherit_rpath_CXX=yes
>> >          ;;
>> >
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >          case $cc_basename in
>> >            KCC*)
>> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
>> > @@ -13595,7 +13595,7 @@ interix[3-9]*)
>> >    postdeps_CXX=
>> >    ;;
>> >
>> > -linux*)
>> > +linux* | uclinux*)
>> >    case `$CC -V 2>&1 | sed 5q` in
>> >    *Sun\ C*)
>> >      # Sun C++ 5.9
>> > @@ -13846,7 +13846,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>> >           ;;
>> >       esac
>> >       ;;
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >       case $cc_basename in
>> >         KCC*)
>> >           # KAI C++ Compiler
>> > @@ -14767,7 +14767,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > @@ -16239,7 +16239,7 @@ fi
>> >
>> >
>> >  case "$target" in
>> > -  *-linux*)
>> > +  *-linux* | *-uclinux*)
>> >      case "$enable_linux_futex" in
>> >        default)
>> >       # If headers don't have gettid/futex syscalls definition, then
>> > @@ -16362,7 +16362,7 @@ _ACEOF
>> >  if ac_fn_c_try_link "$LINENO"; then :
>> >    chktls_save_LDFLAGS="$LDFLAGS"
>> >                         case $host in
>> > -         *-*-linux*)
>> > +         *-*-linux* | -*-uclinux*)
>> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>> >             ;;
>> >         esac
>> > diff --git a/libitm/configure.tgt b/libitm/configure.tgt
>> > index 0cbb097..bc6c3ca 100644
>> > --- a/libitm/configure.tgt
>> > +++ b/libitm/configure.tgt
>> > @@ -127,7 +127,7 @@ config_path="$ARCH posix generic"
>> >
>> >  # Other system configury
>> >  case "${target}" in
>> > -  *-*-linux*)
>> > +  *-*-linux* | *-*-uclinux*)
>> >       if test "$enable_linux_futex" = yes; then
>> >         config_path="linux/$ARCH linux $config_path"
>> >       fi
>> > diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>> > index 6d68e90..2e18049 100644
>> > --- a/libstdc++-v3/acinclude.m4
>> > +++ b/libstdc++-v3/acinclude.m4
>> > @@ -1395,7 +1395,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
>> >          ac_has_nanosleep=yes
>> >          ac_has_sched_yield=yes
>> >          ;;
>> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >          AC_MSG_CHECKING([for at least GNU libc 2.17])
>> >          AC_TRY_COMPILE(
>> >            [#include <features.h>],
>> > @@ -1517,7 +1517,7 @@ AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
>> >
>> >    if test x"$ac_has_clock_monotonic" != x"yes"; then
>> >      case ${target_os} in
>> > -      linux*)
>> > +      linux* | uclinux*)
>> >       AC_MSG_CHECKING([for clock_gettime syscall])
>> >       AC_TRY_COMPILE(
>> >         [#include <unistd.h>
>> > @@ -2402,7 +2402,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
>> >    # Default to "generic".
>> >    if test $enable_clocale_flag = auto; then
>> >      case ${target_os} in
>> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >       enable_clocale_flag=gnu
>> >       ;;
>> >        darwin*)
>> > @@ -2648,7 +2648,7 @@ AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
>> >    # Default to "new".
>> >    if test $enable_libstdcxx_allocator_flag = auto; then
>> >      case ${target_os} in
>> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >       enable_libstdcxx_allocator_flag=new
>> >       ;;
>> >        *)
>> > @@ -4282,7 +4282,7 @@ AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
>> >        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
>> >          enable_libstdcxx_filesystem_ts=yes
>> >          ;;
>> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >          enable_libstdcxx_filesystem_ts=yes
>> >          ;;
>> >        rtems*)
>> > @@ -4430,7 +4430,7 @@ dnl
>> >      AC_MSG_CHECKING([for sendfile that can copy files])
>> >      AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
>> >        case "${target_os}" in
>> > -        gnu* | linux* | solaris*)
>> > +        gnu* | linux* | solaris* | uclinux*)
>> >            GCC_TRY_COMPILE_OR_LINK(
>> >              [#include <sys/sendfile.h>],
>> >              [sendfile(1, 2, (off_t*)0, sizeof 1);],
>> > diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
>> > index d33081d..7780679 100755
>> > --- a/libstdc++-v3/configure
>> > +++ b/libstdc++-v3/configure
>> > @@ -6413,7 +6413,7 @@ irix5* | irix6* | nonstopux*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    lt_cv_deplibs_check_method=pass_all
>> >    ;;
>> >
>> > @@ -8765,7 +8765,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>> >        lt_prog_compiler_static='-non_shared'
>> >        ;;
>> >
>> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >        case $cc_basename in
>> >        # old Intel for x86_64 which still supported -KPIC.
>> >        ecc*)
>> > @@ -9360,7 +9360,7 @@ _LT_EOF
>> >        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>> >        ;;
>> >
>> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >        tmp_diet=no
>> >        if test "$host_os" = linux-dietlibc; then
>> >       case $cc_basename in
>> > @@ -10900,7 +10900,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > @@ -12825,7 +12825,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
>> >          inherit_rpath_CXX=yes
>> >          ;;
>> >
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >          case $cc_basename in
>> >            KCC*)
>> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
>> > @@ -13412,7 +13412,7 @@ interix[3-9]*)
>> >    postdeps_CXX=
>> >    ;;
>> >
>> > -linux*)
>> > +linux* | uclinux*)
>> >    case `$CC -V 2>&1 | sed 5q` in
>> >    *Sun\ C*)
>> >      # Sun C++ 5.9
>> > @@ -13663,7 +13663,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
>> >           ;;
>> >       esac
>> >       ;;
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >       case $cc_basename in
>> >         KCC*)
>> >           # KAI C++ Compiler
>> > @@ -14584,7 +14584,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > @@ -15833,7 +15833,7 @@ fi
>> >    # Default to "generic".
>> >    if test $enable_clocale_flag = auto; then
>> >      case ${target_os} in
>> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >       enable_clocale_flag=gnu
>> >       ;;
>> >        darwin*)
>> > @@ -16250,7 +16250,7 @@ fi
>> >    # Default to "new".
>> >    if test $enable_libstdcxx_allocator_flag = auto; then
>> >      case ${target_os} in
>> > -      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >       enable_libstdcxx_allocator_flag=new
>> >       ;;
>> >        *)
>> > @@ -20526,7 +20526,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
>> >          ac_has_nanosleep=yes
>> >          ac_has_sched_yield=yes
>> >          ;;
>> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at least GNU libc 2.17" >&5
>> >  $as_echo_n "checking for at least GNU libc 2.17... " >&6; }
>> >          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>> > @@ -21026,7 +21026,7 @@ $as_echo "$ac_has_nanosleep" >&6; }
>> >
>> >    if test x"$ac_has_clock_monotonic" != x"yes"; then
>> >      case ${target_os} in
>> > -      linux*)
>> > +      linux* | uclinux*)
>> >       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall" >&5
>> >  $as_echo_n "checking for clock_gettime syscall... " >&6; }
>> >       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>> > @@ -27918,7 +27918,7 @@ _ACEOF
>> >  if ac_fn_c_try_link "$LINENO"; then :
>> >    chktls_save_LDFLAGS="$LDFLAGS"
>> >                         case $host in
>> > -         *-*-linux*)
>> > +         *-*-linux* | -*-uclinux*)
>> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>> >             ;;
>> >         esac
>> > @@ -53578,7 +53578,7 @@ _ACEOF
>> >  if ac_fn_c_try_link "$LINENO"; then :
>> >    chktls_save_LDFLAGS="$LDFLAGS"
>> >                         case $host in
>> > -         *-*-linux*)
>> > +         *-*-linux* | -*-uclinux*)
>> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>> >             ;;
>> >         esac
>> > @@ -59771,7 +59771,7 @@ _ACEOF
>> >  if ac_fn_c_try_link "$LINENO"; then :
>> >    chktls_save_LDFLAGS="$LDFLAGS"
>> >                         case $host in
>> > -         *-*-linux*)
>> > +         *-*-linux* | -*-uclinux*)
>> >             LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
>> >             ;;
>> >         esac
>> > @@ -78397,7 +78397,7 @@ fi
>> >
>> >
>> >  case "$target" in
>> > -  *-linux*)
>> > +  *-linux* | *-uclinux*)
>> >      case "$enable_linux_futex" in
>> >        default)
>> >       # If headers don't have gettid/futex syscalls definition, then
>> > @@ -80033,7 +80033,7 @@ $as_echo_n "checking whether to build Filesystem TS support... " >&6; }
>> >        freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
>> >          enable_libstdcxx_filesystem_ts=yes
>> >          ;;
>> > -      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
>> > +      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
>> >          enable_libstdcxx_filesystem_ts=yes
>> >          ;;
>> >        rtems*)
>> > @@ -80457,7 +80457,7 @@ $as_echo_n "checking for sendfile that can copy files... " >&6; }
>> >    $as_echo_n "(cached) " >&6
>> >  else
>> >          case "${target_os}" in
>> > -        gnu* | linux* | solaris*)
>> > +        gnu* | linux* | solaris* | uclinux*)
>> >            if test x$gcc_no_link = xyes; then
>> >    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>> >  /* end confdefs.h.  */
>> > diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
>> > index 155a3cd..1c298ab 100644
>> > --- a/libstdc++-v3/configure.host
>> > +++ b/libstdc++-v3/configure.host
>> > @@ -264,7 +264,7 @@ case "${host_os}" in
>> >    linux-musl*)
>> >      os_include_dir="os/generic"
>> >      ;;
>> > -  gnu* | linux* | kfreebsd*-gnu)
>> > +  gnu* | linux* | kfreebsd*-gnu | uclinux*)
>> >      if [ "$uclibc" = "yes" ]; then
>> >        os_include_dir="os/uclibc"
>> >      elif [ "$bionic" = "yes" ]; then
>> > @@ -327,7 +327,7 @@ esac
>> >  # Set any OS-dependent and CPU-dependent bits.
>> >  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
>> >  case "${host}" in
>> > -  *-*-linux*)
>> > +  *-*-linux* | *-*-uclinux*)
>> >      case "${host_cpu}" in
>> >        i[567]86)
>> >          abi_baseline_pair=i486-linux-gnu
>> > @@ -358,7 +358,7 @@ case "${host}" in
>> >          fi
>> >      esac
>> >      case "${host}" in
>> > -      arm*-*-linux-*)
>> > +      arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
>> >       port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
>> >       ;;
>> >      esac
>> > diff --git a/libtool.m4 b/libtool.m4
>> > index 940faaa..49ab293 100644
>> > --- a/libtool.m4
>> > +++ b/libtool.m4
>> > @@ -2449,7 +2449,7 @@ linux*oldld* | linux*aout* | linux*coff*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    version_type=linux
>> >    need_lib_prefix=no
>> >    need_version=no
>> > @@ -3089,7 +3089,7 @@ irix5* | irix6* | nonstopux*)
>> >    ;;
>> >
>> >  # This must be Linux ELF.
>> > -linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >    lt_cv_deplibs_check_method=pass_all
>> >    ;;
>> >
>> > @@ -3734,7 +3734,7 @@ m4_if([$1], [CXX], [
>> >           ;;
>> >       esac
>> >       ;;
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >       case $cc_basename in
>> >         KCC*)
>> >           # KAI C++ Compiler
>> > @@ -4032,7 +4032,7 @@ m4_if([$1], [CXX], [
>> >        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
>> >        ;;
>> >
>> > -    linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinux*)
>> >        case $cc_basename in
>> >        # old Intel for x86_64 which still supported -KPIC.
>> >        ecc*)
>> > @@ -4449,7 +4449,7 @@ _LT_EOF
>> >        _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
>> >        ;;
>> >
>> > -    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >        tmp_diet=no
>> >        if test "$host_os" = linux-dietlibc; then
>> >       case $cc_basename in
>> > @@ -5946,7 +5946,7 @@ if test "$_lt_caught_CXX_error" != yes; then
>> >          _LT_TAGVAR(inherit_rpath, $1)=yes
>> >          ;;
>> >
>> > -      linux* | k*bsd*-gnu | kopensolaris*-gnu)
>> > +      linux* | k*bsd*-gnu | kopensolaris*-gnu | uclinuxfdpiceabi)
>> >          case $cc_basename in
>> >            KCC*)
>> >           # Kuck and Associates, Inc. (KAI) C++ Compiler
>> > @@ -6598,7 +6598,7 @@ interix[[3-9]]*)
>> >    _LT_TAGVAR(postdeps,$1)=
>> >    ;;
>> >
>> > -linux*)
>> > +linux* | uclinux*)
>> >    case `$CC -V 2>&1 | sed 5q` in
>> >    *Sun\ C*)
>> >      # Sun C++ 5.9
>> >
>>

[-- Attachment #2: xtensa-regressions.txt --]
[-- Type: text/plain, Size: 23659 bytes --]

# Comparing directories
## Dir1=mygcc.ref/: 3 sum files
## Dir2=mygcc: 3 sum files

# Comparing 3 common sum files
## /bin/sh ../GCC/sources/gcc-fsf/trunk/contrib/compare_tests  /tmp/gxx-sum1.24781 /tmp/gxx-sum2.24781
Tests that now fail, but worked before (54 tests):

20_util/hash/chi2_q_bit_flip_set.cc execution test
20_util/hash/quality.cc execution test
26_numerics/random/discrete_distribution/operators/values.cc execution test
30_threads/async/42819.cc execution test
30_threads/async/any.cc execution test
30_threads/async/sync.cc execution test
30_threads/call_once/49668.cc execution test
30_threads/call_once/call_once1.cc execution test
30_threads/call_once/dr2442.cc execution test
30_threads/condition_variable/cons/1.cc execution test
30_threads/condition_variable/members/1.cc execution test
30_threads/condition_variable/members/2.cc execution test
30_threads/condition_variable/members/68519.cc execution test
30_threads/condition_variable_any/cond.cc execution test
30_threads/condition_variable_any/cons/1.cc execution test
30_threads/condition_variable_any/members/1.cc execution test
30_threads/condition_variable_any/members/2.cc execution test
30_threads/future/members/45133.cc execution test
30_threads/future/members/get.cc execution test
30_threads/future/members/get2.cc execution test
30_threads/future/members/share.cc execution test
30_threads/future/members/valid.cc execution test
30_threads/future/members/wait_for.cc execution test
30_threads/future/members/wait_until.cc execution test
30_threads/lock/4.cc execution test
30_threads/packaged_task/49668.cc execution test
30_threads/packaged_task/cons/alloc.cc execution test
30_threads/packaged_task/members/get_future.cc execution test
30_threads/packaged_task/members/invoke.cc execution test
30_threads/packaged_task/members/invoke2.cc execution test
30_threads/packaged_task/members/invoke3.cc execution test
30_threads/packaged_task/members/invoke4.cc execution test
30_threads/packaged_task/members/reset2.cc execution test
30_threads/promise/cons/alloc.cc execution test
30_threads/promise/cons/move.cc execution test
30_threads/promise/cons/move_assign.cc execution test
30_threads/promise/members/at_thread_exit2.cc execution test
30_threads/promise/members/get_future.cc execution test
30_threads/promise/members/set_exception.cc execution test
30_threads/promise/members/set_exception2.cc execution test
30_threads/promise/members/set_value.cc execution test
30_threads/promise/members/set_value2.cc execution test
30_threads/promise/members/set_value3.cc execution test
30_threads/promise/members/swap.cc execution test
30_threads/shared_future/members/get.cc execution test
30_threads/shared_future/members/get2.cc execution test
30_threads/shared_future/members/valid.cc execution test
30_threads/shared_future/members/wait_for.cc execution test
30_threads/shared_future/members/wait_until.cc execution test
30_threads/timed_mutex/try_lock/2.cc execution test
30_threads/timed_mutex/try_lock_until/2.cc execution test
30_threads/try_lock/2.cc execution test
30_threads/try_lock/4.cc execution test
abi/demangle/regression/cw-07.cc execution test

Tests that now work, but didn't before (2 tests):

23_containers/map/requirements/exception/propagation_consistent.cc execution test
ext/mt_allocator/deallocate_global_thread-3.cc execution test

New tests that FAIL (4 tests):

27_io/filesystem/path/native/string.cc (test for excess errors)
30_threads/condition_variable_any/50862.cc execution test
30_threads/condition_variable_any/53830.cc execution test
experimental/filesystem/path/native/string.cc (test for excess errors)

New tests that PASS (301 tests):

27_io/basic_filebuf/open/char/path.cc (test for excess errors)
27_io/basic_filebuf/open/char/path.cc execution test
27_io/basic_fstream/cons/char/path.cc (test for excess errors)
27_io/basic_fstream/cons/char/path.cc execution test
27_io/basic_fstream/open/char/path.cc (test for excess errors)
27_io/basic_fstream/open/char/path.cc execution test
27_io/basic_ifstream/cons/char/path.cc (test for excess errors)
27_io/basic_ifstream/cons/char/path.cc execution test
27_io/basic_ifstream/open/char/path.cc (test for excess errors)
27_io/basic_ifstream/open/char/path.cc execution test
27_io/basic_ofstream/cons/char/path.cc (test for excess errors)
27_io/basic_ofstream/cons/char/path.cc execution test
27_io/basic_ofstream/open/char/path.cc (test for excess errors)
27_io/basic_ofstream/open/char/path.cc execution test
27_io/filesystem/directory_entry/86597.cc (test for excess errors)
27_io/filesystem/directory_entry/86597.cc execution test
27_io/filesystem/file_status/1.cc (test for excess errors)
27_io/filesystem/file_status/1.cc execution test
27_io/filesystem/iterators/directory_iterator.cc (test for excess errors)
27_io/filesystem/iterators/directory_iterator.cc execution test
27_io/filesystem/iterators/pop.cc (test for excess errors)
27_io/filesystem/iterators/pop.cc execution test
27_io/filesystem/iterators/recursive_directory_iterator.cc (test for excess errors)
27_io/filesystem/iterators/recursive_directory_iterator.cc execution test
27_io/filesystem/operations/absolute.cc (test for excess errors)
27_io/filesystem/operations/absolute.cc execution test
27_io/filesystem/operations/canonical.cc (test for excess errors)
27_io/filesystem/operations/canonical.cc execution test
27_io/filesystem/operations/copy.cc (test for excess errors)
27_io/filesystem/operations/copy.cc execution test
27_io/filesystem/operations/copy_file.cc (test for excess errors)
27_io/filesystem/operations/copy_file.cc execution test
27_io/filesystem/operations/create_directories.cc (test for excess errors)
27_io/filesystem/operations/create_directories.cc execution test
27_io/filesystem/operations/create_directory.cc (test for excess errors)
27_io/filesystem/operations/create_directory.cc execution test
27_io/filesystem/operations/create_symlink.cc (test for excess errors)
27_io/filesystem/operations/create_symlink.cc execution test
27_io/filesystem/operations/current_path.cc (test for excess errors)
27_io/filesystem/operations/current_path.cc execution test
27_io/filesystem/operations/equivalent.cc (test for excess errors)
27_io/filesystem/operations/equivalent.cc execution test
27_io/filesystem/operations/exists.cc (test for excess errors)
27_io/filesystem/operations/exists.cc execution test
27_io/filesystem/operations/file_size.cc (test for excess errors)
27_io/filesystem/operations/file_size.cc execution test
27_io/filesystem/operations/is_empty.cc (test for excess errors)
27_io/filesystem/operations/is_empty.cc execution test
27_io/filesystem/operations/last_write_time.cc (test for excess errors)
27_io/filesystem/operations/last_write_time.cc execution test
27_io/filesystem/operations/permissions.cc (test for excess errors)
27_io/filesystem/operations/permissions.cc execution test
27_io/filesystem/operations/proximate.cc (test for excess errors)
27_io/filesystem/operations/proximate.cc execution test
27_io/filesystem/operations/read_symlink.cc (test for excess errors)
27_io/filesystem/operations/read_symlink.cc execution test
27_io/filesystem/operations/relative.cc (test for excess errors)
27_io/filesystem/operations/relative.cc execution test
27_io/filesystem/operations/remove.cc (test for excess errors)
27_io/filesystem/operations/remove.cc execution test
27_io/filesystem/operations/remove_all.cc (test for excess errors)
27_io/filesystem/operations/remove_all.cc execution test
27_io/filesystem/operations/space.cc (test for excess errors)
27_io/filesystem/operations/space.cc execution test
27_io/filesystem/operations/status.cc (test for excess errors)
27_io/filesystem/operations/status.cc execution test
27_io/filesystem/operations/symlink_status.cc (test for excess errors)
27_io/filesystem/operations/symlink_status.cc execution test
27_io/filesystem/operations/temp_directory_path.cc (test for excess errors)
27_io/filesystem/operations/temp_directory_path.cc execution test
27_io/filesystem/operations/weakly_canonical.cc (test for excess errors)
27_io/filesystem/operations/weakly_canonical.cc execution test
27_io/filesystem/path/append/path.cc (test for excess errors)
27_io/filesystem/path/append/path.cc execution test
27_io/filesystem/path/append/source.cc (test for excess errors)
27_io/filesystem/path/append/source.cc execution test
27_io/filesystem/path/assign/assign.cc (test for excess errors)
27_io/filesystem/path/assign/assign.cc execution test
27_io/filesystem/path/assign/copy.cc (test for excess errors)
27_io/filesystem/path/assign/copy.cc execution test
27_io/filesystem/path/compare/compare.cc (test for excess errors)
27_io/filesystem/path/compare/compare.cc execution test
27_io/filesystem/path/compare/path.cc (test for excess errors)
27_io/filesystem/path/compare/path.cc execution test
27_io/filesystem/path/compare/strings.cc (test for excess errors)
27_io/filesystem/path/compare/strings.cc execution test
27_io/filesystem/path/concat/path.cc (test for excess errors)
27_io/filesystem/path/concat/path.cc execution test
27_io/filesystem/path/concat/strings.cc (test for excess errors)
27_io/filesystem/path/concat/strings.cc execution test
27_io/filesystem/path/construct/copy.cc (test for excess errors)
27_io/filesystem/path/construct/copy.cc execution test
27_io/filesystem/path/construct/default.cc (test for excess errors)
27_io/filesystem/path/construct/default.cc execution test
27_io/filesystem/path/construct/format.cc (test for excess errors)
27_io/filesystem/path/construct/format.cc execution test
27_io/filesystem/path/construct/locale.cc (test for excess errors)
27_io/filesystem/path/construct/locale.cc execution test
27_io/filesystem/path/construct/range.cc (test for excess errors)
27_io/filesystem/path/construct/range.cc execution test
27_io/filesystem/path/construct/string_view.cc (test for excess errors)
27_io/filesystem/path/construct/string_view.cc execution test
27_io/filesystem/path/decompose/extension.cc (test for excess errors)
27_io/filesystem/path/decompose/extension.cc execution test
27_io/filesystem/path/decompose/filename.cc (test for excess errors)
27_io/filesystem/path/decompose/filename.cc execution test
27_io/filesystem/path/decompose/parent_path.cc (test for excess errors)
27_io/filesystem/path/decompose/parent_path.cc execution test
27_io/filesystem/path/decompose/relative_path.cc (test for excess errors)
27_io/filesystem/path/decompose/relative_path.cc execution test
27_io/filesystem/path/decompose/root_directory.cc (test for excess errors)
27_io/filesystem/path/decompose/root_directory.cc execution test
27_io/filesystem/path/decompose/root_name.cc (test for excess errors)
27_io/filesystem/path/decompose/root_name.cc execution test
27_io/filesystem/path/decompose/root_path.cc (test for excess errors)
27_io/filesystem/path/decompose/root_path.cc execution test
27_io/filesystem/path/decompose/stem.cc (test for excess errors)
27_io/filesystem/path/decompose/stem.cc execution test
27_io/filesystem/path/generation/normal.cc (test for excess errors)
27_io/filesystem/path/generation/normal.cc execution test
27_io/filesystem/path/generation/proximate.cc (test for excess errors)
27_io/filesystem/path/generation/proximate.cc execution test
27_io/filesystem/path/generation/relative.cc (test for excess errors)
27_io/filesystem/path/generation/relative.cc execution test
27_io/filesystem/path/generic/generic_string.cc (test for excess errors)
27_io/filesystem/path/generic/generic_string.cc execution test
27_io/filesystem/path/itr/components.cc (test for excess errors)
27_io/filesystem/path/itr/components.cc execution test
27_io/filesystem/path/itr/traversal.cc (test for excess errors)
27_io/filesystem/path/itr/traversal.cc execution test
27_io/filesystem/path/modifiers/clear.cc (test for excess errors)
27_io/filesystem/path/modifiers/clear.cc execution test
27_io/filesystem/path/modifiers/make_preferred.cc (test for excess errors)
27_io/filesystem/path/modifiers/make_preferred.cc execution test
27_io/filesystem/path/modifiers/remove_filename.cc (test for excess errors)
27_io/filesystem/path/modifiers/remove_filename.cc execution test
27_io/filesystem/path/modifiers/replace_extension.cc (test for excess errors)
27_io/filesystem/path/modifiers/replace_extension.cc execution test
27_io/filesystem/path/modifiers/replace_filename.cc (test for excess errors)
27_io/filesystem/path/modifiers/replace_filename.cc execution test
27_io/filesystem/path/modifiers/swap.cc (test for excess errors)
27_io/filesystem/path/modifiers/swap.cc execution test
27_io/filesystem/path/nonmember/append.cc (test for excess errors)
27_io/filesystem/path/nonmember/append.cc execution test
27_io/filesystem/path/nonmember/hash_value.cc (test for excess errors)
27_io/filesystem/path/nonmember/hash_value.cc execution test
27_io/filesystem/path/query/empty.cc (test for excess errors)
27_io/filesystem/path/query/empty.cc execution test
27_io/filesystem/path/query/has_extension.cc (test for excess errors)
27_io/filesystem/path/query/has_extension.cc execution test
27_io/filesystem/path/query/has_filename.cc (test for excess errors)
27_io/filesystem/path/query/has_filename.cc execution test
27_io/filesystem/path/query/has_parent_path.cc (test for excess errors)
27_io/filesystem/path/query/has_parent_path.cc execution test
27_io/filesystem/path/query/has_relative_path.cc (test for excess errors)
27_io/filesystem/path/query/has_relative_path.cc execution test
27_io/filesystem/path/query/has_root_directory.cc (test for excess errors)
27_io/filesystem/path/query/has_root_directory.cc execution test
27_io/filesystem/path/query/has_root_name.cc (test for excess errors)
27_io/filesystem/path/query/has_root_name.cc execution test
27_io/filesystem/path/query/has_root_path.cc (test for excess errors)
27_io/filesystem/path/query/has_root_path.cc execution test
27_io/filesystem/path/query/has_stem.cc (test for excess errors)
27_io/filesystem/path/query/has_stem.cc execution test
27_io/filesystem/path/query/is_absolute.cc (test for excess errors)
27_io/filesystem/path/query/is_absolute.cc execution test
27_io/filesystem/path/query/is_relative.cc (test for excess errors)
27_io/filesystem/path/query/is_relative.cc execution test
30_threads/condition_variable_any/50862.cc (test for excess errors)
30_threads/condition_variable_any/53830.cc (test for excess errors)
experimental/filesystem/file_status/1.cc (test for excess errors)
experimental/filesystem/file_status/1.cc execution test
experimental/filesystem/iterators/directory_iterator.cc (test for excess errors)
experimental/filesystem/iterators/directory_iterator.cc execution test
experimental/filesystem/iterators/pop.cc (test for excess errors)
experimental/filesystem/iterators/pop.cc execution test
experimental/filesystem/iterators/recursive_directory_iterator.cc (test for excess errors)
experimental/filesystem/iterators/recursive_directory_iterator.cc execution test
experimental/filesystem/operations/absolute.cc (test for excess errors)
experimental/filesystem/operations/absolute.cc execution test
experimental/filesystem/operations/canonical.cc (test for excess errors)
experimental/filesystem/operations/canonical.cc execution test
experimental/filesystem/operations/copy.cc (test for excess errors)
experimental/filesystem/operations/copy.cc execution test
experimental/filesystem/operations/copy_file.cc (test for excess errors)
experimental/filesystem/operations/copy_file.cc execution test
experimental/filesystem/operations/create_directories.cc (test for excess errors)
experimental/filesystem/operations/create_directories.cc execution test
experimental/filesystem/operations/create_directory.cc (test for excess errors)
experimental/filesystem/operations/create_directory.cc execution test
experimental/filesystem/operations/create_symlink.cc (test for excess errors)
experimental/filesystem/operations/create_symlink.cc execution test
experimental/filesystem/operations/current_path.cc (test for excess errors)
experimental/filesystem/operations/current_path.cc execution test
experimental/filesystem/operations/equivalent.cc (test for excess errors)
experimental/filesystem/operations/equivalent.cc execution test
experimental/filesystem/operations/exists.cc (test for excess errors)
experimental/filesystem/operations/exists.cc execution test
experimental/filesystem/operations/file_size.cc (test for excess errors)
experimental/filesystem/operations/file_size.cc execution test
experimental/filesystem/operations/is_empty.cc (test for excess errors)
experimental/filesystem/operations/is_empty.cc execution test
experimental/filesystem/operations/last_write_time.cc (test for excess errors)
experimental/filesystem/operations/last_write_time.cc execution test
experimental/filesystem/operations/permissions.cc (test for excess errors)
experimental/filesystem/operations/permissions.cc execution test
experimental/filesystem/operations/read_symlink.cc (test for excess errors)
experimental/filesystem/operations/read_symlink.cc execution test
experimental/filesystem/operations/remove.cc (test for excess errors)
experimental/filesystem/operations/remove.cc execution test
experimental/filesystem/operations/remove_all.cc (test for excess errors)
experimental/filesystem/operations/remove_all.cc execution test
experimental/filesystem/operations/space.cc (test for excess errors)
experimental/filesystem/operations/space.cc execution test
experimental/filesystem/operations/status.cc (test for excess errors)
experimental/filesystem/operations/status.cc execution test
experimental/filesystem/operations/temp_directory_path.cc (test for excess errors)
experimental/filesystem/operations/temp_directory_path.cc execution test
experimental/filesystem/path/append/path.cc (test for excess errors)
experimental/filesystem/path/append/path.cc execution test
experimental/filesystem/path/assign/assign.cc (test for excess errors)
experimental/filesystem/path/assign/assign.cc execution test
experimental/filesystem/path/assign/copy.cc (test for excess errors)
experimental/filesystem/path/assign/copy.cc execution test
experimental/filesystem/path/compare/compare.cc (test for excess errors)
experimental/filesystem/path/compare/compare.cc execution test
experimental/filesystem/path/compare/path.cc (test for excess errors)
experimental/filesystem/path/compare/path.cc execution test
experimental/filesystem/path/compare/strings.cc (test for excess errors)
experimental/filesystem/path/compare/strings.cc execution test
experimental/filesystem/path/concat/path.cc (test for excess errors)
experimental/filesystem/path/concat/path.cc execution test
experimental/filesystem/path/concat/strings.cc (test for excess errors)
experimental/filesystem/path/concat/strings.cc execution test
experimental/filesystem/path/construct/copy.cc (test for excess errors)
experimental/filesystem/path/construct/copy.cc execution test
experimental/filesystem/path/construct/default.cc (test for excess errors)
experimental/filesystem/path/construct/default.cc execution test
experimental/filesystem/path/construct/locale.cc (test for excess errors)
experimental/filesystem/path/construct/locale.cc execution test
experimental/filesystem/path/construct/range.cc (test for excess errors)
experimental/filesystem/path/construct/range.cc execution test
experimental/filesystem/path/construct/string_view.cc (test for excess errors)
experimental/filesystem/path/construct/string_view.cc execution test
experimental/filesystem/path/decompose/extension.cc (test for excess errors)
experimental/filesystem/path/decompose/extension.cc execution test
experimental/filesystem/path/decompose/filename.cc (test for excess errors)
experimental/filesystem/path/decompose/filename.cc execution test
experimental/filesystem/path/decompose/parent_path.cc (test for excess errors)
experimental/filesystem/path/decompose/parent_path.cc execution test
experimental/filesystem/path/decompose/relative_path.cc (test for excess errors)
experimental/filesystem/path/decompose/relative_path.cc execution test
experimental/filesystem/path/decompose/root_directory.cc (test for excess errors)
experimental/filesystem/path/decompose/root_directory.cc execution test
experimental/filesystem/path/decompose/root_name.cc (test for excess errors)
experimental/filesystem/path/decompose/root_name.cc execution test
experimental/filesystem/path/decompose/root_path.cc (test for excess errors)
experimental/filesystem/path/decompose/root_path.cc execution test
experimental/filesystem/path/decompose/stem.cc (test for excess errors)
experimental/filesystem/path/decompose/stem.cc execution test
experimental/filesystem/path/generic/generic_string.cc (test for excess errors)
experimental/filesystem/path/generic/generic_string.cc execution test
experimental/filesystem/path/itr/traversal.cc (test for excess errors)
experimental/filesystem/path/itr/traversal.cc execution test
experimental/filesystem/path/modifiers/clear.cc (test for excess errors)
experimental/filesystem/path/modifiers/clear.cc execution test
experimental/filesystem/path/modifiers/make_preferred.cc (test for excess errors)
experimental/filesystem/path/modifiers/make_preferred.cc execution test
experimental/filesystem/path/modifiers/remove_filename.cc (test for excess errors)
experimental/filesystem/path/modifiers/remove_filename.cc execution test
experimental/filesystem/path/modifiers/replace_extension.cc (test for excess errors)
experimental/filesystem/path/modifiers/replace_extension.cc execution test
experimental/filesystem/path/modifiers/replace_filename.cc (test for excess errors)
experimental/filesystem/path/modifiers/replace_filename.cc execution test
experimental/filesystem/path/modifiers/swap.cc (test for excess errors)
experimental/filesystem/path/modifiers/swap.cc execution test
experimental/filesystem/path/nonmember/hash_value.cc (test for excess errors)
experimental/filesystem/path/nonmember/hash_value.cc execution test
experimental/filesystem/path/preferred_separator.cc (test for excess errors)
experimental/filesystem/path/query/empty.cc (test for excess errors)
experimental/filesystem/path/query/empty.cc execution test
experimental/filesystem/path/query/has_extension.cc (test for excess errors)
experimental/filesystem/path/query/has_extension.cc execution test
experimental/filesystem/path/query/has_filename.cc (test for excess errors)
experimental/filesystem/path/query/has_filename.cc execution test
experimental/filesystem/path/query/has_parent_path.cc (test for excess errors)
experimental/filesystem/path/query/has_parent_path.cc execution test
experimental/filesystem/path/query/has_relative_path.cc (test for excess errors)
experimental/filesystem/path/query/has_relative_path.cc execution test
experimental/filesystem/path/query/has_root_directory.cc (test for excess errors)
experimental/filesystem/path/query/has_root_directory.cc execution test
experimental/filesystem/path/query/has_root_name.cc (test for excess errors)
experimental/filesystem/path/query/has_root_name.cc execution test
experimental/filesystem/path/query/has_root_path.cc (test for excess errors)
experimental/filesystem/path/query/has_root_path.cc execution test
experimental/filesystem/path/query/has_stem.cc (test for excess errors)
experimental/filesystem/path/query/has_stem.cc execution test
experimental/filesystem/path/query/is_absolute.cc (test for excess errors)
experimental/filesystem/path/query/is_absolute.cc execution test
experimental/filesystem/path/query/is_relative.cc (test for excess errors)
experimental/filesystem/path/query/is_relative.cc execution test

## Differences found: 
# 1 differences in 3 common sum files found

^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2018-11-09 12:31 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
2018-10-12 10:14   ` Richard Earnshaw (lists)
2018-10-15  8:46     ` Christophe Lyon
2018-11-09 12:31       ` Christophe Lyon
2018-10-11 13:36 ` [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support Christophe Lyon
2018-10-12 10:01   ` Richard Earnshaw (lists)
2018-10-17  8:13     ` Sandra Loosemore
2018-10-11 13:37 ` [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation Christophe Lyon
2018-10-12 11:29   ` Richard Earnshaw (lists)
2018-10-11 13:37 ` [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided Christophe Lyon
2018-10-12 10:46   ` Richard Earnshaw (lists)
2018-10-15 10:35     ` Christophe Lyon
2018-10-23 15:01       ` Richard Earnshaw (lists)
2018-10-23 15:42         ` Segher Boessenkool
2018-10-26 15:33           ` Christophe Lyon
2018-10-29 14:25             ` Christophe Lyon
2018-10-29 23:15               ` Segher Boessenkool
2018-10-11 13:37 ` [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture Christophe Lyon
2018-10-12 11:02   ` Richard Earnshaw (lists)
2018-10-19 13:57     ` Christophe Lyon
2018-10-23 15:12       ` Richard Earnshaw (lists)
2018-10-26 16:34         ` Christophe Lyon
2018-10-26 16:41           ` Richard Earnshaw (lists)
2018-10-29 10:31             ` Christophe Lyon
2018-10-11 13:38 ` [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions Christophe Lyon
2018-10-12 11:54   ` Richard Earnshaw (lists)
2018-10-15 14:22     ` Christophe Lyon
2018-10-11 13:38 ` [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors Christophe Lyon
2018-10-12 12:39   ` Richard Earnshaw (lists)
2018-10-11 13:38 ` [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO Christophe Lyon
2018-10-12 12:21   ` Richard Earnshaw (lists)
2018-10-15 14:30     ` Christophe Lyon
2018-10-11 13:39 ` [ARM/FDPIC v3 11/21] [ARM] FDPIC: Add support to unwind FDPIC signal frame Christophe Lyon
2018-10-11 13:39 ` [ARM/FDPIC v3 09/21] [ARM] FDPIC: Add support for taking address of nested function Christophe Lyon
2018-10-11 13:39 ` [ARM/FDPIC v3 10/21] [ARM] FDPIC: Implement TLS support Christophe Lyon
2018-10-11 13:40 ` [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp Christophe Lyon
2018-10-19 14:02   ` Christophe Lyon
2018-10-11 13:40 ` [ARM/FDPIC v3 13/21] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 16/21] [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently produce an ICE Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 14/21] [ARM][testsuite] FDPIC: Skip unsupported tests Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 15/21] [ARM][testsuite] FDPIC: Adjust scan-assembler patterns Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 18/21] [ARM][testsuite] FDPIC: Handle *-*-uclinux* Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 19/21] [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 17/21] [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode Christophe Lyon
2018-10-11 13:43 ` [ARM/FDPIC v3 20/21] [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc Christophe Lyon
2018-10-11 13:56 ` [ARM/FDPIC v3 21/21] [ARM][testsuite] FDPIC: Skip tests using architecture older than v7 Christophe Lyon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).