@@ -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(). */
@@ -194,16 +196,20 @@ static int mmapForContinuousMode(uint64_t CurrentFileOffset, FILE *File) {
194
196
}
195
197
return 0 ;
196
198
}
197
- #elif defined(__ELF__ ) || defined(_WIN32 )
199
+ #elif defined(__ELF__ ) || defined(_WIN32 ) || defined( _AIX )
198
200
199
201
#define INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR \
200
202
INSTR_PROF_CONCAT(INSTR_PROF_PROFILE_COUNTER_BIAS_VAR, _default)
201
- COMPILER_RT_VISIBILITY intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_DEFAULT_VAR = 0 ;
203
+ COMPILER_RT_VISIBILITY int64_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 int64_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
- COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR ;
211
+ COMPILER_RT_VISIBILITY extern int64_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR ;
212
+ COMPILER_RT_VISIBILITY extern int64_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
- COMPILER_RT_VISIBILITY extern intptr_t INSTR_PROF_PROFILE_COUNTER_BIAS_VAR
227
+ COMPILER_RT_VISIBILITY extern int64_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 int64_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 );
@@ -272,6 +304,8 @@ static const int UseBiasVar = 0;
272
304
static const char * FileOpenMode = "a+b" ;
273
305
static void * BiasAddr = NULL ;
274
306
static void * BiasDefaultAddr = NULL ;
307
+ static void * BitmapBiasAddr = NULL ;
308
+ static void * BitmapBiasDefaultAddr = NULL ;
275
309
static int mmapForContinuousMode (uint64_t CurrentFileOffset , FILE * File ) {
276
310
return 0 ;
277
311
}
@@ -619,8 +653,10 @@ static void initializeProfileForContinuousMode(void) {
619
653
PROF_ERR ("%s\n" , "continuous mode is unsupported on this platform" );
620
654
return ;
621
655
}
622
- if (UseBiasVar && BiasAddr == BiasDefaultAddr ) {
623
- PROF_ERR ("%s\n" , "__llvm_profile_counter_bias is undefined" );
656
+ if (UseBiasVar && BiasAddr == BiasDefaultAddr &&
657
+ BitmapBiasAddr == BitmapBiasDefaultAddr ) {
658
+ PROF_ERR ("%s\n" , "Neither __llvm_profile_counter_bias nor "
659
+ "__llvm_profile_bitmap_bias is defined" );
624
660
return ;
625
661
}
626
662
@@ -826,7 +862,7 @@ static int parseFilenamePattern(const char *FilenamePat,
826
862
__llvm_profile_disable_continuous_mode ();
827
863
return -1 ;
828
864
}
829
- #if defined(__APPLE__ ) || defined(__ELF__ ) || defined(_WIN32 )
865
+ #if defined(__APPLE__ ) || defined(__ELF__ ) || defined(_WIN32 ) || defined( _AIX )
830
866
__llvm_profile_set_page_size (getpagesize ());
831
867
__llvm_profile_enable_continuous_mode ();
832
868
#else
@@ -1223,7 +1259,7 @@ int __llvm_profile_register_write_file_atexit(void) {
1223
1259
lprofSetupValueProfiler ();
1224
1260
1225
1261
HasBeenRegistered = 1 ;
1226
- return atexit (writeFileWithoutReturn );
1262
+ return lprofAtExit (writeFileWithoutReturn );
1227
1263
}
1228
1264
1229
1265
COMPILER_RT_VISIBILITY int __llvm_profile_set_file_object (FILE * File ,
0 commit comments