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