int _sg_mc_max_depth=1000;
int _sg_mc_visited=0;
-
extern int _sg_init_status;
void _mc_cfg_cb_reduce(const char *name, int pos) {
if (_sg_init_status && !_sg_do_model_check) {
mc_state_t mc_current_state = NULL;
char mc_replay_mode = FALSE;
double *mc_time = NULL;
+mc_comparison_times_t mc_comp_times = NULL;
+double mc_snapshot_comparison_time;
/* Safety */
static void MC_get_global_variables(char *elf_file);
void MC_do_the_modelcheck_for_real() {
+
+ MC_SET_RAW_MEM;
+ mc_comp_times = xbt_new0(s_mc_comparison_times_t, 1);
+ MC_UNSET_RAW_MEM;
+
if (!_sg_mc_property_file || _sg_mc_property_file[0]=='\0') {
if (mc_reduce_kind==e_mc_reduce_unset)
mc_reduce_kind=e_mc_reduce_dpor;
xbt_dict_t libsimgrid_location_list = MC_get_location_list(libsimgrid_path);
MC_get_local_variables(libsimgrid_path, libsimgrid_location_list, &mc_local_variables);
+ xbt_dict_free(&libsimgrid_location_list);
+ xbt_dict_free(&binary_location_list);
+
/* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */
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_ignore_stack("_throw_ctx", "*");
MC_ignore_stack("ctx", "*");
+ MC_ignore_stack("next_context", "smx_ctx_sysv_suspend_serial");
+ MC_ignore_stack("i", "smx_ctx_sysv_suspend_serial");
+
if(raw_mem_set)
MC_SET_RAW_MEM;
{
xbt_free(mc_time);
MC_memory_exit();
+ xbt_abort();
}
/************ 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);
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;
- }else{
- region->fragment = ((uintptr_t) (ADDR2UINT (address) % (BLOCKSIZE))) >> ((xbt_mheap_t)std_heap)->heapinfo[region->block].type;
- }
-
+ 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;
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);
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;
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);
xbt_dynar_free(&split);
}
- free(line);
- free(command);
+ xbt_free(line);
+ xbt_free(command);
pclose(fp);
return location_list;
dw_frame_t res;
xbt_dict_foreach(all_variables, cursor, name, res) {
- if(offset >= res->start && offset < res->end)
+ if(offset >= res->start && offset < res->end){
+ xbt_dict_cursor_free(&cursor);
return res;
+ }
}
+ xbt_dict_cursor_free(&cursor);
return NULL;
}
xbt_str_rtrim(abstract_origin, ">");
subprogram_name = (char *)xbt_dict_get_or_null(subprograms_origin, abstract_origin);
frame = xbt_dict_get_or_null(*all_variables, subprogram_name);
+ xbt_free(abstract_origin);
}else if(strcmp(node_type, "DW_AT_name") == 0){
new_frame = 1;
- free(current_frame);
+ xbt_free(current_frame);
frame = xbt_new0(s_dw_frame_t, 1);
frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *));
frame->variables = xbt_dict_new_homogeneous(NULL);
xbt_str_rtrim(loc_expr, ")");
frame->frame_base = get_location(NULL, loc_expr);
xbt_dynar_free(&split2);
+ xbt_free(loc_expr);
}
}else if(strcmp(node_type, "DW_AT_MIPS_linkage_name:") == 0){
- free(frame->name);
- free(current_frame);
+ xbt_free(frame->name);
+ xbt_free(current_frame);
frame->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *));
current_frame = strdup(frame->name);
xbt_dict_set(subprograms_origin, subprogram_start, frame->name, NULL);
xbt_dict_set(*all_variables, frame->name, frame, NULL);
}
- free(subprogram_start);
+ xbt_free(subprogram_start);
if(subprogram_end != NULL){
- free(subprogram_end);
+ xbt_free(subprogram_end);
subprogram_end = NULL;
}
xbt_str_rtrim(loc_expr, ")");
var->location = get_location(NULL, loc_expr);
xbt_dynar_free(&split2);
+ xbt_free(loc_expr);
}
}
xbt_dynar_free(&split);
- free(line);
- free(command);
+ xbt_free(line);
+ xbt_free(command);
pclose(fp);
}
char *key = bprintf("%d", (int)strtoul(expr, NULL, 16));
loc->type = e_dw_loclist;
loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key);
- if(loc == NULL)
+ if(loc->location.loclist == NULL)
XBT_INFO("Key not found in loclist");
+ xbt_free(key);
return loc;
}else{
}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);
}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
}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 ||
}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
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
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 ||
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
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);
|| (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;
}
- free(command);
- free(line);
+ xbt_free(command);
+ xbt_free(line);
pclose(fp);
}