Message ID | 20120302184447.GA27501@intel.com |
---|---|
State | New |
Headers | show |
> 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.
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 --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