xref: /illumos-gate/usr/src/tools/smatch/src/storage.h (revision 1f5207b7)
1 #ifndef STORAGE_H
2 #define STORAGE_H
3 
4 #include "allocate.h"
5 #include "lib.h"
6 
7 /*
8  * The "storage" that underlies an incoming/outgoing pseudo. It's
9  * basically the backing store for a pseudo, and may be a real hardware
10  * register, a stack slot or a static symbol. Or nothing at all,
11  * since some pseudos can just be recalculated on the fly.
12  */
13 enum storage_type {
14 	REG_UDEF,
15 	REG_REG,
16 	REG_STACK,
17 	REG_FRAME,
18 	REG_SYM,
19 	REG_ARG,
20 	REG_BAD,
21 };
22 
23 enum inout_enum {
24 	STOR_IN,
25 	STOR_OUT
26 };
27 
28 struct storage;
29 DECLARE_PTR_LIST(storage_ptr_list, struct storage *);
30 
31 struct storage {
32 	enum storage_type type;
33 	int name;
34 	struct storage_ptr_list *users;
35 	union {
36 		int regno;
37 		int offset;
38 		struct symbol *sym;
39 	};
40 };
41 
42 DECLARE_PTR_LIST(storage_list, struct storage);
43 
44 struct storage_hash {
45 	struct basic_block *bb;
46 	pseudo_t pseudo;
47 	enum inout_enum inout;
48 	struct storage *storage;
49 	unsigned long flags;
50 };
51 
52 DECLARE_PTR_LIST(storage_hash_list, struct storage_hash);
53 
54 extern struct storage_hash_list *gather_storage(struct basic_block *, enum inout_enum);
55 extern void free_storage(void);
56 extern const char *show_storage(struct storage *);
57 extern void set_up_storage(struct entrypoint *);
58 struct storage *lookup_storage(struct basic_block *, pseudo_t, enum inout_enum);
59 void add_storage(struct storage *, struct basic_block *, pseudo_t, enum inout_enum);
60 
61 DECLARE_ALLOCATOR(storage);
62 DECLARE_ALLOCATOR(storage_hash);
63 
alloc_storage(void)64 static inline struct storage *alloc_storage(void)
65 {
66 	return __alloc_storage(0);
67 }
68 
alloc_storage_hash(struct storage * s)69 static inline struct storage_hash *alloc_storage_hash(struct storage *s)
70 {
71 	struct storage_hash *entry = __alloc_storage_hash(0);
72 	struct storage **usep = &entry->storage;
73 
74 	*usep = s;
75 	add_ptr_list(&s->users, usep);
76 	return entry;
77 }
78 
79 #endif /* STORAGE_H */
80