Package: gcc-6 Version: 6.3.0-18 Severity: normal Tags: upstream patch gcc has arm64 ILP32 support, but it only works if built as a multilib on arm64 architecture. This patch allows gcc to also be configured for the aarch64 ILP32 triplet and build the right thing. Without it, gcc defaults to LP64 even when the build is configured as TARGET=aarch64-linux-gnu_ilp32 which is wrong.
Note that this uses the newer triplet for this ABI agreed at Linaro Connect (Feb 2018): aarch64-linux-gnu_ilp32, matching the change made in binutils. This support is in gcc-ilp32-default-support.patch The existing debian multiarch support patch has to be modified to match the right triplet and multiarch/multilib paths too. A patch for that is attached in gcc-fixup-multilib-patch-for-ilp32-default.patch That is a rather confusing patch-patch, so here is the final file that should result from it (sans header): LIB1ASMSRC = aarch64/lib1funcs.asm LIB1ASMFUNCS = _aarch64_sync_cache_range AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be) ifneq (,$(findstring _ilp32,$(target))) MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu) MULTILIB_OSDIRNAMES += mabi.ilp32=../lib$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu_ilp32) MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu_ilp32) else MULTILIB_OSDIRNAMES = mabi.lp64=../lib$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu) MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu_ilp32) MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu) endif These have only been tested on gcc-6, although they should work the same on gcc-7. I will supply separate bug/patches for gcc-7.
Date: Sat, 6 May 2017 03:47:38 +0100 Subject: [PATCH 08/16] Add gcc ilp32 default support --- a/debian/patches/arm64-ilp32-default.diff +++ b/debian/patches/arm64-ilp32-default.diff @@ -0,0 +1,42 @@ +--- a/src/gcc/config.gcc ++++ b/src/gcc/config.gcc +@@ -515,12 +515,15 @@ + tm_p_file="${tm_p_file} arm/aarch-common-protos.h" + case ${with_abi} in + "") +- if test "x$with_multilib_list" = xilp32; then ++ case ${target} in ++ aarch64*-*-*_ilp32) + tm_file="aarch64/biarchilp32.h ${tm_file}" +- else ++ ;; ++ *) + tm_file="aarch64/biarchlp64.h ${tm_file}" +- fi +- ;; ++ ;; ++ esac ++ ;; + ilp32) + tm_file="aarch64/biarchilp32.h ${tm_file}" + ;; +@@ -965,9 +965,16 @@ + esac + aarch64_multilibs="${with_multilib_list}" + if test "$aarch64_multilibs" = "default"; then +- # TODO: turn on ILP32 multilib build after its support is mature. +- # aarch64_multilibs="lp64,ilp32" +- aarch64_multilibs="lp64" ++ case $target in ++ aarch64*_ilp32*) ++ aarch64_multilibs="ilp32" ++ ;; ++ aarch64*) ++ # TODO: turn on ILP32 multilib build after its support is mature. ++ # aarch64_multilibs="lp64,ilp32" ++ aarch64_multilibs="lp64" ++ ;; ++ esac + fi + aarch64_multilibs=`echo $aarch64_multilibs | sed -e 's/,/ /g'` + for aarch64_multilib in ${aarch64_multilibs}; do --- a/debian/rules.patch +++ b/debian/rules.patch @@ -117,6 +117,7 @@ pr77857 \ pr80533 \ pr60818 \ +arm64-ilp32-default \ ifeq ($(libstdcxx_abi),new) debian_patches += libstdc++-functexcept
>From 7a35625da966a0aa0733843fee7d100e2f026808 Mon Sep 17 00:00:00 2001 From: Wookey <woo...@wookware.org> Date: Mon, 8 May 2017 01:58:54 +0100 Subject: [PATCH 09/16] Fixup gcc multilib patch for ilp32 default --- a/debian/patches/gcc-multiarch.diff +++ b/debian/patches/gcc-multiarch.diff @@ -163,17 +163,21 @@ =================================================================== --- a/src/gcc/config/aarch64/t-aarch64-linux +++ b/src/gcc/config/aarch64/t-aarch64-linux -@@ -22,7 +22,7 @@ LIB1ASMSRC = aarch64/lib1funcs.asm +@@ -22,7 +22,12 @@ LIB1ASMSRC = aarch64/lib1funcs.asm LIB1ASMFUNCS = _aarch64_sync_cache_range AARCH_BE = $(if $(findstring TARGET_BIG_ENDIAN_DEFAULT=1, $(tm_defines)),_be) --MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu) --MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu) ++ifneq (,$(findstring _ilp32,$(target))) + MULTILIB_OSDIRNAMES = mabi.lp64=../lib64$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu) ++MULTILIB_OSDIRNAMES += mabi.ilp32=../lib$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu_ilp32) ++MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu_ilp32) ++else +MULTILIB_OSDIRNAMES = mabi.lp64=../lib$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu) -+MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32$(call if_multiarch,:aarch64$(AARCH_BE)_ilp32-linux-gnu) - ++MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32$(call if_multiarch,:aarch64$(AARCH_BE)-linux-gnu_ilp32) + MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu) +- -MULTILIB_OSDIRNAMES += mabi.ilp32=../libilp32 -+MULTIARCH_DIRNAME = $(call if_multiarch,aarch64$(AARCH_BE)-linux-gnu) ++endif Index: b/src/gcc/config/mips/mips.h =================================================================== --- a/src/gcc/config/mips/mips.h