}
+static void MC_post_process_types(mc_object_info_t info) {
+ // Nothing here
+}
+
/** \brief Finds informations about a given shared object/executable */
mc_object_info_t MC_find_object_info(memory_map_t maps, char* name) {
mc_object_info_t result = MC_new_object_info();
result->file_name = xbt_strdup(name);
- result->start_data = NULL;
- result->start_text = NULL;
MC_find_object_address(maps, result);
MC_dwarf_get_variables(result);
+ MC_post_process_types(result);
return result;
}
// Nothing to do
}
else if ((reg.prot & PROT_WRITE)){
- result->start_data = reg.start_addr;
+ xbt_assert(!result->start_rw,
+ "Multiple read-write segments for %s, not supported",
+ maps->regions[i].pathname);
+ result->start_rw = reg.start_addr;
+ result->end_rw = reg.end_addr;
} else if ((reg.prot & PROT_READ) && (reg.prot & PROT_EXEC)){
- result->start_text = reg.start_addr;
+ xbt_assert(!result->start_exec,
+ "Multiple executable segments for %s, not supported",
+ maps->regions[i].pathname);
+ result->start_exec = reg.start_addr;
+ result->end_exec = reg.end_addr;
+ }
+ else if((reg.prot & PROT_READ) && !(reg.prot & PROT_EXEC)) {
+ xbt_assert(!result->start_ro,
+ "Multiple read only segments for %s, not supported",
+ maps->regions[i].pathname);
+ result->start_ro = reg.start_addr;
+ result->end_ro = reg.end_addr;
}
i++;
}
xbt_assert(result->file_name);
- xbt_assert(result->start_data);
- xbt_assert(result->start_text);
+ xbt_assert(result->start_rw);
+ xbt_assert(result->start_exec);
}
/************************************* Take Snapshot ************************************/
unsigned int cursor = 0;
dw_variable_t current_variable;
- dw_location_entry_t entry = NULL;
- int frame_found = 0, region_type;
+ int region_type;
void *frame_pointer_address = NULL;
long true_ip;
int stop = 0;
if(!strcmp(frame_name, "smx_ctx_sysv_wrapper")) /* Stop before context switch with maestro */
stop = 1;
- if((long)ip > (long) mc_libsimgrid_info->start_text)
+ if((long)ip > (long) mc_libsimgrid_info->start_exec)
frame = xbt_dict_get_or_null(mc_libsimgrid_info->local_variables, frame_name);
else
frame = xbt_dict_get_or_null(mc_binary_info->local_variables, frame_name);
}
true_ip = (long)frame->low_pc + (long)off;
- frame_pointer_address = NULL;
-
- /* Get frame pointer */
- switch(frame->frame_base->type){
- case e_dw_loclist:
- cursor = 0;
- while(cursor < xbt_dynar_length(frame->frame_base->location.loclist) && !frame_found){
- entry = xbt_dynar_get_as(frame->frame_base->location.loclist, cursor, dw_location_entry_t);
- if((true_ip >= entry->lowpc) && (true_ip < entry->highpc)){
- frame_found = 1;
- frame_pointer_address = (void*) MC_dwarf_resolve_location(&c, entry->location, NULL);
- }
- cursor++;
- }
- break;
- default :
- frame_pointer_address = NULL; /* FIXME : implement other cases (with optimizations enabled)*/
- break;
- }
+ frame_pointer_address = mc_find_frame_base(true_ip, frame, &c);
- frame_found = 0;
cursor = 0;
xbt_dynar_foreach(frame->variables, cursor, current_variable){
- if((long)ip > (long)mc_libsimgrid_info->start_text)
+ if((long)ip > (long)mc_libsimgrid_info->start_exec)
region_type = 1;
else
region_type = 2;
mc_snapshot_t snapshot = xbt_new0(s_mc_snapshot_t, 1);
snapshot->nb_processes = xbt_swag_size(simix_global->process_list);
+ if(MC_USE_SNAPSHOT_HASH) {
+ snapshot->hash = mc_hash_processes_state(num_state);
+ } else {
+ snapshot->hash = 0;
+ }
/* Save the std heap and the writable mapped pages of libsimgrid and binary */
MC_get_memory_regions(snapshot);