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