[v2] RISC-V: Do not use _init/_fini

Message ID 20180730082844.14461-1-sebastian.huber@embedded-brains.de
State Accepted
Commit 6158b30e3e9b1b582ae60b15d64e775fa1705483
Headers show
Series
  • [v2] RISC-V: Do not use _init/_fini
Related show

Commit Message

Sebastian Huber July 30, 2018, 8:28 a.m.
Introduce new host configuration variable "have_init_fini" which is set
to "yes" by default.  Override it for RISC-V to "no".

Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>

---
 libgloss/riscv/crt0.S   | 11 -----------
 newlib/configure.host   |  8 ++++++++
 newlib/libc/misc/fini.c |  4 ++++
 newlib/libc/misc/init.c |  4 ++++
 4 files changed, 16 insertions(+), 11 deletions(-)

-- 
2.13.7

Comments

Jim Wilson July 31, 2018, 4:41 p.m. | #1
On Mon, Jul 30, 2018 at 1:28 AM, Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
> Introduce new host configuration variable "have_init_fini" which is set

> to "yes" by default.  Override it for RISC-V to "no".


I think this patch is much better than the previous one.  Keeps the
config stuff in one place.  It looks good to me, but I'm not a newlib
maintainer.

Jim
Kito Cheng Aug. 1, 2018, 8:04 a.m. | #2
RISC-V part is LGTM.

On Wed, Aug 1, 2018 at 12:42 AM Jim Wilson <jimw@sifive.com> wrote:

> On Mon, Jul 30, 2018 at 1:28 AM, Sebastian Huber

> <sebastian.huber@embedded-brains.de> wrote:

> > Introduce new host configuration variable "have_init_fini" which is set

> > to "yes" by default.  Override it for RISC-V to "no".

>

> I think this patch is much better than the previous one.  Keeps the

> config stuff in one place.  It looks good to me, but I'm not a newlib

> maintainer.

>

> Jim

>
Corinna Vinschen Aug. 1, 2018, 8:23 a.m. | #3
On Jul 30 10:28, Sebastian Huber wrote:
> Introduce new host configuration variable "have_init_fini" which is set

> to "yes" by default.  Override it for RISC-V to "no".

> 

> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>

> ---

>  libgloss/riscv/crt0.S   | 11 -----------

>  newlib/configure.host   |  8 ++++++++

>  newlib/libc/misc/fini.c |  4 ++++

>  newlib/libc/misc/init.c |  4 ++++

>  4 files changed, 16 insertions(+), 11 deletions(-)


Please push.


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

Patch

diff --git a/libgloss/riscv/crt0.S b/libgloss/riscv/crt0.S
index 3d2a12de5..588becfae 100644
--- a/libgloss/riscv/crt0.S
+++ b/libgloss/riscv/crt0.S
@@ -41,14 +41,3 @@  _start:
   call    main
   tail    exit
   .size  _start, .-_start
-
-  .global _init
-  .type   _init, @function
-  .global _fini
-  .type   _fini, @function
-_init:
-_fini:
-  # These don't have to do anything since we use init_array/fini_array.
-  ret
-  .size  _init, .-_init
-  .size  _fini, .-_fini
diff --git a/newlib/configure.host b/newlib/configure.host
index 4eebf6d95..bfa51669d 100644
--- a/newlib/configure.host
+++ b/newlib/configure.host
@@ -47,6 +47,7 @@ 
 #   crt1_dir            directory where crt1 object is found
 #   have_crt0		"yes"/"no" if crt0 is/isn't provided.
 #			"" if crt0 is provided when sys_dir is set
+#   have_init_fini	have init/fini ("yes" or "no", set to "yes" by default)
 #   noinclude		list of include files to not install
 
 newlib_cflags=
@@ -65,6 +66,7 @@  mach_add_setjmp=
 crt1=
 crt1_dir=
 have_crt0=
+have_init_fini=yes
 use_libtool=no
 have_sys_mach_dir=no
 default_newlib_io_c99_formats=no
@@ -266,6 +268,7 @@  case "${host_cpu}" in
 	machine_dir=riscv
 	newlib_cflags="${newlib_cflags} -DHAVE_NANOSLEEP"
 	default_newlib_atexit_dynamic_alloc="no"
+	have_init_fini=no
 	;;
   rl78)
 	machine_dir=rl78
@@ -920,6 +923,11 @@  if [ "x${xdr_dir}" = "x" ]; then
 	noinclude="${noinclude} rpc/types.h rpc/xdr.h"
 fi
 
+# Have init/finit if not explicitly specified otherwise
+if [ "x${have_init_fini}" != "xno" ]; then
+	newlib_cflags="${newlib_cflags} -DHAVE_INIT_FINI"
+fi
+
 if test -z "${have_crt0}" && test -n "${sys_dir}"; then
   have_crt0="yes"
 fi
diff --git a/newlib/libc/misc/fini.c b/newlib/libc/misc/fini.c
index ab4203bf8..56eed6cb3 100644
--- a/newlib/libc/misc/fini.c
+++ b/newlib/libc/misc/fini.c
@@ -17,7 +17,9 @@ 
 extern void (*__fini_array_start []) (void) __attribute__((weak));
 extern void (*__fini_array_end []) (void) __attribute__((weak));
 
+#ifdef HAVE_INIT_FINI
 extern void _fini (void);
+#endif
 
 /* Run all the cleanup routines.  */
 void
@@ -30,6 +32,8 @@  __libc_fini_array (void)
   for (i = count; i > 0; i--)
     __fini_array_start[i-1] ();
 
+#ifdef HAVE_INIT_FINI
   _fini ();
+#endif
 }
 #endif
diff --git a/newlib/libc/misc/init.c b/newlib/libc/misc/init.c
index c85d6020f..95f1a7422 100644
--- a/newlib/libc/misc/init.c
+++ b/newlib/libc/misc/init.c
@@ -21,7 +21,9 @@  extern void (*__preinit_array_end []) (void) __attribute__((weak));
 extern void (*__init_array_start []) (void) __attribute__((weak));
 extern void (*__init_array_end []) (void) __attribute__((weak));
 
+#ifdef HAVE_INIT_FINI
 extern void _init (void);
+#endif
 
 /* Iterate over all the init routines.  */
 void
@@ -34,7 +36,9 @@  __libc_init_array (void)
   for (i = 0; i < count; i++)
     __preinit_array_start[i] ();
 
+#ifdef HAVE_INIT_FINI
   _init ();
+#endif
 
   count = __init_array_end - __init_array_start;
   for (i = 0; i < count; i++)