public inbox for newlib-cvs@sourceware.org help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org> To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] MSP430: Make the inclusion of run_*_array fns depend on defined assembler symbols Date: Thu, 18 Apr 2019 08:29:00 -0000 [thread overview] Message-ID: <20190418082940.38072.qmail@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=f811485ffb78286929cd555d65bb70b8cac51c0c commit f811485ffb78286929cd555d65bb70b8cac51c0c Author: Jozef Lawrynowicz <jozef.l@mittosystems.com> Date: Wed Apr 17 13:17:38 2019 +0100 MSP430: Make the inclusion of run_*_array fns depend on defined assembler symbols 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. Diff: --- libgloss/msp430/Makefile.in | 4 +++ libgloss/msp430/crt0.S | 79 +++++++++++++++++++++++++++++++++------------ libgloss/msp430/crtn.S | 13 ++++++-- 3 files changed, 74 insertions(+), 22 deletions(-) diff --git a/libgloss/msp430/Makefile.in b/libgloss/msp430/Makefile.in index 73079d6..77c9b8b 100644 --- a/libgloss/msp430/Makefile.in +++ b/libgloss/msp430/Makefile.in @@ -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. diff --git a/libgloss/msp430/crt0.S b/libgloss/msp430/crt0.S index 53162e6..42464dd 100644 --- a/libgloss/msp430/crt0.S +++ b/libgloss/msp430/crt0.S @@ -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 */ diff --git a/libgloss/msp430/crtn.S b/libgloss/msp430/crtn.S index 939d5ce..110fc30 100644 --- a/libgloss/msp430/crtn.S +++ b/libgloss/msp430/crtn.S @@ -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
reply other threads:[~2019-04-18 8:29 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190418082940.38072.qmail@sourceware.org \ --to=corinna@sourceware.org \ --cc=newlib-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).