@@ -46,83 +46,27 @@ MCAssembler *MCObjectStreamer::getAssemblerPtr() {
4646 return nullptr ;
4747}
4848
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-
6549void 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>());
8551}
8652
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 &&
8955 " 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);
10556 addFragment (F);
57+ newFragment ();
10658}
10759
10860void 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);
11462}
11563
11664void 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);
12266}
12367
12468void MCObjectStreamer::addFixup (const MCExpr *Value, MCFixupKind Kind) {
125- CurFrag->addFixup (MCFixup::create (getCurFragSize (), Value, Kind));
69+ CurFrag->addFixup (MCFixup::create (CurFrag-> getFixedSize (), Value, Kind));
12670}
12771
12872// As a compile-time optimization, avoid allocating and evaluating an MCExpr
@@ -171,8 +115,6 @@ void MCObjectStreamer::reset() {
171115 }
172116 EmitEHFrame = true ;
173117 EmitDebugFrame = false ;
174- FragStorage.clear ();
175- FragSpace = 0 ;
176118 MCStreamer::reset ();
177119}
178120
@@ -201,6 +143,7 @@ void MCObjectStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {
201143void MCObjectStreamer::emitValueImpl (const MCExpr *Value, unsigned Size,
202144 SMLoc Loc) {
203145 MCStreamer::emitValueImpl (Value, Size, Loc);
146+ MCFragment *DF = getCurrentFragment ();
204147
205148 MCDwarfLineEntry::make (this , getCurrentSectionOnly ());
206149
@@ -215,9 +158,9 @@ void MCObjectStreamer::emitValueImpl(const MCExpr *Value, unsigned Size,
215158 emitIntValue (AbsValue, Size);
216159 return ;
217160 }
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 );
221164}
222165
223166MCSymbol *MCObjectStreamer::emitCFILabel () {
@@ -251,7 +194,7 @@ void MCObjectStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
251194 // section.
252195 MCFragment *F = CurFrag;
253196 Symbol->setFragment (F);
254- Symbol->setOffset (F->getFixedSize ());
197+ Symbol->setOffset (F->getContents (). size ());
255198
256199 emitPendingAssignments (Symbol);
257200}
@@ -317,38 +260,20 @@ void MCObjectStreamer::changeSection(MCSection *Section, uint32_t Subsection) {
317260 F0 = CurFrag;
318261 }
319262
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-
335263 auto &Subsections = Section->Subsections ;
336264 size_t I = 0 , E = Subsections.size ();
337265 while (I != E && Subsections[I].first < Subsection)
338266 ++I;
339267 // If the subsection number is not in the sorted Subsections list, create a
340268 // new fragment list.
341269 if (I == E || Subsections[I].first != Subsection) {
270+ auto *F = getContext ().allocFragment <MCFragment>();
271+ F->setParent (Section);
342272 Subsections.insert (Subsections.begin () + I,
343273 {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);
351274 }
275+ Section->CurFragList = &Subsections[I].second ;
276+ CurFrag = Section->CurFragList ->Tail ;
352277
353278 // Define the section symbol at subsection 0's initial fragment if required.
354279 if (!NewSec)
@@ -419,15 +344,11 @@ void MCObjectStreamer::emitInstToData(const MCInst &Inst,
419344 MCFragment *F = getCurrentFragment ();
420345
421346 // Append the instruction to the data fragment.
422- size_t CodeOffset = getCurFragSize ();
423- SmallString<16 > Content;
347+ size_t CodeOffset = F->getContents ().size ();
424348 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 ();
431352 F->setHasInstructions (STI);
432353
433354 if (Fixups.empty ())
0 commit comments