diff --git a/compiler-rt/lib/profile/InstrProfiling.h b/compiler-rt/lib/profile/InstrProfiling.h index 133474b7649c..dd0c9cd4e09a 100644 --- a/compiler-rt/lib/profile/InstrProfiling.h +++ b/compiler-rt/lib/profile/InstrProfiling.h @@ -32,6 +32,8 @@ typedef unsigned int uint32_t; typedef unsigned long long uint64_t; #endif +#define PROFILE_HEADER_SIZE 7 + typedef struct __llvm_profile_data { const uint32_t NameSize; const uint32_t NumCounters; diff --git a/compiler-rt/lib/profile/InstrProfilingBuffer.c b/compiler-rt/lib/profile/InstrProfilingBuffer.c index 2d91961a6162..250e22143595 100644 --- a/compiler-rt/lib/profile/InstrProfilingBuffer.c +++ b/compiler-rt/lib/profile/InstrProfilingBuffer.c @@ -11,13 +11,17 @@ #include uint64_t __llvm_profile_get_size_for_buffer(void) { - return sizeof(uint64_t) * 7 + + /* Match logic in __llvm_profile_write_buffer(). */ + return sizeof(uint64_t) * PROFILE_HEADER_SIZE + PROFILE_RANGE_SIZE(data) * sizeof(__llvm_profile_data) + PROFILE_RANGE_SIZE(counters) * sizeof(uint64_t) + PROFILE_RANGE_SIZE(names) * sizeof(char); } int __llvm_profile_write_buffer(char *Buffer) { + /* Match logic in __llvm_profile_get_size_for_buffer(). + * Match logic in __llvm_profile_write_file(). + */ const __llvm_profile_data *DataBegin = __llvm_profile_data_begin(); const __llvm_profile_data *DataEnd = __llvm_profile_data_end(); const uint64_t *CountersBegin = __llvm_profile_counters_begin(); @@ -31,7 +35,7 @@ int __llvm_profile_write_buffer(char *Buffer) { const uint64_t NamesSize = NamesEnd - NamesBegin; /* Create the header. */ - uint64_t Header[] = { + uint64_t Header[PROFILE_HEADER_SIZE] = { __llvm_profile_get_magic(), __llvm_profile_get_version(), DataSize, @@ -47,10 +51,10 @@ int __llvm_profile_write_buffer(char *Buffer) { memcpy(Buffer, Data, Size); \ Buffer += Size; \ } while (0) - UPDATE_memcpy(Header, sizeof(Header)); - UPDATE_memcpy(DataBegin, DataSize * sizeof(__llvm_profile_data)); - UPDATE_memcpy(CountersBegin, CountersSize * sizeof(uint64_t)); - UPDATE_memcpy(NamesBegin, NamesSize * sizeof(char)); + UPDATE_memcpy(Header, PROFILE_HEADER_SIZE * sizeof(uint64_t)); + UPDATE_memcpy(DataBegin, DataSize * sizeof(__llvm_profile_data)); + UPDATE_memcpy(CountersBegin, CountersSize * sizeof(uint64_t)); + UPDATE_memcpy(NamesBegin, NamesSize * sizeof(char)); #undef UPDATE_memcpy return 0; diff --git a/compiler-rt/lib/profile/InstrProfilingFile.c b/compiler-rt/lib/profile/InstrProfilingFile.c index 27fa92611e60..1bd2af323b91 100644 --- a/compiler-rt/lib/profile/InstrProfilingFile.c +++ b/compiler-rt/lib/profile/InstrProfilingFile.c @@ -13,6 +13,7 @@ #include static int writeFile(FILE *File) { + /* Match logic in __llvm_profile_write_buffer(). */ const __llvm_profile_data *DataBegin = __llvm_profile_data_begin(); const __llvm_profile_data *DataEnd = __llvm_profile_data_end(); const uint64_t *CountersBegin = __llvm_profile_counters_begin(); @@ -25,29 +26,24 @@ static int writeFile(FILE *File) { const uint64_t CountersSize = CountersEnd - CountersBegin; const uint64_t NamesSize = NamesEnd - NamesBegin; - /* Get rest of header data. */ - const uint64_t Magic = __llvm_profile_get_magic(); - const uint64_t Version = __llvm_profile_get_version(); - const uint64_t CountersDelta = (uint64_t)CountersBegin; - const uint64_t NamesDelta = (uint64_t)NamesBegin; - -#define CHECK_fwrite(Data, Size, Length, File) \ - do { if (fwrite(Data, Size, Length, File) != Length) return -1; } while (0) - - /* Write the header. */ - CHECK_fwrite(&Magic, sizeof(uint64_t), 1, File); - CHECK_fwrite(&Version, sizeof(uint64_t), 1, File); - CHECK_fwrite(&DataSize, sizeof(uint64_t), 1, File); - CHECK_fwrite(&CountersSize, sizeof(uint64_t), 1, File); - CHECK_fwrite(&NamesSize, sizeof(uint64_t), 1, File); - CHECK_fwrite(&CountersDelta, sizeof(uint64_t), 1, File); - CHECK_fwrite(&NamesDelta, sizeof(uint64_t), 1, File); + /* Create the header. */ + uint64_t Header[PROFILE_HEADER_SIZE] = { + __llvm_profile_get_magic(), + __llvm_profile_get_version(), + DataSize, + CountersSize, + NamesSize, + (uint64_t)CountersBegin, + (uint64_t)NamesBegin + }; /* Write the data. */ - CHECK_fwrite(DataBegin, sizeof(__llvm_profile_data), DataSize, File); +#define CHECK_fwrite(Data, Size, Length, File) \ + do { if (fwrite(Data, Size, Length, File) != Length) return -1; } while (0) + CHECK_fwrite(Header, sizeof(uint64_t), PROFILE_HEADER_SIZE, File); + CHECK_fwrite(DataBegin, sizeof(__llvm_profile_data), DataSize, File); CHECK_fwrite(CountersBegin, sizeof(uint64_t), CountersSize, File); - CHECK_fwrite(NamesBegin, sizeof(char), NamesSize, File); - + CHECK_fwrite(NamesBegin, sizeof(char), NamesSize, File); #undef CHECK_fwrite return 0;