1
1
#pragma once
2
+
2
3
#include < cassert>
3
4
#include < cstdint>
4
- #include < vector>
5
5
#include < string>
6
+ #include < vector>
6
7
7
8
class ArgLocation {
8
9
public:
@@ -23,18 +24,20 @@ class ArgLocation {
23
24
Kind _kind;
24
25
unsigned _size;
25
26
unsigned _align;
26
- const char * _reg = nullptr ;
27
+ const char * _reg = nullptr ;
27
28
size_t _stack_offset = 0 ;
28
29
29
30
public:
30
31
static ArgLocation Register (Kind kind, unsigned size) {
31
32
return ArgLocation (kind, size, size);
32
33
}
33
- static ArgLocation Stack (int64_t size, int64_t align) {
34
- auto loc = ArgLocation (Kind::Memory, static_cast <unsigned >(size), static_cast <unsigned >(align));
34
+
35
+ static ArgLocation Stack (int64_t size, int64_t align) {
36
+ auto loc = ArgLocation (Kind::Memory, static_cast <unsigned >(size), static_cast <unsigned >(align));
35
37
loc._onStack = true ;
36
38
return loc;
37
39
}
40
+
38
41
static ArgLocation Indirect (unsigned size, unsigned align) {
39
42
auto loc = ArgLocation (Kind::Integral, static_cast <unsigned >(size), static_cast <unsigned >(align));
40
43
loc._indirectOnStack = true ;
@@ -46,35 +49,62 @@ class ArgLocation {
46
49
_allocated = true ;
47
50
_reg = r;
48
51
}
52
+
49
53
void allocate_stack (size_t offset) {
50
54
assert (!_allocated);
51
55
_allocated = true ;
52
56
_onStack = true ;
53
57
_stack_offset = offset;
54
58
}
59
+
55
60
void set_indirect_on_stack () {
56
61
assert (!_indirectOnStack);
57
62
_indirectOnStack = true ;
58
63
}
59
64
60
- bool is_allocated () const { return _allocated; }
61
- bool is_stack () const { return _onStack; }
62
- bool is_indirect () const { return _indirectOnStack; }
65
+ bool is_allocated () const {
66
+ return _allocated;
67
+ }
68
+
69
+ bool is_stack () const {
70
+ return _onStack;
71
+ }
72
+
73
+ bool is_indirect () const {
74
+ return _indirectOnStack;
75
+ }
76
+
63
77
bool is_128bit_float () const {
64
78
return _reg != nullptr && ((_reg[0 ] == ' x' && _reg[1 ] == ' m' && _reg[2 ] == ' m' ) || _reg[0 ] == ' q' );
65
79
}
66
- const char * as_str () const {
80
+
81
+ const char *as_str () const {
67
82
if (_onStack) {
68
83
return " <stack>" ;
69
84
} else {
70
85
return _reg;
71
86
}
72
87
}
73
- operator const char *() const { return as_str (); }
74
- Kind kind () const { return _kind; }
75
- size_t size () const { return is_128bit_float () ? 16 : _size; }
76
- size_t align () const { return _align; }
77
- size_t stack_offset () const { return _stack_offset; }
88
+
89
+ operator const char *() const {
90
+ return as_str ();
91
+ }
92
+
93
+ Kind kind () const {
94
+ return _kind;
95
+ }
96
+
97
+ size_t size () const {
98
+ return is_128bit_float () ? 16 : _size;
99
+ }
100
+
101
+ size_t align () const {
102
+ return _align;
103
+ }
104
+
105
+ size_t stack_offset () const {
106
+ return _stack_offset;
107
+ }
78
108
};
79
109
80
110
struct AbiSignature {
0 commit comments