@@ -66,7 +66,7 @@ class VMATree {
66
66
return statetype_strings[static_cast <uint8_t >(type)];
67
67
}
68
68
69
- // Each point has some stack and a flag associated with it.
69
+ // Each point has some stack and a tag associated with it.
70
70
struct RegionData {
71
71
const NativeCallStackStorage::StackIndex stack_idx;
72
72
const MemTag mem_tag;
@@ -88,30 +88,34 @@ class VMATree {
88
88
struct IntervalState {
89
89
private:
90
90
// Store the type and mem_tag as two bytes
91
- uint8_t type_flag [2 ];
91
+ uint8_t type_tag [2 ];
92
92
NativeCallStackStorage::StackIndex sidx;
93
93
94
94
public:
95
- IntervalState () : type_flag {0 ,0 }, sidx() {}
95
+ IntervalState () : type_tag {0 ,0 }, sidx() {}
96
96
IntervalState (const StateType type, const RegionData data) {
97
97
assert (!(type == StateType::Released) || data.mem_tag == mtNone, " Released type must have memory tag mtNone" );
98
- type_flag [0 ] = static_cast <uint8_t >(type);
99
- type_flag [1 ] = static_cast <uint8_t >(data.mem_tag );
98
+ type_tag [0 ] = static_cast <uint8_t >(type);
99
+ type_tag [1 ] = static_cast <uint8_t >(data.mem_tag );
100
100
sidx = data.stack_idx ;
101
101
}
102
102
103
103
StateType type () const {
104
- return static_cast <StateType>(type_flag [0 ]);
104
+ return static_cast <StateType>(type_tag [0 ]);
105
105
}
106
106
107
107
MemTag mem_tag () const {
108
- return static_cast <MemTag>(type_flag [1 ]);
108
+ return static_cast <MemTag>(type_tag [1 ]);
109
109
}
110
110
111
111
RegionData regiondata () const {
112
112
return RegionData{sidx, mem_tag ()};
113
113
}
114
114
115
+ void set_tag (MemTag tag) {
116
+ type_tag[1 ] = static_cast <uint8_t >(tag);
117
+ }
118
+
115
119
NativeCallStackStorage::StackIndex stack () const {
116
120
return sidx;
117
121
}
@@ -167,14 +171,20 @@ class VMATree {
167
171
}
168
172
};
169
173
170
- SummaryDiff register_mapping (position A, position B, StateType state, const RegionData& metadata);
174
+ private:
175
+ SummaryDiff register_mapping (position A, position B, StateType state, const RegionData& metadata, bool use_tag_inplace = false );
171
176
177
+ public:
172
178
SummaryDiff reserve_mapping (position from, position sz, const RegionData& metadata) {
173
- return register_mapping (from, from + sz, StateType::Reserved, metadata);
179
+ return register_mapping (from, from + sz, StateType::Reserved, metadata, false );
180
+ }
181
+
182
+ SummaryDiff commit_mapping (position from, position sz, const RegionData& metadata, bool use_tag_inplace = false ) {
183
+ return register_mapping (from, from + sz, StateType::Committed, metadata, use_tag_inplace);
174
184
}
175
185
176
- SummaryDiff commit_mapping (position from, position sz, const RegionData& metadata) {
177
- return register_mapping (from, from + sz, StateType::Committed , metadata);
186
+ SummaryDiff uncommit_mapping (position from, position sz, const RegionData& metadata) {
187
+ return register_mapping (from, from + sz, StateType::Reserved , metadata, true );
178
188
}
179
189
180
190
SummaryDiff release_mapping (position from, position sz) {
0 commit comments