diff options
author | Fangrui Song <i@maskray.me> | 2024-06-27 19:12:35 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2024-06-27 19:12:35 -0700 |
commit | 7423bf78eb53d81ce0c7b3a38e39a56341ca2a89 (patch) | |
tree | 1acd27dcfa21b6e190a232c463c1baca0572cc94 /llvm/lib/MC/MCObjectStreamer.cpp | |
parent | 2dff96d37a8419dab7a6ec3e1f8de917c7adb4ea (diff) | |
download | llvm-7423bf78eb53d81ce0c7b3a38e39a56341ca2a89.zip llvm-7423bf78eb53d81ce0c7b3a38e39a56341ca2a89.tar.gz llvm-7423bf78eb53d81ce0c7b3a38e39a56341ca2a89.tar.bz2 |
[MC] Ensure subsections have a MCDataFragment
Similar to 21fac2d1d060b0f9b11a746718e58d4cd1ee97e5 for sections. This
makes it feasible to cache the current fragment in MCStreamer.
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index fec1cce..2357203 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -294,9 +294,21 @@ bool MCObjectStreamer::changeSectionImpl(MCSection *Section, assert(Section && "Cannot switch to a null section!"); getContext().clearDwarfLocSeen(); - bool Created = getAssembler().registerSection(*Section); - Section->switchSubsection(Subsection); - return Created; + auto &Subsections = Section->Subsections; + size_t I = 0, E = Subsections.size(); + while (I != E && Subsections[I].first < Subsection) + ++I; + // If the subsection number is not in the sorted Subsections list, create a + // new fragment list. + if (I == E || Subsections[I].first != Subsection) { + auto *F = getContext().allocFragment<MCDataFragment>(); + F->setParent(Section); + Subsections.insert(Subsections.begin() + I, + {Subsection, MCSection::FragList{F, F}}); + } + Section->CurFragList = &Subsections[I].second; + + return getAssembler().registerSection(*Section); } void MCObjectStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) { |