Print this page
11972 resync smatch

@@ -56,11 +56,10 @@
  * merge_sm_state() sets ->left and ->right.  (These are the states which were
  *    merged to form the current state.)
  * a pool:  a pool is an slist that has been merged with another slist.
  */
 
-#include <sys/time.h>
 #include <time.h>
 #include "smatch.h"
 #include "smatch_slist.h"
 #include "smatch_extra.h"
 

@@ -69,10 +68,15 @@
 bool implications_off;
 
 #define implied_debug 0
 #define DIMPLIED(msg...) do { if (implied_debug) printf(msg); } while (0)
 
+bool debug_implied(void)
+{
+        return implied_debug;
+}
+
 /*
  * tmp_range_list():
  * It messes things up to free range list allocations.  This helper fuction
  * lets us reuse memory instead of doing new allocations.
  */

@@ -296,17 +300,18 @@
                         struct state_list **checked, int *mixed, struct sm_state *gate_sm,
                         struct timeval *start_time)
 {
         int free_checked = 0;
         struct state_list *checked_states = NULL;
-        struct timeval now;
+        struct timeval now, diff;
 
         if (!sm)
                 return;
 
         gettimeofday(&now, NULL);
-        if (now.tv_usec - start_time->tv_usec > 1000000) {
+        timersub(&now, start_time, &diff);
+        if (diff.tv_sec >= 1) {
                 if (implied_debug) {
                         sm_msg("debug: %s: implications taking too long.  (%s %s %s)",
                                __func__, sm->state->name, show_special(comparison), show_rl(rl));
                 }
                 if (mixed)

@@ -449,18 +454,19 @@
 {
         struct sm_state *ret = NULL;
         struct sm_state *left;
         struct sm_state *right;
         int removed = 0;
-        struct timeval now;
+        struct timeval now, diff;
 
         if (!sm)
                 return NULL;
         if (*bail)
                 return NULL;
         gettimeofday(&now, NULL);
-        if (now.tv_usec - start->tv_usec > 3000000) {
+        timersub(&now, start, &diff);
+        if (diff.tv_sec >= 3) {
                 DIMPLIED("%s: implications taking too long: %s\n", __func__, sm_state_info(sm));
                 *bail = 1;
                 return NULL;
         }
         if ((*recurse_cnt)++ > RECURSE_LIMIT) {

@@ -597,18 +603,10 @@
         *true_states = filter_stack(sm, pre_stree, false_stack, true_stack);
         DIMPLIED("filtering false stack.\n");
         *false_states = filter_stack(sm, pre_stree, true_stack, false_stack);
         free_slist(&true_stack);
         free_slist(&false_stack);
-        if (implied_debug) {
-                printf("These are the implied states for the true path: (%s (%s) %s %s)\n",
-                       sm->name, sm->state->name, show_special(comparison), show_rl(rl));
-                __print_stree(*true_states);
-                printf("These are the implied states for the false path: (%s (%s) %s %s)\n",
-                       sm->name, sm->state->name, show_special(comparison), show_rl(rl));
-                __print_stree(*false_states);
-        }
 
         gettimeofday(&time_after, NULL);
         sec = time_after.tv_sec - time_before.tv_sec;
         if (option_timeout && sec > option_timeout) {
                 sm_perror("Function too hairy.  Ignoring implications after %d seconds.", sec);

@@ -795,10 +793,16 @@
 
 static int handled_by_extra_states(struct expression *expr,
                                    struct stree **implied_true,
                                    struct stree **implied_false)
 {
+        sval_t sval;
+
+        /* If the expression is known then it has no implications.  */
+        if (get_implied_value(expr, &sval))
+                return true;
+
         if (expr->type == EXPR_COMPARE)
                 return handle_comparison(expr, implied_true, implied_false);
         else
                 return handle_zero_comparison(expr, implied_true, implied_false);
 }

@@ -881,10 +885,22 @@
 
 static void set_implied_states(struct expression *expr)
 {
         struct sm_state *sm;
 
+        if (implied_debug &&
+            (expr || saved_implied_true || saved_implied_false)) {
+                char *name;
+
+                name = expr_to_str(expr);
+                printf("These are the implied states for the true path: (%s)\n", name);
+                __print_stree(saved_implied_true);
+                printf("These are the implied states for the false path: (%s)\n", name);
+                __print_stree(saved_implied_false);
+                free_string(name);
+        }
+
         FOR_EACH_SM(saved_implied_true, sm) {
                 __set_true_false_sm(sm, NULL);
         } END_FOR_EACH_SM(sm);
         free_stree(&saved_implied_true);