]> sourceware.org Git - newlib-cygwin.git/commitdiff
MSP430: Make the inclusion of run_*_array fns depend on defined assembler symbols
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Wed, 17 Apr 2019 12:17:38 +0000 (13:17 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 18 Apr 2019 08:29:24 +0000 (10:29 +0200)
Many of the MSP430 crt functions (e.g. to initialize bss) are linked
"dynamically", based on symbols defined in the program.
The GNU assembler defines the symbols corresponding to the crt
functions by examining the section names in the input file.

If GCC has been configured with --enable-initfini-array, then
.init_array and .fini_array will hold pointers to global
constructors/destructors. These sections can also hold functions that
need to be executed for other purposes.

The attached patch puts the __crt0_run_{preinit,init,fini}_array and
__crt0_run_array functions in their own object files, so they will
only be linked when needed.

Successfully regtested the DejaGNU GCC testsuite using the binutils and
newlib changes together with GCC trunk configured with
--enable-initfini-array.

libgloss/msp430/Makefile.in
libgloss/msp430/crt0.S
libgloss/msp430/crtn.S

index 73079d65bace6b895066997e08cb827e4ab0b09d..77c9b8b213be73b2daece9a22f1c5d3b4b30b57d 100644 (file)
@@ -87,6 +87,10 @@ CRT_OBJS = \
        crt_main.o \
        crt_main_minrt.o \
        crt_callexit.o \
+       crt_run_init_array.o \
+       crt_run_preinit_array.o \
+       crt_run_fini_array.o \
+       crt_run_array.o \
        crt_init.o
 
 #### Host specific Makefile fragment comes in here.
index 53162e6bd09730729a47817f652e358586178f9b..42464ddbefaf8cf323d29906fb4b1371c626cf20 100644 (file)
@@ -62,6 +62,13 @@ START_CRT_FUNC 0000 start
 END_CRT_FUNC   start
 #endif
 
+;; Some of the CRT functions below will only be present in the final linked
+;; executable if the assembler decides they are needed.  It will only define
+;; the symbol necessary to prevent them being garbage collected by the linker
+;; if the file being assembled has a specific section.
+;; The CRT functions this applies to are:
+;; init_bss, movedata, move_highdata, init_highbss, run_init_array,
+;; run_preinit_array, run_fini_array and run_array.
 
 #if Lbss
 ;; Note - this section is only included in the startup code of the
@@ -215,44 +222,69 @@ END_CRT_FUNC      call_exit
 ;----------------------------------------
 
 #ifndef MINRT
-#if L0
-       .section ".crt_0900main_init", "ax", @progbits
-       .global _msp430_run_init_array
-       .type   _msp430_run_init_array,@function
-_msp430_run_init_array:
-       mov_    #__init_array_start, R4
-       mov_    #__init_array_end, R5
-       mov_    #PTRsz, R6
-       br_     #_msp430_run_array
 
-       .global _msp430_run_preinit_array
-       .type   _msp430_run_preinit_array,@function
-_msp430_run_preinit_array:
+#if Lrun_preinit_array
+;; Note - this section is only included in the startup code of the application
+;; if it is needed.  It is responsible for setting up the arguments
+;; required for __crt0_run_array, to run the functions in .preinit_array.
+START_CRT_FUNC 0910 run_preinit_array
+
        mov_    #__preinit_array_start, R4
        mov_    #__preinit_array_end, R5
        mov_    #PTRsz, R6
-       br_     #_msp430_run_array
+       br_     #__crt0_run_array
+
+END_CRT_FUNC   run_preinit_array
+#endif /* Lrun_preinit_array */
+
+#if Lrun_init_array
+;; Note - this section is only included in the startup code of the application
+;; if it is needed.  It is responsible for setting up the arguments
+;; required for __crt0_run_array, to run the functions in .init_array.
+START_CRT_FUNC 0920 run_init_array
+
+       mov_    #__init_array_start, R4
+       mov_    #__init_array_end, R5
+       mov_    #PTRsz, R6
+       br_     #__crt0_run_array
+
+END_CRT_FUNC   run_init_array
+#endif /* Lrun_init_array */
+
+#if Lrun_fini_array
+;; Note - this section is only included in the startup code of the application
+;; if it is needed.  It is responsible for setting up the arguments
+;; required for __crt0_run_array, to run the functions in .fini_array.
+START_CRT_FUNC 0930 run_fini_array
 
-       .global _msp430_run_fini_array
-       .type   _msp430_run_fini_array,@function
-_msp430_run_fini_array:
        mov_    #__fini_array_start, R4
        mov_    #__fini_array_end, R5
        mov_    #-PTRsz, R6
-       br_     #_msp430_run_array
+       br_     #__crt0_run_array
+
+END_CRT_FUNC   run_fini_array
+#endif /* Lrun_fini_array */
+
+#if Lrun_array
+;; Note - this section is only included in the startup code of the application
+;; if it is needed by one of the above run_*_array functions.
+START_CRT_FUNC 0980 run_array
 
-_msp430_run_array:
        cmp_    R4, R5
        jeq     _msp430_run_done
        mov_    @R4, R7
        add_    R6, R4
        call_   R7
-       br_     #_msp430_run_array
+       br_     #__crt0_run_array
+
+END_CRT_FUNC   run_array
 
 _msp430_run_done:
        ret_
+#endif /* Lrun_array */
 
 ;----------------------------------------
+#if L0
 
        .section        .init,"ax"
 
@@ -263,7 +295,14 @@ __msp430_init:
 
        .global __msp430_fini
 __msp430_fini:
-       call_   #_msp430_run_fini_array
+       call_   #__crt0_run_fini_array
        
+;; If this function is not defined externally, we don't need it to do
+;; anything.
+       .text
+       .weak __crt0_run_fini_array
+__crt0_run_fini_array:
+       ret_
+
 #endif
 #endif /* not MINRT */
index 939d5ce6fda1300847b0a0c0da565f12c85ba9e5..110fc309061ee21d7c9bcb500751f505d1b89d48 100644 (file)
@@ -15,8 +15,8 @@
 
 #ifndef MINRT
        .section        .init,"ax"
-       call_   #_msp430_run_preinit_array
-       call_   #_msp430_run_init_array
+       call_   #__crt0_run_preinit_array
+       call_   #__crt0_run_init_array
        ret_
        .global __msp430_init_end
 __msp430_init_end:
@@ -28,5 +28,14 @@ __msp430_init_end:
 __msp430_fini_end:
 
        .text
+;; If these functions are not defined externally, we don't need them to do
+;; anything.
+       .balign 2
+       .weak __crt0_run_preinit_array
+       .weak __crt0_run_init_array
+__crt0_run_preinit_array:
+__crt0_run_init_array:
+       ret_
+
 
 #endif
This page took 0.037548 seconds and 5 git commands to generate.