-int is_stack_ignore_variable(char *frame, char *var_name){
-
- unsigned int cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(mc_stack_comparison_ignore) - 1;
- mc_stack_ignore_variable_t current_var;
-
- 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 || strcmp(current_var->frame, "*") == 0){
- if(strcmp(current_var->var_name, var_name) == 0)
- return 1;
- if(strcmp(current_var->var_name, var_name) < 0)
- start = cursor + 1;
- if(strcmp(current_var->var_name, var_name) > 0)
- end = cursor - 1;
- }else if(strcmp(current_var->frame, frame) < 0){
- start = cursor + 1;
- }else if(strcmp(current_var->frame, frame) > 0){
- end = cursor - 1;
- }
- }
-
- return 0;
-}
-
-static int compare_local_variables(char *s1, char *s2){
-
- xbt_dynar_t tokens1 = xbt_str_split(s1, NULL);
- xbt_dynar_t tokens2 = xbt_str_split(s2, NULL);
-
- xbt_dynar_t s_tokens1, s_tokens2;
- unsigned int cursor = 0;
- void *addr1, *addr2;
- char *frame_name1 = NULL, *frame_name2 = NULL;
- int res_compare = 0;
-
- #if defined MC_VERBOSE || defined MC_DEBUG
- char *var_name;
- #endif
-
- while(cursor < xbt_dynar_length(tokens1)){
- s_tokens1 = xbt_str_split(xbt_dynar_get_as(tokens1, cursor, char *), "=");
- s_tokens2 = xbt_str_split(xbt_dynar_get_as(tokens2, cursor, char *), "=");
- if(xbt_dynar_length(s_tokens1) > 1 && xbt_dynar_length(s_tokens2) > 1){
- #if defined MC_VERBOSE || defined MC_DEBUG
- var_name = xbt_dynar_get_as(s_tokens1, 0, char *);
- #endif
- if((strcmp(xbt_dynar_get_as(s_tokens1, 0, char *), "frame_name") == 0) && (strcmp(xbt_dynar_get_as(s_tokens2, 0, char *), "frame_name") == 0)){
- xbt_free(frame_name1);
- xbt_free(frame_name2);
- frame_name1 = strdup(xbt_dynar_get_as(s_tokens1, 1, char *));
- frame_name2 = strdup(xbt_dynar_get_as(s_tokens2, 1, char *));
- }
- addr1 = (void *) strtoul(xbt_dynar_get_as(s_tokens1, 1, char *), NULL, 16);
- addr2 = (void *) strtoul(xbt_dynar_get_as(s_tokens2, 1, char *), NULL, 16);
- if(addr1 > std_heap && (char *)addr1 <= (char *)std_heap + STD_HEAP_SIZE && addr2 > std_heap && (char *)addr2 <= (char *)std_heap + STD_HEAP_SIZE){
- res_compare = compare_area(addr1, addr2, NULL);
- if(res_compare == 1){
- if(is_stack_ignore_variable(frame_name1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(frame_name2, xbt_dynar_get_as(s_tokens2, 0, char *))){
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
- cursor++;
- continue;
- }else {
- #ifdef MC_VERBOSE
- XBT_VERB("Different local variable : %s at addresses %p - %p", var_name, addr1, addr2);
- #endif
- #ifdef MC_DEBUG
- XBT_DEBUG("Different local variable : %s at addresses %p - %p", var_name, addr1, addr2);
- #endif
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
- xbt_dynar_free(&tokens1);
- xbt_dynar_free(&tokens2);
- xbt_free(frame_name1);
- xbt_free(frame_name2);
- return 1;
- }
- }
- }else{
- if(strcmp(xbt_dynar_get_as(s_tokens1, 1, char *), xbt_dynar_get_as(s_tokens2, 1, char *)) != 0){
- if(is_stack_ignore_variable(frame_name1, xbt_dynar_get_as(s_tokens1, 0, char *)) && is_stack_ignore_variable(frame_name2, xbt_dynar_get_as(s_tokens2, 0, char *))){
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
- cursor++;
- 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 *));
- #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 *));
- #endif
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
- xbt_dynar_free(&tokens1);
- xbt_dynar_free(&tokens2);
- xbt_free(frame_name1);
- xbt_free(frame_name2);
- return 1;
- }
- }
- }
- }
- xbt_dynar_free(&s_tokens1);
- xbt_dynar_free(&s_tokens2);
-
- cursor++;
- }
-
- xbt_free(frame_name1);
- xbt_free(frame_name2);
- xbt_dynar_free(&tokens1);
- xbt_dynar_free(&tokens2);
- return 0;
-
-}
-
-static int is_heap_equality(xbt_dynar_t equals, void *a1, void *a2){
-
- unsigned int cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(equals) - 1;
- heap_equality_t current_equality;
-
- while(start <= end){
- cursor = (start + end) / 2;
- current_equality = (heap_equality_t)xbt_dynar_get_as(equals, cursor, heap_equality_t);
- if(current_equality->address1 == a1){
- if(current_equality->address2 == a2)
- return 1;
- if(current_equality->address2 < a2)
- start = cursor + 1;
- if(current_equality->address2 > a2)
- end = cursor - 1;
- }
- if(current_equality->address1 < a1)
- start = cursor + 1;
- if(current_equality->address1 > a1)
- end = cursor - 1;
- }
-
- return 0;
-
-}
-
-int MC_compare_snapshots(void *s1, void *s2){
-
- MC_ignore_stack("self", "simcall_BODY_mc_snapshot");
-
- return simcall_mc_compare_snapshots(s1, s2);
-
-}