2 * Copyright (C) 2014 Oracle.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
19 * Some helper functions for managing links.
24 #include "smatch_slist.h"
26 static struct smatch_state
*alloc_link(struct var_sym_list
*links
)
28 struct smatch_state
*state
;
33 state
= __alloc_smatch_state(0);
36 FOR_EACH_PTR(links
, tmp
) {
38 snprintf(buf
, sizeof(buf
), "%s", tmp
->var
);
40 append(buf
, ", ", sizeof(buf
));
41 append(buf
, tmp
->var
, sizeof(buf
));
43 } END_FOR_EACH_PTR(tmp
);
45 state
->name
= alloc_sname(buf
);
50 struct smatch_state
*merge_link_states(struct smatch_state
*s1
, struct smatch_state
*s2
)
52 struct var_sym_list
*new_links
;
59 if (var_sym_lists_equiv(s1
->data
, s2
->data
))
62 new_links
= clone_var_sym_list(s1
->data
);
63 merge_var_sym_list(&new_links
, s2
->data
);
65 return alloc_link(new_links
);
68 void store_link(int link_id
, const char *var
, struct symbol
*sym
, const char *link_name
, struct symbol
*link_sym
)
71 struct smatch_state
*old_state
;
72 struct var_sym_list
*links
;
77 old_state
= get_state(link_id
, var
, sym
);
79 links
= clone_var_sym_list(old_state
->data
);
83 add_var_sym(&links
, link_name
, link_sym
);
84 set_state(link_id
, var
, sym
, alloc_link(links
));
87 static void match_link_modify(struct sm_state
*sm
, struct expression
*mod_expr
)
89 struct var_sym_list
*links
;
92 links
= sm
->state
->data
;
94 FOR_EACH_PTR(links
, tmp
) {
95 set_state(sm
->owner
- 1, tmp
->var
, tmp
->sym
, &undefined
);
96 } END_FOR_EACH_PTR(tmp
);
97 set_state(sm
->owner
, sm
->name
, sm
->sym
, &undefined
);
100 void set_up_link_functions(int id
, int link_id
)
102 if (id
+ 1 != link_id
)
103 sm_fatal("FATAL ERROR: links need to be registered directly after the check");
105 set_dynamic_states(link_id
);
106 add_merge_hook(link_id
, &merge_link_states
);
107 add_modification_hook(link_id
, &match_link_modify
);
108 // free link at the end of function