From 2f2a76fc6a74148e164fe09c588d8a7f4ef56965 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 19 Jan 2016 16:57:08 +0000 Subject: [PATCH] Simplify MCFillFragment. The value size was always 1 or 0, so we don't need to store it. In a no asserts build this takes the testcase of pr26208 from 11 to 10 seconds. llvm-svn: 258141 --- include/llvm/MC/MCFragment.h | 29 ++++++----------------------- lib/MC/MCAssembler.cpp | 16 +++------------- lib/MC/MCFragment.cpp | 3 +-- lib/MC/MCMachOStreamer.cpp | 2 +- lib/MC/MCObjectStreamer.cpp | 4 ++-- lib/MC/WinCOFFStreamer.cpp | 2 +- 6 files changed, 14 insertions(+), 42 deletions(-) diff --git a/include/llvm/MC/MCFragment.h b/include/llvm/MC/MCFragment.h index 7d6db525ce6..e51ee90e3e6 100644 --- a/include/llvm/MC/MCFragment.h +++ b/include/llvm/MC/MCFragment.h @@ -321,36 +321,19 @@ public: class MCFillFragment : public MCFragment { - /// Value - Value to use for filling bytes. - int64_t Value; + /// Value to use for filling bytes. + uint8_t Value; - /// ValueSize - The size (in bytes) of \p Value to use when filling, or 0 if - /// this is a virtual fill fragment. - unsigned ValueSize; - - /// Size - The number of bytes to insert. + /// The number of bytes to insert. uint64_t Size; public: - MCFillFragment(int64_t Value, unsigned ValueSize, uint64_t Size, - MCSection *Sec = nullptr) - : MCFragment(FT_Fill, false, 0, Sec), Value(Value), ValueSize(ValueSize), - Size(Size) { - assert((!ValueSize || (Size % ValueSize) == 0) && - "Fill size must be a multiple of the value size!"); - } - - /// \name Accessors - /// @{ - - int64_t getValue() const { return Value; } - - unsigned getValueSize() const { return ValueSize; } + MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr) + : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {} + uint8_t getValue() const { return Value; } uint64_t getSize() const { return Size; } - /// @} - static bool classof(const MCFragment *F) { return F->getKind() == MCFragment::FT_Fill; } diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 15e82fa4938..a88e3df88ff 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -489,17 +489,8 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout, ++stats::EmittedFillFragments; const 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: llvm_unreachable("Invalid size!"); - case 1: OW->write8 (uint8_t (FF.getValue())); break; - case 2: OW->write16(uint16_t(FF.getValue())); break; - case 4: OW->write32(uint32_t(FF.getValue())); break; - case 8: OW->write64(uint64_t(FF.getValue())); break; - } - } + for (uint64_t I = 0, E = FF.getSize(); I != E; ++I) + OW->write8(FF.getValue()); break; } @@ -578,8 +569,7 @@ void MCAssembler::writeSectionData(const MCSection *Sec, "Invalid align in virtual section!"); break; case MCFragment::FT_Fill: - assert((cast(F).getValueSize() == 0 || - cast(F).getValue() == 0) && + assert((cast(F).getValue() == 0) && "Invalid fill in virtual section!"); break; } diff --git a/lib/MC/MCFragment.cpp b/lib/MC/MCFragment.cpp index efdb7049203..09570d7fbe4 100644 --- a/lib/MC/MCFragment.cpp +++ b/lib/MC/MCFragment.cpp @@ -386,8 +386,7 @@ void MCFragment::dump() { } case MCFragment::FT_Fill: { const MCFillFragment *FF = cast(this); - OS << " Value:" << FF->getValue() << " ValueSize:" << FF->getValueSize() - << " Size:" << FF->getSize(); + OS << " Value:" << FF->getValue() << " Size:" << FF->getSize(); break; } case MCFragment::FT_Relaxable: { diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index 21f7571eec4..578ae962007 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -414,7 +414,7 @@ void MCMachOStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, if (ByteAlignment != 1) new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, Section); - MCFragment *F = new MCFillFragment(0, 0, Size, Section); + MCFragment *F = new MCFillFragment(0, Size, Section); Symbol->setFragment(F); // Update the maximum alignment on the zero fill section if necessary. diff --git a/lib/MC/MCObjectStreamer.cpp b/lib/MC/MCObjectStreamer.cpp index 972610ac8d6..8ee24786967 100644 --- a/lib/MC/MCObjectStreamer.cpp +++ b/lib/MC/MCObjectStreamer.cpp @@ -436,9 +436,9 @@ bool MCObjectStreamer::EmitRelocDirective(const MCExpr &Offset, StringRef Name, void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) { const MCSection *Sec = getCurrentSection().first; + (void)Sec; assert(Sec && "need a section"); - unsigned ItemSize = Sec->isVirtualSection() ? 0 : 1; - insert(new MCFillFragment(FillValue, ItemSize, NumBytes)); + insert(new MCFillFragment(FillValue, NumBytes)); } void MCObjectStreamer::FinishImpl() { diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index a38b1a41a9b..f9d231921d5 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -258,7 +258,7 @@ void MCWinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, ByteAlignment, Section); MCFillFragment *Fragment = new MCFillFragment( - /*Value=*/0, /*ValueSize=*/0, Size, Section); + /*Value=*/0, Size, Section); Symbol->setFragment(Fragment); }