aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCObjectStreamer.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2024-06-27 19:12:35 -0700
committerFangrui Song <i@maskray.me>2024-06-27 19:12:35 -0700
commit7423bf78eb53d81ce0c7b3a38e39a56341ca2a89 (patch)
tree1acd27dcfa21b6e190a232c463c1baca0572cc94 /llvm/lib/MC/MCObjectStreamer.cpp
parent2dff96d37a8419dab7a6ec3e1f8de917c7adb4ea (diff)
downloadllvm-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.cpp18
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) {