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);
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 ************************************/
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);
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;
dw_variable_t current_var;
size_t offset;
void *start_data;
- void* start_data_binary = mc_binary_info->start_data;
- void* start_data_libsimgrid = mc_libsimgrid_info->start_data;
+ void* start_data_binary = mc_binary_info->start_rw;
+ void* start_data_libsimgrid = mc_libsimgrid_info->start_rw;
mc_object_info_t object_info = NULL;
mc_object_info_t other_object_info = NULL;
}
static int compare_local_variables(mc_snapshot_stack_t stack1, mc_snapshot_stack_t stack2, void *heap1, void *heap2){
- void* start_data_binary = mc_binary_info->start_data;
- void* start_data_libsimgrid = mc_libsimgrid_info->start_data;
+ void* start_data_binary = mc_binary_info->start_rw;
+ void* start_data_libsimgrid = mc_libsimgrid_info->start_rw;
if(!compared_pointers){
compared_pointers = xbt_dynar_new(sizeof(pointers_pair_t), pointers_pair_free_voidp);
// object_info
mc_object_info_t MC_new_object_info(void) {
- mc_object_info_t res = xbt_new(s_mc_object_info_t, 1);
- res->file_name = NULL;
- res->start_text = NULL;
- res->start_data = NULL;
- res->start_bss = NULL;
+ mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
res->local_variables = xbt_dict_new_homogeneous(NULL);
res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
res->types = xbt_dict_new_homogeneous(NULL);
typedef struct s_mc_object_info {
char* file_name;
- char* start_text;
- char* start_data;
- char* start_bss;
+ char *start_exec, *end_exec; // Executable segment
+ char *start_rw, *end_rw; // Read-write segment
+ char *start_ro, *end_ro; // read-only segment
xbt_dict_t local_variables; // xbt_dict_t<frame_name, dw_frame_t>
xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>