From a3c96a520f0d0e194a4ac43936c5b6dbed607cdd Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Thu, 22 Oct 2020 21:41:01 +0900 Subject: [PATCH] task_startup: Implement cxx_initialize for sim/macOS --- libs/libc/Kconfig | 1 + libs/libc/sched/Kconfig | 17 ++++ libs/libc/sched/Make.defs | 9 ++ libs/libc/sched/cxx_initialize.h | 21 +++++ libs/libc/sched/cxx_initialize_macho.c | 61 +++++++++++++ libs/libc/sched/cxx_initialize_sinit.c | 113 +++++++++++++++++++++++++ libs/libc/sched/task_startup.c | 85 +------------------ 7 files changed, 224 insertions(+), 83 deletions(-) create mode 100644 libs/libc/sched/Kconfig create mode 100644 libs/libc/sched/cxx_initialize.h create mode 100644 libs/libc/sched/cxx_initialize_macho.c create mode 100644 libs/libc/sched/cxx_initialize_sinit.c diff --git a/libs/libc/Kconfig b/libs/libc/Kconfig index cf512d886a..1a36dca660 100644 --- a/libs/libc/Kconfig +++ b/libs/libc/Kconfig @@ -9,6 +9,7 @@ source "libs/libc/stdio/Kconfig" source "libs/libc/audio/Kconfig" source "libs/libc/math/Kconfig" source "libs/libc/machine/Kconfig" +source "libs/libc/sched/Kconfig" source "libs/libc/stdlib/Kconfig" source "libs/libc/unistd/Kconfig" source "libs/libc/string/Kconfig" diff --git a/libs/libc/sched/Kconfig b/libs/libc/sched/Kconfig new file mode 100644 index 0000000000..c13df9eed8 --- /dev/null +++ b/libs/libc/sched/Kconfig @@ -0,0 +1,17 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +choice + prompt "CXX initialization style" + default CXX_INITIALIZE_MACHO if ARCH_SIM && HOST_MACOS + default CXX_INITIALIZE_SINIT + +config CXX_INITIALIZE_SINIT + bool "_sinit/_einit style intialization" + +config CXX_INITIALIZE_MACHO + bool "Mach-O style intialization (sim/macOS)" + +endchoice diff --git a/libs/libc/sched/Make.defs b/libs/libc/sched/Make.defs index a136f4834e..f3881bc1e0 100644 --- a/libs/libc/sched/Make.defs +++ b/libs/libc/sched/Make.defs @@ -34,12 +34,21 @@ endif ifneq ($(CONFIG_BUILD_KERNEL),y) CSRCS += task_startup.c + +ifeq ($(CONFIG_CXX_INITIALIZE_SINIT),y) +CSRCS += cxx_initialize_sinit.c +endif + +ifeq ($(CONFIG_CXX_INITIALIZE_MACHO),y) +CSRCS += cxx_initialize_macho.c endif ifeq ($(CONFIG_SCHED_BACKTRACE),y) CSRCS += sched_dumpstack.c sched_backtrace.c endif +endif # CONFIG_BUILD_KERNEL + # Add the sched directory to the build DEPPATH += --dep-path sched diff --git a/libs/libc/sched/cxx_initialize.h b/libs/libc/sched/cxx_initialize.h new file mode 100644 index 0000000000..e8fd6549d9 --- /dev/null +++ b/libs/libc/sched/cxx_initialize.h @@ -0,0 +1,21 @@ +/**************************************************************************** + * libs/libc/sched/cxx_initialize.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +void cxx_initialize(void); diff --git a/libs/libc/sched/cxx_initialize_macho.c b/libs/libc/sched/cxx_initialize_macho.c new file mode 100644 index 0000000000..ca9cf7fd40 --- /dev/null +++ b/libs/libc/sched/cxx_initialize_macho.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * libs/libc/sched/cxx_initialize_macho.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cxx_initialize + * + * Description: + * If C++ and C++ static constructors are supported, then this function + * must be provided by board-specific logic in order to perform + * initialization of the static C++ class instances. + * + * This function should then be called in the application-specific + * user_start logic in order to perform the C++ initialization. NOTE + * that no component of the core NuttX RTOS logic is involved; this + * function definition only provides the 'contract' between application + * specific C++ code and platform-specific toolchain support. + * + ****************************************************************************/ + +void cxx_initialize(void) +{ +#ifdef CONFIG_HAVE_CXXINITIALIZE + static int inited = 0; + + if (inited == 0) + { + extern void macho_call_saved_init_funcs(void); + + macho_call_saved_init_funcs(); + + inited = 1; + } +#endif +} diff --git a/libs/libc/sched/cxx_initialize_sinit.c b/libs/libc/sched/cxx_initialize_sinit.c new file mode 100644 index 0000000000..1fcc0dcd63 --- /dev/null +++ b/libs/libc/sched/cxx_initialize_sinit.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * libs/libc/sched/cxx_initialize_sinit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* This type defines one entry in initialization array */ + +typedef CODE void (*initializer_t)(void); + +/**************************************************************************** + * External References + ****************************************************************************/ + +/* _sinit and _einit are symbols exported by the linker script that mark the + * beginning and the end of the C++ initialization section. + */ + +extern initializer_t _sinit; +extern initializer_t _einit; + +/* _stext and _etext are symbols exported by the linker script that mark the + * beginning and the end of text. + */ + +extern uintptr_t _stext; +extern uintptr_t _etext; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: cxx_initialize + * + * Description: + * If C++ and C++ static constructors are supported, then this function + * must be provided by board-specific logic in order to perform + * initialization of the static C++ class instances. + * + * This function should then be called in the application-specific + * user_start logic in order to perform the C++ initialization. NOTE + * that no component of the core NuttX RTOS logic is involved; this + * function definition only provides the 'contract' between application + * specific C++ code and platform-specific toolchain support. + * + ****************************************************************************/ + +void cxx_initialize(void) +{ +#ifdef CONFIG_HAVE_CXXINITIALIZE + static int inited = 0; + + if (inited == 0) + { + initializer_t *initp; + + sinfo("_sinit: %p _einit: %p _stext: %p _etext: %p\n", + &_sinit, &_einit, &_stext, &_etext); + + /* Visit each entry in the initialization table */ + + for (initp = &_sinit; initp != &_einit; initp++) + { + initializer_t initializer = *initp; + sinfo("initp: %p initializer: %p\n", initp, initializer); + + /* Make sure that the address is non-NULL and lies in the text + * region defined by the linker script. Some toolchains may put + * NULL values or counts in the initialization table. + */ + + if ((FAR void *)initializer >= (FAR void *)&_stext && + (FAR void *)initializer < (FAR void *)&_etext) + { + sinfo("Calling %p\n", initializer); + initializer(); + } + } + + inited = 1; + } +#endif +} diff --git a/libs/libc/sched/task_startup.c b/libs/libc/sched/task_startup.c index 3b111c5a57..76a03f5291 100644 --- a/libs/libc/sched/task_startup.c +++ b/libs/libc/sched/task_startup.c @@ -29,91 +29,10 @@ #include #include +#include "cxx_initialize.h" + #ifndef CONFIG_BUILD_KERNEL -/**************************************************************************** - * Private Types - ****************************************************************************/ - -/* This type defines one entry in initialization array */ - -typedef CODE void (*initializer_t)(void); - -/**************************************************************************** - * External References - ****************************************************************************/ - -/* _sinit and _einit are symbols exported by the linker script that mark the - * beginning and the end of the C++ initialization section. - */ - -extern initializer_t _sinit; -extern initializer_t _einit; - -/* _stext and _etext are symbols exported by the linker script that mark the - * beginning and the end of text. - */ - -extern uintptr_t _stext; -extern uintptr_t _etext; - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: cxx_initialize - * - * Description: - * If C++ and C++ static constructors are supported, then this function - * must be provided by board-specific logic in order to perform - * initialization of the static C++ class instances. - * - * This function should then be called in the application-specific - * user_start logic in order to perform the C++ initialization. NOTE - * that no component of the core NuttX RTOS logic is involved; this - * function definition only provides the 'contract' between application - * specific C++ code and platform-specific toolchain support. - * - ****************************************************************************/ - -static void cxx_initialize(void) -{ -#ifdef CONFIG_HAVE_CXXINITIALIZE - static int inited = 0; - - if (inited == 0) - { - initializer_t *initp; - - sinfo("_sinit: %p _einit: %p _stext: %p _etext: %p\n", - &_sinit, &_einit, &_stext, &_etext); - - /* Visit each entry in the initialization table */ - - for (initp = &_sinit; initp != &_einit; initp++) - { - initializer_t initializer = *initp; - sinfo("initp: %p initializer: %p\n", initp, initializer); - - /* Make sure that the address is non-NULL and lies in the text - * region defined by the linker script. Some toolchains may put - * NULL values or counts in the initialization table. - */ - - if ((FAR void *)initializer >= (FAR void *)&_stext && - (FAR void *)initializer < (FAR void *)&_etext) - { - sinfo("Calling %p\n", initializer); - initializer(); - } - } - - inited = 1; - } -#endif -} - /**************************************************************************** * Public Functions ****************************************************************************/