Tested on x86_64, aarch64 Darwin21 (which default to heap-based trampolines)
and on x86_64 Darwin19 and Linux (which default to executable stack
trampolines).
OK for trunk?
Iain
--- 8< ---
The symbols for the functions supporting heap-based trampolines were
exported at an incorrect symbol version, the following patch fixes that.
As requested in the PR, this also renames __builtin_nested_func_ptr* to
__gcc_nested_func_ptr*.
PR libgcc/113402
gcc/ChangeLog:
* builtins.def
(BUILT_IN_NESTED_PTR_CREATED): Rename __builtin_nested_func_ptr_created
to __gcc_nested_func_ptr_created.
(BUILT_IN_NESTED_PTR_DELETED): Rename __builtin_nested_func_ptr_deleted
to __gcc_nested_func_ptr_deleted.
* doc/invoke.texi: Likewise.
* tree.cc (build_common_builtin_nodes): Likewise.
libgcc/ChangeLog:
* config/aarch64/heap-trampoline.c: Rename
__builtin_nested_func_ptr_created to __gcc_nested_func_ptr_created and
__builtin_nested_func_ptr_deleted to __gcc_nested_func_ptr_deleted.
* config/i386/heap-trampoline.c: Likewise.
* libgcc2.h: Likewise.
* libgcc-std.ver.in (GCC_7.0.0): Likewise and then move
__gcc_nested_func_ptr_created and
__gcc_nested_func_ptr_deleted from this symbol version to ...
(GCC_14.0.0): ... this one.
Signed-off-by: Iain Sandoe <[email protected]>
Co-authored-by: Jakub Jelinek <[email protected]>
---
gcc/builtins.def | 4 ++--
gcc/doc/invoke.texi | 4 ++--
gcc/tree.cc | 8 ++++----
libgcc/config/aarch64/heap-trampoline.c | 8 ++++----
libgcc/config/i386/heap-trampoline.c | 8 ++++----
libgcc/libgcc-std.ver.in | 5 ++---
libgcc/libgcc2.h | 4 ++--
7 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 4d97ca0eec9..e8a88ee8bf7 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -1084,8 +1084,8 @@ DEF_BUILTIN_STUB (BUILT_IN_ADJUST_TRAMPOLINE,
"__builtin_adjust_trampoline")
DEF_BUILTIN_STUB (BUILT_IN_INIT_DESCRIPTOR, "__builtin_init_descriptor")
DEF_BUILTIN_STUB (BUILT_IN_ADJUST_DESCRIPTOR, "__builtin_adjust_descriptor")
DEF_BUILTIN_STUB (BUILT_IN_NONLOCAL_GOTO, "__builtin_nonlocal_goto")
-DEF_BUILTIN_STUB (BUILT_IN_NESTED_PTR_CREATED,
"__builtin_nested_func_ptr_created")
-DEF_BUILTIN_STUB (BUILT_IN_NESTED_PTR_DELETED,
"__builtin_nested_func_ptr_deleted")
+DEF_BUILTIN_STUB (BUILT_IN_NESTED_PTR_CREATED, "__gcc_nested_func_ptr_created")
+DEF_BUILTIN_STUB (BUILT_IN_NESTED_PTR_DELETED, "__gcc_nested_func_ptr_deleted")
/* Implementing __builtin_setjmp. */
DEF_BUILTIN_STUB (BUILT_IN_SETJMP_SETUP, "__builtin_setjmp_setup")
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 16e31a3c6db..9727f1de71d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -19450,8 +19450,8 @@ for nested functions.
By default, trampolines are generated on stack. However, certain platforms
(such as the Apple M1) do not permit an executable stack. Compiling with
@option{-ftrampoline-impl=heap} generate calls to
-@code{__builtin_nested_func_ptr_created} and
-@code{__builtin_nested_func_ptr_deleted} in order to allocate and
+@code{__gcc_nested_func_ptr_created} and
+@code{__gcc_nested_func_ptr_deleted} in order to allocate and
deallocate trampoline space on the executable heap. These functions are
implemented in libgcc, and will only be provided on specific targets:
x86_64 Darwin, x86_64 and aarch64 Linux. @emph{PLEASE NOTE}: Heap
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 8aee3ef18d8..6fa99ad7fe4 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -9934,15 +9934,15 @@ build_common_builtin_nodes (void)
ptr_type_node, // void *func
ptr_ptr_type_node, // void **dst
NULL_TREE);
- local_define_builtin ("__builtin_nested_func_ptr_created", ftype,
+ local_define_builtin ("__gcc_nested_func_ptr_created", ftype,
BUILT_IN_NESTED_PTR_CREATED,
- "__builtin_nested_func_ptr_created", ECF_NOTHROW);
+ "__gcc_nested_func_ptr_created", ECF_NOTHROW);
ftype = build_function_type_list (void_type_node,
NULL_TREE);
- local_define_builtin ("__builtin_nested_func_ptr_deleted", ftype,
+ local_define_builtin ("__gcc_nested_func_ptr_deleted", ftype,
BUILT_IN_NESTED_PTR_DELETED,
- "__builtin_nested_func_ptr_deleted", ECF_NOTHROW);
+ "__gcc_nested_func_ptr_deleted", ECF_NOTHROW);
ftype = build_function_type_list (void_type_node,
ptr_type_node, ptr_type_node, NULL_TREE);
diff --git a/libgcc/config/aarch64/heap-trampoline.c
b/libgcc/config/aarch64/heap-trampoline.c
index f22233987ca..2041fe6aa39 100644
--- a/libgcc/config/aarch64/heap-trampoline.c
+++ b/libgcc/config/aarch64/heap-trampoline.c
@@ -20,8 +20,8 @@ int get_trampolines_per_page (void);
struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent);
void *allocate_trampoline_page (void);
-void __builtin_nested_func_ptr_created (void *chain, void *func, void **dst);
-void __builtin_nested_func_ptr_deleted (void);
+void __gcc_nested_func_ptr_created (void *chain, void *func, void **dst);
+void __gcc_nested_func_ptr_deleted (void);
#if defined(__gnu_linux__)
static const uint32_t aarch64_trampoline_insns[] = {
@@ -108,7 +108,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_data *parent)
}
void
-__builtin_nested_func_ptr_created (void *chain, void *func, void **dst)
+__gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
{
if (tramp_ctrl_curr == NULL)
{
@@ -155,7 +155,7 @@ __builtin_nested_func_ptr_created (void *chain, void *func,
void **dst)
}
void
-__builtin_nested_func_ptr_deleted (void)
+__gcc_nested_func_ptr_deleted (void)
{
if (tramp_ctrl_curr == NULL)
abort ();
diff --git a/libgcc/config/i386/heap-trampoline.c
b/libgcc/config/i386/heap-trampoline.c
index 4b9f4365868..726cf55277a 100644
--- a/libgcc/config/i386/heap-trampoline.c
+++ b/libgcc/config/i386/heap-trampoline.c
@@ -20,8 +20,8 @@ int get_trampolines_per_page (void);
struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent);
void *allocate_trampoline_page (void);
-void __builtin_nested_func_ptr_created (void *chain, void *func, void **dst);
-void __builtin_nested_func_ptr_deleted (void);
+void __gcc_nested_func_ptr_created (void *chain, void *func, void **dst);
+void __gcc_nested_func_ptr_deleted (void);
static const uint8_t trampoline_insns[] = {
/* movabs $<chain>,%r11 */
@@ -108,7 +108,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_data *parent)
}
void
-__builtin_nested_func_ptr_created (void *chain, void *func, void **dst)
+__gcc_nested_func_ptr_created (void *chain, void *func, void **dst)
{
if (tramp_ctrl_curr == NULL)
{
@@ -155,7 +155,7 @@ __builtin_nested_func_ptr_created (void *chain, void *func,
void **dst)
}
void
-__builtin_nested_func_ptr_deleted (void)
+__gcc_nested_func_ptr_deleted (void)
{
if (tramp_ctrl_curr == NULL)
abort ();
diff --git a/libgcc/libgcc-std.ver.in b/libgcc/libgcc-std.ver.in
index a81c5a1142c..ac8f661a08e 100644
--- a/libgcc/libgcc-std.ver.in
+++ b/libgcc/libgcc-std.ver.in
@@ -1943,9 +1943,6 @@ GCC_4.8.0 {
GCC_7.0.0 {
__PFX__divmoddi4
__PFX__divmodti4
-
- __builtin_nested_func_ptr_created
- __builtin_nested_func_ptr_deleted
}
%inherit GCC_14.0.0 GCC_7.0.0
@@ -1960,4 +1957,6 @@ GCC_14.0.0 {
__PFX__strub_enter
__PFX__strub_update
__PFX__strub_leave
+ __gcc_nested_func_ptr_created
+ __gcc_nested_func_ptr_deleted
}
diff --git a/libgcc/libgcc2.h b/libgcc/libgcc2.h
index 5050456eada..0b67fab637e 100644
--- a/libgcc/libgcc2.h
+++ b/libgcc/libgcc2.h
@@ -29,8 +29,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If
not, see
#pragma GCC visibility push(default)
#endif
-extern void __builtin_nested_func_ptr_created (void *, void *, void **);
-extern void __builtin_nested_func_ptr_deleted (void);
+extern void __gcc_nested_func_ptr_created (void *, void *, void **);
+extern void __gcc_nested_func_ptr_deleted (void);
extern int __gcc_bcmp (const unsigned char *, const unsigned char *, size_t);
extern void __clear_cache (void *, void *);
--
2.39.2 (Apple Git-143)