From e73d49eda2cb4fc30b52c4a241acf69c8af98302 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 12 May 2010 22:51:27 +0000 Subject: [PATCH] MC: Drop support for alignment in ZeroFill fragment, we can just use MCAlignFragments for this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103661 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAssembler.h | 10 ++-------- lib/MC/MCAssembler.cpp | 15 ++++----------- lib/MC/MCMachOStreamer.cpp | 7 ++++++- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 8bd67342009..ddf4ec95899 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -359,21 +359,15 @@ class MCZeroFillFragment : public MCFragment { /// Size - The size of this fragment. uint64_t Size; - /// Alignment - The alignment for this fragment. - unsigned Alignment; - public: - MCZeroFillFragment(uint64_t _Size, unsigned _Alignment, MCSectionData *SD = 0) - : MCFragment(FT_ZeroFill, SD), - Size(_Size), Alignment(_Alignment) {} + MCZeroFillFragment(uint64_t _Size, MCSectionData *SD = 0) + : MCFragment(FT_ZeroFill, SD), Size(_Size) {} /// @name Accessors /// @{ uint64_t getSize() const { return Size; } - unsigned getAlignment() const { return Alignment; } - /// @} static bool classof(const MCFragment *F) { diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 7bcce2e7e34..fbda26b4ce8 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -421,16 +421,7 @@ void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) { } case MCFragment::FT_ZeroFill: { - MCZeroFillFragment &ZFF = cast(F); - - // Align the fragment offset; it is safe to adjust the offset freely since - // this is only in virtual sections. - // - // FIXME: We shouldn't be doing this here. - Address = RoundUpToAlignment(Address, ZFF.getAlignment()); - Layout.setFragmentOffset(&F, Address - StartAddress); - - EffectiveSize = ZFF.getSize(); + EffectiveSize = cast(F).getSize(); break; } } @@ -498,6 +489,8 @@ static void WriteFragmentData(const MCAssembler &Asm, const MCAsmLayout &Layout, MCAlignFragment &AF = cast(F); uint64_t Count = FragmentSize / AF.getValueSize(); + assert(AF.getValueSize() && "Invalid virtual align in concrete fragment!"); + // FIXME: This error shouldn't actually occur (the front end should emit // multiple .align directives to enforce the semantics it wants), but is // severe enough that we want to report it. How to handle this? @@ -912,7 +905,7 @@ void MCZeroFillFragment::dump() { OS << "MCFragment::dump(); OS << "\n "; - OS << " Size:" << getSize() << " Alignment:" << getAlignment() << ">"; + OS << " Size:" << getSize() << ">"; } void MCSectionData::dump() { diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index ad6ce79ff33..eb49a40707d 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -321,7 +321,12 @@ void MCMachOStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, MCSymbolData &SD = Assembler.getOrCreateSymbolData(*Symbol); - MCFragment *F = new MCZeroFillFragment(Size, ByteAlignment, &SectData); + // Emit an align fragment if necessary. + if (ByteAlignment != 1) + new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, /*EmitNops=*/false, + &SectData); + + MCFragment *F = new MCZeroFillFragment(Size, &SectData); SD.setFragment(F); if (Assembler.isSymbolLinkerVisible(&SD)) F->setAtom(&SD); -- 2.34.1