InstrProf: Unify logic in two profile writers

<rdar://problem/15943240>

llvm-svn: 204500
This commit is contained in:
Duncan P. N. Exon Smith 2014-03-21 18:29:24 +00:00
parent 117cf2bd1f
commit 812dcae09c
3 changed files with 28 additions and 26 deletions

View File

@ -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;

View File

@ -11,13 +11,17 @@
#include <string.h>
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;

View File

@ -13,6 +13,7 @@
#include <string.h>
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;