]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
x86, libgcc: Implement ia32 basic heap trampoline [PR113855].
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 10 Feb 2024 14:44:41 +0000 (14:44 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Mon, 12 Feb 2024 15:03:12 +0000 (15:03 +0000)
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.

gcc/config/i386/darwin.h
gcc/config/i386/darwin32-biarch.h
gcc/config/i386/darwin64-biarch.h
libgcc/config.host
libgcc/config/i386/heap-trampoline.c

index 8e64b4e9b5ffa2bc4127789042affe957f5f92c8..bf9c45d70bb0249a7e178be2f39510cf77ec2b4d 100644 (file)
@@ -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                                   \
index 2180f5a53528cb82fe3c713dfeadccd9a5788415..051ad12b4259a9517470e34c509e044c31cc795e 100644 (file)
@@ -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                                            \
index 620800749a8f09284bb14dd2a8eef2e6901e7ad0..85436791a6c80643f319b612d574236ee98447c7 100644 (file)
@@ -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                                            \
index 3e7d00f67aafe6cd1cc552711bde26fb8d87570f..59a42d3a01f0990a5b2017a8f6633bf8478bc302 100644 (file)
@@ -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"
index 657b344c10c3593c4231ec7b271b70ad2c4daef4..1df0aa06108601a1bf1a5fc680b73dd77710dae7 100644 (file)
@@ -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 $<chain>,%r11  */
+  /* movabs $<func>,%r11  */
   0x49, 0xbb,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 
-  /* movabs $<func>,%r10  */
+  /* movabs $<chain>,%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 $<chain>,%ecx  */
+  0xb9,
+  0x00, 0x00, 0x00, 0x00,
+
+  /* jmpl <func>-. */
+  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.  */