aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCAssembler.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-01-19 17:47:48 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-01-19 17:47:48 +0000
commita39d305dedd38c9c0946385ee643989f2732f223 (patch)
tree2b21f0016316ec4cf0129df578422b7d9b2df3d3 /llvm/lib/MC/MCAssembler.cpp
parent5c6e076eb2a532431d1444d865f02b7dd35fc72d (diff)
downloadllvm-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.cpp17
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;
}