Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : fix dynar index in algorithm to get local variable location
[simgrid.git] / src / mc / mc_global.c
index 421479d..2dd304f 100644 (file)
@@ -23,6 +23,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
 /* Configuration support */
 e_mc_reduce_t mc_reduce_kind=e_mc_reduce_unset;
 
+
 extern int _surf_init_status;
 void _mc_cfg_cb_reduce(const char *name, int pos) {
   if (_surf_init_status && !_surf_do_model_check) {
@@ -72,7 +73,7 @@ mc_stats_t mc_stats = NULL;
 
 mc_stats_pair_t mc_stats_pair = NULL;
 xbt_fifo_t mc_stack_liveness = NULL;
-mc_snapshot_t initial_snapshot_liveness = NULL;
+mc_global_t initial_state_liveness = NULL;
 int compare;
 
 /* Local */
@@ -145,11 +146,8 @@ void MC_init_safety(void)
   MC_take_snapshot(initial_snapshot);
   MC_UNSET_RAW_MEM;
 
-
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
   
 }
 
@@ -165,12 +163,9 @@ void MC_modelcheck(void)
   MC_exit();
 }
 
-void MC_modelcheck_liveness(){
+void MC_init_liveness(){
 
   raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
-
-  /* init stuff */
-  XBT_INFO("Start init mc");
   
   mc_time = xbt_new0(double, simix_process_maxpid);
 
@@ -197,6 +192,27 @@ void MC_modelcheck_liveness(){
   /* Get local variables in libsimgrid for state equality detection */
   xbt_dict_t libsimgrid_location_list = MC_get_location_list(ls_path);
   MC_get_local_variables(ls_path, libsimgrid_location_list, &mc_local_variables);
+
+  MC_UNSET_RAW_MEM;
+
+  MC_init_memory_map_info();
+
+  /* Get .plt section (start and end addresses) for data libsimgrid and data program comparison */
+  get_libsimgrid_plt_section();
+  get_binary_plt_section();
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
+
+}
+
+void MC_modelcheck_liveness(){
+
+  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
+  MC_init_liveness();
+  MC_SET_RAW_MEM;
   
   /* Initialize statistics */
   mc_stats_pair = xbt_new0(s_mc_stats_pair_t, 1);
@@ -213,8 +229,7 @@ void MC_modelcheck_liveness(){
   /* We're done */
   MC_print_statistics_pairs(mc_stats_pair);
   xbt_free(mc_time);
-  MC_memory_exit();
-  exit(0);
+
 }
 
 
@@ -356,9 +371,10 @@ void MC_replay_liveness(xbt_fifo_t stack, int all_stack)
   XBT_DEBUG("**** Begin Replay ****");
 
   /* Restore the initial state */
-  MC_restore_snapshot(initial_snapshot_liveness);
+  MC_restore_snapshot(initial_state_liveness->initial_snapshot);
   /* At the moment of taking the snapshot the raw heap was set, so restoring
    * it will set it back again, we have to unset it to continue  */
+  
   MC_UNSET_RAW_MEM;
 
   if(all_stack){
@@ -549,13 +565,11 @@ void MC_dump_stack_liveness(xbt_fifo_t stack){
 
   MC_SET_RAW_MEM;
   while ((pair = (mc_pair_stateless_t) xbt_fifo_pop(stack)) != NULL)
-    MC_pair_stateless_delete(pair);
+    pair_stateless_free(pair);
   MC_UNSET_RAW_MEM;
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
 
 }
 
@@ -585,7 +599,7 @@ void MC_print_statistics_pairs(mc_stats_pair_t stats)
 
 void MC_assert(int prop)
 {
-  if (MC_IS_ENABLED && !prop){
+  if (MC_is_active() && !prop){
     XBT_INFO("**************************");
     XBT_INFO("*** PROPERTY NOT VALID ***");
     XBT_INFO("**************************");
@@ -597,7 +611,7 @@ void MC_assert(int prop)
 }
 
 static void MC_assert_pair(int prop){
-  if (MC_IS_ENABLED && !prop) {
+  if (MC_is_active() && !prop) {
     XBT_INFO("**************************");
     XBT_INFO("*** PROPERTY NOT VALID ***");
     XBT_INFO("**************************");
@@ -616,10 +630,14 @@ void MC_process_clock_add(smx_process_t process, double amount)
 
 double MC_process_clock_get(smx_process_t process)
 {
-  if(mc_time)
-    return mc_time[process->pid];
-  else
+  if(mc_time){
+    if(process != NULL)
+      return mc_time[process->pid];
+    else 
+      return -1;
+  }else{
     return 0;
+  }
 }
 
 void MC_automaton_load(const char *file){
@@ -637,8 +655,6 @@ void MC_automaton_load(const char *file){
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
 
 }
 
@@ -657,8 +673,6 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
 
   if(raw_mem_set)
     MC_SET_RAW_MEM;
-  else
-    MC_UNSET_RAW_MEM;
   
 }
 
@@ -666,6 +680,8 @@ void MC_automaton_new_propositional_symbol(const char* id, void* fct) {
 
 void MC_ignore(void *address, size_t size){
 
+  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+
   MC_SET_RAW_MEM;
   
   if(mc_comparison_ignore == NULL)
@@ -698,21 +714,31 @@ void MC_ignore(void *address, size_t size){
   xbt_dynar_insert_at(mc_comparison_ignore, cursor, &region);
 
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
 }
 
 void MC_new_stack_area(void *stack, char *name, void* context){
 
-  if(stacks_areas == NULL)
-    stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
 
   MC_SET_RAW_MEM;
+
+  if(stacks_areas == NULL)
+    stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL);
+  
   stack_region_t region = NULL;
   region = xbt_new0(s_stack_region_t, 1);
   region->address = stack;
   region->process_name = strdup(name);
   region->context = context;
   xbt_dynar_push(stacks_areas, &region);
+  
   MC_UNSET_RAW_MEM;
+
+  if(raw_mem_set)
+    MC_SET_RAW_MEM;
 }
 
 /************ DWARF ***********/
@@ -1263,7 +1289,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_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, 2, char*));
+        new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(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);