[Coverage] Darwin: Move __llvm_covmap from __DATA to __LLVM_COV
authorVedant Kumar <vsk@apple.com>
Thu, 27 Oct 2016 23:17:51 +0000 (23:17 +0000)
committerVedant Kumar <vsk@apple.com>
Thu, 27 Oct 2016 23:17:51 +0000 (23:17 +0000)
commit75f1de0c1a939258054869ebdbdd7a20b917201b
tree9088d0ed3fc7f98e655d3270d2e7731f4de1e436
parentb133fbb9a49123f0caa05677d7d034ec7b0bdc09
[Coverage] Darwin: Move __llvm_covmap from __DATA to __LLVM_COV

Programs with very large __llvm_covmap sections may fail to link on
Darwin because because of out-of-range 32-bit RIP relative references.
It isn't possible to work around this by using the large code model
because it isn't supported on Darwin. One solution is to move the
__llvm_covmap section past the end of the __DATA segment.

=== Testing ===

In addition to check-{llvm,clang,profile}, I performed a link test on a
simple object after injecting ~4GB of padding into __llvm_covmap:

  @__llvm_coverage_padding = internal constant [4000000000 x i8] zeroinitializer, section "__LLVM_COV,__llvm_covmap", align 8

(This test is too expensive to check-in.)

=== Backwards Compatibility ===

This patch should not pose any backwards-compatibility concerns. LLVM
is expected to scan all of the sections in a binary for __llvm_covmap,
so changing its segment shouldn't affect anything. I double-checked this
by loading coverage produced by an unpatched compiler with a patched
llvm-cov.

Suggested by Nick Kledzik.

llvm-svn: 285360
llvm/include/llvm/ProfileData/InstrProf.h
llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll