From f6e28b0bd83e4bbdde69a243303517b801437ffc Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Mon, 20 Jan 2014 10:19:38 +0100 Subject: [PATCH] [mc] Have a more complete/accurate view of an given object mapping in memory * Change the terminology (exec/rw instead of text/data) as we do not have information about the sections but only about the segments. * Add information about the read only segment. --- src/mc/mc_checkpoint.c | 29 +++++++++++++++++++++-------- src/mc/mc_compare.c | 8 ++++---- src/mc/mc_dwarf.c | 2 +- src/mc/mc_global.c | 6 +----- src/mc/mc_private.h | 6 +++--- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index fb323a4a95..5aeff819d3 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -243,8 +243,6 @@ void MC_init_memory_map_info(){ 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; @@ -262,16 +260,31 @@ static void MC_find_object_address(memory_map_t maps, mc_object_info_t 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 ************************************/ @@ -409,7 +422,7 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){ 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); @@ -445,7 +458,7 @@ static xbt_dynar_t MC_get_local_variables_values(void *stack_context){ 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; diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index f9feecf980..09e11eff94 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -248,8 +248,8 @@ static int compare_global_variables(int region_type, mc_mem_region_t r1, mc_mem_ 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; @@ -291,8 +291,8 @@ static int compare_global_variables(int region_type, mc_mem_region_t r1, mc_mem_ } 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); diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index eaff170fa6..84747d0409 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -831,7 +831,7 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D variable->global = 1; Dwarf_Off offset = expr[0].number; // TODO, Why is this different base on the object? - Dwarf_Off base = strcmp(info->file_name, xbt_binary_name) !=0 ? (Dwarf_Off) info->start_text : 0; + Dwarf_Off base = strcmp(info->file_name, xbt_binary_name) !=0 ? (Dwarf_Off) info->start_exec : 0; variable->address.address = (void*) (base + offset); } else { variable->address.location = MC_dwarf_get_expression(expr, len); diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index db0a1a3be8..7bf5c97157 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -178,11 +178,7 @@ void dw_variable_free_voidp(void *t){ // 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); diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 7fe3f6b3f7..85ef10f74f 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -323,9 +323,9 @@ void MC_dump_stack_liveness(xbt_fifo_t stack); 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 xbt_dynar_t global_variables; // xbt_dynar_t xbt_dict_t types; // xbt_dict_t -- 2.20.1