You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2020/07/02 02:38:59 UTC

[GitHub] [incubator-nuttx] xiaoxiang781216 commented on a change in pull request #1341: Call c++ global variables in nxtask_startup

xiaoxiang781216 commented on a change in pull request #1341:
URL: https://github.com/apache/incubator-nuttx/pull/1341#discussion_r448715953



##########
File path: libs/libc/sched/task_startup.c
##########
@@ -39,19 +39,101 @@
 
 #include <nuttx/config.h>
 
+#include <sched.h>
 #include <stdlib.h>
 #include <assert.h>
 
-#include <nuttx/userspace.h>
+#ifndef CONFIG_BUILD_KERNEL
 
-#if defined(CONFIG_BUILD_PROTECTED) && !defined(__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
+}

Review comment:
       > @xiaoxiang781216 Is this logic specific to the GNU compiler? I don't know how other C++ compilers provide C++ constructor data.
   
   Not too specific as far as I know, compiler(gcc, clang, ceva) always put the constructor points in a special section.
   
   > It could work completely differently. I wonder if this does not belong in libs/libc/machine/*/gnu
   
   Yes, if some compiler work differently, we need put this stuff into the compiler specific folder, but libc/machine/*/gnu isn't very suitable since how to invoke the constructor is only compiler specific not machine specific.
   BTW, on the other hand, the exception unwind is the compiler and machine specific, so could you review this patch?
   https://github.com/apache/incubator-nuttx/pull/1315.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org