Print this page
11972 resync smatch


  30 static struct statement *get_cur_stmt(void)
  31 {
  32         return last_ptr_list((struct ptr_list *)big_statement_stack);
  33 }
  34 
  35 static void set_modified(struct sm_state *sm, struct expression *mod_expr)
  36 {
  37         set_state(my_id, sm->name, sm->sym, &modified);
  38 }
  39 
  40 static struct expression *strip_condition(struct expression *expr)
  41 {
  42         expr = strip_expr(expr);
  43 
  44         if (expr->type == EXPR_PREOP && expr->op == '!')
  45                 return strip_condition(expr->unop);
  46 
  47         if (expr->type == EXPR_COMPARE &&
  48             (expr->op == SPECIAL_EQUAL ||
  49              expr->op == SPECIAL_NOTEQUAL)) {
  50                 if (is_zero(expr->left))
  51                         return strip_condition(expr->right);
  52                 if (is_zero(expr->right))
  53                         return strip_condition(expr->left);
  54         }
  55 
  56         return expr;
  57 }
  58 
  59 static int conditions_match(struct expression *cond, struct expression *prev)
  60 {
  61         prev = strip_condition(prev);
  62 
  63         if (prev == cond)
  64                 return 1;
  65 
  66         if (prev->type == EXPR_LOGICAL) {
  67                 if (conditions_match(cond, prev->left) ||
  68                     conditions_match(cond, prev->right))
  69                         return 1;
  70         }
  71 
  72         return 0;


 114         if (strcasestr(name, "delay"))
 115                 return 1;
 116         if (strcasestr(name, "schedule"))
 117                 return 1;
 118         if (strcmp(name, "smp_rmb") == 0)
 119                 return 1;
 120         if (strcmp(name, "mb") == 0)
 121                 return 1;
 122         if (strcmp(name, "barrier") == 0)
 123                 return 1;
 124         return 0;
 125 }
 126 
 127 static int previous_statement_was_synchronize(void)
 128 {
 129         struct statement *stmt;
 130         struct position pos;
 131         struct position prev_pos;
 132         char *ident;
 133 



 134         if (__prev_stmt) {
 135                 prev_pos = __prev_stmt->pos;
 136                 prev_pos.line -= 3;
 137         } else {
 138                 prev_pos = __cur_stmt->pos;
 139                 prev_pos.line -= 5;
 140         }
 141 
 142         FOR_EACH_PTR_REVERSE(big_statement_stack, stmt) {
 143                 if (stmt->pos.line < prev_pos.line)
 144                         return 0;
 145                 pos = stmt->pos;
 146                 ident = get_macro_name(pos);
 147                 if (name_means_synchronize(ident))
 148                         return 1;
 149                 ident = pos_ident(pos);
 150                 if (!ident)
 151                         continue;
 152                 if (strcmp(ident, "if") == 0) {
 153                         pos.pos += 4;




  30 static struct statement *get_cur_stmt(void)
  31 {
  32         return last_ptr_list((struct ptr_list *)big_statement_stack);
  33 }
  34 
  35 static void set_modified(struct sm_state *sm, struct expression *mod_expr)
  36 {
  37         set_state(my_id, sm->name, sm->sym, &modified);
  38 }
  39 
  40 static struct expression *strip_condition(struct expression *expr)
  41 {
  42         expr = strip_expr(expr);
  43 
  44         if (expr->type == EXPR_PREOP && expr->op == '!')
  45                 return strip_condition(expr->unop);
  46 
  47         if (expr->type == EXPR_COMPARE &&
  48             (expr->op == SPECIAL_EQUAL ||
  49              expr->op == SPECIAL_NOTEQUAL)) {
  50                 if (expr_is_zero(expr->left))
  51                         return strip_condition(expr->right);
  52                 if (expr_is_zero(expr->right))
  53                         return strip_condition(expr->left);
  54         }
  55 
  56         return expr;
  57 }
  58 
  59 static int conditions_match(struct expression *cond, struct expression *prev)
  60 {
  61         prev = strip_condition(prev);
  62 
  63         if (prev == cond)
  64                 return 1;
  65 
  66         if (prev->type == EXPR_LOGICAL) {
  67                 if (conditions_match(cond, prev->left) ||
  68                     conditions_match(cond, prev->right))
  69                         return 1;
  70         }
  71 
  72         return 0;


 114         if (strcasestr(name, "delay"))
 115                 return 1;
 116         if (strcasestr(name, "schedule"))
 117                 return 1;
 118         if (strcmp(name, "smp_rmb") == 0)
 119                 return 1;
 120         if (strcmp(name, "mb") == 0)
 121                 return 1;
 122         if (strcmp(name, "barrier") == 0)
 123                 return 1;
 124         return 0;
 125 }
 126 
 127 static int previous_statement_was_synchronize(void)
 128 {
 129         struct statement *stmt;
 130         struct position pos;
 131         struct position prev_pos;
 132         char *ident;
 133 
 134         if (!__cur_stmt)
 135                 return 0;
 136 
 137         if (__prev_stmt) {
 138                 prev_pos = __prev_stmt->pos;
 139                 prev_pos.line -= 3;
 140         } else {
 141                 prev_pos = __cur_stmt->pos;
 142                 prev_pos.line -= 5;
 143         }
 144 
 145         FOR_EACH_PTR_REVERSE(big_statement_stack, stmt) {
 146                 if (stmt->pos.line < prev_pos.line)
 147                         return 0;
 148                 pos = stmt->pos;
 149                 ident = get_macro_name(pos);
 150                 if (name_means_synchronize(ident))
 151                         return 1;
 152                 ident = pos_ident(pos);
 153                 if (!ident)
 154                         continue;
 155                 if (strcmp(ident, "if") == 0) {
 156                         pos.pos += 4;