From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1698) id BBDB93858D37; Mon, 12 Feb 2024 15:03:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BBDB93858D37 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1707750239; bh=1ryfixeKSNv1yo+TDLkLOb2s+W65zrHgHSTFcEff6zY=; h=From:To:Subject:Date:From; b=xfMdJymCIMOSdZFKaUdMGsRAM+r/p1QvnSXoZy9hhxDwSN6pQidGzEYKJRr//Xmjo lK7kqNuGkrcoGzU55pWr2JWxrhYR2N8FEAmMPOwRHqyGU3aUxB+HJ02aC/xaZ6BEnK jMBs4iqAslD1aImASxi8w07xRPbwuGuPjUvSUsQs= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Iain D Sandoe To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-8931] x86, libgcc: Implement ia32 basic heap trampoline [PR113855]. X-Act-Checkin: gcc X-Git-Author: Iain Sandoe X-Git-Refname: refs/heads/master X-Git-Oldrev: 1e94648ab7b370c5867e146c7f59603e2e6ba2e6 X-Git-Newrev: 5e39897ee2c73938fa940c4792d987608aeeebcd Message-Id: <20240212150359.BBDB93858D37@sourceware.org> Date: Mon, 12 Feb 2024 15:03:59 +0000 (GMT) List-Id: https://gcc.gnu.org/g:5e39897ee2c73938fa940c4792d987608aeeebcd commit r14-8931-g5e39897ee2c73938fa940c4792d987608aeeebcd Author: Iain Sandoe Date: Sat Feb 10 14:44:41 2024 +0000 x86, libgcc: Implement ia32 basic heap trampoline [PR113855]. The initial heap trampoline implementation was targeting 64b platforms. As the PR demonstrates this creates an issue where it is expected that the same symbols are exported for 32 and 64b. Rather than conditionalize the exports and code-gen on x86_64, this patch provides a basic implementation of the IA32 trampoline. This also avoids potential user confusion, when a 32b target has 64b multilibs, and vice versa; which is the case for Darwin. PR target/113855 gcc/ChangeLog: * config/i386/darwin.h (DARWIN_HEAP_T_LIB): Moved to be available to all sub-targets. * config/i386/darwin32-biarch.h (DARWIN_HEAP_T_LIB): Delete. * config/i386/darwin64-biarch.h (DARWIN_HEAP_T_LIB): Delete. libgcc/ChangeLog: * config.host: Add trampoline support to x?86-linux. * config/i386/heap-trampoline.c (trampoline_insns): Provide a variant for IA32. (union ix86_trampoline): Likewise. (__gcc_nested_func_ptr_created): Implement a basic trampoline for IA32. Diff: --- gcc/config/i386/darwin.h | 3 ++- gcc/config/i386/darwin32-biarch.h | 3 --- gcc/config/i386/darwin64-biarch.h | 3 --- libgcc/config.host | 1 + libgcc/config/i386/heap-trampoline.c | 40 +++++++++++++++++++++++++++++++++--- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index 8e64b4e9b5ff..bf9c45d70bb0 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -119,9 +119,10 @@ along with GCC; see the file COPYING3. If not see /* We default to x86_64 for single-arch builds, bi-arch overrides. */ #define DARWIN_ARCH_SPEC "x86_64" #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC +#endif + #undef DARWIN_HEAP_T_LIB #define DARWIN_HEAP_T_LIB " -lheapt_w " -#endif #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ diff --git a/gcc/config/i386/darwin32-biarch.h b/gcc/config/i386/darwin32-biarch.h index 2180f5a53528..051ad12b4259 100644 --- a/gcc/config/i386/darwin32-biarch.h +++ b/gcc/config/i386/darwin32-biarch.h @@ -27,9 +27,6 @@ along with GCC; see the file COPYING3. If not see #undef DARWIN_SUBARCH_SPEC #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC -#undef DARWIN_HEAP_T_LIB -#define DARWIN_HEAP_T_LIB " %{m64:-lheapt_w}" - #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ DARWIN_EXTRA_SPECS \ diff --git a/gcc/config/i386/darwin64-biarch.h b/gcc/config/i386/darwin64-biarch.h index 620800749a8f..85436791a6c8 100644 --- a/gcc/config/i386/darwin64-biarch.h +++ b/gcc/config/i386/darwin64-biarch.h @@ -28,9 +28,6 @@ along with GCC; see the file COPYING3. If not see #undef DARWIN_SUBARCH_SPEC #define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC -#undef DARWIN_HEAP_T_LIB -#define DARWIN_HEAP_T_LIB "%{!m32:-lheapt_w}" - #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ DARWIN_EXTRA_SPECS \ diff --git a/libgcc/config.host b/libgcc/config.host index 3e7d00f67aaf..59a42d3a01f0 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -774,6 +774,7 @@ i[34567]86-*-linux*) tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" tm_file="${tm_file} i386/elf-lib.h" md_unwind_header=i386/linux-unwind.h + tmake_file="${tmake_file} i386/t-heap-trampoline" ;; i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-kopensolaris*-gnu) extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" diff --git a/libgcc/config/i386/heap-trampoline.c b/libgcc/config/i386/heap-trampoline.c index 657b344c10c3..1df0aa061086 100644 --- a/libgcc/config/i386/heap-trampoline.c +++ b/libgcc/config/i386/heap-trampoline.c @@ -29,12 +29,13 @@ void *allocate_trampoline_page (void); void __gcc_nested_func_ptr_created (void *chain, void *func, void *dst); void __gcc_nested_func_ptr_deleted (void); +#if __x86_64__ static const uint8_t trampoline_insns[] = { - /* movabs $,%r11 */ + /* movabs $,%r11 */ 0x49, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /* movabs $,%r10 */ + /* movabs $,%r10 */ 0x49, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -54,6 +55,33 @@ union ix86_trampoline { } fields; }; +#elif __i386__ + +static const uint8_t trampoline_insns[] = { + /* movl $,%ecx */ + 0xb9, + 0x00, 0x00, 0x00, 0x00, + + /* jmpl -. */ + 0xe9, + 0x00, 0x00, 0x00, 0x00, +}; + +union ix86_trampoline { + uint8_t insns[sizeof(trampoline_insns)]; + + struct __attribute__((packed)) fields { + uint8_t insn_0[1]; + void *chain_ptr; + uint8_t insn_1[1]; + uintptr_t func_offset; + } fields; +}; + +#else +#error unsupported architecture/ABI +#endif + struct tramp_ctrl_data { struct tramp_ctrl_data *prev; @@ -145,8 +173,14 @@ __gcc_nested_func_ptr_created (void *chain, void *func, void *dst) memcpy (trampoline->insns, trampoline_insns, sizeof(trampoline_insns)); - trampoline->fields.func_ptr = func; trampoline->fields.chain_ptr = chain; +#if __x86_64__ + trampoline->fields.func_ptr = func; +#elif __i386__ + uintptr_t off_add = (uintptr_t) &trampoline->fields.func_offset; + off_add += 4; + trampoline->fields.func_offset = (uintptr_t)func - off_add; +#endif #if __APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101400 /* Re-enable write protection. */