From d950fb2fa8e5ce29dea42393607af51ad40236ee Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 27 Oct 2016 23:17:51 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285360 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/InstrProf.h | 2 +- .../AddressSanitizer/do-not-instrument-globals-darwin.ll | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index 4d12df903da..267007ea083 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -82,7 +82,7 @@ inline StringRef getInstrProfValueProfFuncName() { /// Return the name of the section containing function coverage mapping /// data. inline StringRef getInstrProfCoverageSectionName(bool AddSegment) { - return AddSegment ? "__DATA," INSTR_PROF_COVMAP_SECT_NAME_STR + return AddSegment ? "__LLVM_COV," INSTR_PROF_COVMAP_SECT_NAME_STR : INSTR_PROF_COVMAP_SECT_NAME_STR; } diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll index 0ca8975a675..7d15cd9537f 100644 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll +++ b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll @@ -10,12 +10,14 @@ target triple = "x86_64-apple-macosx10.10.0" ; CHECK: @foo_noinst = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" @.str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata" -@.str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap" +@.str_noinst_old_cov = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap" +@.str_noinst_new_cov = private unnamed_addr constant [4 x i8] c"aaa\00", section "__LLVM_COV,__llvm_covmap" @.str_noinst_LLVM = private unnamed_addr constant [4 x i8] c"aaa\00", section "__LLVM,__not_visible" @.str_inst = private unnamed_addr constant [4 x i8] c"aaa\00" ; CHECK-NOT: {{asan_gen.*str_noinst}} -; CHECK-NOT: {{asan_gen.*str_noinst_prof}} +; CHECK-NOT: {{asan_gen.*str_noinst_old_cov}} +; CHECK-NOT: {{asan_gen.*str_noinst_new_cov}} ; CHECK-NOT: {{asan_gen.*str_noinst_LLVM}} ; CHECK: {{asan_gen.*str_inst}} ; CHECK: @asan.module_ctor -- 2.40.0