MC: Switch MCFragment to storing the layout order index, not its index in the file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103751 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2010-05-14 00:37:14 +00:00
parent afc6acdab7
commit 337718e09c
2 changed files with 19 additions and 18 deletions

View File

@ -96,9 +96,9 @@ private:
/// initialized.
uint64_t EffectiveSize;
/// Ordinal - The global index of this fragment. This is the index across all
/// sections, not just the parent section.
unsigned Ordinal;
/// LayoutOrder - The global layout order of this fragment. This is the index
/// across all fragments in the file, not just within the section.
unsigned LayoutOrder;
/// @}
@ -118,8 +118,8 @@ public:
MCSymbolData *getAtom() const { return Atom; }
void setAtom(MCSymbolData *Value) { Atom = Value; }
unsigned getOrdinal() const { return Ordinal; }
void setOrdinal(unsigned Value) { Ordinal = Value; }
unsigned getLayoutOrder() const { return LayoutOrder; }
void setLayoutOrder(unsigned Value) { LayoutOrder = Value; }
static bool classof(const MCFragment *O) { return true; }

View File

@ -599,10 +599,6 @@ void MCAssembler::Finish() {
// Create the layout object.
MCAsmLayout Layout(*this);
// Assign layout order indices.
for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i)
Layout.getSectionOrder()[i]->setLayoutOrder(i);
// Insert additional align fragments for concrete sections to explicitly pad
// the previous section to match their alignment requirements. This is for
// 'gas' compatibility, it shouldn't strictly be necessary.
@ -627,10 +623,8 @@ void MCAssembler::Finish() {
AF->setOnlyAlignAddress(true);
}
// Assign section and fragment ordinals, all subsequent backend code is
// responsible for updating these in place.
// Create dummy fragments and assign section ordinals.
unsigned SectionIndex = 0;
unsigned FragmentIndex = 0;
for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) {
// Create dummy fragments to eliminate any empty sections, this simplifies
// layout.
@ -642,10 +636,17 @@ void MCAssembler::Finish() {
}
it->setOrdinal(SectionIndex++);
}
for (MCSectionData::iterator it2 = it->begin(),
ie2 = it->end(); it2 != ie2; ++it2)
it2->setOrdinal(FragmentIndex++);
// Assign layout order indices to sections and fragments.
unsigned FragmentIndex = 0;
for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) {
MCSectionData *SD = Layout.getSectionOrder()[i];
SD->setLayoutOrder(i);
for (MCSectionData::iterator it2 = SD->begin(),
ie2 = SD->end(); it2 != ie2; ++it2)
it2->setLayoutOrder(FragmentIndex++);
}
// Layout until everything fits.
@ -827,7 +828,7 @@ void MCAssembler::FinishLayout(MCAsmLayout &Layout) {
// Update the data fragments layout data.
DF->setParent(IF->getParent());
DF->setAtom(IF->getAtom());
DF->setOrdinal(IF->getOrdinal());
DF->setLayoutOrder(IF->getLayoutOrder());
Layout.FragmentReplaced(IF, DF);
// Copy in the data and the fixups.
@ -857,8 +858,8 @@ raw_ostream &operator<<(raw_ostream &OS, const MCAsmFixup &AF) {
void MCFragment::dump() {
raw_ostream &OS = llvm::errs();
OS << "<MCFragment " << (void*) this << " Offset:" << Offset
<< " EffectiveSize:" << EffectiveSize << ">";
OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder
<< " Offset:" << Offset << " EffectiveSize:" << EffectiveSize << ">";
}
void MCAlignFragment::dump() {