aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCAssembler.h10
-rw-r--r--lib/MC/MCAssembler.cpp27
2 files changed, 19 insertions, 18 deletions
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index 78a8bb2a07..6b0cacfb68 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -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; }
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 57214af296..47c891534f 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -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() {