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);
}