Skip to content

[MC] Move MCFragment::Atom to MCSectionMachO::Atoms #95341

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions llvm/include/llvm/MC/MCFragment.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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; }
Expand Down
7 changes: 7 additions & 0 deletions llvm/include/llvm/MC/MCSectionMachO.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ class MCSectionMachO final : public MCSection {
/// for example.
unsigned Reserved2;

// The defining non-temporary symbol for each fragment.
SmallVector<const MCSymbol *, 0> Atoms;

MCSectionMachO(StringRef Segment, StringRef Section, unsigned TAA,
unsigned reserved2, SectionKind K, MCSymbol *Begin);
friend class MCContext;
Expand Down Expand Up @@ -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;
}
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/MC/MCFragment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -264,6 +265,10 @@ void MCFragment::destroy() {
}
}

const MCSymbol *MCFragment::getAtom() const {
return cast<MCSectionMachO>(Parent)->getAtom(LayoutOrder);
}

// Debugging methods

namespace llvm {
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/MC/MCMachOStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<MCSectionMachO>(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<MCSectionMachO>(Sec).setAtom(I++, CurrentAtom);
}
}

Expand Down
12 changes: 12 additions & 0 deletions llvm/lib/MC/MCSectionMachO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Loading