Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] OOify mc_find_frame_base()
[simgrid.git] / src / mc / mc_checkpoint.cpp
index 8c64e1b..746d20b 100644 (file)
@@ -50,18 +50,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkpoint, mc,
 /************************************  Free functions **************************************/
 /*****************************************************************************************/
 
-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.
-  // This field is only non-NULL when using soft-dirty
-  // page tracking.
-  if (snapshot == mc_model_checker->parent_snapshot_)
-    return true;
-
-  return false;
-}
-
 /** @brief Restore a region from a snapshot
  *
  *  @param reg     Target region
@@ -317,22 +305,17 @@ 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.location_list.empty()) {
-      s_mc_location_t location;
-      mc_dwarf_resolve_locations(
-        &location, &current_variable.location_list,
-        current_variable.object_info,
-        &(stack_frame->unw_cursor),
-        (void *) stack_frame->frame_base,
-        &mc_model_checker->process(), 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:
+      simgrid::dwarf::Location location =
+        simgrid::dwarf::resolve(
+          current_variable.location_list,
+          current_variable.object_info,
+          &(stack_frame->unw_cursor),
+          (void *) stack_frame->frame_base,
+          &mc_model_checker->process(), process_index);
+
+      if (!location.in_memory())
         xbt_die("Cannot handle non-address variable");
-      }
+      new_var.address = location.address();
 
     } else {
       xbt_die("No address");
@@ -397,7 +380,7 @@ static std::vector<s_mc_stack_frame_t> MC_unwind_stack_frames(mc_unw_context_t s
       if (frame) {
         stack_frame.frame_name = frame->name;
         stack_frame.frame_base =
-            (unw_word_t) mc_find_frame_base(frame, frame->object_info, &c);
+            (unw_word_t) frame->frame_base(c);
       } else {
         stack_frame.frame_base = 0;
         stack_frame.frame_name = std::string();
@@ -487,7 +470,7 @@ static std::vector<s_mc_heap_ignore_region_t> MC_take_snapshot_ignore()
 
 static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot)
 {
-  xbt_assert(snapshot->process);
+  xbt_assert(snapshot->process());
   
   // Copy the memory:
   for (auto const& region : mc_model_checker->process().ignored_regions()) {
@@ -495,7 +478,7 @@ static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot)
     ignored_data.start = (void*)region.addr;
     ignored_data.data.resize(region.size);
     // TODO, we should do this once per privatization segment:
-    snapshot->process->read_bytes(
+    snapshot->process()->read_bytes(
       ignored_data.data.data(), region.size, remote(region.addr),
       simgrid::mc::ProcessIndexDisabled);
     snapshot->ignored_data.push_back(std::move(ignored_data));
@@ -503,7 +486,7 @@ static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot)
 
   // Zero the memory:
   for(auto const& region : mc_model_checker->process().ignored_regions()) {
-    snapshot->process->clear_bytes(remote(region.addr), region.size);
+    snapshot->process()->clear_bytes(remote(region.addr), region.size);
   }
 
 }
@@ -511,7 +494,7 @@ static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot)
 static void MC_snapshot_ignore_restore(mc_snapshot_t snapshot)
 {
   for (auto const& ignored_data : snapshot->ignored_data)
-    snapshot->process->write_bytes(
+    snapshot->process()->write_bytes(
       ignored_data.data.data(), ignored_data.data.size(),
       remote(ignored_data.start));
 }
@@ -601,9 +584,8 @@ mc_snapshot_t MC_take_snapshot(int num_state)
 
   simgrid::mc::Process* mc_process = &mc_model_checker->process();
 
-  mc_snapshot_t snapshot = new simgrid::mc::Snapshot();
+  mc_snapshot_t snapshot = new simgrid::mc::Snapshot(mc_process);
 
-  snapshot->process = mc_process;
   snapshot->num_state = num_state;
 
   smx_process_t process;