[v2] Fix __builtin_nested_func_ptr_{created, deleted} symbol versions [PR113402]

Message ID 20240117085531.21315-1-iain@sandoe.co.uk
State Unresolved
Headers
Series [v2] Fix __builtin_nested_func_ptr_{created, deleted} symbol versions [PR113402] |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Iain Sandoe Jan. 17, 2024, 8:55 a.m. UTC
  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 <iain@sandoe.co.uk>
Co-authored-by: Jakub Jelinek  <jakub@redhat.com>
---
 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(-)
  

Comments

Iain Sandoe Jan. 17, 2024, 9:04 a.m. UTC | #1
> On 17 Jan 2024, at 08:55, Iain Sandoe <iains.gcc@gmail.com> wrote:
> 
> 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?

Hmm.. maybe this is not right and the builtins should still be named __builtin (with
the fallback function only renamed) or alternatively, add these as libfuncs only?

> 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 <iain@sandoe.co.uk>
> Co-authored-by: Jakub Jelinek  <jakub@redhat.com>
> ---
> 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)
>
  
Jakub Jelinek Jan. 17, 2024, 9:21 a.m. UTC | #2
On Wed, Jan 17, 2024 at 09:04:08AM +0000, Iain Sandoe wrote:
> > On 17 Jan 2024, at 08:55, Iain Sandoe <iains.gcc@gmail.com> wrote:
> > 
> > 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?
> 
> Hmm.. maybe this is not right and the builtins should still be named __builtin (with
> the fallback function only renamed) or alternatively, add these as libfuncs only?
> 
> > 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.

The normal way would be call the builtins in the compiler
__builtin___gcc_nested_func_ptr_*
and expand them to the __gcc_nested_func_ptr_* calls.
See e.g. __builtin___clear_cache.

	Jakub
  

Patch

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 *);