@@ -73,18 +73,18 @@ static void swapBytes(std::byte *M, size_t N) {
73
73
// / All offsets are in bits.
74
74
struct BitTracker {
75
75
llvm::BitVector Initialized;
76
- llvm::BitVector Data_ ;
76
+ llvm::BitVector Data ;
77
77
78
78
BitTracker () = default ;
79
79
80
80
size_t size () const {
81
- assert (Initialized.size () == Data_ .size ());
81
+ assert (Initialized.size () == Data .size ());
82
82
return Initialized.size ();
83
83
}
84
84
85
85
const std::byte *getBytes (size_t BitOffset, int a) {
86
86
assert (BitOffset % 8 == 0 );
87
- return reinterpret_cast <const std::byte *>(Data_ .getData ().data ()) +
87
+ return reinterpret_cast <const std::byte *>(Data .getData ().data ()) +
88
88
(BitOffset / 8 );
89
89
}
90
90
@@ -95,19 +95,22 @@ struct BitTracker {
95
95
bool allInitialized () const { return Initialized.all (); }
96
96
97
97
void pushData (const std::byte *data, size_t BitOffset, size_t BitWidth) {
98
- assert (BitOffset >= Data_.size ());
98
+ assert (BitOffset >= Data.size ());
99
+ Data.reserve (BitOffset + BitWidth);
100
+ Initialized.reserve (BitOffset + BitWidth);
101
+
99
102
// First, fill up the bit vector until BitOffset. The bits are all 0
100
103
// but we record them as indeterminate.
101
104
{
102
- Data_ .resize (BitOffset, false );
105
+ Data .resize (BitOffset, false );
103
106
Initialized.resize (BitOffset, false );
104
107
}
105
108
106
109
size_t BitsHandled = 0 ;
107
110
// Read all full bytes first
108
111
for (size_t I = 0 ; I != BitWidth / 8 ; ++I) {
109
112
for (unsigned X = 0 ; X != 8 ; ++X) {
110
- Data_ .push_back ((data[I] & std::byte (1 << X)) != std::byte{0 });
113
+ Data .push_back ((data[I] & std::byte (1 << X)) != std::byte{0 });
111
114
Initialized.push_back (true );
112
115
++BitsHandled;
113
116
}
@@ -116,21 +119,21 @@ struct BitTracker {
116
119
// Rest of the bits.
117
120
assert ((BitWidth - BitsHandled) < 8 );
118
121
for (size_t I = 0 , E = (BitWidth - BitsHandled); I != E; ++I) {
119
- Data_ .push_back ((data[BitWidth / 8 ] & std::byte (1 << I)) != std::byte{0 });
122
+ Data .push_back ((data[BitWidth / 8 ] & std::byte (1 << I)) != std::byte{0 });
120
123
Initialized.push_back (true );
121
124
++BitsHandled;
122
125
}
123
126
}
124
127
125
128
void pushZeroes (size_t Amount) {
126
- size_t N = Data_ .size ();
127
- Data_ .resize (N + Amount, false );
129
+ size_t N = Data .size ();
130
+ Data .resize (N + Amount, false );
128
131
Initialized.resize (N + Amount, true );
129
132
}
130
133
131
134
void markUninitializedUntil (size_t Offset) {
132
- assert (Offset >= Data_ .size ());
133
- Data_ .resize (Offset, false );
135
+ assert (Offset >= Data .size ());
136
+ Data .resize (Offset, false );
134
137
Initialized.resize (Offset, false );
135
138
}
136
139
};
@@ -185,7 +188,6 @@ static bool enumerateData(const Pointer &P, const Context &Ctx, size_t Offset,
185
188
size_t BitOffset = Offset + Ctx.getASTContext ().toBits (ByteOffset);
186
189
Ok = Ok && enumerateData (Elem, Ctx, BitOffset, F);
187
190
}
188
- // TODO: Virtual bases?
189
191
190
192
for (unsigned I = 0 ; I != R->getNumFields (); ++I) {
191
193
const Record::Field *Fi = R->getField (I);
@@ -344,11 +346,11 @@ bool DoBitCast(InterpState &S, CodePtr OpPC, const Pointer &P, std::byte *Buff,
344
346
assert (Bits.size () == BuffSize * 8 );
345
347
346
348
HasIndeterminateBits = !Bits.allInitialized ();
347
- std::memcpy (Buff, Bits.Data_ .getData ().data (), BuffSize);
349
+ std::memcpy (Buff, Bits.Data .getData ().data (), BuffSize);
348
350
349
351
if (BigEndian)
350
352
swapBytes (Buff, BuffSize);
351
- return Success; // && !HasIndeterminateBits;
353
+ return Success;
352
354
}
353
355
354
356
// / Bitcast from a Pointer to a Pointer.
0 commit comments