X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0c13871d73e933c1847faf8debea7b7745a3ff44..bb90f02025de07b7f6b3e319114764303010562e:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 244e01de20..ff19ead87b 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -189,7 +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)); @@ -744,6 +743,15 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) { /************ MC_ignore ***********/ +void heap_ignore_region_free(mc_heap_ignore_region_t r){ + if(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); @@ -751,25 +759,21 @@ void MC_ignore_heap(void *address, size_t size){ 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_comparison_ignore = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp); 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; } unsigned int cursor = 0; @@ -787,6 +791,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); @@ -950,6 +996,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; @@ -1466,13 +1513,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 +1529,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 +1538,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 +1558,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 +1573,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 +1583,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 +1592,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 +1605,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); @@ -1753,6 +1800,17 @@ static void MC_get_global_variables(char *elf_file){ || (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) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapinfo1") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapinfo2") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapbase1") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapbase2") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapsize1") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heapsize2") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "heaplimit") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "ignore_done") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "s_heap") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "to_ignore1") == 0) + || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "to_ignore2") == 0) || ((size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16) == 0)) continue;