Switch the inferior too in switch_to_program_space_and_thread
[deliverable/binutils-gdb.git] / sim / common / dv-glue.c
index b99487dbd784684c56650f7015a0c1f334a71e44..fb693443d9b0b4cc04fde268fee5054d91d8d618 100644 (file)
@@ -1,6 +1,6 @@
 /* The common simulator framework for GDB, the GNU Debugger.
 
-   Copyright 2002, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright 2002-2020 Free Software Foundation, Inc.
 
    Contributed by Andrew Cagney and Red Hat.
 
@@ -195,6 +195,7 @@ static void
 hw_glue_finish (struct hw *me)
 {
   struct hw_glue *glue = HW_ZALLOC (me, struct hw_glue);
+  const char *name = hw_name (me);
 
   /* establish our own methods */
   set_hw_data (me, glue);
@@ -207,39 +208,49 @@ hw_glue_finish (struct hw *me)
   do_hw_attach_regs (me);
 
   /* establish the output registers */
-  {
-    reg_property_spec unit;
-    int reg_nr;
-
-    /* find a relevant reg entry */
-    reg_nr = 0;
-    while (hw_find_reg_array_property (me, "reg", reg_nr, &unit)
-          && !hw_unit_size_to_attach_size (hw_parent (me),
-                                           &unit.size,
-                                           &glue->sizeof_output,
-                                           me))
-      reg_nr++;
-
-    /* check out the size */
-    if (glue->sizeof_output == 0)
-      hw_abort (me, "at least one reg property size must be nonzero");
-    if (glue->sizeof_output % sizeof (unsigned_word) != 0)
-      hw_abort (me, "reg property size must be %ld aligned",
-               (long) sizeof (unsigned_word));
-
-    /* and the address */
-    hw_unit_address_to_attach_address (hw_parent (me),
-                                      &unit.address,
-                                      &glue->space,
-                                      &glue->address,
-                                      me);
-    if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0)
-      hw_abort (me, "reg property address must be %ld aligned",
-               (long) (sizeof (unsigned_word) * max_nr_ports));
-
-    glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word);
-    glue->output = hw_zalloc (me, glue->sizeof_output);
-  }
+  if (hw_find_property (me, "reg"))
+    {
+      reg_property_spec unit;
+      int reg_nr;
+
+      /* Find a relevant reg entry.  */
+      reg_nr = 0;
+      while (hw_find_reg_array_property (me, "reg", reg_nr, &unit)
+            && !hw_unit_size_to_attach_size (hw_parent (me),
+                                             &unit.size,
+                                             &glue->sizeof_output,
+                                             me))
+       reg_nr++;
+
+      /* Check out the size ...  */
+      if (glue->sizeof_output == 0)
+       hw_abort (me, "at least one reg property size must be nonzero");
+      if (glue->sizeof_output % sizeof (unsigned_word) != 0)
+       hw_abort (me, "reg property size must be %ld aligned",
+                 (long) sizeof (unsigned_word));
+
+      /* ... and the address.  */
+      hw_unit_address_to_attach_address (hw_parent (me),
+                                        &unit.address,
+                                        &glue->space,
+                                        &glue->address,
+                                        me);
+      if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0)
+       hw_abort (me, "reg property address must be %ld aligned",
+                 (long) (sizeof (unsigned_word) * max_nr_ports));
+
+      glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word);
+    }
+  else
+    {
+      /* Allow bitwise glue devices to declare only ports.  */
+      if (!strcmp (name, "glue"))
+       hw_abort (me, "Missing \"reg\" property");
+
+      glue->nr_outputs = 1;
+      glue->sizeof_output = sizeof (unsigned_word);
+    }
+  glue->output = hw_zalloc (me, glue->sizeof_output);
 
   /* establish the input ports */
   {
@@ -267,20 +278,16 @@ hw_glue_finish (struct hw *me)
   }
 
   /* determine our type */
-  {
-    const char *name = hw_name(me);
-
-    if (strcmp (name, "glue") == 0)
-      glue->type = glue_io;
-    else if (strcmp (name, "glue-and") == 0)
-      glue->type = glue_and;
-    else if (strcmp (name, "glue-or") == 0)
-      glue->type = glue_or;
-    else if (strcmp (name, "glue-xor") == 0)
-      glue->type = glue_xor;
-    else
-      hw_abort (me, "unimplemented glue type");
-  }
+  if (strcmp (name, "glue") == 0)
+    glue->type = glue_io;
+  else if (strcmp (name, "glue-and") == 0)
+    glue->type = glue_and;
+  else if (strcmp (name, "glue-or") == 0)
+    glue->type = glue_or;
+  else if (strcmp (name, "glue-xor") == 0)
+    glue->type = glue_xor;
+  else
+    hw_abort (me, "unimplemented glue type");
 
   HW_TRACE ((me, "int-number %d, nr_inputs %d, nr_outputs %d",
             glue->int_number, glue->nr_inputs, glue->nr_outputs));
This page took 0.025747 seconds and 4 git commands to generate.