59 data->tag = tag;
60 data->offset = offset;
61
62 state = __alloc_smatch_state(0);
63 state->name = alloc_sname(name);
64 state->data = data;
65 return state;
66 }
67
68 struct smatch_state *merge_tag_info(struct smatch_state *s1, struct smatch_state *s2)
69 {
70 /* Basically ignore undefined states */
71 if (s1 == &undefined)
72 return s2;
73 if (s2 == &undefined)
74 return s1;
75
76 return &merged;
77 }
78
79 static bool is_local_var(struct expression *expr)
80 {
81 struct symbol *sym;
82
83 if (!expr || expr->type != EXPR_SYMBOL)
84 return false;
85 sym = expr->symbol;
86 if (!(sym->ctype.modifiers & MOD_TOPLEVEL))
87 return true;
88 return false;
89 }
90
91 static void match_assign(struct expression *expr)
92 {
93 struct expression *left;
94 struct symbol *right_sym;
95 char *name;
96 mtag_t tag;
97 int offset;
98 int param;
99
100 if (expr->op != '=')
101 return;
102 left = strip_expr(expr->left);
103 if (is_local_var(left))
104 return;
105 right_sym = expr_to_sym(expr->right);
106 if (!right_sym)
107 return;
108
109 param = get_param_num_from_sym(right_sym);
110 if (param < 0)
111 return;
112 // FIXME: modify param_has_filter_data() to take a name/sym
113 if (!expr_to_mtag_offset(left, &tag, &offset))
114 return;
115 name = expr_to_str(left);
116 if (!name)
117 return;
118 set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
119 free_string(name);
120 }
121
122 static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
123 {
|
59 data->tag = tag;
60 data->offset = offset;
61
62 state = __alloc_smatch_state(0);
63 state->name = alloc_sname(name);
64 state->data = data;
65 return state;
66 }
67
68 struct smatch_state *merge_tag_info(struct smatch_state *s1, struct smatch_state *s2)
69 {
70 /* Basically ignore undefined states */
71 if (s1 == &undefined)
72 return s2;
73 if (s2 == &undefined)
74 return s1;
75
76 return &merged;
77 }
78
79 static void match_assign(struct expression *expr)
80 {
81 struct expression *left;
82 struct symbol *right_sym;
83 char *name;
84 mtag_t tag;
85 int offset;
86 int param;
87
88 if (expr->op != '=')
89 return;
90 left = strip_expr(expr->left);
91 if (is_local_variable(left))
92 return;
93 right_sym = expr_to_sym(expr->right);
94 if (!right_sym)
95 return;
96
97 param = get_param_num_from_sym(right_sym);
98 if (param < 0)
99 return;
100 // FIXME: modify param_has_filter_data() to take a name/sym
101 if (!expr_to_mtag_offset(left, &tag, &offset))
102 return;
103 name = expr_to_str(left);
104 if (!name)
105 return;
106 set_state_expr(my_id, expr->right, alloc_tag_data_state(tag, name, offset));
107 free_string(name);
108 }
109
110 static void propogate_assignment(struct expression *expr, mtag_t tag, int offset, int param, char *key)
111 {
|