Add Linux/x32 support to Ada
2012-03-03 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. From-SVN: r184859
This commit is contained in:
parent
0e19363724
commit
8b1106fbc3
|
@ -1,3 +1,14 @@
|
|||
2012-03-03 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.
|
||||
|
||||
2012-02-29 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/decl.c (components_to_record): Add ARTIFICIAL parameter
|
||||
|
|
|
@ -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 = \
|
||||
|
|
|
@ -615,9 +615,13 @@ __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
|
||||
/* The pattern may also be "orl $0x0,(%esp)" for a probe in
|
||||
x32 mode. */
|
||||
|| (*pc & 0xffffffffLL) == 0x00240c83LL))
|
||||
mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long);
|
||||
#elif defined (__ia64__)
|
||||
/* ??? The IA-64 unwinder doesn't compensate for signals. */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue