InstrProf: Unify logic in two profile writers
<rdar://problem/15943240> llvm-svn: 204500
This commit is contained in:
parent
117cf2bd1f
commit
812dcae09c
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue