aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-05-13 20:40:12 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-05-13 20:40:12 +0000
commitb69fc044db8c193348b6611f46432bb21b3cbe90 (patch)
tree4f7905abd161727d7f31ec2b92167dc161388365
parente6cd757e6800b9b94a6459ec148c0624c4f2e3c1 (diff)
downloadexternal_llvm-b69fc044db8c193348b6611f46432bb21b3cbe90.zip
external_llvm-b69fc044db8c193348b6611f46432bb21b3cbe90.tar.gz
external_llvm-b69fc044db8c193348b6611f46432bb21b3cbe90.tar.bz2
MC: Move Layout{Fragment,Section} into MCAsmLayout, and add LayoutFile().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103738 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCAsmLayout.h12
-rw-r--r--include/llvm/MC/MCAssembler.h10
-rw-r--r--lib/MC/MCAssembler.cpp53
3 files changed, 39 insertions, 36 deletions
diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h
index f866aab..18f720e 100644
--- a/include/llvm/MC/MCAsmLayout.h
+++ b/include/llvm/MC/MCAsmLayout.h
@@ -50,6 +50,18 @@ public:
/// \brief Update the layout because a fragment has been replaced.
void FragmentReplaced(MCFragment *Src, MCFragment *Dst);
+ /// \brief Perform a full layout.
+ void LayoutFile();
+
+ /// \brief Perform layout for a single fragment, assuming that the previous
+ /// fragment has already been layed out correctly, and the parent section has
+ /// been initialized.
+ void LayoutFragment(MCFragment *Fragment);
+
+ /// \brief Performs layout for a single section, assuming that the previous
+ /// section has already been layed out correctly.
+ void LayoutSection(MCSectionData *SD);
+
/// @name Section Access (in layout order)
/// @{
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index 6522b67..78a8bb2 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -656,16 +656,6 @@ private:
uint64_t SectionAddress,
uint64_t FragmentOffset) const;
- /// LayoutFragment - Performs layout of the given \arg Fragment; assuming that
- /// the previous fragment has already been layed out correctly, and the parent
- /// section has been initialized.
- void LayoutFragment(MCAsmLayout &Layout, MCFragment &Fragment);
-
- /// LayoutSection - Performs layout of the section referenced by the given
- /// \arg SectionOrderIndex. The layout assumes that the previous section has
- /// already been layed out correctly.
- void LayoutSection(MCAsmLayout &Layout, unsigned SectionOrderIndex);
-
/// LayoutOnce - Perform one layout iteration and return true if any offsets
/// were adjusted.
bool LayoutOnce(MCAsmLayout &Layout);
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index dfc2663..38994e7 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -69,8 +69,7 @@ void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
// FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter.
// Layout the sections in order.
- for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
- getAssembler().LayoutSection(*this, i);
+ LayoutFile();
}
void MCAsmLayout::FragmentReplaced(MCFragment *Src, MCFragment *Dst) {
@@ -426,49 +425,52 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout,
return 0;
}
-void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) {
- uint64_t StartAddress = Layout.getSectionAddress(F.getParent());
+void MCAsmLayout::LayoutFile() {
+ for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
+ LayoutSection(getSectionOrder()[i]);
+}
+
+void MCAsmLayout::LayoutFragment(MCFragment *F) {
+ uint64_t StartAddress = getSectionAddress(F->getParent());
// Get the fragment start address.
uint64_t Address = StartAddress;
- MCSectionData::iterator it = &F;
- if (MCFragment *Prev = F.getPrevNode())
- Address = (StartAddress + Layout.getFragmentOffset(Prev) +
- Layout.getFragmentEffectiveSize(Prev));
+ MCSectionData::iterator it = F;
+ if (MCFragment *Prev = F->getPrevNode())
+ Address = (StartAddress + getFragmentOffset(Prev) +
+ getFragmentEffectiveSize(Prev));
++stats::FragmentLayouts;
- uint64_t FragmentOffset = Address - StartAddress;
- Layout.setFragmentOffset(&F, FragmentOffset);
+ // Compute fragment offset and size.
+ uint64_t Offset = Address - StartAddress;
+ uint64_t EffectiveSize =
+ getAssembler().ComputeFragmentSize(*this, *F, StartAddress, Offset);
- // Evaluate fragment size.
- uint64_t EffectiveSize = ComputeFragmentSize(Layout, F, StartAddress,
- FragmentOffset);
- Layout.setFragmentEffectiveSize(&F, EffectiveSize);
+ setFragmentOffset(F, Offset);
+ setFragmentEffectiveSize(F, EffectiveSize);
}
-void MCAssembler::LayoutSection(MCAsmLayout &Layout,
- unsigned SectionOrderIndex) {
- MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex];
+void MCAsmLayout::LayoutSection(MCSectionData *SD) {
+ unsigned SectionOrderIndex = SD->getLayoutOrder();
++stats::SectionLayouts;
// Compute the section start address.
uint64_t StartAddress = 0;
if (SectionOrderIndex) {
- MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
- StartAddress = (Layout.getSectionAddress(Prev) +
- Layout.getSectionAddressSize(Prev));
+ MCSectionData *Prev = getSectionOrder()[SectionOrderIndex - 1];
+ StartAddress = getSectionAddress(Prev) + getSectionAddressSize(Prev);
}
// Honor the section alignment requirements.
- StartAddress = RoundUpToAlignment(StartAddress, SD.getAlignment());
+ StartAddress = RoundUpToAlignment(StartAddress, SD->getAlignment());
// Set the section address.
- Layout.setSectionAddress(&SD, StartAddress);
+ setSectionAddress(SD, StartAddress);
- for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it)
- LayoutFragment(Layout, *it);
+ for (MCSectionData::iterator it = SD->begin(), ie = SD->end(); it != ie; ++it)
+ LayoutFragment(it);
}
/// WriteFragmentData - Write the \arg F data to the output file.
@@ -754,8 +756,7 @@ bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
++stats::RelaxationSteps;
// Layout the sections in order.
- for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i)
- LayoutSection(Layout, i);
+ Layout.LayoutFile();
// Scan for fragments that need relaxation.
bool WasRelaxed = false;