Print this page
11506 smatch resync

@@ -94,19 +94,22 @@
         sql_insert_caller_info(call, NOSPEC, param, printed_name, "");
 }
 
 static void returned_struct_members(int return_id, char *return_ranges, struct expression *expr)
 {
+        struct stree *start_states = get_start_states();
         struct symbol *returned_sym;
         struct sm_state *sm;
         const char *param_name;
         struct range_list *rl;
         int param;
 
         returned_sym = expr_to_sym(expr);
 
         FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
+                if (get_state_stree(start_states, my_id, sm->name, sm->sym) == sm->state)
+                        continue;
                 param = get_param_num_from_sym(sm->sym);
                 if (param < 0) {
                         if (!returned_sym || returned_sym != sm->sym)
                                 continue;
                         param = -1;

@@ -220,11 +223,12 @@
         macro = get_macro_name(stmt->pos);
         if (!macro)
                 return;
         if (strcmp(macro, "rmb") != 0 &&
             strcmp(macro, "smp_rmb") != 0 &&
-            strcmp(macro, "barrier_nospec") != 0)
+            strcmp(macro, "barrier_nospec") != 0 &&
+            strcmp(macro, "preempt_disable") != 0)
                 return;
 
         set_state(barrier_id, "barrier", NULL, &nospec);
         mark_user_data_as_nospec();
 }

@@ -232,10 +236,19 @@
 static void db_returns_barrier(struct expression *expr, int param, char *key, char *value)
 {
         mark_user_data_as_nospec();
 }
 
+static void select_return_stmt_cnt(struct expression *expr, int param, char *key, char *value)
+{
+        int cnt;
+
+        cnt = atoi(value);
+        if (cnt > 400)
+                mark_user_data_as_nospec();
+}
+
 void check_nospec(int id)
 {
         my_id = id;
 
         add_hook(&nospec_assign, ASSIGNMENT_HOOK);

@@ -246,10 +259,11 @@
         add_hook(&match_call_info, FUNCTION_CALL_HOOK);
         add_member_info_callback(my_id, struct_member_callback);
         add_split_return_callback(&returned_struct_members);
         select_return_states_hook(NOSPEC, &db_returns_nospec);
         select_return_states_hook(NOSPEC_WB, &db_returns_barrier);
+        select_return_states_hook(STMT_CNT, &select_return_stmt_cnt);
 
         add_hook(&match_asm, ASM_HOOK);
         add_hook(&match_after_nospec_asm, STMT_HOOK_AFTER);
 }