diff mbox

PATCH: Add Linux/x32 support to Ada

Message ID 20120302184447.GA27501@intel.com
State New
Headers show

Commit Message

H.J. Lu March 2, 2012, 6:44 p.m. UTC
Hi,

This patch adds Linux/x32 support to Ada.  It sets LIBGNAT_TARGET_PAIRS
similar to Linux/x86-64 and replaces system-linux-x86_64.ads with
system-linux-x86.ads.  It also adds "orl $0x0,(%esp)" check for SIGSEGV
probe and sets __gnat_default_libgcc_subdir to libx32 for x32.  Tested
on Linux/x32 with the following Ada test failures:

FAIL: gnat.dg/curr_task.adb execution test
FAIL: gnat.dg/lto8.adb (test for excess errors)
FAIL: gnat.dg/requeue1.adb execution test
FAIL: gnat.dg/test_image.adb execution test
FAIL: gnat.dg/timer_cancel.adb execution test
FAIL: gnat.dg/specs/addr1.ads  (test for bogus messages, line 24)
FAIL: gnat.dg/specs/addr1.ads (test for excess errors)
FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 9)
FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 13)

OK for trunk?

Thanks.


H.J.
---
2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>

	* init.c (__gnat_adjust_context_for_raise): Also check
	"orq $0x0,(%esp)" for x32.

	* link.c (__gnat_default_libgcc_subdir): set to libx32 for x32.

	* gcc-interface/Makefile.in (arch): Set to x32 if MULTISUBDIR
	is /x32.
	Support x32.

Comments

Eric Botcazou March 3, 2012, 10:31 a.m. UTC | #1
> This patch adds Linux/x32 support to Ada.  It sets LIBGNAT_TARGET_PAIRS
> similar to Linux/x86-64 and replaces system-linux-x86_64.ads with
> system-linux-x86.ads.  It also adds "orl $0x0,(%esp)" check for SIGSEGV
> probe and sets __gnat_default_libgcc_subdir to libx32 for x32.  Tested
> on Linux/x32 with the following Ada test failures:
>
> FAIL: gnat.dg/curr_task.adb execution test
> FAIL: gnat.dg/lto8.adb (test for excess errors)
> FAIL: gnat.dg/requeue1.adb execution test
> FAIL: gnat.dg/test_image.adb execution test
> FAIL: gnat.dg/timer_cancel.adb execution test
> FAIL: gnat.dg/specs/addr1.ads  (test for bogus messages, line 24)
> FAIL: gnat.dg/specs/addr1.ads (test for excess errors)
> FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 9)
> FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 13)

Thanks for working on this.

> 2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>
>
> 	* init.c (__gnat_adjust_context_for_raise): Also check
> 	"orq $0x0,(%esp)" for x32.
>
> 	* link.c (__gnat_default_libgcc_subdir): set to libx32 for x32.
>
> 	* gcc-interface/Makefile.in (arch): Set to x32 if MULTISUBDIR
> 	is /x32.
> 	Support x32.

This looks good to me, modulo the following nits:

> --- a/gcc/ada/init.c
> +++ b/gcc/ada/init.c
> @@ -615,9 +615,16 @@ __gnat_adjust_context_for_raise (int signo
> ATTRIBUTE_UNUSED, void *ucontext) if (signo == SIGSEGV && pc && *pc ==
> 0x00240c83)
>      mcontext->gregs[REG_ESP] += 4096 + 4 * sizeof (unsigned long);
>  #elif defined (__x86_64__)
> -  unsigned long *pc = (unsigned long *)mcontext->gregs[REG_RIP];
> -  /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
> -  if (signo == SIGSEGV && pc && (*pc & 0xffffffffff) == 0x00240c8348)
> +  unsigned long long *pc = (unsigned long long *)mcontext->gregs[REG_RIP];
> +  if (signo == SIGSEGV && pc
> +      /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
> +      && ((*pc & 0xffffffffffLL) == 0x00240c8348LL
> +# ifndef __LP64__
> +      /* The pattern may also be "orl $0x0,(%esp)" for a probe in x32
> +	 mode.  */
> +	  || (*pc & 0xffffffffLL) == 0x00240c83LL
> +# endif
> +	 ))
>      mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long);
>  #elif defined (__ia64__)
>    /* ??? The IA-64 unwinder doesn't compensate for signals.  */

The preprocessor directive is very likely superfluous, let's remove it and just 
add the || thing.

> diff --git a/gcc/ada/link.c b/gcc/ada/link.c
> index 8bcad27..3648878 100644
> --- a/gcc/ada/link.c
> +++ b/gcc/ada/link.c
> @@ -187,7 +187,11 @@ unsigned char __gnat_using_gnu_linker = 1;
>  const char *__gnat_object_library_extension = ".a";
>  unsigned char __gnat_separate_run_path_options = 0;
>  #if defined (__x86_64)
> +# if defined __LP64__
>  const char *__gnat_default_libgcc_subdir = "lib64";
> +# else
> +const char *__gnat_default_libgcc_subdir = "libx32";
> +# endif
>  #else
>  const char *__gnat_default_libgcc_subdir = "lib";
>  #endif

Please follow the existing idiom and write defined (__LP64__) instead.

OK with these changes.
H.J. Lu March 3, 2012, 5:05 p.m. UTC | #2
On Sat, Mar 3, 2012 at 2:31 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> This patch adds Linux/x32 support to Ada.  It sets LIBGNAT_TARGET_PAIRS
>> similar to Linux/x86-64 and replaces system-linux-x86_64.ads with
>> system-linux-x86.ads.  It also adds "orl $0x0,(%esp)" check for SIGSEGV
>> probe and sets __gnat_default_libgcc_subdir to libx32 for x32.  Tested
>> on Linux/x32 with the following Ada test failures:
>>
>> FAIL: gnat.dg/curr_task.adb execution test
>> FAIL: gnat.dg/lto8.adb (test for excess errors)
>> FAIL: gnat.dg/requeue1.adb execution test
>> FAIL: gnat.dg/test_image.adb execution test
>> FAIL: gnat.dg/timer_cancel.adb execution test
>> FAIL: gnat.dg/specs/addr1.ads  (test for bogus messages, line 24)
>> FAIL: gnat.dg/specs/addr1.ads (test for excess errors)
>> FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 9)
>> FAIL: gnat.dg/specs/atomic1.ads  (test for errors, line 13)
>
> Thanks for working on this.
>
>> 2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>
>>
>>       * init.c (__gnat_adjust_context_for_raise): Also check
>>       "orq $0x0,(%esp)" for x32.
>>
>>       * link.c (__gnat_default_libgcc_subdir): set to libx32 for x32.
>>
>>       * gcc-interface/Makefile.in (arch): Set to x32 if MULTISUBDIR
>>       is /x32.
>>       Support x32.
>
> This looks good to me, modulo the following nits:
>
>> --- a/gcc/ada/init.c
>> +++ b/gcc/ada/init.c
>> @@ -615,9 +615,16 @@ __gnat_adjust_context_for_raise (int signo
>> ATTRIBUTE_UNUSED, void *ucontext) if (signo == SIGSEGV && pc && *pc ==
>> 0x00240c83)
>>      mcontext->gregs[REG_ESP] += 4096 + 4 * sizeof (unsigned long);
>>  #elif defined (__x86_64__)
>> -  unsigned long *pc = (unsigned long *)mcontext->gregs[REG_RIP];
>> -  /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
>> -  if (signo == SIGSEGV && pc && (*pc & 0xffffffffff) == 0x00240c8348)
>> +  unsigned long long *pc = (unsigned long long *)mcontext->gregs[REG_RIP];
>> +  if (signo == SIGSEGV && pc
>> +      /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
>> +      && ((*pc & 0xffffffffffLL) == 0x00240c8348LL
>> +# ifndef __LP64__
>> +      /* The pattern may also be "orl $0x0,(%esp)" for a probe in x32
>> +      mode.  */
>> +       || (*pc & 0xffffffffLL) == 0x00240c83LL
>> +# endif
>> +      ))
>>      mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long);
>>  #elif defined (__ia64__)
>>    /* ??? The IA-64 unwinder doesn't compensate for signals.  */
>
> The preprocessor directive is very likely superfluous, let's remove it and just
> add the || thing.
>
>> diff --git a/gcc/ada/link.c b/gcc/ada/link.c
>> index 8bcad27..3648878 100644
>> --- a/gcc/ada/link.c
>> +++ b/gcc/ada/link.c
>> @@ -187,7 +187,11 @@ unsigned char __gnat_using_gnu_linker = 1;
>>  const char *__gnat_object_library_extension = ".a";
>>  unsigned char __gnat_separate_run_path_options = 0;
>>  #if defined (__x86_64)
>> +# if defined __LP64__
>>  const char *__gnat_default_libgcc_subdir = "lib64";
>> +# else
>> +const char *__gnat_default_libgcc_subdir = "libx32";
>> +# endif
>>  #else
>>  const char *__gnat_default_libgcc_subdir = "lib";
>>  #endif
>
> Please follow the existing idiom and write defined (__LP64__) instead.
>
> OK with these changes.
>

I checked in the updated change.

Thanks.
diff mbox

Patch

diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
index 5fa6ffa..19d9eb0 100644
--- a/gcc/ada/gcc-interface/Makefile.in
+++ b/gcc/ada/gcc-interface/Makefile.in
@@ -349,6 +349,10 @@  GNATMAKE_OBJS = a-except.o ali.o ali-util.o aspects.o s-casuti.o alloc.o \
 ifeq ($(strip $(filter-out %x86_64, $(arch))),)
   ifeq ($(strip $(MULTISUBDIR)),/32)
     arch:=i686
+  else
+    ifeq ($(strip $(MULTISUBDIR)),/x32)
+      arch:=x32
+    endif
   endif
 endif
 
@@ -2134,6 +2138,43 @@  ifeq ($(strip $(filter-out %x86_64 linux%,$(arch) $(osys))),)
   LIBRARY_VERSION := $(LIB_VERSION)
 endif
 
+ifeq ($(strip $(filter-out %x32 linux%,$(arch) $(osys))),)
+  LIBGNAT_TARGET_PAIRS = \
+  a-exetim.adb<a-exetim-posix.adb \
+  a-exetim.ads<a-exetim-default.ads \
+  a-intnam.ads<a-intnam-linux.ads \
+  a-synbar.adb<a-synbar-posix.adb \
+  a-synbar.ads<a-synbar-posix.ads \
+  s-inmaop.adb<s-inmaop-posix.adb \
+  s-intman.adb<s-intman-posix.adb \
+  s-linux.ads<s-linux.ads \
+  s-mudido.adb<s-mudido-affinity.adb \
+  s-osinte.ads<s-osinte-linux.ads \
+  s-osinte.adb<s-osinte-posix.adb \
+  s-osprim.adb<s-osprim-posix.adb \
+  s-taprop.adb<s-taprop-linux.adb \
+  s-tasinf.ads<s-tasinf-linux.ads \
+  s-tasinf.adb<s-tasinf-linux.adb \
+  s-tpopsp.adb<s-tpopsp-tls.adb \
+  s-taspri.ads<s-taspri-posix.ads \
+  g-sercom.adb<g-sercom-linux.adb \
+  $(ATOMICS_TARGET_PAIRS) \
+  $(X86_64_TARGET_PAIRS) \
+  system.ads<system-linux-x86.ads
+
+  TOOLS_TARGET_PAIRS =  \
+    mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+    indepsw.adb<indepsw-gnu.adb
+
+  EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EH_MECHANISM=-gcc
+  THREADSLIB=-lpthread -lrt
+  GNATLIB_SHARED=gnatlib-shared-dual
+  GMEM_LIB = gmemlib
+  LIBRARY_VERSION := $(LIB_VERSION)
+endif
+
 ifeq ($(strip $(filter-out darwin%,$(osys))),)
   SO_OPTS = -shared-libgcc
   LIBGNAT_TARGET_PAIRS = \
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 18280c2..d125ed1 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -615,9 +615,16 @@  __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, void *ucontext)
   if (signo == SIGSEGV && pc && *pc == 0x00240c83)
     mcontext->gregs[REG_ESP] += 4096 + 4 * sizeof (unsigned long);
 #elif defined (__x86_64__)
-  unsigned long *pc = (unsigned long *)mcontext->gregs[REG_RIP];
-  /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
-  if (signo == SIGSEGV && pc && (*pc & 0xffffffffff) == 0x00240c8348)
+  unsigned long long *pc = (unsigned long long *)mcontext->gregs[REG_RIP];
+  if (signo == SIGSEGV && pc
+      /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode.  */
+      && ((*pc & 0xffffffffffLL) == 0x00240c8348LL
+# ifndef __LP64__
+      /* The pattern may also be "orl $0x0,(%esp)" for a probe in x32
+	 mode.  */
+	  || (*pc & 0xffffffffLL) == 0x00240c83LL
+# endif
+	 ))
     mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long);
 #elif defined (__ia64__)
   /* ??? The IA-64 unwinder doesn't compensate for signals.  */
diff --git a/gcc/ada/link.c b/gcc/ada/link.c
index 8bcad27..3648878 100644
--- a/gcc/ada/link.c
+++ b/gcc/ada/link.c
@@ -187,7 +187,11 @@  unsigned char __gnat_using_gnu_linker = 1;
 const char *__gnat_object_library_extension = ".a";
 unsigned char __gnat_separate_run_path_options = 0;
 #if defined (__x86_64)
+# if defined __LP64__
 const char *__gnat_default_libgcc_subdir = "lib64";
+# else
+const char *__gnat_default_libgcc_subdir = "libx32";
+# endif
 #else
 const char *__gnat_default_libgcc_subdir = "lib";
 #endif