@@ -101,6 +101,8 @@ static const int UseBiasVar = 0;
101
101
static const char * FileOpenMode = "a+b" ;
102
102
static void * BiasAddr = NULL ;
103
103
static void * BiasDefaultAddr = NULL ;
104
+ static void * BitmapBiasAddr = NULL ;
105
+ static void * BitmapBiasDefaultAddr = NULL ;
104
106
static int mmapForContinuousMode (uint64_t CurrentFileOffset , FILE * File ) {
105
107
/* Get the sizes of various profile data sections. Taken from
106
108
* __llvm_profile_get_size_for_buffer(). */
@@ -199,11 +201,15 @@ static int mmapForContinuousMode(uint64_t CurrentFileOffset, FILE *File) {
199
201
#define INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR \
200
202
INSTR_PROF_CONCAT(INSTR_PROF_PROFILE_COUNTER_BIAS_VAR, _default)
201
203
COMPILER_RT_VISIBILITY intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR = 0 ;
204
+ #define INSTR_PROF_PROFILE_BITMAP_BIAS_DEFAULT_VAR \
205
+ INSTR_PROF_CONCAT(INSTR_PROF_PROFILE_BITMAP_BIAS_VAR, _default)
206
+ COMPILER_RT_VISIBILITY intptr_t INSTR_PROF_PROFILE_BITMAP_BIAS_DEFAULT_VAR = 0 ;
202
207
203
208
/* This variable is a weak external reference which could be used to detect
204
209
* whether or not the compiler defined this symbol. */
205
210
#if defined(_MSC_VER )
206
211
COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR ;
212
+ COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_BITMAP_BIAS_VAR ;
207
213
#if defined(_M_IX86 ) || defined(__i386__ )
208
214
#define WIN_SYM_PREFIX "_"
209
215
#else
@@ -213,10 +219,17 @@ COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR;
213
219
linker, "/alternatename:" WIN_SYM_PREFIX INSTR_PROF_QUOTE( \
214
220
INSTR_PROF_PROFILE_COUNTER_BIAS_VAR) "=" WIN_SYM_PREFIX \
215
221
INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR))
222
+ #pragma comment( \
223
+ linker, "/alternatename:" WIN_SYM_PREFIX INSTR_PROF_QUOTE( \
224
+ INSTR_PROF_PROFILE_BITMAP_BIAS_VAR) "=" WIN_SYM_PREFIX \
225
+ INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_BITMAP_BIAS_DEFAULT_VAR))
216
226
#else
217
227
COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR
218
228
__attribute__((weak , alias (INSTR_PROF_QUOTE (
219
229
INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR )))) ;
230
+ COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_BITMAP_BIAS_VAR
231
+ __attribute__((weak , alias (INSTR_PROF_QUOTE (
232
+ INSTR_PROF_PROFILE_BITMAP_BIAS_DEFAULT_VAR )))) ;
220
233
#endif
221
234
static const int ContinuousModeSupported = 1 ;
222
235
static const int UseBiasVar = 1 ;
@@ -227,6 +240,9 @@ static const char *FileOpenMode = "w+b";
227
240
* used and runtime provides a weak alias so we can check if it's defined. */
228
241
static void * BiasAddr = & INSTR_PROF_PROFILE_COUNTER_BIAS_VAR ;
229
242
static void * BiasDefaultAddr = & INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR ;
243
+ static void * BitmapBiasAddr = & INSTR_PROF_PROFILE_BITMAP_BIAS_VAR ;
244
+ static void * BitmapBiasDefaultAddr =
245
+ & INSTR_PROF_PROFILE_BITMAP_BIAS_DEFAULT_VAR ;
230
246
static int mmapForContinuousMode (uint64_t CurrentFileOffset , FILE * File ) {
231
247
/* Get the sizes of various profile data sections. Taken from
232
248
* __llvm_profile_get_size_for_buffer(). */
@@ -237,12 +253,18 @@ static int mmapForContinuousMode(uint64_t CurrentFileOffset, FILE *File) {
237
253
const char * BitmapBegin = __llvm_profile_begin_bitmap ();
238
254
const char * BitmapEnd = __llvm_profile_end_bitmap ();
239
255
uint64_t DataSize = __llvm_profile_get_data_size (DataBegin , DataEnd );
256
+ uint64_t CountersSize =
257
+ __llvm_profile_get_counters_size (CountersBegin , CountersEnd );
258
+ uint64_t NumBitmapBytes =
259
+ __llvm_profile_get_num_bitmap_bytes (BitmapBegin , BitmapEnd );
240
260
/* Get the file size. */
241
261
uint64_t FileSize = 0 ;
242
262
if (getProfileFileSizeForMerging (File , & FileSize ))
243
263
return 1 ;
244
264
245
265
int Fileno = fileno (File );
266
+ uint64_t PaddingBytesAfterCounters =
267
+ __llvm_profile_get_num_padding_bytes (CountersSize );
246
268
uint64_t FileOffsetToCounters =
247
269
sizeof (__llvm_profile_header ) + __llvm_write_binary_ids (NULL ) + DataSize ;
248
270
@@ -260,7 +282,17 @@ static int mmapForContinuousMode(uint64_t CurrentFileOffset, FILE *File) {
260
282
/* Return the memory allocated for counters to OS. */
261
283
lprofReleaseMemoryPagesToOS ((uintptr_t )CountersBegin , (uintptr_t )CountersEnd );
262
284
263
- /* BIAS MODE not supported yet for Bitmap (MCDC). */
285
+ /* Also mmap MCDC bitmap bytes. If there aren't any bitmap bytes, mmap()
286
+ * will fail with EINVAL. */
287
+ if (NumBitmapBytes == 0 )
288
+ return 0 ;
289
+
290
+ /* Update profbm_bias. */
291
+ uint64_t FileOffsetToBitmap =
292
+ FileOffsetToCounters + CountersSize + PaddingBytesAfterCounters ;
293
+ /* Update the profile fields based on the current mapping. */
294
+ INSTR_PROF_PROFILE_BITMAP_BIAS_VAR =
295
+ (uintptr_t )Profile - (uintptr_t )BitmapBegin + FileOffsetToBitmap ;
264
296
265
297
/* Return the memory allocated for counters to OS. */
266
298
lprofReleaseMemoryPagesToOS ((uintptr_t )BitmapBegin , (uintptr_t )BitmapEnd );
@@ -619,8 +651,10 @@ static void initializeProfileForContinuousMode(void) {
619
651
PROF_ERR ("%s\n" , "continuous mode is unsupported on this platform" );
620
652
return ;
621
653
}
622
- if (UseBiasVar && BiasAddr == BiasDefaultAddr ) {
623
- PROF_ERR ("%s\n" , "__llvm_profile_counter_bias is undefined" );
654
+ if (UseBiasVar && BiasAddr == BiasDefaultAddr &&
655
+ BitmapBiasAddr == BitmapBiasDefaultAddr ) {
656
+ PROF_ERR ("%s\n" , "Neither __llvm_profile_counter_bias nor "
657
+ "__llvm_profile_bitmap_bias is defined" );
624
658
return ;
625
659
}
626
660
0 commit comments