Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
rename all SIMIX_pre_* to simcall_HANDLER_*
[simgrid.git] / src / mc / mc_checkpoint.c
index 9b21eb1..6920bf2 100644 (file)
@@ -102,7 +102,7 @@ void MC_free_snapshot(mc_snapshot_t snapshot)
 /*******************************  Snapshot regions ********************************/
 /*********************************************************************************/
 
-  static mc_mem_region_t mc_region_new_dense(int type, void *start_addr, void* permanent_addr, size_t size, mc_mem_region_t ref_reg)
+static mc_mem_region_t mc_region_new_dense(int type, void *start_addr, void* permanent_addr, size_t size, mc_mem_region_t ref_reg)
 {
   mc_mem_region_t new_reg = xbt_new(s_mc_mem_region_t, 1);
   new_reg->start_addr = start_addr;
@@ -245,50 +245,6 @@ void MC_init_memory_map_info()
 
 }
 
-/** \brief Fill/lookup the "subtype" field.
- */
-static void MC_resolve_subtype(mc_object_info_t info, dw_type_t type)
-{
-
-  if (type->dw_type_id == NULL)
-    return;
-  type->subtype = xbt_dict_get_or_null(info->types, type->dw_type_id);
-  if (type->subtype == NULL)
-    return;
-  if (type->subtype->byte_size != 0)
-    return;
-  if (type->subtype->name == NULL)
-    return;
-  // Try to find a more complete description of the type:
-  // We need to fix in order to support C++.
-
-  dw_type_t subtype =
-      xbt_dict_get_or_null(info->full_types_by_name, type->subtype->name);
-  if (subtype != NULL) {
-    type->subtype = subtype;
-  }
-
-}
-
-void MC_post_process_types(mc_object_info_t info)
-{
-  xbt_dict_cursor_t cursor = NULL;
-  char *origin;
-  dw_type_t type;
-
-  // Lookup "subtype" field:
-  xbt_dict_foreach(info->types, cursor, origin, type) {
-    MC_resolve_subtype(info, type);
-
-    dw_type_t member;
-    unsigned int i = 0;
-    if (type->members != NULL)
-      xbt_dynar_foreach(type->members, i, member) {
-      MC_resolve_subtype(info, member);
-      }
-  }
-}
-
 /** \brief Fills the position of the segments (executable, read-only, read/write).
  *
  * TODO, use dl_iterate_phdr to be more robust
@@ -389,12 +345,22 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame,
     if (current_variable->address != NULL) {
       new_var->address = current_variable->address;
     } else if (current_variable->locations.size != 0) {
-      new_var->address =
-          (void *) mc_dwarf_resolve_locations(&current_variable->locations,
+      s_mc_location_t location;
+      mc_dwarf_resolve_locations(&location, &current_variable->locations,
                                               current_variable->object_info,
                                               &(stack_frame->unw_cursor),
                                               (void *) stack_frame->frame_base,
                                               NULL, process_index);
+
+      switch(mc_get_location_type(&location)) {
+      case MC_LOCATION_TYPE_ADDRESS:
+        new_var->address = location.memory_location;
+        break;
+      case MC_LOCATION_TYPE_REGISTER:
+      default:
+        xbt_die("Cannot handle non-address variable");
+      }
+
     } else {
       xbt_die("No address");
     }
@@ -599,7 +565,9 @@ static void MC_snapshot_ignore_restore(mc_snapshot_t snapshot)
 int mc_important_snapshot(mc_snapshot_t snapshot)
 {
   // We need this snapshot in order to know which
-  // pages needs to be stored in the next snapshot:
+  // pages needs to be stored in the next snapshot.
+  // This field is only non-NULL when using soft-dirty
+  // page tracking.
   if (snapshot == mc_model_checker->parent_snapshot)
     return true;
 
@@ -669,7 +637,13 @@ void MC_restore_snapshot(mc_snapshot_t snapshot)
     }
   }
   if(snapshot->privatization_index >= 0) {
-    smpi_switch_data_segment(snapshot->privatization_index);
+    // We just rewrote the global variables.
+    // The privatisation segment SMPI thinks
+    // is mapped might be inconsistent with the segment which
+    // is really mapped in memory (kernel state).
+    // We ask politely SMPI to map the segment anyway,
+    // even if it thinks it is the current one:
+    smpi_really_switch_data_segment(snapshot->privatization_index);
   }
 #endif
 
@@ -683,7 +657,7 @@ void MC_restore_snapshot(mc_snapshot_t snapshot)
   }
 }
 
-mc_snapshot_t SIMIX_pre_mc_snapshot(smx_simcall_t simcall)
+mc_snapshot_t simcall_HANDLER_mc_snapshot(smx_simcall_t simcall)
 {
   return MC_take_snapshot(1);
 }