aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2024-01-16 10:21:14 +0000
committerIain Sandoe <iain@sandoe.co.uk>2024-01-28 10:59:34 +0000
commit837827f8f2542c36ba5944b4da0a76ea6a64b08b (patch)
treeac406b504717cf847f7f5543febf30eac96bd885 /gcc
parent557bea3d2e13bd8a4a19f494df748f7a384dc649 (diff)
downloadgcc-837827f8f2542c36ba5944b4da0a76ea6a64b08b.zip
gcc-837827f8f2542c36ba5944b4da0a76ea6a64b08b.tar.gz
gcc-837827f8f2542c36ba5944b4da0a76ea6a64b08b.tar.bz2
Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402]
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*. In carrying our the rename, we move the builtins to use DEF_EXT_LIB_BUILTIN. PR libgcc/113402 gcc/ChangeLog: * builtins.cc (expand_builtin): Handle BUILT_IN_GCC_NESTED_PTR_CREATED and BUILT_IN_GCC_NESTED_PTR_DELETED. * builtins.def (BUILT_IN_GCC_NESTED_PTR_CREATED, BUILT_IN_GCC_NESTED_PTR_DELETED): Make these builtins LIB-EXT and rename the library fallbacks to __gcc_nested_func_ptr_created and __gcc_nested_func_ptr_deleted. * doc/invoke.texi: Rename these to __gcc_nested_func_ptr_created and __gcc_nested_func_ptr_deleted. * tree-nested.cc (finalize_nesting_tree_1): Use builtin_explicit for BUILT_IN_GCC_NESTED_PTR_CREATED and BUILT_IN_GCC_NESTED_PTR_DELETED. * tree.cc (build_common_builtin_nodes): Build the BUILT_IN_GCC_NESTED_PTR_CREATED and BUILT_IN_GCC_NESTED_PTR_DELETED local builtins only for non-explicit. 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 <iain@sandoe.co.uk> Co-authored-by: Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/builtins.cc4
-rw-r--r--gcc/builtins.def4
-rw-r--r--gcc/doc/invoke.texi4
-rw-r--r--gcc/tree-nested.cc4
-rw-r--r--gcc/tree.cc31
5 files changed, 28 insertions, 19 deletions
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 09f2354..a0bd82c 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -8416,6 +8416,10 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode,
case BUILT_IN_ADJUST_DESCRIPTOR:
return expand_builtin_adjust_descriptor (exp);
+ case BUILT_IN_GCC_NESTED_PTR_CREATED:
+ case BUILT_IN_GCC_NESTED_PTR_DELETED:
+ break; /* At present, no expansion, just call the function. */
+
case BUILT_IN_FORK:
case BUILT_IN_EXECL:
case BUILT_IN_EXECV:
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 4d97ca0..f6f3e10 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_EXT_LIB_BUILTIN (BUILT_IN_GCC_NESTED_PTR_CREATED, "__gcc_nested_func_ptr_created", BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+DEF_EXT_LIB_BUILTIN (BUILT_IN_GCC_NESTED_PTR_DELETED, "__gcc_nested_func_ptr_deleted", BT_FN_VOID, ATTR_NOTHROW_LIST)
/* 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 f2dee97..819a75d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -19523,8 +19523,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-nested.cc b/gcc/tree-nested.cc
index 96718a6..c8f07f7 100644
--- a/gcc/tree-nested.cc
+++ b/gcc/tree-nested.cc
@@ -3557,13 +3557,13 @@ finalize_nesting_tree_1 (struct nesting_info *root)
root->frame_decl, field, NULL_TREE);
arg3 = build_addr (x);
- x = builtin_decl_implicit (BUILT_IN_NESTED_PTR_CREATED);
+ x = builtin_decl_explicit (BUILT_IN_GCC_NESTED_PTR_CREATED);
stmt = gimple_build_call (x, 3, arg1, arg2, arg3);
gimple_seq_add_stmt (&stmt_list, stmt);
/* This call to delete the nested function trampoline is added to
the cleanup list, and called when we exit the current scope. */
- x = builtin_decl_implicit (BUILT_IN_NESTED_PTR_DELETED);
+ x = builtin_decl_explicit (BUILT_IN_GCC_NESTED_PTR_DELETED);
stmt = gimple_build_call (x, 0);
gimple_seq_add_stmt (&cleanup_list, stmt);
}
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 8aee3ef..3dff8c5 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -9929,20 +9929,25 @@ build_common_builtin_nodes (void)
tree ptr_ptr_type_node = build_pointer_type (ptr_type_node);
- ftype = build_function_type_list (void_type_node,
- ptr_type_node, // void *chain
- ptr_type_node, // void *func
- ptr_ptr_type_node, // void **dst
- NULL_TREE);
- local_define_builtin ("__builtin_nested_func_ptr_created", ftype,
- BUILT_IN_NESTED_PTR_CREATED,
- "__builtin_nested_func_ptr_created", ECF_NOTHROW);
+ if (!builtin_decl_explicit_p (BUILT_IN_GCC_NESTED_PTR_CREATED))
+ {
+ ftype = build_function_type_list (void_type_node,
+ ptr_type_node, // void *chain
+ ptr_type_node, // void *func
+ ptr_ptr_type_node, // void **dst
+ NULL_TREE);
+ local_define_builtin ("__builtin___gcc_nested_func_ptr_created", ftype,
+ BUILT_IN_GCC_NESTED_PTR_CREATED,
+ "__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,
- BUILT_IN_NESTED_PTR_DELETED,
- "__builtin_nested_func_ptr_deleted", ECF_NOTHROW);
+ if (!builtin_decl_explicit_p (BUILT_IN_GCC_NESTED_PTR_DELETED))
+ {
+ ftype = build_function_type_list (void_type_node, NULL_TREE);
+ local_define_builtin ("__builtin___gcc_nested_func_ptr_deleted", ftype,
+ BUILT_IN_GCC_NESTED_PTR_DELETED,
+ "__gcc_nested_func_ptr_deleted", ECF_NOTHROW);
+ }
ftype = build_function_type_list (void_type_node,
ptr_type_node, ptr_type_node, NULL_TREE);