This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH: Add Linux/x32 support to Ada
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 2 Mar 2012 10:44:47 -0800
- Subject: PATCH: Add Linux/x32 support to Ada
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
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.
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