X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0c13871d73e933c1847faf8debea7b7745a3ff44..b8169ac0d35610b827d6669a1263011e42a5e7b3:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 244e01de20..c3c6539d22 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -189,10 +189,6 @@ void MC_init(){ get_libsimgrid_plt_section(); get_binary_plt_section(); - MC_ignore_data_bss(&end_raw_heap, sizeof(end_raw_heap)); - MC_ignore_data_bss(&mc_comp_times, sizeof(mc_comp_times)); - MC_ignore_data_bss(&mc_snapshot_comparison_time, sizeof(mc_snapshot_comparison_time)); - /* Get global variables */ MC_get_global_variables(xbt_binary_name); MC_get_global_variables(libsimgrid_path); @@ -212,6 +208,9 @@ void MC_init(){ MC_ignore_stack("next_context", "smx_ctx_sysv_suspend_serial"); MC_ignore_stack("i", "smx_ctx_sysv_suspend_serial"); + MC_ignore_data_bss(&mc_comp_times, sizeof(mc_comp_times)); + MC_ignore_data_bss(&mc_snapshot_comparison_time, sizeof(mc_snapshot_comparison_time)); + if(raw_mem_set) MC_SET_RAW_MEM; @@ -304,11 +303,16 @@ void MC_exit(void) xbt_abort(); } +int SIMIX_pre_mc_random(smx_simcall_t simcall, int min, int max){ + + return simcall->mc_value; +} + int MC_random(int min, int max) { /*FIXME: return mc_current_state->executed_transition->random.value;*/ - return 0; + return simcall_mc_random(min, max); } /** @@ -744,42 +748,67 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) { /************ MC_ignore ***********/ +void heap_ignore_region_free(mc_heap_ignore_region_t r){ + xbt_free(r); +} + +void heap_ignore_region_free_voidp(void *r){ + heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); +} + void MC_ignore_heap(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); MC_SET_RAW_MEM; - - if(mc_heap_comparison_ignore == NULL) - mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), NULL); mc_heap_ignore_region_t region = NULL; region = xbt_new0(s_mc_heap_ignore_region_t, 1); region->address = address; region->size = size; - - if((address >= std_heap) && (address <= (void*)((char *)std_heap + STD_HEAP_SIZE))){ - - region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; - - if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){ - region->fragment = -1; - ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore = 1; - }else{ - region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type; - ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment] = 1; - } - + + region->block = ((char*)address - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; + + if(((xbt_mheap_t)std_heap)->heapinfo[region->block].type == 0){ + region->fragment = -1; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore = 1; + }else{ + region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type; + ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment] = 1; + } + + if(mc_heap_comparison_ignore == NULL){ + mc_heap_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp); + xbt_dynar_push(mc_heap_comparison_ignore, ®ion); + if(!raw_mem_set) + MC_UNSET_RAW_MEM; + return; } unsigned int cursor = 0; mc_heap_ignore_region_t current_region; - xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){ + int start = 0; + int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; + + while(start <= end){ + cursor = (start + end) / 2; + current_region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t); + if(current_region->address == address){ + heap_ignore_region_free(region); + if(!raw_mem_set) + MC_UNSET_RAW_MEM; + return; + } + if(current_region->address < address) + start = cursor + 1; if(current_region->address > address) - break; + end = cursor - 1; } - xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); + if(current_region->address < address) + xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor + 1, ®ion); + else + xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, ®ion); MC_UNSET_RAW_MEM; @@ -787,6 +816,48 @@ void MC_ignore_heap(void *address, size_t size){ MC_SET_RAW_MEM; } +void MC_remove_ignore_heap(void *address, size_t size){ + + int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); + + MC_SET_RAW_MEM; + + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1; + mc_heap_ignore_region_t region; + int ignore_found = 0; + + while(start <= end){ + cursor = (start + end) / 2; + region = (mc_heap_ignore_region_t)xbt_dynar_get_as(mc_heap_comparison_ignore, cursor, mc_heap_ignore_region_t); + if(region->address == address){ + ignore_found = 1; + break; + } + if(region->address < address) + start = cursor + 1; + if(region->address > address){ + if((char * )region->address <= ((char *)address + size)){ + ignore_found = 1; + break; + }else + end = cursor - 1; + } + } + + if(ignore_found == 1){ + xbt_dynar_remove_at(mc_heap_comparison_ignore, cursor, NULL); + MC_remove_ignore_heap(address, size); + } + + MC_UNSET_RAW_MEM; + + if(raw_mem_set) + MC_SET_RAW_MEM; + +} + void MC_ignore_data_bss(void *address, size_t size){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -796,12 +867,12 @@ void MC_ignore_data_bss(void *address, size_t size){ if(mc_data_bss_comparison_ignore == NULL) mc_data_bss_comparison_ignore = xbt_dynar_new(sizeof(mc_data_bss_ignore_variable_t), NULL); - if(xbt_dynar_is_empty(mc_data_bss_comparison_ignore)){ + mc_data_bss_ignore_variable_t var = NULL; + var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1); + var->address = address; + var->size = size; - mc_data_bss_ignore_variable_t var = NULL; - var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1); - var->address = address; - var->size = size; + if(xbt_dynar_is_empty(mc_data_bss_comparison_ignore)){ xbt_dynar_insert_at(mc_data_bss_comparison_ignore, 0, &var); @@ -826,11 +897,6 @@ void MC_ignore_data_bss(void *address, size_t size){ if(current_var->address > address) end = cursor - 1; } - - mc_data_bss_ignore_variable_t var = NULL; - var = xbt_new0(s_mc_data_bss_ignore_variable_t, 1); - var->address = address; - var->size = size; if(current_var->address < address) xbt_dynar_insert_at(mc_data_bss_comparison_ignore, cursor + 1, &var); @@ -839,6 +905,34 @@ void MC_ignore_data_bss(void *address, size_t size){ } + /* Remove variable from mc_global_variables */ + + if(mc_global_variables != NULL){ + + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_global_variables) - 1; + global_variable_t current_var; + int var_found; + + while(start <= end){ + cursor = (start + end) / 2; + current_var = (global_variable_t)xbt_dynar_get_as(mc_global_variables, cursor, global_variable_t); + if(current_var->address == var->address){ + var_found = 1; + break; + } + if(current_var->address < address) + start = cursor + 1; + if(current_var->address > address) + end = cursor - 1; + } + + if(var_found) + xbt_dynar_remove_at(mc_global_variables, cursor, NULL); + + } + MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -871,7 +965,7 @@ static size_t data_bss_ignore_size(void *address){ -void MC_ignore_stack(const char *var_name, const char *frame){ +void MC_ignore_stack(const char *var_name, const char *frame_name){ int raw_mem_set = (mmalloc_get_current_heap() == raw_heap); @@ -885,7 +979,7 @@ void MC_ignore_stack(const char *var_name, const char *frame){ mc_stack_ignore_variable_t var = NULL; var = xbt_new0(s_mc_stack_ignore_variable_t, 1); var->var_name = strdup(var_name); - var->frame = strdup(frame); + var->frame = strdup(frame_name); xbt_dynar_insert_at(mc_stack_comparison_ignore, 0, &var); @@ -899,7 +993,7 @@ void MC_ignore_stack(const char *var_name, const char *frame){ while(start <= end){ cursor = (start + end) / 2; current_var = (mc_stack_ignore_variable_t)xbt_dynar_get_as(mc_stack_comparison_ignore, cursor, mc_stack_ignore_variable_t); - if(strcmp(current_var->frame, frame) == 0){ + if(strcmp(current_var->frame, frame_name) == 0){ if(strcmp(current_var->var_name, var_name) == 0){ MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -911,24 +1005,34 @@ void MC_ignore_stack(const char *var_name, const char *frame){ if(strcmp(current_var->var_name, var_name) > 0) end = cursor - 1; } - if(strcmp(current_var->frame, frame) < 0) + if(strcmp(current_var->frame, frame_name) < 0) start = cursor + 1; - if(strcmp(current_var->frame, frame) > 0) + if(strcmp(current_var->frame, frame_name) > 0) end = cursor - 1; } mc_stack_ignore_variable_t var = NULL; var = xbt_new0(s_mc_stack_ignore_variable_t, 1); var->var_name = strdup(var_name); - var->frame = strdup(frame); + var->frame = strdup(frame_name); - if(strcmp(current_var->frame, frame) < 0) + if(strcmp(current_var->frame, frame_name) < 0) xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor + 1, &var); else xbt_dynar_insert_at(mc_stack_comparison_ignore, cursor, &var); } + /* Remove variable from mc_local_variables */ + + if(mc_local_variables != NULL){ + + dw_frame_t frame = xbt_dict_get_or_null(mc_local_variables, frame_name); + if(frame != NULL) + xbt_dict_remove(frame->variables, var_name); + + } + MC_UNSET_RAW_MEM; if(raw_mem_set) @@ -950,6 +1054,7 @@ void MC_new_stack_area(void *stack, char *name, void* context, size_t size){ region->process_name = strdup(name); region->context = context; region->size = size; + region->block = ((char*)stack - (char*)((xbt_mheap_t)std_heap)->heapbase) / BLOCKSIZE + 1; xbt_dynar_push(stacks_areas, ®ion); MC_UNSET_RAW_MEM; @@ -980,7 +1085,7 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ int cursor_remove; xbt_dynar_t split = NULL; - while ((read = getline(&line, &n, fp)) != -1) { + while ((read = xbt_getline(&line, &n, fp)) != -1) { /* Wipeout the new line character */ line[read - 1] = '\0'; @@ -1039,7 +1144,7 @@ xbt_dict_t MC_get_location_list(const char *elf_file){ xbt_dynar_free(&split); free(loc_expr); - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); if(read != -1){ line[read - 1] = '\0'; xbt_str_strip_spaces(line); @@ -1104,12 +1209,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ int new_frame = 0, new_variable = 0; dw_frame_t variable_frame, subroutine_frame = NULL; - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); while (read != -1) { if(n == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1117,7 +1222,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ line[read - 1] = '\0'; if(strlen(line) == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1125,7 +1230,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ xbt_str_strip_spaces(line); if(line[0] != '<'){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1143,12 +1248,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ subprogram_start = strdup(strtok(NULL, "<")); xbt_str_rtrim(subprogram_start, ">:"); - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); while(read != -1){ if(n == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1156,7 +1261,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ line[read - 1] = '\0'; if(strlen(line) == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1239,7 +1344,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); } @@ -1251,10 +1356,8 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } xbt_free(subprogram_start); - if(subprogram_end != NULL){ - xbt_free(subprogram_end); - subprogram_end = NULL; - } + xbt_free(subprogram_end); + subprogram_end = NULL; }else if(strcmp(node_type, "(DW_TAG_variable)") == 0){ /* New variable */ @@ -1265,12 +1368,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ origin = strdup(strtok(NULL, "<")); xbt_str_rtrim(origin, ">:"); - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); while(read != -1){ if(n == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1278,7 +1381,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ line[read - 1] = '\0'; if(strlen(line) == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1344,7 +1447,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ } - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); } @@ -1363,7 +1466,7 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ origin = strdup(strtok(NULL, "<")); xbt_str_rtrim(origin, ">:"); - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); while(read != -1){ @@ -1371,12 +1474,12 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ line[read - 1] = '\0'; if(n == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } if(strlen(line) == 0){ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); continue; } @@ -1408,13 +1511,13 @@ void MC_get_local_variables(const char *elf_file, xbt_dict_t location_list, xbt_ subroutine_frame->high_pc = (void *)strtoul(xbt_dynar_get_as(split, 3, char *), NULL, 16); } - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); } }else{ - read = getline(&line, &n, fp); + read = xbt_getline(&line, &n, fp); } @@ -1466,13 +1569,13 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ }else if(strcmp(tok2, "DW_OP_fbreg:") == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_fbregister_op; - new_element->location.fbreg_op = atoi(xbt_dynar_get_as(tokens2, 1, char*)); + new_element->location.fbreg_op = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); xbt_dynar_push(loc->location.compose, &new_element); }else if(strncmp(tok2, "DW_OP_breg", 10) == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_bregister_op; new_element->location.breg_op.reg = atoi(strtok(tok2, "DW_OP_breg")); - new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 1, char*)); + new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); xbt_dynar_push(loc->location.compose, &new_element); }else if(strncmp(tok2, "DW_OP_lit", 9) == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); @@ -1482,7 +1585,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ }else if(strcmp(tok2, "DW_OP_piece:") == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_piece; - new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, 1, char*)); + new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); /*if(strlen(xbt_dynar_get_as(tokens2, 1, char*)) > 1) new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, 1, char*)); else @@ -1491,7 +1594,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ }else if(strcmp(tok2, "DW_OP_plus_uconst:") == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_plus_uconst; - new_element->location.plus_uconst = atoi(xbt_dynar_get_as(tokens2, 1, char *)); + new_element->location.plus_uconst = atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char *)); xbt_dynar_push(loc->location.compose, &new_element); }else if(strcmp(tok, "DW_OP_abs") == 0 || strcmp(tok, "DW_OP_and") == 0 || @@ -1511,7 +1614,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ }else if(strcmp(tok2, "DW_OP_deref_size:") == 0){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_deref; - new_element->location.deref_size = (unsigned int short) atoi(xbt_dynar_get_as(tokens2, 1, char*)); + new_element->location.deref_size = (unsigned int short) atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*)); /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1) new_element->location.deref_size = atoi(xbt_dynar_get_as(tokens, cursor, char*)); else @@ -1526,7 +1629,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_uconstant; new_element->location.uconstant.bytes = 1; - new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*))); + new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1) new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens, cursor, char*))); else @@ -1536,7 +1639,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_sconstant; new_element->location.sconstant.bytes = 1; - new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*))); + new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); xbt_dynar_push(loc->location.compose, &new_element); }else if(strcmp(tok2, "DW_OP_const1u:") == 0 || strcmp(tok2, "DW_OP_const2u:") == 0 || @@ -1545,7 +1648,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_uconstant; new_element->location.uconstant.bytes = tok2[11] - '0'; - new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*))); + new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1) new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, cursor, char*)); else @@ -1558,7 +1661,7 @@ static dw_location_t get_location(xbt_dict_t location_list, char *expr){ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); new_element->type = e_dw_sconstant; new_element->location.sconstant.bytes = tok2[11] - '0'; - new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*))); + new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, xbt_dynar_length(tokens2) - 1, char*))); xbt_dynar_push(loc->location.compose, &new_element); }else{ dw_location_t new_element = xbt_new0(s_dw_location_t, 1); @@ -1731,7 +1834,7 @@ static void MC_get_global_variables(char *elf_file){ int type = strcmp(elf_file, xbt_binary_name); /* 0 = binary, other = libsimgrid */ - while ((read = getline(&line, &n, fp)) != -1){ + while ((read = xbt_getline(&line, &n, fp)) != -1){ if(n == 0) continue; @@ -1752,7 +1855,6 @@ static void MC_get_global_variables(char *elf_file){ || (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; @@ -1768,10 +1870,34 @@ static void MC_get_global_variables(char *elf_file){ 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) + if(data_bss_ignore_size(var->address) > 0){ global_variable_free(var); - else - xbt_dynar_push(mc_global_variables, &var); + }else{ + if(xbt_dynar_is_empty(mc_global_variables)){ + xbt_dynar_push(mc_global_variables, &var); + }else{ + unsigned int cursor = 0; + int start = 0; + int end = xbt_dynar_length(mc_global_variables) - 1; + global_variable_t current_var = NULL; + + while(start <= end){ + cursor = (start + end) / 2; + current_var = (global_variable_t)xbt_dynar_get_as(mc_global_variables, cursor, global_variable_t); + if(current_var->address == var->address) + break; + if(current_var->address < var->address) + start = cursor + 1; + if(current_var->address > var->address) + end = cursor - 1; + } + + if(current_var->address < var->address) + xbt_dynar_insert_at(mc_global_variables, cursor + 1, &var); + else + xbt_dynar_insert_at(mc_global_variables, cursor, &var); + } + } xbt_dynar_free(&line_tokens);