diff --git a/llvm/include/llvm/MC/MCFragment.h b/llvm/include/llvm/MC/MCFragment.h index 2f62bdb462f837a..555730828b46252 100644 --- a/llvm/include/llvm/MC/MCFragment.h +++ b/llvm/include/llvm/MC/MCFragment.h @@ -60,9 +60,6 @@ class MCFragment { /// The data for the section this fragment is in. MCSection *Parent; - /// The atom this fragment is in, as represented by its defining symbol. - const MCSymbol *Atom = nullptr; - /// The offset of this fragment in its section. uint64_t Offset = 0; @@ -96,8 +93,7 @@ class MCFragment { MCSection *getParent() const { return Parent; } void setParent(MCSection *Value) { Parent = Value; } - const MCSymbol *getAtom() const { return Atom; } - void setAtom(const MCSymbol *Value) { Atom = Value; } + const MCSymbol *getAtom() const; unsigned getLayoutOrder() const { return LayoutOrder; } void setLayoutOrder(unsigned Value) { LayoutOrder = Value; } diff --git a/llvm/include/llvm/MC/MCSectionMachO.h b/llvm/include/llvm/MC/MCSectionMachO.h index fdf1773d400253b..e268562786b2fbb 100644 --- a/llvm/include/llvm/MC/MCSectionMachO.h +++ b/llvm/include/llvm/MC/MCSectionMachO.h @@ -32,6 +32,9 @@ class MCSectionMachO final : public MCSection { /// for example. unsigned Reserved2; + // The defining non-temporary symbol for each fragment. + SmallVector Atoms; + MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA, unsigned reserved2, SectionKind K, MCSymbol *Begin); friend class MCContext; @@ -74,6 +77,10 @@ class MCSectionMachO final : public MCSection { bool useCodeAlign() const override; bool isVirtualSection() const override; + void allocAtoms(); + const MCSymbol *getAtom(size_t I) const; + void setAtom(size_t I, const MCSymbol *Sym); + static bool classof(const MCSection *S) { return S->getVariant() == SV_MachO; } diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp index ffd3a503e733b51..0d8d639b0f8aff0 100644 --- a/llvm/lib/MC/MCFragment.cpp +++ b/llvm/lib/MC/MCFragment.cpp @@ -17,6 +17,7 @@ #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCFixup.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionMachO.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCValue.h" #include "llvm/Support/Casting.h" @@ -264,6 +265,10 @@ void MCFragment::destroy() { } } +const MCSymbol *MCFragment::getAtom() const { + return cast(Parent)->getAtom(LayoutOrder); +} + // Debugging methods namespace llvm { diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index 10f9988b9d16a0b..466aa633f008719 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -519,11 +519,13 @@ void MCMachOStreamer::finishImpl() { // Set the fragment atom associations by tracking the last seen atom defining // symbol. for (MCSection &Sec : getAssembler()) { + cast(Sec).allocAtoms(); const MCSymbol *CurrentAtom = nullptr; + size_t I = 0; for (MCFragment &Frag : Sec) { if (const MCSymbol *Symbol = DefiningSymbolMap.lookup(&Frag)) CurrentAtom = Symbol; - Frag.setAtom(CurrentAtom); + cast(Sec).setAtom(I++, CurrentAtom); } } diff --git a/llvm/lib/MC/MCSectionMachO.cpp b/llvm/lib/MC/MCSectionMachO.cpp index f7eedac3f2d1ad2..53b76663084e8e4 100644 --- a/llvm/lib/MC/MCSectionMachO.cpp +++ b/llvm/lib/MC/MCSectionMachO.cpp @@ -291,3 +291,15 @@ Error MCSectionMachO::ParseSectionSpecifier(StringRef Spec, // In. return Error::success(); } + +void MCSectionMachO::allocAtoms() { + auto *L = curFragList(); + if (L->Tail) + Atoms.resize(L->Tail->getLayoutOrder() + 1); +} + +const MCSymbol *MCSectionMachO::getAtom(size_t I) const { + return I < Atoms.size() ? Atoms[I] : nullptr; +} + +void MCSectionMachO::setAtom(size_t I, const MCSymbol *Sym) { Atoms[I] = Sym; }