OSDN Git Service

MC: Explicitly check that only virtual fragments appear in virtual sections.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 22:51:35 +0000 (22:51 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 12 May 2010 22:51:35 +0000 (22:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103663 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCAssembler.cpp

index 6cdef20..b8b60af 100644 (file)
@@ -534,6 +534,9 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout,
 
   case MCFragment::FT_Fill: {
     MCFillFragment &FF = cast<MCFillFragment>(F);
+
+    assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
+
     for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {
       switch (FF.getValueSize()) {
       default:
@@ -578,6 +581,26 @@ void MCAssembler::WriteSectionData(const MCSectionData *SD,
   // Ignore virtual sections.
   if (getBackend().isVirtualSection(SD->getSection())) {
     assert(SectionFileSize == 0 && "Invalid size for section!");
+
+    // Check that contents are only things legal inside a virtual section.
+    for (MCSectionData::const_iterator it = SD->begin(),
+           ie = SD->end(); it != ie; ++it) {
+      switch (it->getKind()) {
+      default:
+        assert(0 && "Invalid fragment in virtual section!");
+      case MCFragment::FT_Align:
+        assert(!cast<MCAlignFragment>(it)->getValueSize() &&
+               "Invalid align in virtual section!");
+        break;
+      case MCFragment::FT_Fill:
+        assert(!cast<MCFillFragment>(it)->getValueSize() &&
+               "Invalid fill in virtual section!");
+        break;
+      case MCFragment::FT_ZeroFill:
+        break;
+      }
+    }
+
     return;
   }