* [PATCH v3] Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402] @ 2024-01-18 14:59 Iain Sandoe 2024-01-18 15:05 ` Jakub Jelinek 0 siblings, 1 reply; 7+ messages in thread From: Iain Sandoe @ 2024-01-18 14:59 UTC (permalink / raw) To: gcc-patches; +Cc: jakub In order to regularise the two new builtins as extension library types the scope of this patch has grown w.r.t "just rename". Tested on x86_64-darwin21 (default heap trampolines) and x86_64 Linux and other Darwin platforms that are default executable stack. How does this look now? thanks 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*. 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_NESTED_PTR_CREATED and BUILT_IN_NESTED_PTR_DELETED. * builtins.def (BUILT_IN_NESTED_PTR_CREATED, BUILT_IN_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_NESTED_PTR_CREATED and BUILT_IN_NESTED_PTR_DELETED. * tree.cc (build_common_builtin_nodes): Build the BUILT_IN_NESTED_PTR_CREATED and BUILT_IN_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> --- gcc/builtins.cc | 5 ++++ gcc/builtins.def | 4 ++-- gcc/doc/invoke.texi | 4 ++-- gcc/tree-nested.cc | 4 ++-- gcc/tree.cc | 31 ++++++++++++++----------- libgcc/config/aarch64/heap-trampoline.c | 8 +++---- libgcc/config/i386/heap-trampoline.c | 8 +++---- libgcc/libgcc-std.ver.in | 5 ++-- libgcc/libgcc2.h | 4 ++-- 9 files changed, 41 insertions(+), 32 deletions(-) diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 09f2354f114..cebd88142b0 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -8416,6 +8416,11 @@ 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_NESTED_PTR_CREATED: + case BUILT_IN_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 4d97ca0eec9..fd040eb8d80 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_NESTED_PTR_CREATED, "__gcc_nested_func_ptr_created", BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LIST) +DEF_EXT_LIB_BUILTIN (BUILT_IN_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 4d43dda9839..7a5ba9e7fb5 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -19457,8 +19457,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 96718a66d01..9f275879595 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_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_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 8aee3ef18d8..4e65dd26165 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_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_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_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_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 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) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3] Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402] 2024-01-18 14:59 [PATCH v3] Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402] Iain Sandoe @ 2024-01-18 15:05 ` Jakub Jelinek 2024-01-28 11:02 ` Iain Sandoe 0 siblings, 1 reply; 7+ messages in thread From: Jakub Jelinek @ 2024-01-18 15:05 UTC (permalink / raw) To: iain; +Cc: gcc-patches On Thu, Jan 18, 2024 at 02:59:23PM +0000, Iain Sandoe wrote: > --- a/gcc/builtins.cc > +++ b/gcc/builtins.cc > @@ -8416,6 +8416,11 @@ 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_NESTED_PTR_CREATED: > + case BUILT_IN_NESTED_PTR_DELETED: Unsure if it is ok to have the BUILT_IN_ names so different from the actual functions, if they shouldn't be BUILT_IN_GCC_NESTED_FUNC_PTR_{CREATED,DELETED} instead. The missing __ is what happens even with BUILT_IN_CLEAR_CACHE / __clear_cache. > + break; /* At present, no expansion, just call the function. */ > + > + Just one empty newline, not 2. > case BUILT_IN_FORK: > case BUILT_IN_EXECL: > case BUILT_IN_EXECV: > diff --git a/gcc/builtins.def b/gcc/builtins.def > index 4d97ca0eec9..fd040eb8d80 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_NESTED_PTR_CREATED, "__gcc_nested_func_ptr_created", BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LIST) > +DEF_EXT_LIB_BUILTIN (BUILT_IN_NESTED_PTR_DELETED, "__gcc_nested_func_ptr_deleted", BT_FN_VOID, ATTR_NOTHROW_LIST) See above. Otherwise LGTM. Jakub ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3] Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402] 2024-01-18 15:05 ` Jakub Jelinek @ 2024-01-28 11:02 ` Iain Sandoe 2024-01-31 12:04 ` [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] Jakub Jelinek 0 siblings, 1 reply; 7+ messages in thread From: Iain Sandoe @ 2024-01-28 11:02 UTC (permalink / raw) To: GCC Patches; +Cc: Jakub Jelinek [-- Attachment #1: Type: text/plain, Size: 1953 bytes --] > On 18 Jan 2024, at 15:05, Jakub Jelinek <jakub@redhat.com> wrote: > > On Thu, Jan 18, 2024 at 02:59:23PM +0000, Iain Sandoe wrote: >> --- a/gcc/builtins.cc >> +++ b/gcc/builtins.cc >> @@ -8416,6 +8416,11 @@ 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_NESTED_PTR_CREATED: >> + case BUILT_IN_NESTED_PTR_DELETED: > > Unsure if it is ok to have the BUILT_IN_ names so different from the actual > functions, if they shouldn't be > BUILT_IN_GCC_NESTED_FUNC_PTR_{CREATED,DELETED} instead. > The missing __ is what happens even with BUILT_IN_CLEAR_CACHE / __clear_cache. > >> + break; /* At present, no expansion, just call the function. */ >> + >> + > > Just one empty newline, not 2. > >> case BUILT_IN_FORK: >> case BUILT_IN_EXECL: >> case BUILT_IN_EXECV: >> diff --git a/gcc/builtins.def b/gcc/builtins.def >> index 4d97ca0eec9..fd040eb8d80 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_NESTED_PTR_CREATED, "__gcc_nested_func_ptr_created", BT_FN_VOID_PTR_PTR_PTR, ATTR_NOTHROW_LIST) >> +DEF_EXT_LIB_BUILTIN (BUILT_IN_NESTED_PTR_DELETED, "__gcc_nested_func_ptr_deleted", BT_FN_VOID, ATTR_NOTHROW_LIST) > > See above. > > Otherwise LGTM This is what I pushed, thanks Iain [-- Attachment #2: 0001-Fix-__builtin_nested_func_ptr_-created-deleted-symbo.patch.txt --] [-- Type: text/plain, Size: 11312 bytes --] From 837827f8f2542c36ba5944b4da0a76ea6a64b08b Mon Sep 17 00:00:00 2001 From: Iain Sandoe <iain@sandoe.co.uk> Date: Tue, 16 Jan 2024 10:21:14 +0000 Subject: [PATCH] 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> --- gcc/builtins.cc | 4 ++++ gcc/builtins.def | 4 ++-- gcc/doc/invoke.texi | 4 ++-- gcc/tree-nested.cc | 4 ++-- gcc/tree.cc | 31 ++++++++++++++----------- libgcc/config/aarch64/heap-trampoline.c | 8 +++---- libgcc/config/i386/heap-trampoline.c | 8 +++---- libgcc/libgcc-std.ver.in | 5 ++-- libgcc/libgcc2.h | 4 ++-- 9 files changed, 40 insertions(+), 32 deletions(-) diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 09f2354f114..a0bd82c7981 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 4d97ca0eec9..f6f3e104f6a 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 f2dee977b00..819a75dfe94 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 96718a66d01..c8f07f78185 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 8aee3ef18d8..3dff8c51083 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 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) ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] 2024-01-28 11:02 ` Iain Sandoe @ 2024-01-31 12:04 ` Jakub Jelinek 2024-02-01 8:22 ` Jakub Jelinek 0 siblings, 1 reply; 7+ messages in thread From: Jakub Jelinek @ 2024-01-31 12:04 UTC (permalink / raw) To: Iain Sandoe; +Cc: GCC Patches On Sun, Jan 28, 2024 at 11:02:33AM +0000, Iain Sandoe wrote: > * 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. I'm seeing hundreds of In file included from ../../../libgcc/libgcc2.c:56: ../../../libgcc/libgcc2.h:32:13: warning: conflicting types for built-in function ‘__gcc_nested_func_ptr_created’; expected ‘void(void *, void *, void *)’ [-Wbuiltin-declaration-mismatch] 32 | extern void __gcc_nested_func_ptr_created (void *, void *, void **); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ warnings. Either we need to add like in r14-6218 #pragma GCC diagnostic ignored "-Wbuiltin-declaration-mismatch" (but in that case because of the libgcc2.h prototype (why is it there?) it would need to be also with #pragma GCC diagnostic push/pop around), or we could go with just following how the builtins are prototyped on the compiler side and only cast to void ** when dereferencing (which is in a single spot in each TU). 2024-01-31 Jakub Jelinek <jakub@redhat.com> * libgcc2.h (__gcc_nested_func_ptr_created): Change type of last argument from void ** to void *. * config/i386/heap-trampoline.c (__gcc_nested_func_ptr_created): Change type of dst from void ** to void * and cast dst to void ** before dereferencing it. * config/aarch64/heap-trampoline.c (__gcc_nested_func_ptr_created): Likewise. --- libgcc/libgcc2.h.jj 2024-01-29 09:41:20.096387494 +0100 +++ libgcc/libgcc2.h 2024-01-31 12:43:22.702694509 +0100 @@ -29,7 +29,7 @@ see the files COPYING3 and COPYING.RUNTI #pragma GCC visibility push(default) #endif -extern void __gcc_nested_func_ptr_created (void *, void *, 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); --- libgcc/config/i386/heap-trampoline.c.jj 2024-01-31 10:46:36.491743132 +0100 +++ libgcc/config/i386/heap-trampoline.c 2024-01-31 12:44:44.449550698 +0100 @@ -26,7 +26,7 @@ int get_trampolines_per_page (void); struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent); void *allocate_trampoline_page (void); -void __gcc_nested_func_ptr_created (void *chain, void *func, void **dst); +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[] = { @@ -115,7 +115,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_d HEAP_T_ATTR void -__gcc_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) { @@ -158,7 +158,7 @@ __gcc_nested_func_ptr_created (void *cha __builtin___clear_cache ((void *)trampoline->insns, ((void *)trampoline->insns + sizeof(trampoline->insns))); - *dst = &trampoline->insns; + *(void **) dst = &trampoline->insns; } HEAP_T_ATTR --- libgcc/config/aarch64/heap-trampoline.c.jj 2024-01-31 10:46:36.491743132 +0100 +++ libgcc/config/aarch64/heap-trampoline.c 2024-01-31 12:45:11.282175257 +0100 @@ -26,7 +26,7 @@ int get_trampolines_per_page (void); struct tramp_ctrl_data *allocate_tramp_ctrl (struct tramp_ctrl_data *parent); void *allocate_trampoline_page (void); -void __gcc_nested_func_ptr_created (void *chain, void *func, void **dst); +void __gcc_nested_func_ptr_created (void *chain, void *func, void *dst); void __gcc_nested_func_ptr_deleted (void); #if defined(__gnu_linux__) @@ -115,7 +115,7 @@ allocate_tramp_ctrl (struct tramp_ctrl_d HEAP_T_ATTR void -__gcc_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) { @@ -158,7 +158,7 @@ __gcc_nested_func_ptr_created (void *cha __builtin___clear_cache ((void *)trampoline->insns, ((void *)trampoline->insns + sizeof(trampoline->insns))); - *dst = &trampoline->insns; + *(void **) dst = &trampoline->insns; } HEAP_T_ATTR Jakub ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] 2024-01-31 12:04 ` [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] Jakub Jelinek @ 2024-02-01 8:22 ` Jakub Jelinek 2024-02-01 8:51 ` Richard Biener 0 siblings, 1 reply; 7+ messages in thread From: Jakub Jelinek @ 2024-02-01 8:22 UTC (permalink / raw) To: Iain Sandoe, GCC Patches On Wed, Jan 31, 2024 at 01:04:20PM +0100, Jakub Jelinek wrote: > On Sun, Jan 28, 2024 at 11:02:33AM +0000, Iain Sandoe wrote: > > * 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. > > I'm seeing hundreds of > In file included from ../../../libgcc/libgcc2.c:56: > ../../../libgcc/libgcc2.h:32:13: warning: conflicting types for built-in function ‘__gcc_nested_func_ptr_created’; expected ‘void(void *, void *, void *)’ [-Wbuiltin-declaration-mismatch] > 32 | extern void __gcc_nested_func_ptr_created (void *, void *, void **); > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > warnings. > > Either we need to add like in r14-6218 > #pragma GCC diagnostic ignored "-Wbuiltin-declaration-mismatch" > (but in that case because of the libgcc2.h prototype (why is it there?) > it would need to be also with #pragma GCC diagnostic push/pop around), > or we could go with just following how the builtins are prototyped on the > compiler side and only cast to void ** when dereferencing (which is in > a single spot in each TU). Bootstrapped/regtested on x86_64-linux and i686-linux successfully. > 2024-01-31 Jakub Jelinek <jakub@redhat.com> > > * libgcc2.h (__gcc_nested_func_ptr_created): Change type of last > argument from void ** to void *. > * config/i386/heap-trampoline.c (__gcc_nested_func_ptr_created): > Change type of dst from void ** to void * and cast dst to void ** > before dereferencing it. > * config/aarch64/heap-trampoline.c (__gcc_nested_func_ptr_created): > Likewise. Jakub ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] 2024-02-01 8:22 ` Jakub Jelinek @ 2024-02-01 8:51 ` Richard Biener 2024-02-01 20:00 ` Iain Sandoe 0 siblings, 1 reply; 7+ messages in thread From: Richard Biener @ 2024-02-01 8:51 UTC (permalink / raw) To: Jakub Jelinek; +Cc: Iain Sandoe, GCC Patches On Thu, Feb 1, 2024 at 9:23 AM Jakub Jelinek <jakub@redhat.com> wrote: > > On Wed, Jan 31, 2024 at 01:04:20PM +0100, Jakub Jelinek wrote: > > On Sun, Jan 28, 2024 at 11:02:33AM +0000, Iain Sandoe wrote: > > > * 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. > > > > I'm seeing hundreds of > > In file included from ../../../libgcc/libgcc2.c:56: > > ../../../libgcc/libgcc2.h:32:13: warning: conflicting types for built-in function ‘__gcc_nested_func_ptr_created’; expected ‘void(void *, void *, void *)’ [-Wbuiltin-declaration-mismatch] > > 32 | extern void __gcc_nested_func_ptr_created (void *, void *, void **); > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > warnings. > > > > Either we need to add like in r14-6218 > > #pragma GCC diagnostic ignored "-Wbuiltin-declaration-mismatch" > > (but in that case because of the libgcc2.h prototype (why is it there?) > > it would need to be also with #pragma GCC diagnostic push/pop around), > > or we could go with just following how the builtins are prototyped on the > > compiler side and only cast to void ** when dereferencing (which is in > > a single spot in each TU). > > Bootstrapped/regtested on x86_64-linux and i686-linux successfully. Looks obvious to me. Richard. > > 2024-01-31 Jakub Jelinek <jakub@redhat.com> > > > > * libgcc2.h (__gcc_nested_func_ptr_created): Change type of last > > argument from void ** to void *. > > * config/i386/heap-trampoline.c (__gcc_nested_func_ptr_created): > > Change type of dst from void ** to void * and cast dst to void ** > > before dereferencing it. > > * config/aarch64/heap-trampoline.c (__gcc_nested_func_ptr_created): > > Likewise. > > Jakub > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] 2024-02-01 8:51 ` Richard Biener @ 2024-02-01 20:00 ` Iain Sandoe 0 siblings, 0 replies; 7+ messages in thread From: Iain Sandoe @ 2024-02-01 20:00 UTC (permalink / raw) To: Jakub Jelinek; +Cc: GCC Patches > On 1 Feb 2024, at 08:51, Richard Biener <richard.guenther@gmail.com> wrote: > > On Thu, Feb 1, 2024 at 9:23 AM Jakub Jelinek <jakub@redhat.com> wrote: >> >> On Wed, Jan 31, 2024 at 01:04:20PM +0100, Jakub Jelinek wrote: >>> On Sun, Jan 28, 2024 at 11:02:33AM +0000, Iain Sandoe wrote: >>>> * 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. >>> >>> I'm seeing hundreds of >>> In file included from ../../../libgcc/libgcc2.c:56: >>> ../../../libgcc/libgcc2.h:32:13: warning: conflicting types for built-in function ‘__gcc_nested_func_ptr_created’; expected ‘void(void *, void *, void *)’ [-Wbuiltin-declaration-mismatch] >>> 32 | extern void __gcc_nested_func_ptr_created (void *, void *, void **); >>> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> warnings. >>> >>> Either we need to add like in r14-6218 >>> #pragma GCC diagnostic ignored "-Wbuiltin-declaration-mismatch" >>> (but in that case because of the libgcc2.h prototype (why is it there?) >>> it would need to be also with #pragma GCC diagnostic push/pop around), >>> or we could go with just following how the builtins are prototyped on the >>> compiler side and only cast to void ** when dereferencing (which is in >>> a single spot in each TU). >> >> Bootstrapped/regtested on x86_64-linux and i686-linux successfully. > > Looks obvious to me. Thanks, also tested on x86_64 darwin; I guess having typed pointers on the builtins would be a pretty tricky change. Iain > > Richard. > >>> 2024-01-31 Jakub Jelinek <jakub@redhat.com> >>> >>> * libgcc2.h (__gcc_nested_func_ptr_created): Change type of last >>> argument from void ** to void *. >>> * config/i386/heap-trampoline.c (__gcc_nested_func_ptr_created): >>> Change type of dst from void ** to void * and cast dst to void ** >>> before dereferencing it. >>> * config/aarch64/heap-trampoline.c (__gcc_nested_func_ptr_created): >>> Likewise. >> >> Jakub ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-02-01 20:00 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-01-18 14:59 [PATCH v3] Fix __builtin_nested_func_ptr_{created,deleted} symbol versions [PR113402] Iain Sandoe 2024-01-18 15:05 ` Jakub Jelinek 2024-01-28 11:02 ` Iain Sandoe 2024-01-31 12:04 ` [PATCH] libgcc: Avoid warnings on __gcc_nested_func_ptr_created [PR113402] Jakub Jelinek 2024-02-01 8:22 ` Jakub Jelinek 2024-02-01 8:51 ` Richard Biener 2024-02-01 20:00 ` Iain Sandoe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).