diff options
author | Pavel Chupin <pavel.v.chupin@intel.com> | 2012-11-27 14:09:50 +0400 |
---|---|---|
committer | Pavel Chupin <pavel.v.chupin@intel.com> | 2013-04-18 16:50:12 +0400 |
commit | 9e1f9b3eacb51a67e675cd1195c472215fb16373 (patch) | |
tree | af3f97ee1874e13a5fe5ba61058aba045bbad279 /gcc-4.7/gcc/ada | |
parent | 5d65342898686feb3faceb3beb10529501d67b48 (diff) | |
download | toolchain_gcc-9e1f9b3eacb51a67e675cd1195c472215fb16373.tar.gz toolchain_gcc-9e1f9b3eacb51a67e675cd1195c472215fb16373.tar.bz2 toolchain_gcc-9e1f9b3eacb51a67e675cd1195c472215fb16373.zip |
[4.7] x32: Backport x32 support into 4.7
This patch contains all gcc changes required to build x32 compiler.
They are backported from 4.8/trunk.
Change-Id: I923f639c1f0cee5812b0f555a39bab0bd0723865
Signed-off-by: Pavel Chupin <pavel.v.chupin@intel.com>
Diffstat (limited to 'gcc-4.7/gcc/ada')
-rw-r--r-- | gcc-4.7/gcc/ada/ChangeLog.x32 | 10 | ||||
-rw-r--r-- | gcc-4.7/gcc/ada/gcc-interface/Makefile.in | 41 | ||||
-rw-r--r-- | gcc-4.7/gcc/ada/init.c | 10 | ||||
-rw-r--r-- | gcc-4.7/gcc/ada/link.c | 4 |
4 files changed, 62 insertions, 3 deletions
diff --git a/gcc-4.7/gcc/ada/ChangeLog.x32 b/gcc-4.7/gcc/ada/ChangeLog.x32 new file mode 100644 index 000000000..5d5bca2e3 --- /dev/null +++ b/gcc-4.7/gcc/ada/ChangeLog.x32 @@ -0,0 +1,10 @@ +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. diff --git a/gcc-4.7/gcc/ada/gcc-interface/Makefile.in b/gcc-4.7/gcc/ada/gcc-interface/Makefile.in index f9e7edab3..bf8a06f78 100644 --- a/gcc-4.7/gcc/ada/gcc-interface/Makefile.in +++ b/gcc-4.7/gcc/ada/gcc-interface/Makefile.in @@ -350,6 +350,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 @@ -2132,6 +2136,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-4.7/gcc/ada/init.c b/gcc-4.7/gcc/ada/init.c index 18280c28c..80a02b173 100644 --- a/gcc-4.7/gcc/ada/init.c +++ b/gcc-4.7/gcc/ada/init.c @@ -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. */ diff --git a/gcc-4.7/gcc/ada/link.c b/gcc-4.7/gcc/ada/link.c index 51ea7594c..5a5dabedb 100644 --- a/gcc-4.7/gcc/ada/link.c +++ b/gcc-4.7/gcc/ada/link.c @@ -165,7 +165,11 @@ unsigned char __gnat_objlist_file_supported = 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 |