MC: Add TargetAsmBackend::isVirtualSection hook.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 19 Mar 2010 09:29:03 +0000 (09:29 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 19 Mar 2010 09:29:03 +0000 (09:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98950 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetAsmBackend.h
lib/MC/MCAssembler.cpp
lib/Target/X86/X86AsmBackend.cpp

index cada3e4479f0744ad3e8d06d5901dfbf561c8a3d..97b1d6024e1b669eba2b195b73d18d2eee61fee7 100644 (file)
@@ -80,6 +80,10 @@ public:
     return false;
   }
 
     return false;
   }
 
+  /// isVirtualSection - Check whether the given section is "virtual", that is
+  /// has no actual object file contents.
+  virtual bool isVirtualSection(const MCSection &Section) const = 0;
+
   /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
   /// data fragment, at the offset specified by the fixup and following the
   /// fixup kind as appropriate.
   /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
   /// data fragment, at the offset specified by the fixup and following the
   /// fixup kind as appropriate.
index ae8ca4bf7ee94df77acd33f13ff9450d497b15c2..f1847df2f140cb8647841ae1cc95b9d575be1a83 100644 (file)
@@ -43,14 +43,6 @@ STATISTIC(EmittedFragments, "Number of emitted assembler fragments");
 // object file, which may truncate it. We should detect that truncation where
 // invalid and report errors back.
 
 // object file, which may truncate it. We should detect that truncation where
 // invalid and report errors back.
 
-/// isVirtualSection - Check if this is a section which does not actually exist
-/// in the object file.
-static bool isVirtualSection(const MCSection &Section) {
-  // FIXME: Lame.
-  const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
-  return (SMO.getType() == MCSectionMachO::S_ZEROFILL);
-}
-
 static unsigned getFixupKindLog2Size(unsigned Kind) {
   switch (Kind) {
   default: llvm_unreachable("invalid fixup kind!");
 static unsigned getFixupKindLog2Size(unsigned Kind) {
   switch (Kind) {
   default: llvm_unreachable("invalid fixup kind!");
@@ -264,7 +256,7 @@ public:
                     uint64_t FileOffset, uint64_t RelocationsStart,
                     unsigned NumRelocations) {
     // The offset is unused for virtual sections.
                     uint64_t FileOffset, uint64_t RelocationsStart,
                     unsigned NumRelocations) {
     // The offset is unused for virtual sections.
-    if (isVirtualSection(SD.getSection())) {
+    if (Asm.getBackend().isVirtualSection(SD.getSection())) {
       assert(SD.getFileSize() == 0 && "Invalid file size!");
       FileOffset = 0;
     }
       assert(SD.getFileSize() == 0 && "Invalid file size!");
       FileOffset = 0;
     }
@@ -748,7 +740,7 @@ public:
 
       VMSize = std::max(VMSize, SD.getAddress() + SD.getSize());
 
 
       VMSize = std::max(VMSize, SD.getAddress() + SD.getSize());
 
-      if (isVirtualSection(SD.getSection()))
+      if (Asm.getBackend().isVirtualSection(SD.getSection()))
         continue;
 
       SectionDataSize = std::max(SectionDataSize,
         continue;
 
       SectionDataSize = std::max(SectionDataSize,
@@ -776,7 +768,7 @@ public:
       std::vector<MachRelocationEntry> &Relocs = Relocations[it];
       unsigned NumRelocs = Relocs.size();
       uint64_t SectionStart = SectionDataStart + it->getAddress();
       std::vector<MachRelocationEntry> &Relocs = Relocations[it];
       unsigned NumRelocs = Relocs.size();
       uint64_t SectionStart = SectionDataStart + it->getAddress();
-      WriteSection(*it, SectionStart, RelocTableEnd, NumRelocs);
+      WriteSection(Asm, *it, SectionStart, RelocTableEnd, NumRelocs);
       RelocTableEnd += NumRelocs * RelocationInfoSize;
     }
 
       RelocTableEnd += NumRelocs * RelocationInfoSize;
     }
 
@@ -1194,7 +1186,7 @@ void MCAssembler::LayoutSection(MCSectionData &SD) {
 
   // Set the section sizes.
   SD.setSize(Address - SD.getAddress());
 
   // Set the section sizes.
   SD.setSize(Address - SD.getAddress());
-  if (isVirtualSection(SD.getSection()))
+  if (getBackend().isVirtualSection(SD.getSection()))
     SD.setFileSize(0);
   else
     SD.setFileSize(Address - SD.getAddress());
     SD.setFileSize(0);
   else
     SD.setFileSize(Address - SD.getAddress());
@@ -1342,7 +1334,7 @@ static void WriteFragmentData(const MCFragment &F, MCObjectWriter *OW) {
 void MCAssembler::WriteSectionData(const MCSectionData *SD,
                                    MCObjectWriter *OW) const {
   // Ignore virtual sections.
 void MCAssembler::WriteSectionData(const MCSectionData *SD,
                                    MCObjectWriter *OW) const {
   // Ignore virtual sections.
-  if (isVirtualSection(SD->getSection())) {
+  if (getBackend().isVirtualSection(SD->getSection())) {
     assert(SD->getFileSize() == 0);
     return;
   }
     assert(SD->getFileSize() == 0);
     return;
   }
@@ -1444,7 +1436,7 @@ bool MCAssembler::LayoutOnce() {
     MCSectionData &SD = *it;
 
     // Skip virtual sections.
     MCSectionData &SD = *it;
 
     // Skip virtual sections.
-    if (isVirtualSection(SD.getSection()))
+    if (getBackend().isVirtualSection(SD.getSection()))
       continue;
 
     // Align this section if necessary by adding padding bytes to the previous
       continue;
 
     // Align this section if necessary by adding padding bytes to the previous
@@ -1467,7 +1459,7 @@ bool MCAssembler::LayoutOnce() {
   for (iterator it = begin(), ie = end(); it != ie; ++it) {
     MCSectionData &SD = *it;
 
   for (iterator it = begin(), ie = end(); it != ie; ++it) {
     MCSectionData &SD = *it;
 
-    if (!isVirtualSection(SD.getSection()))
+    if (!getBackend().isVirtualSection(SD.getSection()))
       continue;
 
     // Align this section if necessary by adding padding bytes to the previous
       continue;
 
     // Align this section if necessary by adding padding bytes to the previous
index fec563817e6c31489f02ebe85d2896ef60449b82..1d66b841523207d96997de124175bdae0eda8217 100644 (file)
@@ -11,6 +11,7 @@
 #include "X86.h"
 #include "X86FixupKinds.h"
 #include "llvm/MC/MCAssembler.h"
 #include "X86.h"
 #include "X86FixupKinds.h"
 #include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Target/TargetAsmBackend.h"
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Target/TargetAsmBackend.h"
@@ -48,6 +49,20 @@ public:
   }
 };
 
   }
 };
 
+class ELFX86AsmBackend : public X86AsmBackend {
+public:
+  ELFX86AsmBackend(const Target &T)
+    : X86AsmBackend(T) {
+    HasAbsolutizedSet = true;
+    HasScatteredSymbols = true;
+  }
+
+  bool isVirtualSection(const MCSection &Section) const {
+    const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
+    return SE.getType() == MCSectionELF::SHT_NOBITS;;
+  }
+};
+
 class DarwinX86AsmBackend : public X86AsmBackend {
 public:
   DarwinX86AsmBackend(const Target &T)
 class DarwinX86AsmBackend : public X86AsmBackend {
 public:
   DarwinX86AsmBackend(const Target &T)
@@ -55,6 +70,12 @@ public:
     HasAbsolutizedSet = true;
     HasScatteredSymbols = true;
   }
     HasAbsolutizedSet = true;
     HasScatteredSymbols = true;
   }
+
+  bool isVirtualSection(const MCSection &Section) const {
+    const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
+    return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
+            SMO.getType() == MCSectionMachO::S_GB_ZEROFILL);
+  }
 };
 
 class DarwinX86_32AsmBackend : public DarwinX86AsmBackend {
 };
 
 class DarwinX86_32AsmBackend : public DarwinX86AsmBackend {
@@ -92,7 +113,7 @@ TargetAsmBackend *llvm::createX86_32AsmBackend(const Target &T,
   case Triple::Darwin:
     return new DarwinX86_32AsmBackend(T);
   default:
   case Triple::Darwin:
     return new DarwinX86_32AsmBackend(T);
   default:
-    return new X86AsmBackend(T);
+    return new ELFX86AsmBackend(T);
   }
 }
 
   }
 }
 
@@ -102,6 +123,6 @@ TargetAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
   case Triple::Darwin:
     return new DarwinX86_64AsmBackend(T);
   default:
   case Triple::Darwin:
     return new DarwinX86_64AsmBackend(T);
   default:
-    return new X86AsmBackend(T);
+    return new ELFX86AsmBackend(T);
   }
 }
   }
 }