Print this page
12724 update smatch to 0.6.1-rc1-il-5

@@ -76,27 +76,18 @@
 }
 
 static void match_states(const char *fn, struct expression *expr, void *info)
 {
         struct expression *check_arg;
-        struct sm_state *sm;
-        int found = 0;
 
         check_arg = get_argument_from_call_expr(expr->args, 0);
         if (check_arg->type != EXPR_STRING) {
                 sm_error("the check_name argument to %s is supposed to be a string literal", fn);
                 return;
         }
 
-        FOR_EACH_SM(__get_cur_stree(), sm) {
-                if (!strstr(check_name(sm->owner), check_arg->string->data))
-                        continue;
-                sm_msg("%s", show_sm(sm));
-                found = 1;
-        } END_FOR_EACH_SM(sm);
-
-        if (found)
+        if (__print_states(check_arg->string->data))
                 return;
 
         if (!id_from_name(check_arg->string->data))
                 sm_msg("invalid check name '%s'", check_arg->string->data);
         else

@@ -208,10 +199,13 @@
         struct expression *arg;
         struct range_list *rl = NULL;
         bool capped = false;
         char *name;
 
+        if (option_project != PROJ_KERNEL)
+                sm_msg("no user data for project = '%s'", option_project_str);
+
         arg = get_argument_from_call_expr(expr->args, 0);
         name = expr_to_str(arg);
 
         get_user_rl(arg, &rl);
         if (rl)

@@ -524,10 +518,21 @@
 static void match_debug_db_off(const char *fn, struct expression *expr, void *info)
 {
         debug_db = 0;
 }
 
+static void mtag_info(struct expression *expr)
+{
+        mtag_t tag = 0;
+        int offset = 0;
+        struct range_list *rl = NULL;
+
+        expr_to_mtag_offset(expr, &tag, &offset);
+        get_mtag_rl(expr, &rl);
+        sm_msg("mtag = %llu offset = %d rl = '%s'", tag, offset, show_rl(rl));
+}
+
 static void match_about(const char *fn, struct expression *expr, void *info)
 {
         struct expression *arg;
         struct sm_state *sm;
         char *name;

@@ -535,10 +540,11 @@
         sm_msg("---- about ----");
         match_print_implied(fn, expr, NULL);
         match_buf_size(fn, expr, NULL);
         match_strlen(fn, expr, NULL);
         match_real_absolute(fn, expr, NULL);
+        mtag_info(expr);
 
         arg = get_argument_from_call_expr(expr->args, 0);
         name = expr_to_str(arg);
         if (!name) {
                 sm_msg("info: not a straight forward variable.");

@@ -649,10 +655,25 @@
 static void match_print_stree_id(const char *fn, struct expression *expr, void *info)
 {
         sm_msg("stree_id %d", __stree_id);
 }
 
+static void match_bits(const char *fn, struct expression *expr, void *_unused)
+{
+        struct expression *arg;
+        struct bit_info *info;
+        char *name;
+
+        arg = get_argument_from_call_expr(expr->args, 0);
+        name = expr_to_str(arg);
+
+        info = get_bit_info(arg);
+
+        sm_msg("bit info '%s': definitely set 0x%llx.  possibly set 0x%llx.",
+               name, info->set, info->possible);
+}
+
 static void match_mtag(const char *fn, struct expression *expr, void *info)
 {
         struct expression *arg;
         char *name;
         mtag_t tag = 0;

@@ -693,10 +714,32 @@
         sm_msg("container: '%s' vs '%s' --> '%s'", cont, name, str);
         free_string(cont);
         free_string(name);
 }
 
+static void match_expr(const char *fn, struct expression *expr, void *info)
+{
+        struct expression *arg, *str, *new;
+        char *name, *new_name;
+
+        str = get_argument_from_call_expr(expr->args, 0);
+        arg = get_argument_from_call_expr(expr->args, 1);
+        if (!arg || !str)
+                return;
+
+        if (str->type != EXPR_STRING)
+                return;
+
+        new = gen_expression_from_key(arg, str->string->data);
+        name = expr_to_str(arg);
+        new_name = expr_to_str(new);
+
+        sm_msg("str = '%s', arg = '%s' expr = '%s'", str->string->data, name, new_name);
+
+        free_string(new_name);
+        free_string(name);
+}
 static void match_state_count(const char *fn, struct expression *expr, void *info)
 {
         sm_msg("state_count = %d\n", sm_state_counter);
 }
 

@@ -790,12 +833,14 @@
         add_function_hook("__smatch_intersection", &match_intersection, NULL);
         add_function_hook("__smatch_type", &match_type, NULL);
         add_implied_return_hook("__smatch_type_rl_helper", &match_type_rl_return, NULL);
         add_function_hook("__smatch_merge_tree", &match_print_merge_tree, NULL);
         add_function_hook("__smatch_stree_id", &match_print_stree_id, NULL);
+        add_function_hook("__smatch_bits", &match_bits, NULL);
         add_function_hook("__smatch_mtag", &match_mtag, NULL);
         add_function_hook("__smatch_mtag_data", &match_mtag_data_offset, NULL);
+        add_function_hook("__smatch_expr", &match_expr, NULL);
         add_function_hook("__smatch_state_count", &match_state_count, NULL);
         add_function_hook("__smatch_mem", &match_mem, NULL);
         add_function_hook("__smatch_exit", &match_exit, NULL);
         add_function_hook("__smatch_container", &match_container, NULL);