Revert "[MC] Factor MCObjectStreamer::addFragmentAtoms out of MachO streamer."

This reverts rL331412.  We didn't up using fragment atoms
in the wasm object writer after all.

Differential Revision: https://reviews.llvm.org/D48173

llvm-svn: 334734
This commit is contained in:
Sam Clegg 2018-06-14 17:11:19 +00:00
parent e2f3e10913
commit c0dba0af01
4 changed files with 24 additions and 32 deletions

View File

@ -87,8 +87,6 @@ protected:
/// will be used as a symbol offset within the fragment. /// will be used as a symbol offset within the fragment.
void flushPendingLabels(MCFragment *F, uint64_t FOffset = 0); void flushPendingLabels(MCFragment *F, uint64_t FOffset = 0);
void addFragmentAtoms();
public: public:
void visitUsedSymbol(const MCSymbol &Sym) override; void visitUsedSymbol(const MCSymbol &Sym) override;

View File

@ -459,7 +459,30 @@ void MCMachOStreamer::FinishImpl() {
// We have to set the fragment atom associations so we can relax properly for // We have to set the fragment atom associations so we can relax properly for
// Mach-O. // Mach-O.
addFragmentAtoms();
// First, scan the symbol table to build a lookup table from fragments to
// defining symbols.
DenseMap<const MCFragment *, const MCSymbol *> DefiningSymbolMap;
for (const MCSymbol &Symbol : getAssembler().symbols()) {
if (getAssembler().isSymbolLinkerVisible(Symbol) && Symbol.isInSection() &&
!Symbol.isVariable()) {
// An atom defining symbol should never be internal to a fragment.
assert(Symbol.getOffset() == 0 &&
"Invalid offset in atom defining symbol!");
DefiningSymbolMap[Symbol.getFragment()] = &Symbol;
}
}
// Set the fragment atom associations by tracking the last seen atom defining
// symbol.
for (MCSection &Sec : getAssembler()) {
const MCSymbol *CurrentAtom = nullptr;
for (MCFragment &Frag : Sec) {
if (const MCSymbol *Symbol = DefiningSymbolMap.lookup(&Frag))
CurrentAtom = Symbol;
Frag.setAtom(CurrentAtom);
}
}
this->MCObjectStreamer::FinishImpl(); this->MCObjectStreamer::FinishImpl();
} }

View File

@ -59,32 +59,6 @@ void MCObjectStreamer::flushPendingLabels(MCFragment *F, uint64_t FOffset) {
PendingLabels.clear(); PendingLabels.clear();
} }
void MCObjectStreamer::addFragmentAtoms() {
// First, scan the symbol table to build a lookup table from fragments to
// defining symbols.
DenseMap<const MCFragment *, const MCSymbol *> DefiningSymbolMap;
for (const MCSymbol &Symbol : getAssembler().symbols()) {
if (getAssembler().isSymbolLinkerVisible(Symbol) && Symbol.isInSection() &&
!Symbol.isVariable()) {
// An atom defining symbol should never be internal to a fragment.
assert(Symbol.getOffset() == 0 &&
"Invalid offset in atom defining symbol!");
DefiningSymbolMap[Symbol.getFragment()] = &Symbol;
}
}
// Set the fragment atom associations by tracking the last seen atom defining
// symbol.
for (MCSection &Sec : getAssembler()) {
const MCSymbol *CurrentAtom = nullptr;
for (MCFragment &Frag : Sec) {
if (const MCSymbol *Symbol = DefiningSymbolMap.lookup(&Frag))
CurrentAtom = Symbol;
Frag.setAtom(CurrentAtom);
}
}
}
// As a compile-time optimization, avoid allocating and evaluating an MCExpr // As a compile-time optimization, avoid allocating and evaluating an MCExpr
// tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment. // tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment.
static Optional<uint64_t> absoluteSymbolDiff(const MCSymbol *Hi, static Optional<uint64_t> absoluteSymbolDiff(const MCSymbol *Hi,

View File

@ -191,9 +191,6 @@ void MCWasmStreamer::EmitInstToData(const MCInst &Inst,
void MCWasmStreamer::FinishImpl() { void MCWasmStreamer::FinishImpl() {
EmitFrames(nullptr); EmitFrames(nullptr);
// Set fragment atoms so we can map from code fragment to defining symbol
addFragmentAtoms();
this->MCObjectStreamer::FinishImpl(); this->MCObjectStreamer::FinishImpl();
} }