diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-01-19 17:47:48 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-01-19 17:47:48 +0000 |
commit | a39d305dedd38c9c0946385ee643989f2732f223 (patch) | |
tree | 2b21f0016316ec4cf0129df578422b7d9b2df3d3 /llvm/lib/MC/MCAssembler.cpp | |
parent | 5c6e076eb2a532431d1444d865f02b7dd35fc72d (diff) | |
download | llvm-a39d305dedd38c9c0946385ee643989f2732f223.zip llvm-a39d305dedd38c9c0946385ee643989f2732f223.tar.gz llvm-a39d305dedd38c9c0946385ee643989f2732f223.tar.bz2 |
Use larger write sizes for MCFillFragment.
This brings the pr26208 testcase down to 3.2 seconds. Not checking it in
since it does create a 4GB .o file.
llvm-svn: 258149
Diffstat (limited to 'llvm/lib/MC/MCAssembler.cpp')
-rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index a88e3df..6965b1b 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -488,9 +488,20 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout, case MCFragment::FT_Fill: { ++stats::EmittedFillFragments; const MCFillFragment &FF = cast<MCFillFragment>(F); - - for (uint64_t I = 0, E = FF.getSize(); I != E; ++I) - OW->write8(FF.getValue()); + uint8_t V = FF.getValue(); + const unsigned MaxChunkSize = 16; + char Data[MaxChunkSize]; + memcpy(Data, &V, 1); + for (unsigned I = 1; I < MaxChunkSize; ++I) + Data[I] = Data[0]; + + uint64_t Size = FF.getSize(); + for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) { + StringRef Ref(Data, ChunkSize); + for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I) + OW->writeBytes(Ref); + Size = Size % ChunkSize; + } break; } |