diff options
-rw-r--r-- | libgloss/msp430/Makefile.in | 4 | ||||
-rw-r--r-- | libgloss/msp430/crt0.S | 79 | ||||
-rw-r--r-- | 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 |