@@ -46,83 +46,27 @@ MCAssembler *MCObjectStreamer::getAssemblerPtr() {
46
46
return nullptr ;
47
47
}
48
48
49
- constexpr size_t FragBlockSize = 16384 ;
50
- // Ensure the new fragment can at least store a few bytes.
51
- constexpr size_t NewFragHeadroom = 8 ;
52
-
53
- static_assert (NewFragHeadroom >= alignof (MCFragment));
54
- static_assert (FragBlockSize >= sizeof (MCFragment) + NewFragHeadroom);
55
-
56
- MCFragment *MCObjectStreamer::allocFragSpace (size_t Headroom) {
57
- auto Size = std::max (FragBlockSize, sizeof (MCFragment) + Headroom);
58
- FragSpace = Size - sizeof (MCFragment);
59
- auto Chunk = std::unique_ptr<char []>(new char [Size]);
60
- auto *F = reinterpret_cast <MCFragment *>(Chunk.get ());
61
- FragStorage.push_back (std::move (Chunk));
62
- return F;
63
- }
64
-
65
49
void MCObjectStreamer::newFragment () {
66
- MCFragment *F;
67
- if (LLVM_LIKELY (sizeof (MCFragment) + NewFragHeadroom <= FragSpace)) {
68
- auto End = reinterpret_cast <size_t >(getCurFragEnd ());
69
- F = reinterpret_cast <MCFragment *>(
70
- alignToPowerOf2 (End, alignof (MCFragment)));
71
- FragSpace -= size_t (F) - End + sizeof (MCFragment);
72
- } else {
73
- F = allocFragSpace (0 );
74
- }
75
- new (F) MCFragment ();
76
- addFragment (F);
77
- }
78
-
79
- void MCObjectStreamer::ensureHeadroom (size_t Headroom) {
80
- if (Headroom <= FragSpace)
81
- return ;
82
- auto *F = allocFragSpace (Headroom);
83
- new (F) MCFragment ();
84
- addFragment (F);
50
+ addFragment (getContext ().allocFragment <MCFragment>());
85
51
}
86
52
87
- void MCObjectStreamer::insert (MCFragment *Frag ) {
88
- assert (Frag ->getKind () != MCFragment::FT_Data &&
53
+ void MCObjectStreamer::insert (MCFragment *F ) {
54
+ assert (F ->getKind () != MCFragment::FT_Data &&
89
55
" F should have a variable-size tail" );
90
- // Frag is not connected to FragSpace. Before modifying CurFrag with
91
- // addFragment(Frag), allocate an empty fragment to maintain FragSpace
92
- // connectivity, potentially reusing CurFrag's associated space.
93
- MCFragment *F;
94
- if (LLVM_LIKELY (sizeof (MCFragment) + NewFragHeadroom <= FragSpace)) {
95
- auto End = reinterpret_cast <size_t >(getCurFragEnd ());
96
- F = reinterpret_cast <MCFragment *>(
97
- alignToPowerOf2 (End, alignof (MCFragment)));
98
- FragSpace -= size_t (F) - End + sizeof (MCFragment);
99
- } else {
100
- F = allocFragSpace (0 );
101
- }
102
- new (F) MCFragment ();
103
-
104
- addFragment (Frag);
105
56
addFragment (F);
57
+ newFragment ();
106
58
}
107
59
108
60
void MCObjectStreamer::appendContents (ArrayRef<char > Contents) {
109
- ensureHeadroom (Contents.size ());
110
- assert (FragSpace >= Contents.size ());
111
- llvm::copy (Contents, getCurFragEnd ());
112
- CurFrag->FixedSize += Contents.size ();
113
- FragSpace -= Contents.size ();
61
+ CurFrag->appendContents (Contents);
114
62
}
115
63
116
64
void MCObjectStreamer::appendContents (size_t Num, char Elt) {
117
- ensureHeadroom (Num);
118
- MutableArrayRef<char > Data (getCurFragEnd (), Num);
119
- llvm::fill (Data, Elt);
120
- CurFrag->FixedSize += Num;
121
- FragSpace -= Num;
65
+ CurFrag->appendContents (Num, Elt);
122
66
}
123
67
124
68
void MCObjectStreamer::addFixup (const MCExpr *Value, MCFixupKind Kind) {
125
- CurFrag->addFixup (MCFixup::create (getCurFragSize (), Value, Kind));
69
+ CurFrag->addFixup (MCFixup::create (CurFrag-> getFixedSize (), Value, Kind));
126
70
}
127
71
128
72
// As a compile-time optimization, avoid allocating and evaluating an MCExpr
@@ -171,8 +115,6 @@ void MCObjectStreamer::reset() {
171
115
}
172
116
EmitEHFrame = true ;
173
117
EmitDebugFrame = false ;
174
- FragStorage.clear ();
175
- FragSpace = 0 ;
176
118
MCStreamer::reset ();
177
119
}
178
120
@@ -201,6 +143,7 @@ void MCObjectStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {
201
143
void MCObjectStreamer::emitValueImpl (const MCExpr *Value, unsigned Size,
202
144
SMLoc Loc) {
203
145
MCStreamer::emitValueImpl (Value, Size, Loc);
146
+ MCFragment *DF = getCurrentFragment ();
204
147
205
148
MCDwarfLineEntry::make (this , getCurrentSectionOnly ());
206
149
@@ -215,9 +158,9 @@ void MCObjectStreamer::emitValueImpl(const MCExpr *Value, unsigned Size,
215
158
emitIntValue (AbsValue, Size);
216
159
return ;
217
160
}
218
- ensureHeadroom (Size);
219
- addFixup (Value, MCFixup::getDataKindForSize (Size));
220
- appendContents (Size, 0 );
161
+ DF-> addFixup ( MCFixup::create (DF-> getContents (). size (), Value,
162
+ MCFixup::getDataKindForSize (Size) ));
163
+ DF-> appendContents (Size, 0 );
221
164
}
222
165
223
166
MCSymbol *MCObjectStreamer::emitCFILabel () {
@@ -251,7 +194,7 @@ void MCObjectStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
251
194
// section.
252
195
MCFragment *F = CurFrag;
253
196
Symbol->setFragment (F);
254
- Symbol->setOffset (F->getFixedSize ());
197
+ Symbol->setOffset (F->getContents (). size ());
255
198
256
199
emitPendingAssignments (Symbol);
257
200
}
@@ -317,38 +260,20 @@ void MCObjectStreamer::changeSection(MCSection *Section, uint32_t Subsection) {
317
260
F0 = CurFrag;
318
261
}
319
262
320
- // To maintain connectivity between CurFrag and FragSpace when CurFrag is
321
- // modified, allocate an empty fragment and append it to the fragment list.
322
- // (Subsections[I].second.Tail is not connected to FragSpace.)
323
- MCFragment *F;
324
- if (LLVM_LIKELY (sizeof (MCFragment) + NewFragHeadroom <= FragSpace)) {
325
- auto End = reinterpret_cast <size_t >(getCurFragEnd ());
326
- F = reinterpret_cast <MCFragment *>(
327
- alignToPowerOf2 (End, alignof (MCFragment)));
328
- FragSpace -= size_t (F) - End + sizeof (MCFragment);
329
- } else {
330
- F = allocFragSpace (0 );
331
- }
332
- new (F) MCFragment ();
333
- F->setParent (Section);
334
-
335
263
auto &Subsections = Section->Subsections ;
336
264
size_t I = 0 , E = Subsections.size ();
337
265
while (I != E && Subsections[I].first < Subsection)
338
266
++I;
339
267
// If the subsection number is not in the sorted Subsections list, create a
340
268
// new fragment list.
341
269
if (I == E || Subsections[I].first != Subsection) {
270
+ auto *F = getContext ().allocFragment <MCFragment>();
271
+ F->setParent (Section);
342
272
Subsections.insert (Subsections.begin () + I,
343
273
{Subsection, MCSection::FragList{F, F}});
344
- Section->CurFragList = &Subsections[I].second ;
345
- CurFrag = F;
346
- } else {
347
- Section->CurFragList = &Subsections[I].second ;
348
- CurFrag = Subsections[I].second .Tail ;
349
- // Ensure CurFrag is associated with FragSpace.
350
- addFragment (F);
351
274
}
275
+ Section->CurFragList = &Subsections[I].second ;
276
+ CurFrag = Section->CurFragList ->Tail ;
352
277
353
278
// Define the section symbol at subsection 0's initial fragment if required.
354
279
if (!NewSec)
@@ -419,15 +344,11 @@ void MCObjectStreamer::emitInstToData(const MCInst &Inst,
419
344
MCFragment *F = getCurrentFragment ();
420
345
421
346
// Append the instruction to the data fragment.
422
- size_t CodeOffset = getCurFragSize ();
423
- SmallString<16 > Content;
347
+ size_t CodeOffset = F->getContents ().size ();
424
348
SmallVector<MCFixup, 1 > Fixups;
425
- getAssembler ().getEmitter ().encodeInstruction (Inst, Content, Fixups, STI);
426
- appendContents (Content);
427
- if (CurFrag != F) {
428
- F = CurFrag;
429
- CodeOffset = 0 ;
430
- }
349
+ getAssembler ().getEmitter ().encodeInstruction (
350
+ Inst, F->getContentsForAppending (), Fixups, STI);
351
+ F->doneAppending ();
431
352
F->setHasInstructions (STI);
432
353
433
354
if (Fixups.empty ())
0 commit comments