MC: Tweak section layout to not relying on accumulating address value.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 21:35:22 +0000 (21:35 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 21:35:22 +0000 (21:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103648 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCAssembler.cpp

index aefe2c429469979be6254a86dac6bdd202e556eb..44e4cc9ea5f590e26bad89e7cec0f914dd055dcd 100644 (file)
@@ -396,10 +396,15 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout,
   // Set the aligned section address.
   Layout.setSectionAddress(&SD, StartAddress);
 
-  uint64_t Address = StartAddress;
   for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it) {
     MCFragment &F = *it;
 
+    // Compute the fragment start address.
+    uint64_t Address = StartAddress;
+    if (MCFragment *Prev = F.getPrevNode())
+      Address = (Layout.getFragmentAddress(Prev) +
+                 Layout.getFragmentEffectiveSize(Prev));
+
     ++stats::FragmentLayouts;
 
     uint64_t FragmentOffset = Address - StartAddress;
@@ -464,15 +469,16 @@ void MCAssembler::LayoutSection(MCAsmLayout &Layout,
     }
 
     Layout.setFragmentEffectiveSize(&F, EffectiveSize);
-    Address += EffectiveSize;
   }
 
   // Set the section sizes.
-  Layout.setSectionSize(&SD, Address - StartAddress);
-  if (IsVirtual)
-    Layout.setSectionFileSize(&SD, 0);
-  else
-    Layout.setSectionFileSize(&SD, Address - StartAddress);
+  uint64_t Size = 0;
+  if (!SD.getFragmentList().empty()) {
+    MCFragment *F = &SD.getFragmentList().back();
+    Size = Layout.getFragmentOffset(F) + Layout.getFragmentEffectiveSize(F);
+  }
+  Layout.setSectionSize(&SD, Size);
+  Layout.setSectionFileSize(&SD, IsVirtual ? 0 : Size);
 }
 
 /// WriteFragmentData - Write the \arg F data to the output file.