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
This commit is contained in:
parent
9e8c6c1731
commit
1a7e8b4bc1
|
@ -321,36 +321,19 @@ public:
|
||||||
|
|
||||||
class MCFillFragment : public MCFragment {
|
class MCFillFragment : public MCFragment {
|
||||||
|
|
||||||
/// Value - Value to use for filling bytes.
|
/// Value to use for filling bytes.
|
||||||
int64_t Value;
|
uint8_t Value;
|
||||||
|
|
||||||
/// ValueSize - The size (in bytes) of \p Value to use when filling, or 0 if
|
/// The number of bytes to insert.
|
||||||
/// this is a virtual fill fragment.
|
|
||||||
unsigned ValueSize;
|
|
||||||
|
|
||||||
/// Size - The number of bytes to insert.
|
|
||||||
uint64_t Size;
|
uint64_t Size;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MCFillFragment(int64_t Value, unsigned ValueSize, uint64_t Size,
|
MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr)
|
||||||
MCSection *Sec = nullptr)
|
: MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {}
|
||||||
: 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; }
|
|
||||||
|
|
||||||
|
uint8_t getValue() const { return Value; }
|
||||||
uint64_t getSize() const { return Size; }
|
uint64_t getSize() const { return Size; }
|
||||||
|
|
||||||
/// @}
|
|
||||||
|
|
||||||
static bool classof(const MCFragment *F) {
|
static bool classof(const MCFragment *F) {
|
||||||
return F->getKind() == MCFragment::FT_Fill;
|
return F->getKind() == MCFragment::FT_Fill;
|
||||||
}
|
}
|
||||||
|
|
|
@ -489,17 +489,8 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||||
++stats::EmittedFillFragments;
|
++stats::EmittedFillFragments;
|
||||||
const MCFillFragment &FF = cast<MCFillFragment>(F);
|
const MCFillFragment &FF = cast<MCFillFragment>(F);
|
||||||
|
|
||||||
assert(FF.getValueSize() && "Invalid virtual align in concrete fragment!");
|
for (uint64_t I = 0, E = FF.getSize(); I != E; ++I)
|
||||||
|
OW->write8(FF.getValue());
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,8 +569,7 @@ void MCAssembler::writeSectionData(const MCSection *Sec,
|
||||||
"Invalid align in virtual section!");
|
"Invalid align in virtual section!");
|
||||||
break;
|
break;
|
||||||
case MCFragment::FT_Fill:
|
case MCFragment::FT_Fill:
|
||||||
assert((cast<MCFillFragment>(F).getValueSize() == 0 ||
|
assert((cast<MCFillFragment>(F).getValue() == 0) &&
|
||||||
cast<MCFillFragment>(F).getValue() == 0) &&
|
|
||||||
"Invalid fill in virtual section!");
|
"Invalid fill in virtual section!");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,8 +386,7 @@ void MCFragment::dump() {
|
||||||
}
|
}
|
||||||
case MCFragment::FT_Fill: {
|
case MCFragment::FT_Fill: {
|
||||||
const MCFillFragment *FF = cast<MCFillFragment>(this);
|
const MCFillFragment *FF = cast<MCFillFragment>(this);
|
||||||
OS << " Value:" << FF->getValue() << " ValueSize:" << FF->getValueSize()
|
OS << " Value:" << FF->getValue() << " Size:" << FF->getSize();
|
||||||
<< " Size:" << FF->getSize();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MCFragment::FT_Relaxable: {
|
case MCFragment::FT_Relaxable: {
|
||||||
|
|
|
@ -414,7 +414,7 @@ void MCMachOStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
|
||||||
if (ByteAlignment != 1)
|
if (ByteAlignment != 1)
|
||||||
new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, Section);
|
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);
|
Symbol->setFragment(F);
|
||||||
|
|
||||||
// Update the maximum alignment on the zero fill section if necessary.
|
// Update the maximum alignment on the zero fill section if necessary.
|
||||||
|
|
|
@ -436,9 +436,9 @@ bool MCObjectStreamer::EmitRelocDirective(const MCExpr &Offset, StringRef Name,
|
||||||
|
|
||||||
void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {
|
void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {
|
||||||
const MCSection *Sec = getCurrentSection().first;
|
const MCSection *Sec = getCurrentSection().first;
|
||||||
|
(void)Sec;
|
||||||
assert(Sec && "need a section");
|
assert(Sec && "need a section");
|
||||||
unsigned ItemSize = Sec->isVirtualSection() ? 0 : 1;
|
insert(new MCFillFragment(FillValue, NumBytes));
|
||||||
insert(new MCFillFragment(FillValue, ItemSize, NumBytes));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCObjectStreamer::FinishImpl() {
|
void MCObjectStreamer::FinishImpl() {
|
||||||
|
|
|
@ -258,7 +258,7 @@ void MCWinCOFFStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||||
ByteAlignment, Section);
|
ByteAlignment, Section);
|
||||||
|
|
||||||
MCFillFragment *Fragment = new MCFillFragment(
|
MCFillFragment *Fragment = new MCFillFragment(
|
||||||
/*Value=*/0, /*ValueSize=*/0, Size, Section);
|
/*Value=*/0, Size, Section);
|
||||||
Symbol->setFragment(Fragment);
|
Symbol->setFragment(Fragment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue