@@ -94,18 +94,32 @@ class ChunkHeader {
94
94
u8 rz_log : 3 ;
95
95
u8 lsan_tag : 2 ;
96
96
97
- // This field is used for small sizes. For large sizes it is equal to
98
- // SizeClassMap::kMaxSize and the actual size is stored in the
99
- // SecondaryAllocator's metadata.
100
- u32 user_requested_size : 29 ;
101
97
// align < 8 -> 0
102
98
// else -> log2(min(align, 512)) - 2
103
- u32 user_requested_alignment_log : 3 ;
99
+ u16 user_requested_alignment_log : 3 ;
104
100
105
101
private:
102
+ u16 user_requested_size_hi : 13 ;
103
+ u32 user_requested_size_lo;
106
104
atomic_uint64_t alloc_context_id;
107
105
108
106
public:
107
+ uptr UsedSize () const {
108
+ uptr R = user_requested_size_lo;
109
+ if (sizeof (uptr) > sizeof (user_requested_size_lo))
110
+ R += (uptr)user_requested_size_hi << (8 * sizeof (user_requested_size_lo));
111
+ return R;
112
+ }
113
+
114
+ void SetUsedSize (uptr size) {
115
+ user_requested_size_lo = size;
116
+ if (sizeof (uptr) > sizeof (user_requested_size_lo)) {
117
+ size >>= (8 * sizeof (user_requested_size_lo));
118
+ user_requested_size_hi = size;
119
+ CHECK_EQ (user_requested_size_hi, size);
120
+ }
121
+ }
122
+
109
123
void SetAllocContext (u32 tid, u32 stack) {
110
124
AtomicContextStore (&alloc_context_id, tid, stack);
111
125
}
@@ -147,19 +161,10 @@ enum {
147
161
class AsanChunk : public ChunkBase {
148
162
public:
149
163
uptr Beg () { return reinterpret_cast <uptr>(this ) + kChunkHeaderSize ; }
150
- uptr UsedSize (bool locked_version = false ) {
151
- if (user_requested_size != SizeClassMap::kMaxSize )
152
- return user_requested_size;
153
- return *reinterpret_cast <uptr *>(
154
- get_allocator ().GetMetaData (AllocBeg (locked_version)));
155
- }
156
- void *AllocBeg (bool locked_version = false ) {
157
- if (from_memalign) {
158
- if (locked_version)
159
- return get_allocator ().GetBlockBeginFastLocked (
160
- reinterpret_cast <void *>(this ));
164
+
165
+ void *AllocBeg () {
166
+ if (from_memalign)
161
167
return get_allocator ().GetBlockBegin (reinterpret_cast <void *>(this ));
162
- }
163
168
return reinterpret_cast <void *>(Beg () - RZLog2Size (rz_log));
164
169
}
165
170
};
@@ -337,7 +342,7 @@ struct Allocator {
337
342
if (ac && atomic_load (&ac->chunk_state , memory_order_acquire) ==
338
343
CHUNK_ALLOCATED) {
339
344
uptr beg = ac->Beg ();
340
- uptr end = ac->Beg () + ac->UsedSize (true );
345
+ uptr end = ac->Beg () + ac->UsedSize ();
341
346
uptr chunk_end = chunk + allocated_size;
342
347
if (chunk < beg && beg < end && end <= chunk_end) {
343
348
// Looks like a valid AsanChunk in use, poison redzones only.
@@ -552,15 +557,13 @@ struct Allocator {
552
557
reinterpret_cast <uptr *>(alloc_beg)[0 ] = kAllocBegMagic ;
553
558
reinterpret_cast <uptr *>(alloc_beg)[1 ] = chunk_beg;
554
559
}
560
+ CHECK (size);
561
+ m->SetUsedSize (size);
555
562
if (using_primary_allocator) {
556
- CHECK (size);
557
- m->user_requested_size = size;
558
563
CHECK (allocator.FromPrimary (allocated));
559
564
} else {
560
565
CHECK (!allocator.FromPrimary (allocated));
561
- m->user_requested_size = SizeClassMap::kMaxSize ;
562
566
uptr *meta = reinterpret_cast <uptr *>(allocator.GetMetaData (allocated));
563
- meta[0 ] = size;
564
567
meta[1 ] = chunk_beg;
565
568
}
566
569
m->user_requested_alignment_log = user_requested_alignment_log;
@@ -1151,7 +1154,7 @@ void LsanMetadata::set_tag(ChunkTag value) {
1151
1154
1152
1155
uptr LsanMetadata::requested_size () const {
1153
1156
__asan::AsanChunk *m = reinterpret_cast <__asan::AsanChunk *>(metadata_);
1154
- return m->UsedSize (/* locked_version= */ true );
1157
+ return m->UsedSize ();
1155
1158
}
1156
1159
1157
1160
u32 LsanMetadata::stack_trace_id () const {
0 commit comments