From 7cd309f7dc8e7cb7de6153103df4aff3ab52030f Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 12 May 2010 22:51:35 +0000 Subject: [PATCH] MC: Explicitly check that only virtual fragments appear in virtual sections. llvm-svn: 103663 --- llvm/lib/MC/MCAssembler.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 6cdef20d2496..b8b60af8fb74 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -534,6 +534,9 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, case MCFragment::FT_Fill: { MCFillFragment &FF = cast(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(it)->getValueSize() && + "Invalid align in virtual section!"); + break; + case MCFragment::FT_Fill: + assert(!cast(it)->getValueSize() && + "Invalid fill in virtual section!"); + break; + case MCFragment::FT_ZeroFill: + break; + } + } + return; }