[llvm] r285360 - [Coverage] Darwin: Move __llvm_covmap from __DATA to __LLVM_COV

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 27 16:17:52 PDT 2016


Author: vedantk
Date: Thu Oct 27 18:17:51 2016
New Revision: 285360

URL: http://llvm.org/viewvc/llvm-project?rev=285360&view=rev
Log:
[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.

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

Modified: llvm/trunk/include/llvm/ProfileData/InstrProf.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/InstrProf.h?rev=285360&r1=285359&r2=285360&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ProfileData/InstrProf.h (original)
+++ llvm/trunk/include/llvm/ProfileData/InstrProf.h Thu Oct 27 18:17:51 2016
@@ -82,7 +82,7 @@ inline StringRef getInstrProfValueProfFu
 /// 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;
 }
 

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll?rev=285360&r1=285359&r2=285360&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll Thu Oct 27 18:17:51 2016
@@ -10,12 +10,14 @@ target triple = "x86_64-apple-macosx10.1
 ; 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"
- at .str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap"
+ at .str_noinst_old_cov = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap"
+ at .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




More information about the llvm-commits mailing list