X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6feb6e8bbb970e26a20a7c74234425bc7ebe0f6f..7ef55d47978f2f2ef20bd27c85881faa99147034:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 2b56b16b43..ceee7f9732 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -34,6 +34,8 @@ int _sg_mc_hash=0; int _sg_mc_max_depth=1000; int _sg_mc_visited=0; char *_sg_mc_dot_output_file = NULL; +int _sg_mc_comms_determinism=0; +int _sg_mc_send_determinism=0; int user_max_depth_reached = 0; @@ -99,6 +101,20 @@ void _mc_cfg_cb_dot_output(const char *name, int pos) { _sg_mc_dot_output_file= xbt_cfg_get_string(_sg_cfg_set, name); } +void _mc_cfg_cb_comms_determinism(const char *name, int pos) { + if (_sg_cfg_init_status && !_sg_do_model_check) { + xbt_die("You are specifying a value to enable/disable the detection of determinism in the communications schemes after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); + } + _sg_mc_comms_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name); +} + +void _mc_cfg_cb_send_determinism(const char *name, int pos) { + if (_sg_cfg_init_status && !_sg_do_model_check) { + xbt_die("You are specifying a value to enable/disable the detection of send-determinism in the communications schemes after the initialization (through MSG_config?), but model-checking was not activated at config time (through --cfg=model-check:1). This won't work, sorry."); + } + _sg_mc_send_determinism= xbt_cfg_get_boolean(_sg_cfg_set, name); +} + /* MC global data structures */ mc_state_t mc_current_state = NULL; char mc_replay_mode = FALSE; @@ -225,12 +241,6 @@ static int MC_compare_frame_index_items(mc_function_index_item_t a, mc_function_ static void MC_make_functions_index(mc_object_info_t info) { xbt_dynar_t index = xbt_dynar_new(sizeof(s_mc_function_index_item_t), NULL); - // The base address of the function must be used to offset the addresses. - // This should be fixed this in the frame_t structure instead. - // Relocated addresses are offset for shared objets and constant for executables objects. - // See DWARF4 spec 7.5 - void* offset = info->flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info); - // Populate the array: dw_frame_t frame = NULL; xbt_dict_cursor_t cursor = NULL; @@ -239,8 +249,8 @@ static void MC_make_functions_index(mc_object_info_t info) { if(frame->low_pc==NULL) continue; s_mc_function_index_item_t entry; - entry.low_pc = (char*) frame->low_pc + (unsigned long) offset; - entry.high_pc = (char*) frame->high_pc + (unsigned long) offset; + entry.low_pc = frame->low_pc; + entry.high_pc = frame->high_pc; entry.function = frame; xbt_dynar_push(index, &entry); } @@ -294,6 +304,31 @@ dw_frame_t MC_find_function_by_ip(void* ip) { return MC_find_function_by_ip_and_object(ip, info); } +static void MC_post_process_variables(mc_object_info_t info) { + unsigned cursor = 0; + dw_variable_t variable = NULL; + xbt_dynar_foreach(info->global_variables, cursor, variable) { + if(variable->type_origin) { + variable->type = xbt_dict_get_or_null(info->types, variable->type_origin); + } + } +} + +static void MC_post_process_functions(mc_object_info_t info) { + xbt_dict_cursor_t cursor = NULL; + char* key = NULL; + dw_frame_t function = NULL; + xbt_dict_foreach(info->local_variables, cursor, key, function) { + unsigned cursor2 = 0; + dw_variable_t variable = NULL; + xbt_dynar_foreach(function->variables, cursor2, variable) { + if(variable->type_origin) { + variable->type = xbt_dict_get_or_null(info->types, variable->type_origin); + } + } + } +} + /** \brief Finds informations about a given shared object/executable */ mc_object_info_t MC_find_object_info(memory_map_t maps, char* name, int executable) { mc_object_info_t result = MC_new_object_info(); @@ -303,6 +338,8 @@ mc_object_info_t MC_find_object_info(memory_map_t maps, char* name, int executab MC_find_object_address(maps, result); MC_dwarf_get_variables(result); MC_post_process_types(result); + MC_post_process_variables(result); + MC_post_process_functions(result); MC_make_functions_index(result); return result; } @@ -875,8 +912,19 @@ void MC_ignore(void *addr, size_t size){ /******************************* Initialisation of MC *******************************/ /*********************************************************************************/ -static void MC_init_debug_info(); -static void MC_init_debug_info() { +static void MC_post_process_object_info(mc_object_info_t info) { + mc_object_info_t other_info = info == mc_binary_info ? mc_libsimgrid_info : mc_binary_info; + xbt_dict_cursor_t cursor = NULL; + char* key = NULL; + dw_type_t type = NULL; + xbt_dict_foreach(info->types, cursor, key, type){ + if(type->name && type->byte_size == 0) { + type->other_object_same_type = xbt_dict_get_or_null(other_info->types_by_name, type->name); + } + } +} + +static void MC_init_debug_info(void) { XBT_INFO("Get debug information ..."); memory_map_t maps = MC_get_memory_map(); @@ -885,6 +933,10 @@ static void MC_init_debug_info() { mc_binary_info = MC_find_object_info(maps, xbt_binary_name, 1); mc_libsimgrid_info = MC_find_object_info(maps, libsimgrid_path, 0); + // Use information of the other objects: + MC_post_process_object_info(mc_binary_info); + MC_post_process_object_info(mc_libsimgrid_info); + MC_free_memory_map(maps); XBT_INFO("Get debug information done !"); } @@ -918,12 +970,14 @@ void MC_init(){ MC_ignore_local_variable("_throw_ctx", "*"); MC_ignore_local_variable("ctx", "*"); + MC_ignore_local_variable("self", "simcall_BODY_mc_snapshot"); MC_ignore_local_variable("next_context", "smx_ctx_sysv_suspend_serial"); MC_ignore_local_variable("i", "smx_ctx_sysv_suspend_serial"); /* Ignore local variable about time used for tracing */ MC_ignore_local_variable("start_time", "*"); + MC_ignore_global_variable("compared_pointers"); MC_ignore_global_variable("mc_comp_times"); MC_ignore_global_variable("mc_snapshot_comparison_time"); MC_ignore_global_variable("mc_time"); @@ -1203,7 +1257,8 @@ void MC_replay(xbt_fifo_t stack, int start) xbt_free(key); } } - xbt_dynar_reset(communications_pattern); + if(_sg_mc_comms_determinism || _sg_mc_send_determinism) + xbt_dynar_reset(communications_pattern); MC_UNSET_RAW_MEM; @@ -1234,20 +1289,23 @@ void MC_replay(xbt_fifo_t stack, int start) } } - if(req->call == SIMCALL_COMM_ISEND) - comm_pattern = 1; - else if(req->call == SIMCALL_COMM_IRECV) + if(_sg_mc_comms_determinism || _sg_mc_send_determinism){ + if(req->call == SIMCALL_COMM_ISEND) + comm_pattern = 1; + else if(req->call == SIMCALL_COMM_IRECV) comm_pattern = 2; - + } + SIMIX_simcall_pre(req, value); - MC_SET_RAW_MEM; - if(comm_pattern != 0){ - get_comm_pattern(communications_pattern, req, comm_pattern); + if(_sg_mc_comms_determinism || _sg_mc_send_determinism){ + MC_SET_RAW_MEM; + if(comm_pattern != 0){ + get_comm_pattern(communications_pattern, req, comm_pattern); + } + MC_UNSET_RAW_MEM; + comm_pattern = 0; } - MC_UNSET_RAW_MEM; - - comm_pattern = 0; MC_wait_for_requests(); @@ -1530,8 +1588,10 @@ void MC_print_statistics(mc_stats_t stats) fclose(dot_output); } if(initial_state_safety != NULL){ - // XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes"); - // XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes"); + if(_sg_mc_comms_determinism) + XBT_INFO("Communication-deterministic : %s", !initial_state_safety->comm_deterministic ? "No" : "Yes"); + if (_sg_mc_send_determinism) + XBT_INFO("Send-deterministic : %s", !initial_state_safety->send_deterministic ? "No" : "Yes"); } MC_UNSET_RAW_MEM; }