MC/Assembler: Strip out object writer arguments, now that it is always available

-- and remove FIXME asking for the same!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122032 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar
2010-12-17 02:45:59 +00:00
parent feb7ba3d9a
commit 5d2477cecf
5 changed files with 51 additions and 73 deletions

View File

@@ -694,44 +694,37 @@ private:
/// \return Whether the fixup value was fully resolved. This is true if the
/// \arg Value result is fixed, otherwise the value may change due to
/// relocation.
bool EvaluateFixup(const MCObjectWriter &Writer, const MCAsmLayout &Layout,
bool EvaluateFixup(const MCAsmLayout &Layout,
const MCFixup &Fixup, const MCFragment *DF,
MCValue &Target, uint64_t &Value) const;
/// Check whether a fixup can be satisfied, or whether it needs to be relaxed
/// (increased in size, in order to hold its value correctly).
bool FixupNeedsRelaxation(const MCObjectWriter &Writer,
const MCFixup &Fixup, const MCFragment *DF,
bool FixupNeedsRelaxation(const MCFixup &Fixup, const MCFragment *DF,
const MCAsmLayout &Layout) const;
/// Check whether the given fragment needs relaxation.
bool FragmentNeedsRelaxation(const MCObjectWriter &Writer,
const MCInstFragment *IF,
bool FragmentNeedsRelaxation(const MCInstFragment *IF,
const MCAsmLayout &Layout) const;
/// LayoutOnce - Perform one layout iteration and return true if any offsets
/// were adjusted.
bool LayoutOnce(const MCObjectWriter &Writer, MCAsmLayout &Layout);
bool LayoutOnce(MCAsmLayout &Layout);
bool RelaxInstruction(const MCObjectWriter &Writer, MCAsmLayout &Layout,
MCInstFragment &IF);
bool RelaxInstruction(MCAsmLayout &Layout, MCInstFragment &IF);
bool RelaxOrg(const MCObjectWriter &Writer, MCAsmLayout &Layout,
MCOrgFragment &OF);
bool RelaxOrg(MCAsmLayout &Layout, MCOrgFragment &OF);
bool RelaxLEB(const MCObjectWriter &Writer, MCAsmLayout &Layout,
MCLEBFragment &IF);
bool RelaxLEB(MCAsmLayout &Layout, MCLEBFragment &IF);
bool RelaxDwarfLineAddr(const MCObjectWriter &Writer, MCAsmLayout &Layout,
MCDwarfLineAddrFragment &DF);
bool RelaxDwarfLineAddr(MCAsmLayout &Layout, MCDwarfLineAddrFragment &DF);
bool RelaxAlignment(const MCObjectWriter &Writer, MCAsmLayout &Layout,
MCAlignFragment &DF);
bool RelaxAlignment(MCAsmLayout &Layout, MCAlignFragment &DF);
/// FinishLayout - Finalize a layout, including fragment lowering.
void FinishLayout(MCAsmLayout &Layout);
uint64_t HandleFixup(MCObjectWriter &Writer, const MCAsmLayout &Layout,
uint64_t HandleFixup(const MCAsmLayout &Layout,
MCFragment &F, const MCFixup &Fixup);
public:
@@ -750,10 +743,8 @@ public:
bool isSymbolLinkerVisible(const MCSymbol &SD) const;
/// Emit the section contents using the given object writer.
//
// FIXME: Should MCAssembler always have a reference to the object writer?
void WriteSectionData(const MCSectionData *Section, const MCAsmLayout &Layout,
MCObjectWriter *OW) const;
void WriteSectionData(const MCSectionData *Section,
const MCAsmLayout &Layout) const;
/// Check whether a given symbol has been flagged with .thumb_func.
bool isThumbFunc(const MCSymbol *Func) const {

View File

@@ -1455,7 +1455,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
if (IsELFMetaDataSection(SD))
WriteDataSectionData(this, SD);
else
Asm.WriteSectionData(&SD, Layout, this);
Asm.WriteSectionData(&SD, Layout);
}
uint64_t Padding = OffsetToAlignment(FileOff, NaturalAlignment);

View File

@@ -210,8 +210,7 @@ const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
return SD->getFragment()->getAtom();
}
bool MCAssembler::EvaluateFixup(const MCObjectWriter &Writer,
const MCAsmLayout &Layout,
bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
const MCFixup &Fixup, const MCFragment *DF,
MCValue &Target, uint64_t &Value) const {
++stats::EvaluateFixup;
@@ -247,7 +246,7 @@ bool MCAssembler::EvaluateFixup(const MCObjectWriter &Writer,
}
if (IsResolved)
IsResolved = Writer.IsFixupFullyResolved(*this, Target, IsPCRel, DF);
IsResolved = getWriter().IsFixupFullyResolved(*this, Target, IsPCRel, DF);
bool ShouldAlignPC = Backend.getFixupKindInfo(Fixup.getKind()).Flags &
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits;
@@ -322,7 +321,8 @@ void MCAsmLayout::LayoutFragment(MCFragment *F) {
/// WriteFragmentData - Write the \arg F data to the output file.
static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
const MCFragment &F, MCObjectWriter *OW) {
const MCFragment &F) {
MCObjectWriter *OW = &Asm.getWriter();
uint64_t Start = OW->getStream().tell();
(void) Start;
@@ -428,8 +428,7 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
}
void MCAssembler::WriteSectionData(const MCSectionData *SD,
const MCAsmLayout &Layout,
MCObjectWriter *OW) const {
const MCAsmLayout &Layout) const {
// Ignore virtual sections.
if (SD->getSection().isVirtualSection()) {
assert(Layout.getSectionFileSize(SD) == 0 && "Invalid size for section!");
@@ -469,29 +468,29 @@ void MCAssembler::WriteSectionData(const MCSectionData *SD,
return;
}
uint64_t Start = OW->getStream().tell();
uint64_t Start = getWriter().getStream().tell();
(void) Start;
for (MCSectionData::const_iterator it = SD->begin(),
ie = SD->end(); it != ie; ++it)
WriteFragmentData(*this, Layout, *it, OW);
WriteFragmentData(*this, Layout, *it);
assert(OW->getStream().tell() - Start == Layout.getSectionAddressSize(SD));
assert(getWriter().getStream().tell() - Start ==
Layout.getSectionAddressSize(SD));
}
uint64_t MCAssembler::HandleFixup(MCObjectWriter &Writer,
const MCAsmLayout &Layout,
MCFragment &F,
const MCFixup &Fixup) {
uint64_t MCAssembler::HandleFixup(const MCAsmLayout &Layout,
MCFragment &F,
const MCFixup &Fixup) {
// Evaluate the fixup.
MCValue Target;
uint64_t FixedValue;
if (!EvaluateFixup(Writer, Layout, Fixup, &F, Target, FixedValue)) {
if (!EvaluateFixup(Layout, Fixup, &F, Target, FixedValue)) {
// The fixup was unresolved, we need a relocation. Inform the object
// writer of the relocation, and give it an opportunity to adjust the
// fixup value if need be.
Writer.RecordRelocation(*this, Layout, &F, Fixup, Target, FixedValue);
getWriter().RecordRelocation(*this, Layout, &F, Fixup, Target, FixedValue);
}
return FixedValue;
}
@@ -527,7 +526,7 @@ void MCAssembler::Finish() {
}
// Layout until everything fits.
while (LayoutOnce(Writer, Layout))
while (LayoutOnce(Layout))
continue;
DEBUG_WITH_TYPE("mc-dump", {
@@ -545,7 +544,7 @@ void MCAssembler::Finish() {
// Allow the object writer a chance to perform post-layout binding (for
// example, to set the index fields in the symbol data).
Writer.ExecutePostLayoutBinding(*this, Layout);
getWriter().ExecutePostLayoutBinding(*this, Layout);
// Evaluate and apply the fixups, generating relocation entries as necessary.
for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
@@ -556,7 +555,7 @@ void MCAssembler::Finish() {
for (MCDataFragment::fixup_iterator it3 = DF->fixup_begin(),
ie3 = DF->fixup_end(); it3 != ie3; ++it3) {
MCFixup &Fixup = *it3;
uint64_t FixedValue = HandleFixup(Writer, Layout, *DF, Fixup);
uint64_t FixedValue = HandleFixup(Layout, *DF, Fixup);
getBackend().ApplyFixup(Fixup, DF->getContents().data(),
DF->getContents().size(), FixedValue);
}
@@ -566,7 +565,7 @@ void MCAssembler::Finish() {
for (MCInstFragment::fixup_iterator it3 = IF->fixup_begin(),
ie3 = IF->fixup_end(); it3 != ie3; ++it3) {
MCFixup &Fixup = *it3;
uint64_t FixedValue = HandleFixup(Writer, Layout, *IF, Fixup);
uint64_t FixedValue = HandleFixup(Layout, *IF, Fixup);
getBackend().ApplyFixup(Fixup, IF->getCode().data(),
IF->getCode().size(), FixedValue);
}
@@ -575,13 +574,12 @@ void MCAssembler::Finish() {
}
// Write the object file.
Writer.WriteObject(*this, Layout);
getWriter().WriteObject(*this, Layout);
stats::ObjectBytes += OS.tell() - StartOffset;
}
bool MCAssembler::FixupNeedsRelaxation(const MCObjectWriter &Writer,
const MCFixup &Fixup,
bool MCAssembler::FixupNeedsRelaxation(const MCFixup &Fixup,
const MCFragment *DF,
const MCAsmLayout &Layout) const {
if (getRelaxAll())
@@ -590,7 +588,7 @@ bool MCAssembler::FixupNeedsRelaxation(const MCObjectWriter &Writer,
// If we cannot resolve the fixup value, it requires relaxation.
MCValue Target;
uint64_t Value;
if (!EvaluateFixup(Writer, Layout, Fixup, DF, Target, Value))
if (!EvaluateFixup(Layout, Fixup, DF, Target, Value))
return true;
// Otherwise, relax if the value is too big for a (signed) i8.
@@ -599,8 +597,7 @@ bool MCAssembler::FixupNeedsRelaxation(const MCObjectWriter &Writer,
return int64_t(Value) != int64_t(int8_t(Value));
}
bool MCAssembler::FragmentNeedsRelaxation(const MCObjectWriter &Writer,
const MCInstFragment *IF,
bool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF,
const MCAsmLayout &Layout) const {
// If this inst doesn't ever need relaxation, ignore it. This occurs when we
// are intentionally pushing out inst fragments, or because we relaxed a
@@ -610,16 +607,15 @@ bool MCAssembler::FragmentNeedsRelaxation(const MCObjectWriter &Writer,
for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
ie = IF->fixup_end(); it != ie; ++it)
if (FixupNeedsRelaxation(Writer, *it, IF, Layout))
if (FixupNeedsRelaxation(*it, IF, Layout))
return true;
return false;
}
bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer,
MCAsmLayout &Layout,
bool MCAssembler::RelaxInstruction(MCAsmLayout &Layout,
MCInstFragment &IF) {
if (!FragmentNeedsRelaxation(Writer, &IF, Layout))
if (!FragmentNeedsRelaxation(&IF, Layout))
return false;
++stats::RelaxedInstructions;
@@ -653,9 +649,7 @@ bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer,
return true;
}
bool MCAssembler::RelaxOrg(const MCObjectWriter &Writer,
MCAsmLayout &Layout,
MCOrgFragment &OF) {
bool MCAssembler::RelaxOrg(MCAsmLayout &Layout, MCOrgFragment &OF) {
int64_t TargetLocation;
if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, Layout))
report_fatal_error("expected assembly-time absolute expression");
@@ -672,9 +666,7 @@ bool MCAssembler::RelaxOrg(const MCObjectWriter &Writer,
return OldSize != OF.getSize();
}
bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer,
MCAsmLayout &Layout,
MCLEBFragment &LF) {
bool MCAssembler::RelaxLEB(MCAsmLayout &Layout, MCLEBFragment &LF) {
int64_t Value = 0;
uint64_t OldSize = LF.getContents().size();
LF.getValue().EvaluateAsAbsolute(Value, Layout);
@@ -689,8 +681,7 @@ bool MCAssembler::RelaxLEB(const MCObjectWriter &Writer,
return OldSize != LF.getContents().size();
}
bool MCAssembler::RelaxDwarfLineAddr(const MCObjectWriter &Writer,
MCAsmLayout &Layout,
bool MCAssembler::RelaxDwarfLineAddr(MCAsmLayout &Layout,
MCDwarfLineAddrFragment &DF) {
int64_t AddrDelta = 0;
uint64_t OldSize = DF.getContents().size();
@@ -705,8 +696,7 @@ bool MCAssembler::RelaxDwarfLineAddr(const MCObjectWriter &Writer,
return OldSize != Data.size();
}
bool MCAssembler::RelaxAlignment(const MCObjectWriter &Writer,
MCAsmLayout &Layout,
bool MCAssembler::RelaxAlignment(MCAsmLayout &Layout,
MCAlignFragment &AF) {
unsigned Offset = Layout.getFragmentOffset(&AF);
unsigned Size = OffsetToAlignment(Offset, AF.getAlignment());
@@ -717,8 +707,7 @@ bool MCAssembler::RelaxAlignment(const MCObjectWriter &Writer,
return OldSize != Size;
}
bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer,
MCAsmLayout &Layout) {
bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
++stats::RelaxationSteps;
// Scan for fragments that need relaxation.
@@ -735,22 +724,20 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer,
default:
break;
case MCFragment::FT_Align:
relaxedFrag = RelaxAlignment(Writer, Layout,
*cast<MCAlignFragment>(it2));
relaxedFrag = RelaxAlignment(Layout, *cast<MCAlignFragment>(it2));
break;
case MCFragment::FT_Inst:
relaxedFrag = RelaxInstruction(Writer, Layout,
*cast<MCInstFragment>(it2));
relaxedFrag = RelaxInstruction(Layout, *cast<MCInstFragment>(it2));
break;
case MCFragment::FT_Org:
relaxedFrag = RelaxOrg(Writer, Layout, *cast<MCOrgFragment>(it2));
relaxedFrag = RelaxOrg(Layout, *cast<MCOrgFragment>(it2));
break;
case MCFragment::FT_Dwarf:
relaxedFrag = RelaxDwarfLineAddr(Writer, Layout,
*cast<MCDwarfLineAddrFragment>(it2));
relaxedFrag = RelaxDwarfLineAddr(Layout,
*cast<MCDwarfLineAddrFragment>(it2));
break;
case MCFragment::FT_LEB:
relaxedFrag = RelaxLEB(Writer, Layout, *cast<MCLEBFragment>(it2));
relaxedFrag = RelaxLEB(Layout, *cast<MCLEBFragment>(it2));
break;
}
// Update the layout, and remember that we relaxed.

View File

@@ -1257,7 +1257,7 @@ public:
// Write the actual section data.
for (MCAssembler::const_iterator it = Asm.begin(),
ie = Asm.end(); it != ie; ++it) {
Asm.WriteSectionData(it, Layout, this);
Asm.WriteSectionData(it, Layout);
uint64_t Pad = getPaddingSize(it, Layout);
for (unsigned int i = 0; i < Pad; ++i)

View File

@@ -874,7 +874,7 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm,
assert(OS.tell() == (*i)->Header.PointerToRawData &&
"Section::PointerToRawData is insane!");
Asm.WriteSectionData(j, Layout, this);
Asm.WriteSectionData(j, Layout);
}
if ((*i)->Relocations.size() > 0) {