X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c74cd8ff2a61ce60dcbb71c6b169c51c1085e059..3203ed1f4fb6f4617e94d5351661ba07e8b8f833:/src/mc/mc_checkpoint.cpp diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 97ddc26b0f..01c518386c 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -10,17 +10,17 @@ #include #include -#include "internal_config.h" +#include "src/internal_config.h" #include "mc_memory_map.h" #include "mc_private.h" #include "xbt/module.h" #include -#include "../smpi/private.h" +#include "src/smpi/private.h" #include -#include "xbt/mmalloc/mmprivate.h" +#include "src/xbt/mmalloc/mmprivate.h" -#include "../simix/smx_private.h" +#include "src/simix/smx_private.h" #include #include @@ -36,9 +36,9 @@ #include "mc_smx.h" #include "mc_hash.hpp" -#include "mc/ObjectInformation.hpp" -#include "mc/Frame.hpp" -#include "mc/Variable.hpp" +#include "src/mc/ObjectInformation.hpp" +#include "src/mc/Frame.hpp" +#include "src/mc/Variable.hpp" using simgrid::mc::remote; @@ -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 @@ -97,8 +85,8 @@ namespace mc { #ifdef HAVE_SMPI simgrid::mc::RegionSnapshot privatized_region( - RegionType region_type, void *start_addr, void* permanent_addr, size_t size, - const simgrid::mc::RegionSnapshot* ref_region + RegionType region_type, void *start_addr, void* permanent_addr, + std::size_t size, const simgrid::mc::RegionSnapshot* ref_region ) { size_t process_count = MC_smpi_process_count(); @@ -138,7 +126,8 @@ extern "C" { static void MC_snapshot_add_region(int index, mc_snapshot_t snapshot, simgrid::mc::RegionType type, simgrid::mc::ObjectInformation* object_info, - void *start_addr, void* permanent_addr, size_t size) + void *start_addr, void* permanent_addr, + std::size_t size) { if (type == simgrid::mc::RegionType::Data) xbt_assert(object_info, "Missing object info for object."); @@ -208,9 +197,10 @@ static void MC_get_memory_regions(simgrid::mc::Process* process, mc_snapshot_t s * `dl_iterate_phdr` would be more robust but would not work in cross-process. * */ void MC_find_object_address( - std::vector const& maps, simgrid::mc::ObjectInformation* result) + std::vector const& maps, + simgrid::mc::ObjectInformation* result) { - const char* file_name = xbt_strdup(result->file_name.c_str()); + char* file_name = xbt_strdup(result->file_name.c_str()); const char *name = basename(file_name); for (size_t i = 0; i < maps.size(); ++i) { simgrid::mc::VmMap const& reg = maps[i]; @@ -258,6 +248,7 @@ void MC_find_object_address( xbt_assert(result->start_rw); xbt_assert(result->start_exec); + free(file_name); } /************************************* Take Snapshot ************************************/ @@ -272,7 +263,8 @@ void MC_find_object_address( * \param ip Instruction pointer * \return true if the variable is valid * */ -static bool mc_valid_variable(simgrid::mc::Variable* var, simgrid::mc::Frame* scope, +static bool mc_valid_variable(simgrid::mc::Variable* var, + simgrid::mc::Frame* scope, const void *ip) { // The variable is not yet valid: @@ -283,7 +275,8 @@ static bool mc_valid_variable(simgrid::mc::Variable* var, simgrid::mc::Frame* sc } static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, - simgrid::mc::Frame* scope, int process_index, + simgrid::mc::Frame* scope, + int process_index, std::vector& result) { simgrid::mc::Process* process = &mc_model_checker->process(); @@ -316,22 +309,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, ¤t_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"); @@ -396,7 +384,7 @@ static std::vector 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(); @@ -486,7 +474,7 @@ static std::vector 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()) { @@ -494,7 +482,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)); @@ -502,7 +490,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); } } @@ -510,7 +498,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)); } @@ -600,9 +588,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; @@ -626,7 +613,7 @@ mc_snapshot_t MC_take_snapshot(int num_state) if (_sg_mc_visited > 0 || strcmp(_sg_mc_property_file, "")) { snapshot->stacks = MC_take_snapshot_stacks(&snapshot); - if (_sg_mc_hash && !snapshot->stacks.empty()) { + if (_sg_mc_hash) { snapshot->hash = simgrid::mc::hash(*snapshot); } else { snapshot->hash = 0;