On Sat, Feb 10, 2024 at 10:05:34AM -0800, H.J. Lu wrote:
> > I bet it probably doesn't work properly for -mx32 (which defines
> > __x86_64__), CCing H.J. on that, but that is a preexisting issue
> > (and I don't have any experience with it; I guess one would either
> > need to add 4 bytes of padding after the func_ptr so that those
> > bits remain zeros as sizeof (void *) is 4, but presumably it would be
> > better to just use movl (but into %r10) and maybe the jmpl instead
> > of movabsq.
>
> Are there any testcases to exercise this code on Linux?
Here is an untested attempt to implement it for -mx32 (well, I've compiled
it with -mx32 in libgcc by hand after stubbing
/usr/include/gnu/stubs-x32.h).
Testcase could be something like:
/* { dg-do run } */
/* { dg-options "-ftrampoline-impl=heap" } */
__attribute__((noipa)) int
bar (int (*fn) (int))
{
return fn (42) + 1;
}
int
main ()
{
int a = 0;
int foo (int x) { if (x != 42) __builtin_abort (); return ++a; }
if (bar (foo) != 2 || a != 1)
__builtin_abort ();
if (bar (foo) != 3 || a != 2)
__builtin_abort ();
a = 42;
if (bar (foo) != 44 || a != 43)
__builtin_abort ();
return 0;
}
but I must say I'm also surprised we have no tests for this in the
testsuite. Sure, we'd also need to add some effective target whether
-ftrampoline-impl=heap can be used for a link/runtime test or not.
2024-02-13 Jakub Jelinek <[email protected]>
PR target/113855
* config/i386/heap-trampoline.c (trampoline_insns): Use movabsq
instead of movabs in comments. Add -mx32 variant.
--- libgcc/config/i386/heap-trampoline.c.jj 2024-02-12 18:48:08.548886036
+0100
+++ libgcc/config/i386/heap-trampoline.c 2024-02-13 10:24:06.348020670
+0100
@@ -30,18 +30,34 @@ void __gcc_nested_func_ptr_created (void
void __gcc_nested_func_ptr_deleted (void);
#if __x86_64__
+
+#ifdef __LP64__
static const uint8_t trampoline_insns[] = {
- /* movabs $<func>,%r11 */
+ /* movabsq $<func>,%r11 */
0x49, 0xbb,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- /* movabs $<chain>,%r10 */
+ /* movabsq $<chain>,%r10 */
0x49, 0xba,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* rex.WB jmpq *%r11 */
0x41, 0xff, 0xe3
};
+#else
+static const uint8_t trampoline_insns[] = {
+ /* movl $<func>,%r11d */
+ 0x41, 0xbb,
+ 0x00, 0x00, 0x00, 0x00,
+
+ /* movl $<chain>,%r10d */
+ 0x41, 0xba,
+ 0x00, 0x00, 0x00, 0x00,
+
+ /* rex.WB jmpq *%r11 */
+ 0x41, 0xff, 0xe3
+};
+#endif
union ix86_trampoline {
uint8_t insns[sizeof(trampoline_insns)];
Jakub