X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/67c91d5b8652b0e76801e9cfc7d965a360237152..fd81026ba83075bf0b874d39156eef7de2ced0b2:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 2fba00d1a6..f1e1c922b9 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -314,9 +314,14 @@ static dw_location_t MC_dwarf_get_location(xbt_dict_t location_list, char *expr) } +/** @brief Extract the location lists from an ELF file (.debug_loc) + * + * @return A map from the offset in the list (in hexadecimal string) + * into a location list (dynar of dw_location_entry_t). + */ static xbt_dict_t MC_dwarf_get_location_list(const char *elf_file){ - char *command = bprintf("objdump -Wo %s", elf_file); + char *command = bprintf("LANG=C objdump -Wo %s", elf_file); FILE *fp = popen(command, "r"); @@ -371,8 +376,14 @@ static xbt_dict_t MC_dwarf_get_location_list(const char *elf_file){ xbt_str_strip_spaces(line); split = xbt_str_split(line, " "); + char *key = NULL; while(read != -1 && strcmp("lowpc = strtoul((char *)xbt_dynar_get_as(split, 1, char *), NULL, 16); new_entry->highpc = strtoul((char *)xbt_dynar_get_as(split, 2, char *), NULL, 16); @@ -403,7 +414,6 @@ static xbt_dict_t MC_dwarf_get_location_list(const char *elf_file){ } - char *key = bprintf("%d", (int)strtoul((char *)xbt_dynar_get_as(split, 0, char *), NULL, 16)); xbt_dict_set(location_list, key, loclist, NULL); xbt_free(key); @@ -495,7 +505,7 @@ static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char* var, void *a static void MC_dwarf_get_variables(const char *elf_file, xbt_dict_t location_list, xbt_dict_t *local_variables, xbt_dynar_t *global_variables, xbt_dict_t *types){ - char *command = bprintf("objdump -Wi %s", elf_file); + char *command = bprintf("LANG=C objdump -Wi %s", elf_file); FILE *fp = popen(command, "r"); @@ -550,6 +560,8 @@ static void MC_dwarf_get_variables(const char *elf_file, xbt_dict_t location_lis node_type = xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *); if(strcmp(node_type, "(DW_TAG_subprogram)") == 0){ /* New frame */ + /* We build/complete a dw_frame_t object + * and append it if necessary to the local_variables dictionnary */ dw_frame_t frame = NULL; @@ -665,6 +677,9 @@ static void MC_dwarf_get_variables(const char *elf_file, xbt_dict_t location_lis }else if(strcmp(node_type, "(DW_TAG_variable)") == 0){ /* New variable */ + /* We build a dw_variable_t object and append it either to + the list of variables of the frame (local variable) + or to the list of global variables (global variables). */ dw_variable_t var = NULL; @@ -817,6 +832,7 @@ static void MC_dwarf_get_variables(const char *elf_file, xbt_dict_t location_lis new_variable = 1; }else if(strcmp(node_type, "(DW_TAG_inlined_subroutine)") == 0){ + /* Update the information on the frame (we should duplicate it instead). */ read = xbt_getline(&line, &n, fp); @@ -871,6 +887,8 @@ static void MC_dwarf_get_variables(const char *elf_file, xbt_dict_t location_lis || strcmp(node_type, "(DW_TAG_volatile_type)") == 0 || (is_pointer = !strcmp(node_type, "(DW_TAG_pointer_type)"))){ + /* Create the and add it to the types dictionnary */ + if(strcmp(node_type, "(DW_TAG_base_type)") == 0) type_type = e_dw_base_type; else if(strcmp(node_type, "(DW_TAG_enumeration_type)") == 0) @@ -1875,7 +1893,7 @@ void MC_modelcheck_safety(void) MC_SET_RAW_MEM; /* Save the initial state */ initial_state_safety = xbt_new0(s_mc_global_t, 1); - initial_state_safety->snapshot = MC_take_snapshot(); + initial_state_safety->snapshot = MC_take_snapshot(0); MC_UNSET_RAW_MEM; MC_dpor();