Write relocation sections contiguously.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Apr 2015 08:11:38 +0000 (08:11 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Apr 2015 08:11:38 +0000 (08:11 +0000)
commitb4b0b34181de1e28cd55ed5123b15cef13db858a
tree26f734f02af6d17e7760d9eca7929ddcc75fc0fc
parent5023f151a7501d68d7c0f2bf94f0fb6badb93ae8
Write relocation sections contiguously.

Linkers normally read all the relocations upfront to compute the references
between sections. Putting them together is a bit more cache friendly.

I benchmarked linking a Release+Asserts clang with gold on a vm. I tried all
4 combinations of --gc-sections/no --gc-section hot and cold cache.

I cleared the cache with

echo 3 > /proc/sys/vm/drop_caches

and warmed it up by running the link once before timing the subsequent ones.

With cold cache and --gc-sections the time goes from

1.86130781665 +- 0.01713126697463843 seconds
to
1.82370735105 +- 0.014127522318814516 seconds

With cold cache and no --gc-sections the time goes from

1.6087245435500002 +- 0.012999066825178644 seconds
to
1.5687122041500001 +- 0.013145850126026619 seconds

With hot cache and no --gc-sections the time goes from

0.926200939 ( +-  0.33% ) seconds
to
0.907200079 ( +-  0.31% ) seconds

With hot cache and gc sections the time goes from

1.183038049 ( +-  0.34% ) seconds
to
1.147355862 ( +-  0.39% ) seconds

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235165 91177308-0d34-0410-b5e6-96231b3b80d8
lib/MC/ELFObjectWriter.cpp
test/MC/ARM/eh-directive-section-comdat.s
test/MC/ARM/eh-directive-section.s
test/MC/ARM/eh-link.s
test/MC/ELF/comdat-reloc.s