aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-05-12 15:42:59 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-05-12 15:42:59 +0000
commitbc1a0cf13950dcd64d6d0398df5419a0a2931721 (patch)
tree49b68c3447d927a0fca549dba7f51387b03239d6 /lib/MC
parent62d50e89e40cb7fac444bde21bcab10fd69d68e3 (diff)
downloadexternal_llvm-bc1a0cf13950dcd64d6d0398df5419a0a2931721.tar.gz
external_llvm-bc1a0cf13950dcd64d6d0398df5419a0a2931721.tar.bz2
external_llvm-bc1a0cf13950dcd64d6d0398df5419a0a2931721.zip
MC: Track section layout order explicitly, and use to simplify.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103616 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCAssembler.cpp46
1 files changed, 15 insertions, 31 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 8ec927e415..60349e69aa 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -47,6 +47,16 @@ STATISTIC(SectionLayouts, "Number of section layouts");
/* *** */
+MCAsmLayout::MCAsmLayout(MCAssembler &Asm) : Assembler(Asm) {
+ // Compute the section layout order. Virtual sections must go last.
+ for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
+ if (!Asm.getBackend().isVirtualSection(it->getSection()))
+ SectionOrder.push_back(&*it);
+ for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
+ if (Asm.getBackend().isVirtualSection(it->getSection()))
+ SectionOrder.push_back(&*it);
+}
+
void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
// We shouldn't have to do anything special to support negative slides, and it
// is a perfectly valid thing to do as long as other parts of the system can
@@ -59,24 +69,10 @@ void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
// FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter.
// Layout the concrete sections and fragments.
- MCAssembler &Asm = getAssembler();
uint64_t Address = 0;
- for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) {
- // Skip virtual sections.
- if (Asm.getBackend().isVirtualSection(it->getSection()))
- continue;
-
- // Layout the section fragments and its size.
- Address = Asm.LayoutSection(*it, *this, Address);
- }
-
- // Layout the virtual sections.
- for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) {
- if (!Asm.getBackend().isVirtualSection(it->getSection()))
- continue;
-
+ for (iterator it = begin(), ie = end(); it != ie; ++it) {
// Layout the section fragments and its size.
- Address = Asm.LayoutSection(*it, *this, Address);
+ Address = getAssembler().LayoutSection(**it, *this, Address);
}
}
@@ -711,22 +707,10 @@ bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
// Layout the concrete sections and fragments.
uint64_t Address = 0;
- for (iterator it = begin(), ie = end(); it != ie; ++it) {
- // Skip virtual sections.
- if (getBackend().isVirtualSection(it->getSection()))
- continue;
-
- // Layout the section fragments and its size.
- Address = LayoutSection(*it, Layout, Address);
- }
-
- // Layout the virtual sections.
- for (iterator it = begin(), ie = end(); it != ie; ++it) {
- if (!getBackend().isVirtualSection(it->getSection()))
- continue;
-
+ for (MCAsmLayout::iterator it = Layout.begin(),
+ ie = Layout.end(); it != ie; ++it) {
// Layout the section fragments and its size.
- Address = LayoutSection(*it, Layout, Address);
+ Address = LayoutSection(**it, Layout, Address);
}
// Scan for fragments that need relaxation.