X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7526c37879613289a86be06ec264b1cce5ef4049..e8b6afba8f8b0963162e7ece45d9503662d2f03d:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 02f152660b..25de83a3a9 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -37,7 +37,6 @@ void _mc_cfg_cb_reduce(const char *name, int pos) { } else { xbt_die("configuration option %s can only take 'none' or 'dpor' as a value",name); } - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); } void _mc_cfg_cb_checkpoint(const char *name, int pos) { @@ -45,14 +44,12 @@ void _mc_cfg_cb_checkpoint(const char *name, int pos) { xbt_die("You are specifying a checkpointing value 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."); } _surf_mc_checkpoint = xbt_cfg_get_int(_surf_cfg_set, name); - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); } void _mc_cfg_cb_property(const char *name, int pos) { if (_surf_init_status && !_surf_do_model_check) { xbt_die("You are specifying a property 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."); } _surf_mc_property_file= xbt_cfg_get_string(_surf_cfg_set, name); - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); } void _mc_cfg_cb_timeout(const char *name, int pos) { @@ -60,7 +57,6 @@ void _mc_cfg_cb_timeout(const char *name, int pos) { xbt_die("You are specifying a value to enable/disable timeout for wait requests 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."); } _surf_mc_timeout= xbt_cfg_get_int(_surf_cfg_set, name); - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); } void _mc_cfg_cb_max_depth(const char *name, int pos) { @@ -68,15 +64,13 @@ void _mc_cfg_cb_max_depth(const char *name, int pos) { xbt_die("You are specifying a max depth value 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."); } _surf_mc_max_depth= xbt_cfg_get_int(_surf_cfg_set, name); - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); } -void _mc_cfg_cb_stateful(const char *name, int pos) { +void _mc_cfg_cb_visited(const char *name, int pos) { if (_surf_init_status && !_surf_do_model_check) { - xbt_die("You are trying to change stateful mode 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."); + xbt_die("You are specifying a number of stored visited states 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."); } - _surf_mc_stateful= xbt_cfg_get_int(_surf_cfg_set, name); - xbt_cfg_set_int(_surf_cfg_set,"model-check",1); + _surf_mc_visited= xbt_cfg_get_int(_surf_cfg_set, name); } @@ -101,6 +95,8 @@ int compare; /* Local */ xbt_dict_t mc_local_variables = NULL; +/* Global */ +xbt_dynar_t mc_global_variables = NULL; /* Ignore mechanism */ xbt_dynar_t mc_stack_comparison_ignore; @@ -115,6 +111,8 @@ xbt_automaton_t _mc_property_automaton = NULL; static void MC_assert_pair(int prop); static dw_location_t get_location(xbt_dict_t location_list, char *expr); static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset); +static size_t data_bss_ignore_size(void *address); +static void MC_get_global_variables(char *elf_file); void MC_do_the_modelcheck_for_real() { if (!_surf_mc_property_file || _surf_mc_property_file[0]=='\0') { @@ -158,7 +156,7 @@ void MC_init(){ MC_SET_RAW_MEM; - char *ls_path = get_libsimgrid_path(); + MC_init_memory_map_info(); mc_local_variables = xbt_dict_new_homogeneous(NULL); @@ -167,27 +165,31 @@ void MC_init(){ MC_get_local_variables(xbt_binary_name, binary_location_list, &mc_local_variables); /* Get local variables in libsimgrid for state equality detection */ - xbt_dict_t libsimgrid_location_list = MC_get_location_list(ls_path); - MC_get_local_variables(ls_path, libsimgrid_location_list, &mc_local_variables); - - MC_UNSET_RAW_MEM; - - MC_init_memory_map_info(); + xbt_dict_t libsimgrid_location_list = MC_get_location_list(libsimgrid_path); + MC_get_local_variables(libsimgrid_path, libsimgrid_location_list, &mc_local_variables); /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */ get_libsimgrid_plt_section(); get_binary_plt_section(); + MC_ignore_data_bss(&end_raw_heap, sizeof(end_raw_heap)); + + /* Get global variables */ + MC_get_global_variables(xbt_binary_name); + MC_get_global_variables(libsimgrid_path); + + MC_UNSET_RAW_MEM; + /* Ignore some variables from xbt/ex.h used by exception e for stacks comparison */ MC_ignore_stack("e", "*"); MC_ignore_stack("__ex_cleanup", "*"); MC_ignore_stack("__ex_mctx_en", "*"); MC_ignore_stack("__ex_mctx_me", "*"); + MC_ignore_stack("__xbt_ex_ctx_ptr", "*"); MC_ignore_stack("_log_ev", "*"); MC_ignore_stack("_throw_ctx", "*"); MC_ignore_stack("ctx", "*"); - if(raw_mem_set) MC_SET_RAW_MEM; @@ -217,12 +219,14 @@ void MC_modelcheck_safety(void) MC_UNSET_RAW_MEM; - if(_surf_mc_stateful > 0){ + if(_surf_mc_visited > 0){ MC_init(); }else{ + MC_SET_RAW_MEM; MC_init_memory_map_info(); get_libsimgrid_plt_section(); get_binary_plt_section(); + MC_UNSET_RAW_MEM; } MC_dpor_init(); @@ -231,7 +235,6 @@ void MC_modelcheck_safety(void) /* Save the initial state */ initial_state_safety = xbt_new0(s_mc_global_t, 1); initial_state_safety->snapshot = MC_take_snapshot(); - //MC_take_snapshot(initial_snapshot); MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -274,7 +277,6 @@ void MC_modelcheck_liveness(){ void MC_exit(void) { - MC_print_statistics(mc_stats); xbt_free(mc_time); MC_memory_exit(); } @@ -805,7 +807,7 @@ void MC_ignore_data_bss(void *address, size_t size){ var->address = address; var->size = size; - if(current_var->address > address) + if(current_var->address < address) xbt_dynar_insert_at(mc_data_bss_comparison_ignore, cursor + 1, &var); else xbt_dynar_insert_at(mc_data_bss_comparison_ignore, cursor, &var); @@ -913,8 +915,10 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ FILE *fp = popen(command, "r"); - if(fp == NULL) + if(fp == NULL){ perror("popen for objdump failed"); + xbt_abort(); + } int debug = 0; /*Detect if the program has been compiled with -g */ @@ -1008,50 +1012,6 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ return location_list; } -char *get_libsimgrid_path(){ - - char *command = bprintf("ldd %s", xbt_binary_name); - - FILE *fp = popen(command, "r"); - if(fp == NULL) - perror("popen for ldd failed"); - - char *line; - ssize_t read; - size_t n = 0; - xbt_dynar_t split; - - while((read = getline(&line, &n, fp)) != -1){ - - if(n == 0) - continue; - - /* Wipeout the new line character */ - line[read - 1] = '\0'; - - xbt_str_strip_spaces(line); - xbt_str_ltrim(line, NULL); - split = xbt_str_split(line, " "); - - if(strncmp((char *)xbt_dynar_get_as(split, 0, char *), "libsimgrid.so", 13) == 0){ - free(line); - free(command); - pclose(fp); - return ((char *)xbt_dynar_get_as(split, 2, char *)); - } - - xbt_dynar_free(&split); - - } - - free(line); - free(command); - pclose(fp); - - return NULL; - -} - static dw_frame_t get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset){ xbt_dict_cursor_t cursor = NULL; @@ -1686,3 +1646,114 @@ void print_local_variables(xbt_dict_t list){ } } + +static size_t data_bss_ignore_size(void *address){ + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_data_bss_comparison_ignore) - 1; + mc_data_bss_ignore_variable_t var; + + while(start <= end){ + cursor = (start + end) / 2; + var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t); + if(var->address == address) + return var->size; + if(var->address < address){ + if((void *)((char *)var->address + var->size) > address) + return (char *)var->address + var->size - (char*)address; + else + start = cursor + 1; + } + if(var->address > address) + end = cursor - 1; + } + + return 0; +} + + +static void MC_get_global_variables(char *elf_file){ + + FILE *fp; + + char *command = bprintf("objdump -t -j .data -j .bss %s", elf_file); + + fp = popen(command, "r"); + + if(fp == NULL){ + perror("popen failed"); + xbt_abort(); + } + + if(mc_global_variables == NULL) + mc_global_variables = xbt_dynar_new(sizeof(global_variable_t), global_variable_free_voidp); + + char *line = NULL; + ssize_t read; + size_t n = 0; + + xbt_dynar_t line_tokens = NULL; + unsigned long offset; + + int type = strcmp(elf_file, xbt_binary_name); /* 0 = binary, other = libsimgrid */ + + while ((read = getline(&line, &n, fp)) != -1){ + + if(n == 0) + continue; + + /* Wipeout the new line character */ + line[read - 1] = '\0'; + + xbt_str_strip_spaces(line); + xbt_str_ltrim(line, NULL); + + line_tokens = xbt_str_split(line, NULL); + + if(xbt_dynar_length(line_tokens) <= 4 || strcmp(xbt_dynar_get_as(line_tokens, 0, char *), "SYMBOL") == 0) + continue; + + if((strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "__gcov", 6) == 0) + || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "gcov", 4) == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), ".data") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), ".bss") == 0) + || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "stderr", 6) == 0) + || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "counter", 7) == 0) + || ((size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16) == 0)) + continue; + + global_variable_t var = xbt_new0(s_global_variable_t, 1); + + if(type == 0){ + var->address = (void *)strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16); + }else{ + offset = strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16); + var->address = (char *)start_text_libsimgrid+offset; + } + + var->size = (size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16); + var->name = strdup(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*)); + + if(data_bss_ignore_size(var->address) > 0) + global_variable_free(var); + else + xbt_dynar_push(mc_global_variables, &var); + + xbt_dynar_free(&line_tokens); + + } + + free(command); + free(line); + pclose(fp); + +} + +void global_variable_free(global_variable_t v){ + xbt_free(v->name); + xbt_free(v); +} + +void global_variable_free_voidp(void *v){ + global_variable_free((global_variable_t) * (void **) v); +}