sim: add framework for declaring init callbacks locally
[deliverable/binutils-gdb.git] / sim / common / sim-module.c
index ea436902439a862a5c9614d64e7dbba0bec612a4..a776a082176f337f0ef3428a0ed346a6bf14aca9 100644 (file)
@@ -38,8 +38,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <stdlib.h>
 
-/* List of all modules.  */
-static MODULE_INSTALL_FN * const modules[] = {
+/* List of all early/core modules.
+   TODO: Should trim this list by converting to sim_install_* framework.  */
+static MODULE_INSTALL_FN * const early_modules[] = {
   standard_install,
   sim_events_install,
   sim_model_install,
@@ -63,8 +64,12 @@ static MODULE_INSTALL_FN * const modules[] = {
   /* TODO: Shouldn't have device models here.  */
   dv_sockser_install,
 #endif
-  0
 };
+static int early_modules_len = ARRAY_SIZE (early_modules);
+
+/* List of dynamically detected modules.  Declared in generated modules.c.  */
+extern MODULE_INSTALL_FN * const sim_modules_detected[];
+extern const int sim_modules_detected_len;
 \f
 /* Functions called from sim_open.  */
 
@@ -92,11 +97,13 @@ sim_pre_argv_init (SIM_DESC sd, const char *myname)
 
   sim_config_default (sd);
 
-  /* Install all configured in modules.  */
+  /* Install all early configured-in modules.  */
   if (sim_module_install (sd) != SIM_RC_OK)
     return SIM_RC_FAIL;
 
-  return SIM_RC_OK;
+  /* Install all remaining dynamically detected modules.  */
+  return sim_module_install_list (sd, sim_modules_detected,
+                                 sim_modules_detected_len);
 }
 
 /* Initialize common parts after argument processing.  */
@@ -121,30 +128,44 @@ sim_post_argv_init (SIM_DESC sd)
   return SIM_RC_OK;
 }
 \f
-/* Install all modules.
+/* Install a list of modules.
    If this fails, no modules are left installed.  */
-
 SIM_RC
-sim_module_install (SIM_DESC sd)
+sim_module_install_list (SIM_DESC sd, MODULE_INSTALL_FN * const *modules,
+                        size_t modules_len)
 {
-  MODULE_INSTALL_FN * const *modp;
+  size_t i;
 
-  SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
-  SIM_ASSERT (STATE_MODULES (sd) == NULL);
-
-  STATE_MODULES (sd) = ZALLOC (struct module_list);
-  for (modp = modules; *modp != NULL; ++modp)
+  for (i = 0; i < modules_len; ++i)
     {
-      if ((*modp) (sd) != SIM_RC_OK)
+      MODULE_INSTALL_FN *modp = modules[i];
+
+      if (modp != NULL && modp (sd) != SIM_RC_OK)
        {
          sim_module_uninstall (sd);
          SIM_ASSERT (STATE_MODULES (sd) == NULL);
          return SIM_RC_FAIL;
        }
     }
+
   return SIM_RC_OK;
 }
 
+/* Install all modules.
+   If this fails, no modules are left installed.  */
+
+SIM_RC
+sim_module_install (SIM_DESC sd)
+{
+  MODULE_INSTALL_FN * const *modp;
+
+  SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
+  SIM_ASSERT (STATE_MODULES (sd) == NULL);
+
+  STATE_MODULES (sd) = ZALLOC (struct module_list);
+  return sim_module_install_list (sd, early_modules, early_modules_len);
+}
+
 /* Called after all modules have been installed and after argv
    has been processed.  */
 
This page took 0.030203 seconds and 4 git commands to generate.