[2/3] libgcc: Dont define __do_global_dtors_aux if it will be empty

Message ID 20191106161750.0ac390fe@jozef-kubuntu
State New
Headers show
Series
  • libgcc/crtstuff.c tweaks to reduce code size
Related show

Commit Message

Jozef Lawrynowicz Nov. 6, 2019, 4:17 p.m.
__do_global_dtors_aux in crtstuff.c will not do anything meaningful if:
 * crtstuff.c is not being compiled for use in a shared library
 * the target uses .{init,fini}_array sections
 * TM clone registry is disabled
 * EH frame registry is disabled

The attached patch prevents it from being defined at all if all the above
conditions are true. This saves code size in the final linked executable.

Comments

Jeff Law Dec. 7, 2019, 6:29 p.m. | #1
On Wed, 2019-11-06 at 16:17 +0000, Jozef Lawrynowicz wrote:
> From 967262117f0c838fe8a9226484bf6e014c86f0ba Mon Sep 17 00:00:00 2001

> From: Jozef Lawrynowicz <jozef.l@mittosystems.com>

> Date: Tue, 29 Oct 2019 13:02:08 +0000

> Subject: [PATCH 2/3] libgcc: Dont define __do_global_dtors_aux if it will be

>  empty

> 

> libgcc/ChangeLog:

> 

> 2019-11-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

> 

> 	* crtstuff.c (__do_global_dtors_aux): Wrap in #if so it's only defined

> 	if it will have contents.

Generally OK with this as well.

jeff
Tobias Burnus Dec. 9, 2019, 12:19 p.m. | #2
Hi, I see now the following error:

…/libgcc/crtstuff.c:372:52: error: operator '||' has no right operand
   372 |   || USE_TM_CLONE_REGISTRY || USE_EH_FRAME_REGISTRY
       |                                                    ^
/net/build5-trusty-cs/scratch/tburnus/mainline-nv/src/gcc-mainline/libgcc/crtstuff.c:254:17: warning: '__DTOR_LIST__' defined but not used [-Wunused-variable]
   254 | STATIC func_ptr __DTOR_LIST__[1]
       |                 ^~~~~~~~~~~~~
Makefile:1038: recipe for target 'crtbeginT.o' failed

Cheers,

Tobias

On 11/6/19 5:17 PM, Jozef Lawrynowicz wrote:
> __do_global_dtors_aux in crtstuff.c will not do anything meaningful if:

>   * crtstuff.c is not being compiled for use in a shared library

>   * the target uses .{init,fini}_array sections

>   * TM clone registry is disabled

>   * EH frame registry is disabled

>

> The attached patch prevents it from being defined at all if all the above

> conditions are true. This saves code size in the final linked executable.

>

> 0002-libgcc-Dont-define-__do_global_dtors_aux-if-it-will-.patch

>

>  From 967262117f0c838fe8a9226484bf6e014c86f0ba Mon Sep 17 00:00:00 2001

> From: Jozef Lawrynowicz<jozef.l@mittosystems.com>

> Date: Tue, 29 Oct 2019 13:02:08 +0000

> Subject: [PATCH 2/3] libgcc: Dont define __do_global_dtors_aux if it will be

>   empty

>

> libgcc/ChangeLog:

>

> 2019-11-06  Jozef Lawrynowicz<jozef.l@mittosystems.com>

>

> 	* crtstuff.c (__do_global_dtors_aux): Wrap in #if so it's only defined

> 	if it will have contents.

>

> ---

>   libgcc/crtstuff.c | 9 ++++++++-

>   1 file changed, 8 insertions(+), 1 deletion(-)

>

> diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c

> index 9a3247b7848..0b0a0b865fe 100644

> --- a/libgcc/crtstuff.c

> +++ b/libgcc/crtstuff.c

> @@ -368,8 +368,12 @@ extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;

>      On some systems, this routine is run more than once from the .fini,

>      when exit is called recursively, so we arrange to remember where in

>      the list we left off processing, and we resume at that point,

> -   should we be re-invoked.  */

> +   should we be re-invoked.

>   

> +   This routine does not need to be run if none of the following clauses are

> +   true, as it will not do anything, so can be removed.  */

> +#if defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP) \

> +  || USE_TM_CLONE_REGISTRY || USE_EH_FRAME_REGISTRY

>   static void __attribute__((used))

>   __do_global_dtors_aux (void)

>   {

> @@ -455,6 +459,9 @@ __do_global_dtors_aux_1 (void)

>   CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__,

>   			  __do_global_dtors_aux_1)

>   #endif

> +#endif /* defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP)

> +  || defined(USE_TM_CLONE_REGISTRY) || defined(USE_EH_FRAME_REGISTRY) */

> +

>   

>   #if USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY

>   /* Stick a call to __register_frame_info into the .init section.  For some

> -- 2.17.1
Jozef Lawrynowicz Dec. 9, 2019, 12:24 p.m. | #3
On Mon, 9 Dec 2019 13:19:22 +0100
Tobias Burnus <tobias@codesourcery.com> wrote:

> Hi, I see now the following error:

> 

> …/libgcc/crtstuff.c:372:52: error: operator '||' has no right operand

>    372 |   || USE_TM_CLONE_REGISTRY || USE_EH_FRAME_REGISTRY

>        |                                                    ^

> /net/build5-trusty-cs/scratch/tburnus/mainline-nv/src/gcc-mainline/libgcc/crtstuff.c:254:17: warning: '__DTOR_LIST__' defined but not used [-Wunused-variable]

>    254 | STATIC func_ptr __DTOR_LIST__[1]

>        |                 ^~~~~~~~~~~~~

> Makefile:1038: recipe for target 'crtbeginT.o' failed

> 

> Cheers,

> 

> Tobias


Sorry, I need to change that to defined(USE_EH_FRAME_REGISTRY). Committing
shortly.

Thanks,
Jozef

> 

> On 11/6/19 5:17 PM, Jozef Lawrynowicz wrote:

> > __do_global_dtors_aux in crtstuff.c will not do anything meaningful if:

> >   * crtstuff.c is not being compiled for use in a shared library

> >   * the target uses .{init,fini}_array sections

> >   * TM clone registry is disabled

> >   * EH frame registry is disabled

> >

> > The attached patch prevents it from being defined at all if all the above

> > conditions are true. This saves code size in the final linked executable.

> >

> > 0002-libgcc-Dont-define-__do_global_dtors_aux-if-it-will-.patch

> >

> >  From 967262117f0c838fe8a9226484bf6e014c86f0ba Mon Sep 17 00:00:00 2001

> > From: Jozef Lawrynowicz<jozef.l@mittosystems.com>

> > Date: Tue, 29 Oct 2019 13:02:08 +0000

> > Subject: [PATCH 2/3] libgcc: Dont define __do_global_dtors_aux if it will be

> >   empty

> >

> > libgcc/ChangeLog:

> >

> > 2019-11-06  Jozef Lawrynowicz<jozef.l@mittosystems.com>

> >

> > 	* crtstuff.c (__do_global_dtors_aux): Wrap in #if so it's only defined

> > 	if it will have contents.

> >

> > ---

> >   libgcc/crtstuff.c | 9 ++++++++-

> >   1 file changed, 8 insertions(+), 1 deletion(-)

> >

> > diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c

> > index 9a3247b7848..0b0a0b865fe 100644

> > --- a/libgcc/crtstuff.c

> > +++ b/libgcc/crtstuff.c

> > @@ -368,8 +368,12 @@ extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;

> >      On some systems, this routine is run more than once from the .fini,

> >      when exit is called recursively, so we arrange to remember where in

> >      the list we left off processing, and we resume at that point,

> > -   should we be re-invoked.  */

> > +   should we be re-invoked.

> >   

> > +   This routine does not need to be run if none of the following clauses are

> > +   true, as it will not do anything, so can be removed.  */

> > +#if defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP) \

> > +  || USE_TM_CLONE_REGISTRY || USE_EH_FRAME_REGISTRY

> >   static void __attribute__((used))

> >   __do_global_dtors_aux (void)

> >   {

> > @@ -455,6 +459,9 @@ __do_global_dtors_aux_1 (void)

> >   CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__,

> >   			  __do_global_dtors_aux_1)

> >   #endif

> > +#endif /* defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP)

> > +  || defined(USE_TM_CLONE_REGISTRY) || defined(USE_EH_FRAME_REGISTRY) */

> > +

> >   

> >   #if USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY

> >   /* Stick a call to __register_frame_info into the .init section.  For some

> > -- 2.17.1

Patch

From 967262117f0c838fe8a9226484bf6e014c86f0ba Mon Sep 17 00:00:00 2001
From: Jozef Lawrynowicz <jozef.l@mittosystems.com>
Date: Tue, 29 Oct 2019 13:02:08 +0000
Subject: [PATCH 2/3] libgcc: Dont define __do_global_dtors_aux if it will be
 empty

libgcc/ChangeLog:

2019-11-06  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

	* crtstuff.c (__do_global_dtors_aux): Wrap in #if so it's only defined
	if it will have contents.

---
 libgcc/crtstuff.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/libgcc/crtstuff.c b/libgcc/crtstuff.c
index 9a3247b7848..0b0a0b865fe 100644
--- a/libgcc/crtstuff.c
+++ b/libgcc/crtstuff.c
@@ -368,8 +368,12 @@  extern void __cxa_finalize (void *) TARGET_ATTRIBUTE_WEAK;
    On some systems, this routine is run more than once from the .fini,
    when exit is called recursively, so we arrange to remember where in
    the list we left off processing, and we resume at that point,
-   should we be re-invoked.  */
+   should we be re-invoked.
 
+   This routine does not need to be run if none of the following clauses are
+   true, as it will not do anything, so can be removed.  */
+#if defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP) \
+  || USE_TM_CLONE_REGISTRY || USE_EH_FRAME_REGISTRY
 static void __attribute__((used))
 __do_global_dtors_aux (void)
 {
@@ -455,6 +459,9 @@  __do_global_dtors_aux_1 (void)
 CRT_CALL_STATIC_FUNCTION (__LIBGCC_INIT_SECTION_ASM_OP__,
 			  __do_global_dtors_aux_1)
 #endif
+#endif /* defined(CRTSTUFFS_O) || !defined(FINI_ARRAY_SECTION_ASM_OP)
+  || defined(USE_TM_CLONE_REGISTRY) || defined(USE_EH_FRAME_REGISTRY) */
+
 
 #if USE_EH_FRAME_REGISTRY || USE_TM_CLONE_REGISTRY
 /* Stick a call to __register_frame_info into the .init section.  For some
-- 
2.17.1