- ignore field in mmalloc meta-data equal to the amount of elements to ignore in this area
- match_equals was applied twice in heap comparison algorithm, remove one unnecessary call
- apply these changes in system-state equality comparison
}
i = 0;
while(i < current_var->size){
- if(memcmp((char*)d1 + offset + i, (char*)d2 + offset + i, 1) != 0){
+ if(memcmp((char *)d1 + offset + i, (char *)d2 + offset + i, 1) != 0){
pointer_align = (i / sizeof(void*)) * sizeof(void*);
addr_pointed1 = *((void **)((char *)d1 + offset + pointer_align));
addr_pointed2 = *((void **)((char *)d2 + offset + pointer_align));
if((addr_pointed1 > plt_start && addr_pointed1 < plt_end) || (addr_pointed2 > plt_start && addr_pointed2 < plt_end)){
- break;
- }else{
- if((addr_pointed1 > std_heap) && ((char *)addr_pointed1 < (char *)std_heap + STD_HEAP_SIZE)
- && (addr_pointed2 > std_heap) && ((char *)addr_pointed2 < (char *)std_heap + STD_HEAP_SIZE)){
- res_compare = compare_area(addr_pointed1, addr_pointed2, NULL);
- if(res_compare == 1){
- #ifdef MC_VERBOSE
- if(region_type == 2)
- XBT_VERB("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
- else
- XBT_VERB("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
- #endif
- #ifdef MC_DEBUG
- if(region_type == 2)
- XBT_DEBUG("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
- else
- XBT_DEBUG("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
- #endif
- XBT_INFO("Different global variable (%p, %p) : %s at addresses %p - %p (size = %zu)", current_var->address, addr_pointed1, current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
- return 1;
- }
- }else{
+ i = pointer_align + sizeof(void*);
+ continue;
+ }else if((addr_pointed1 > std_heap) && ((char *)addr_pointed1 < (char *)std_heap + STD_HEAP_SIZE)
+ && (addr_pointed2 > std_heap) && ((char *)addr_pointed2 < (char *)std_heap + STD_HEAP_SIZE)){
+ res_compare = compare_area(addr_pointed1, addr_pointed2, NULL);
+ if(res_compare == 1){
#ifdef MC_VERBOSE
if(region_type == 2)
XBT_VERB("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
else
XBT_DEBUG("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
#endif
- XBT_INFO("Different global variable (%p, %p) : %s at addresses %p - %p (size = %zu)", current_var->address, addr_pointed1, current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
return 1;
}
-
- }
- }
+ i = pointer_align + sizeof(void*);
+ continue;
+ }else{
+ #ifdef MC_VERBOSE
+ if(region_type == 2)
+ XBT_VERB("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
+ else
+ XBT_VERB("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
+ #endif
+ #ifdef MC_DEBUG
+ if(region_type == 2)
+ XBT_DEBUG("Different global variable in binary : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
+ else
+ XBT_DEBUG("Different global variable in libsimgrid : %s at addresses %p - %p (size = %zu)", current_var->name, (char *)d1+offset, (char *)d2+offset, current_var->size);
+ #endif
+ return 1;
+ }
+ }
i++;
}
}
xbt_os_timer_start(timer);
#endif
- /* Stacks comparison */
- unsigned int cursor = 0;
- int diff_local = 0;
- is_diff = 0;
+ /* Stacks comparison */
+ unsigned int cursor = 0;
+ int diff_local = 0;
+ is_diff = 0;
- while(cursor < xbt_dynar_length(s1->stacks)){
- diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data);
- if(diff_local > 0){
- #ifdef MC_DEBUG
- if(is_diff == 0){
- xbt_os_timer_stop(timer);
- mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer);
- }
- XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
- errors++;
- is_diff = 1;
- #else
+ while(cursor < xbt_dynar_length(s1->stacks)){
+ diff_local = compare_local_variables(((mc_snapshot_stack_t)xbt_dynar_get_as(s1->stacks, cursor, mc_snapshot_stack_t))->local_variables->data, ((mc_snapshot_stack_t)xbt_dynar_get_as(s2->stacks, cursor, mc_snapshot_stack_t))->local_variables->data);
+ if(diff_local > 0){
+ #ifdef MC_DEBUG
+ if(is_diff == 0){
+ xbt_os_timer_stop(timer);
+ mc_comp_times->stacks_comparison_time = xbt_os_timer_elapsed(timer);
+ }
+ XBT_DEBUG("Different local variables between stacks %d", cursor + 1);
+ errors++;
+ is_diff = 1;
+ #else
- #ifdef MC_VERBOSE
- XBT_VERB("Different local variables between stacks %d", cursor + 1);
- #endif
-
- reset_heap_information();
- xbt_os_timer_free(timer);
- xbt_os_timer_stop(global_timer);
- mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
- xbt_os_timer_free(global_timer);
-
- if(!raw_mem)
- MC_UNSET_RAW_MEM;
-
- return 1;
+ #ifdef MC_VERBOSE
+ XBT_VERB("Different local variables between stacks %d", cursor + 1);
#endif
- }
- cursor++;
+
+ reset_heap_information();
+ xbt_os_timer_free(timer);
+ xbt_os_timer_stop(global_timer);
+ mc_snapshot_comparison_time = xbt_os_timer_elapsed(global_timer);
+ xbt_os_timer_free(global_timer);
+
+ if(!raw_mem)
+ MC_UNSET_RAW_MEM;
+
+ return 1;
+ #endif
}
+ cursor++;
+ }
- #ifdef MC_DEBUG
- xbt_os_timer_start(timer);
- #endif
+ #ifdef MC_DEBUG
+ xbt_os_timer_start(timer);
+ #endif
/* Compare heap */
-
if(mmalloc_compare_heap((xbt_mheap_t)s1->regions[0]->data, (xbt_mheap_t)s2->regions[0]->data)){
#ifdef MC_DEBUG
continue;
}else {
#ifdef MC_VERBOSE
- XBT_VERB("Different local variable : %s at addresses %p - %p", var_name, addr1, addr2);
+ XBT_VERB("Different local variable : %s at addresses %p - %p in frame %s", var_name, addr1, addr2, frame_name1);
#endif
#ifdef MC_DEBUG
XBT_DEBUG("Different local variable : %s at addresses %p - %p", var_name, addr1, addr2);
continue;
}else {
#ifdef MC_VERBOSE
- XBT_VERB("Different local variable : %s (%s - %s)", var_name, xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
+ XBT_VERB("Different local variable : %s (%s - %s) in frame %s", var_name, xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *), frame_name1);
#endif
#ifdef MC_DEBUG
XBT_DEBUG("Different local variable : %s (%s - %s)", var_name, xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *));
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;
+ ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_block.ignore++;
}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;
+ ((xbt_mheap_t)std_heap)->heapinfo[region->block].busy_frag.ignore[region->fragment]++;
}
if(mc_heap_comparison_ignore == NULL){
mdp -> heapinfo[block].busy_block.size * BLOCKSIZE;
if(MC_is_active()){
- if(mdp->heapinfo[block].busy_block.ignore == 1)
+ if(mdp->heapinfo[block].busy_block.ignore > 0)
MC_remove_ignore_heap(ptr, mdp -> heapinfo[block].busy_block.busy_size);
}
}
if(MC_is_active()){
- if(mdp->heapinfo[block].busy_frag.ignore[frag_nb] == 1)
+ if(mdp->heapinfo[block].busy_frag.ignore[frag_nb] > 0)
MC_remove_ignore_heap(ptr, mdp->heapinfo[block].busy_frag.frag_size[frag_nb]);
}
addr_block2 = ((void*) (((ADDR2UINT(current_block)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
- res_compare = compare_area(addr_block1, addr_block2, previous);
+ res_compare = compare_area(addr_block1, addr_block2, NULL);
if(res_compare == 0){
for(k=1; k < heapinfo2[current_block].busy_block.size; k++)
for(k=1; k < heapinfo1[current_block].busy_block.size; k++)
heapinfo1[current_block+k].busy_block.equal_to = new_heap_area(i1, -1);
equal = 1;
- match_equals(previous);
i1 = i1 + heapinfo1[current_block].busy_block.size;
}
i2++;
continue;
}
-
- res_compare = compare_area(addr_block1, addr_block2, previous);
+
+ res_compare = compare_area(addr_block1, addr_block2, NULL);
if(res_compare == 0){
for(k=1; k < heapinfo2[i2].busy_block.size; k++)
for(k=1; k < heapinfo1[i1].busy_block.size; k++)
heapinfo1[i1+k].busy_block.equal_to = new_heap_area(i2, -1);
equal = 1;
- match_equals(previous);
i1 = i1 + heapinfo1[i1].busy_block.size;
}
addr_block2 = ((void*) (((ADDR2UINT(current_block)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
addr_frag2 = (void*) ((char *)addr_block2 + (current_fragment << ((xbt_mheap_t)s_heap)->heapinfo[current_block].type));
- res_compare = compare_area(addr_frag1, addr_frag2, previous);
+ res_compare = compare_area(addr_frag1, addr_frag2, NULL);
- if(res_compare == 0){
+ if(res_compare == 0)
equal = 1;
- match_equals(previous);
- }
xbt_dynar_reset(previous);
- }
+ }
+
}
while(i2 <= heaplimit && !equal){
for(j2=0; j2 < (size_t) (BLOCKSIZE >> heapinfo2[i2].type); j2++){
- if(heapinfo2[i2].type == heapinfo1[i1].type && i2 == current_block && j2 == current_fragment)
+ if(i2 == current_block && j2 == current_fragment)
continue;
if(heapinfo2[i2].busy_frag.equal_to[j2] != NULL)
addr_block2 = ((void*) (((ADDR2UINT(i2)) - 1) * BLOCKSIZE + (char*)((xbt_mheap_t)s_heap)->heapbase));
addr_frag2 = (void*) ((char *)addr_block2 + (j2 << ((xbt_mheap_t)s_heap)->heapinfo[i2].type));
- res_compare = compare_area(addr_frag1, addr_frag2, previous);
+ res_compare = compare_area(addr_frag1, addr_frag2, NULL);
if(res_compare == 0){
equal = 1;
- match_equals(previous);
xbt_dynar_reset(previous);
break;
}
}
-int compare_area(void *area1, void* area2, xbt_dynar_t previous){ /* Return code : 0 = equal, 1 = same size but different bytes, 2 = different size used */
+int compare_area(void *area1, void* area2, xbt_dynar_t previous){
size_t i = 0, pointer_align = 0, ignore1 = 0, ignore2 = 0;
void *addr_pointed1, *addr_pointed2;
ssize_t block1, frag1, block2, frag2;
ssize_t size;
int check_ignore = 0;
- int j;
void *addr_block1, *addr_block2, *addr_frag1, *addr_frag2;
void *area1_to_compare, *area2_to_compare;
if(heapinfo1[block1].type == heapinfo2[block2].type){
- if(heapinfo1[block1].type == -1){
+ if(heapinfo1[block1].type == -1){ /* Free block */
if(match_pairs){
match_equals(previous);
xbt_dynar_free(&previous);
}
return 0;
- }else if(heapinfo1[block1].type == 0){
- if(heapinfo1[block1].busy_block.equal_to != NULL || heapinfo2[block2].busy_block.equal_to != NULL){
+ }else if(heapinfo1[block1].type == 0){ /* Complete block */
+
+ if(heapinfo1[block1].busy_block.equal_to != NULL && heapinfo2[block2].busy_block.equal_to != NULL){
if(equal_blocks(block1, block2)){
if(match_pairs){
match_equals(previous);
xbt_dynar_free(&previous);
}
return 0;
- }else{
- if(match_pairs){
- xbt_dynar_free(&previous);
- }
- return 1;
}
}
if(match_pairs){
xbt_dynar_free(&previous);
}
- return 2;
+ return 1;
}
if(!add_heap_area_pair(previous, block1, -1, block2, -1)){
area1_to_compare = addr_block1;
area2_to_compare = addr_block2;
- if(heapinfo1[block1].busy_block.ignore == 1 && heapinfo2[block2].busy_block.ignore == 1)
- check_ignore = 1;
+ if((heapinfo1[block1].busy_block.ignore > 0) && (heapinfo2[block2].busy_block.ignore == heapinfo1[block1].busy_block.ignore))
+ check_ignore = heapinfo1[block1].busy_block.ignore;
}else{
frag1 = ((uintptr_t) (ADDR2UINT (area1) % (BLOCKSIZE))) >> heapinfo1[block1].type;
area1_to_compare = addr_frag1;
area2_to_compare = addr_frag2;
- if(heapinfo1[block1].busy_frag.equal_to[frag1] != NULL || heapinfo2[block2].busy_frag.equal_to[frag2] != NULL){
+ if(heapinfo1[block1].busy_frag.equal_to[frag1] != NULL && heapinfo2[block2].busy_frag.equal_to[frag2] != NULL){
if(equal_fragments(block1, frag1, block2, frag2)){
if(match_pairs){
match_equals(previous);
xbt_dynar_free(&previous);
}
return 0;
- }else{
- if(match_pairs){
- xbt_dynar_free(&previous);
- }
- return 1;
}
}
if(match_pairs){
xbt_dynar_free(&previous);
}
- return 2;
+ return 1;
}
if(!add_heap_area_pair(previous, block1, frag1, block2, frag2)){
return 0;
}
- if(heapinfo1[block1].busy_frag.ignore[frag1] == 1 && heapinfo2[block2].busy_frag.ignore[frag2] == 1)
- check_ignore = 1;
+ if((heapinfo1[block1].busy_frag.ignore[frag1] > 0) && ( heapinfo2[block2].busy_frag.ignore[frag2] == heapinfo1[block1].busy_frag.ignore[frag1]))
+ check_ignore = heapinfo1[block1].busy_frag.ignore[frag1];
}
xbt_dynar_free(&previous);
}
return 0;
- }else{
- if(match_pairs){
- xbt_dynar_free(&previous);
- }
- return 1;
}
}
if(match_pairs){
xbt_dynar_free(&previous);
}
- return 2;
+ return 1;
}
if(!add_heap_area_pair(previous, block1, frag1, block2, frag2)){
return 0;
}
- if(heapinfo1[block1].busy_frag.ignore[frag1] == 1 && heapinfo2[block2].busy_frag.ignore[frag2] == 1)
- check_ignore = 1;
+ if((heapinfo1[block1].busy_frag.ignore[frag1] > 0) && (heapinfo2[block2].busy_frag.ignore[frag2] == heapinfo1[block1].busy_frag.ignore[frag1]))
+ check_ignore = heapinfo1[block1].busy_frag.ignore[frag1];
}else{
if(match_pairs){
while(i<size){
- if(check_ignore){
+ if(check_ignore > 0){
if((ignore1 = heap_comparison_ignore_size(to_ignore1, (char *)area1 + i)) > 0){
if((ignore2 = heap_comparison_ignore_size(to_ignore2, (char *)area2 + i)) == ignore1){
i = i + ignore2;
+ check_ignore--;
continue;
}
}
}
- pointer_align = (i / sizeof(void*)) * sizeof(void*);
- addr_pointed1 = *((void **)((char *)area1_to_compare + pointer_align));
- addr_pointed2 = *((void **)((char *)area2_to_compare + pointer_align));
+ if(memcmp(((char *)area1_to_compare) + i, ((char *)area2_to_compare) + i, 1) != 0){
- if(addr_pointed1 > maestro_stack_start && addr_pointed1 < maestro_stack_end && addr_pointed2 > maestro_stack_start && addr_pointed2 < maestro_stack_end){
- i = pointer_align + sizeof(void *);
- continue;
- }else if((addr_pointed1 > s_heap) && ((char *)addr_pointed1 < (char *)s_heap + STD_HEAP_SIZE)
+ pointer_align = (i / sizeof(void*)) * sizeof(void*);
+ addr_pointed1 = *((void **)((char *)area1_to_compare + pointer_align));
+ addr_pointed2 = *((void **)((char *)area2_to_compare + pointer_align));
+
+ if(addr_pointed1 > maestro_stack_start && addr_pointed1 < maestro_stack_end && addr_pointed2 > maestro_stack_start && addr_pointed2 < maestro_stack_end){
+ i = pointer_align + sizeof(void *);
+ continue;
+ }else if((addr_pointed1 > s_heap) && ((char *)addr_pointed1 < (char *)s_heap + STD_HEAP_SIZE)
&& (addr_pointed2 > s_heap) && ((char *)addr_pointed2 < (char *)s_heap + STD_HEAP_SIZE)){
- res_compare = compare_area(addr_pointed1, addr_pointed2, previous);
- if(res_compare != 0){
- if(match_pairs)
- xbt_dynar_free(&previous);
- return res_compare;
- }
- }else{
- j=0;
- while(j<sizeof(void*) && (i + j) < size){
- if(memcmp(((char *)area1_to_compare) + i + j, ((char *)area2_to_compare) + i + j , 1) != 0){
+ res_compare = compare_area(addr_pointed1, addr_pointed2, previous);
+ if(res_compare != 0){
if(match_pairs)
xbt_dynar_free(&previous);
- return 1;
+ return res_compare;
}
- j++;
+ i = pointer_align + sizeof(void *);
+ continue;
+ }else{
+ if(match_pairs)
+ xbt_dynar_free(&previous);
+ return 1;
}
+
}
+
+ i++;
- i = pointer_align + sizeof(void *);
}
if(match_pairs){
size_t nfree; /* Free fragments in a fragmented block. */
ssize_t frag_size[MAX_FRAGMENT_PER_BLOCK];
//void *bt[MAX_FRAGMENT_PER_BLOCK][XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
- short ignore[MAX_FRAGMENT_PER_BLOCK];
+ unsigned int ignore[MAX_FRAGMENT_PER_BLOCK];
heap_area_t equal_to[MAX_FRAGMENT_PER_BLOCK];
} busy_frag;
struct {
size_t busy_size; /* Actually used space, in bytes */
//void *bt[XBT_BACKTRACE_SIZE]; /* Where it was malloced (or realloced lastly) */
//int bt_size;
- short ignore;
+ unsigned int ignore;
heap_area_t equal_to;
} busy_block;
/* Heap information for a free block (that may be the first of a free cluster). */