diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2024-01-16 10:21:14 +0000 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2024-01-28 10:59:34 +0000 |
commit | 837827f8f2542c36ba5944b4da0a76ea6a64b08b (patch) | |
tree | ac406b504717cf847f7f5543febf30eac96bd885 | |
parent | 557bea3d2e13bd8a4a19f494df748f7a384dc649 (diff) | |
download | gcc-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>
-rw-r--r-- | gcc/builtins.cc | 4 | ||||
-rw-r--r-- | gcc/builtins.def | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 4 | ||||
-rw-r--r-- | gcc/tree-nested.cc | 4 | ||||
-rw-r--r-- | gcc/tree.cc | 31 | ||||
-rw-r--r-- | libgcc/config/aarch64/heap-trampoline.c | 8 | ||||
-rw-r--r-- | libgcc/config/i386/heap-trampoline.c | 8 | ||||
-rw-r--r-- | libgcc/libgcc-std.ver.in | 5 | ||||
-rw-r--r-- | libgcc/libgcc2.h | 4 |
9 files changed, 40 insertions, 32 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); diff --git a/libgcc/config/aarch64/heap-trampoline.c b/libgcc/config/aarch64/heap-trampoline.c index f222339..2041fe6 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 4b9f436..726cf55 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 a81c5a1..ac8f661 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 5050456..0b67fab 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 *); |