From f938294524df0b8a39a220e7e77ace25edbb9bb8 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Tue, 10 May 2016 00:17:31 +0000 Subject: Reapply r268840: [profile] Simplify value profile writing Revert r268864 that reverted 268840 after underlying problem is fixed for arm bot. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@268992 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/profile/InstrProfiling.h | 10 +------ lib/profile/InstrProfilingBuffer.c | 4 +-- lib/profile/InstrProfilingFile.c | 5 +--- lib/profile/InstrProfilingInternal.h | 11 ++++--- lib/profile/InstrProfilingValue.c | 56 +++++++++--------------------------- lib/profile/InstrProfilingWriter.c | 55 ++++++++++++++++++----------------- 6 files changed, 53 insertions(+), 88 deletions(-) (limited to 'lib') diff --git a/lib/profile/InstrProfiling.h b/lib/profile/InstrProfiling.h index 6ee54c51c..5b1a91ea2 100644 --- a/lib/profile/InstrProfiling.h +++ b/lib/profile/InstrProfiling.h @@ -94,15 +94,7 @@ int __llvm_profile_check_compatibility(const char *Profile, void INSTR_PROF_VALUE_PROF_FUNC( #define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType) ArgType ArgName #include "InstrProfData.inc" -); - -/*! - * \brief Prepares the value profiling data for output. - * - * Returns an array of pointers to value profile data. - */ -struct ValueProfData; -struct ValueProfData **__llvm_profile_gather_value_data(uint64_t *Size); + ); /*! * \brief Write instrumentation data to the current file. diff --git a/lib/profile/InstrProfilingBuffer.c b/lib/profile/InstrProfilingBuffer.c index dcb6929cb..ac259e83c 100644 --- a/lib/profile/InstrProfilingBuffer.c +++ b/lib/profile/InstrProfilingBuffer.c @@ -46,7 +46,7 @@ uint64_t __llvm_profile_get_size_for_buffer_internal( } COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer(char *Buffer) { - return lprofWriteData(lprofBufferWriter, Buffer, 0, 0); + return lprofWriteData(lprofBufferWriter, Buffer, 0); } COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer_internal( @@ -54,6 +54,6 @@ COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer_internal( const __llvm_profile_data *DataEnd, const uint64_t *CountersBegin, const uint64_t *CountersEnd, const char *NamesBegin, const char *NamesEnd) { return lprofWriteDataImpl(lprofBufferWriter, Buffer, DataBegin, DataEnd, - CountersBegin, CountersEnd, 0, 0, NamesBegin, + CountersBegin, CountersEnd, 0, NamesBegin, NamesEnd); } diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c index 9d63269eb..14f7517b6 100644 --- a/lib/profile/InstrProfilingFile.c +++ b/lib/profile/InstrProfilingFile.c @@ -39,15 +39,12 @@ lprofCreateBufferIOInternal(void *File, uint32_t BufferSz) { static int writeFile(FILE *File) { const char *BufferSzStr = 0; - uint64_t ValueDataSize = 0; - struct ValueProfData **ValueDataArray = - __llvm_profile_gather_value_data(&ValueDataSize); FreeHook = &free; CallocHook = &calloc; BufferSzStr = getenv("LLVM_VP_BUFFER_SIZE"); if (BufferSzStr && BufferSzStr[0]) VPBufferSize = atoi(BufferSzStr); - return lprofWriteData(fileWriter, File, ValueDataArray, ValueDataSize); + return lprofWriteData(fileWriter, File, lprofGatherValueProfData); } static int writeFileWithName(const char *OutputName) { diff --git a/lib/profile/InstrProfilingInternal.h b/lib/profile/InstrProfilingInternal.h index e72bfee71..a349244c5 100644 --- a/lib/profile/InstrProfilingInternal.h +++ b/lib/profile/InstrProfilingInternal.h @@ -98,17 +98,20 @@ int lprofBufferIOFlush(ProfBufferIO *BufferIO); uint32_t lprofBufferWriter(ProfDataIOVec *IOVecs, uint32_t NumIOVecs, void **WriterCtx); +typedef struct ValueProfData *(*VPGatherHookType)( + const __llvm_profile_data *Data); int lprofWriteData(WriterCallback Writer, void *WriterCtx, - struct ValueProfData **ValueDataArray, - const uint64_t ValueDataSize); + VPGatherHookType VPDataGatherer); int lprofWriteDataImpl(WriterCallback Writer, void *WriterCtx, const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd, const uint64_t *CountersBegin, const uint64_t *CountersEnd, - struct ValueProfData **ValueDataBeginArray, - const uint64_t ValueDataSize, const char *NamesBegin, + VPGatherHookType VPDataGatherer, const char *NamesBegin, const char *NamesEnd); +/* Gather value profile data from \c Data and return it. */ +struct ValueProfData *lprofGatherValueProfData(const __llvm_profile_data *Data); + /* Merge value profile data pointed to by SrcValueProfData into * in-memory profile counters pointed by to DstData. */ void lprofMergeValueProfData(struct ValueProfData *SrcValueProfData, diff --git a/lib/profile/InstrProfilingValue.c b/lib/profile/InstrProfilingValue.c index 4b4c82e80..3fe913e9d 100644 --- a/lib/profile/InstrProfilingValue.c +++ b/lib/profile/InstrProfilingValue.c @@ -21,7 +21,6 @@ #define PROF_OOM_RETURN(Msg) \ { \ PROF_OOM(Msg) \ - free(ValueDataArray); \ return NULL; \ } @@ -118,51 +117,22 @@ __llvm_profile_instrument_target(uint64_t TargetValue, void *Data, } } -COMPILER_RT_VISIBILITY ValueProfData ** -__llvm_profile_gather_value_data(uint64_t *ValueDataSize) { - size_t S = 0; - __llvm_profile_data *I; - ValueProfData **ValueDataArray; - - const __llvm_profile_data *DataEnd = __llvm_profile_end_data(); - const __llvm_profile_data *DataBegin = __llvm_profile_begin_data(); - - if (!ValueDataSize) - return NULL; - - ValueDataArray = (ValueProfData **)calloc( - __llvm_profile_get_data_size(DataBegin, DataEnd), sizeof(void *)); - if (!ValueDataArray) +COMPILER_RT_VISIBILITY struct ValueProfData * +lprofGatherValueProfData(const __llvm_profile_data *Data) { + ValueProfData *VD = NULL; + ValueProfRuntimeRecord R; + if (initializeValueProfRuntimeRecord(&R, Data->NumValueSites, Data->Values)) PROF_OOM_RETURN("Failed to write value profile data "); - /* - * Compute the total Size of the buffer to hold ValueProfData - * structures for functions with value profile data. - */ - for (I = (__llvm_profile_data *)DataBegin; I < DataEnd; ++I) { - ValueProfRuntimeRecord R; - if (initializeValueProfRuntimeRecord(&R, I->NumValueSites, I->Values)) + /* Compute the size of ValueProfData from this runtime record. */ + if (getNumValueKindsRT(&R) != 0) { + uint32_t VS = getValueProfDataSizeRT(&R); + VD = (ValueProfData *)calloc(VS, sizeof(uint8_t)); + if (!VD) PROF_OOM_RETURN("Failed to write value profile data "); - - /* Compute the size of ValueProfData from this runtime record. */ - if (getNumValueKindsRT(&R) != 0) { - ValueProfData *VD = NULL; - uint32_t VS = getValueProfDataSizeRT(&R); - VD = (ValueProfData *)calloc(VS, sizeof(uint8_t)); - if (!VD) - PROF_OOM_RETURN("Failed to write value profile data "); - serializeValueProfDataFromRT(&R, VD); - ValueDataArray[I - DataBegin] = VD; - S += VS; - } - finalizeValueProfRuntimeRecord(&R); - } - - if (!S) { - free(ValueDataArray); - ValueDataArray = NULL; + serializeValueProfDataFromRT(&R, VD); } + finalizeValueProfRuntimeRecord(&R); - *ValueDataSize = S; - return ValueDataArray; + return VD; } diff --git a/lib/profile/InstrProfilingWriter.c b/lib/profile/InstrProfilingWriter.c index 9513931c6..3bfcc6be0 100644 --- a/lib/profile/InstrProfilingWriter.c +++ b/lib/profile/InstrProfilingWriter.c @@ -91,42 +91,29 @@ COMPILER_RT_VISIBILITY int lprofBufferIOFlush(ProfBufferIO *BufferIO) { return 0; } -COMPILER_RT_VISIBILITY int lprofWriteData(WriterCallback Writer, - void *WriterCtx, - ValueProfData **ValueDataArray, - const uint64_t ValueDataSize) { - /* Match logic in __llvm_profile_write_buffer(). */ - const __llvm_profile_data *DataBegin = __llvm_profile_begin_data(); - const __llvm_profile_data *DataEnd = __llvm_profile_end_data(); - const uint64_t *CountersBegin = __llvm_profile_begin_counters(); - const uint64_t *CountersEnd = __llvm_profile_end_counters(); - const char *NamesBegin = __llvm_profile_begin_names(); - const char *NamesEnd = __llvm_profile_end_names(); - return lprofWriteDataImpl(Writer, WriterCtx, DataBegin, DataEnd, - CountersBegin, CountersEnd, ValueDataArray, - ValueDataSize, NamesBegin, NamesEnd); -} - #define VP_BUFFER_SIZE 8 * 1024 static int writeValueProfData(WriterCallback Writer, void *WriterCtx, - ValueProfData **ValueDataBegin, - uint64_t NumVData) { + VPGatherHookType VPDataGatherer, + const __llvm_profile_data *DataBegin, + const __llvm_profile_data *DataEnd) { ProfBufferIO *BufferIO; - uint32_t I = 0, BufferSz; + uint32_t BufferSz; + const __llvm_profile_data *DI = 0; - if (!ValueDataBegin) + if (!VPDataGatherer) return 0; BufferSz = VPBufferSize ? VPBufferSize : VP_BUFFER_SIZE; BufferIO = lprofCreateBufferIO(Writer, WriterCtx, BufferSz); - for (I = 0; I < NumVData; I++) { - ValueProfData *CurVData = ValueDataBegin[I]; + for (DI = DataBegin; DI < DataEnd; DI++) { + ValueProfData *CurVData = VPDataGatherer(DI); if (!CurVData) continue; if (lprofBufferIOWrite(BufferIO, (const uint8_t *)CurVData, CurVData->TotalSize) != 0) return -1; + FreeHook(CurVData); } if (lprofBufferIOFlush(BufferIO) != 0) @@ -136,13 +123,28 @@ static int writeValueProfData(WriterCallback Writer, void *WriterCtx, return 0; } +COMPILER_RT_VISIBILITY int lprofWriteData(WriterCallback Writer, + void *WriterCtx, + VPGatherHookType VPDataGatherer) { + /* Match logic in __llvm_profile_write_buffer(). */ + const __llvm_profile_data *DataBegin = __llvm_profile_begin_data(); + const __llvm_profile_data *DataEnd = __llvm_profile_end_data(); + const uint64_t *CountersBegin = __llvm_profile_begin_counters(); + const uint64_t *CountersEnd = __llvm_profile_end_counters(); + const char *NamesBegin = __llvm_profile_begin_names(); + const char *NamesEnd = __llvm_profile_end_names(); + return lprofWriteDataImpl(Writer, WriterCtx, DataBegin, DataEnd, + CountersBegin, CountersEnd, VPDataGatherer, + NamesBegin, NamesEnd); +} + COMPILER_RT_VISIBILITY int lprofWriteDataImpl(WriterCallback Writer, void *WriterCtx, const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd, const uint64_t *CountersBegin, const uint64_t *CountersEnd, - ValueProfData **ValueDataBegin, const uint64_t ValueDataSize, - const char *NamesBegin, const char *NamesEnd) { + VPGatherHookType VPDataGatherer, const char *NamesBegin, + const char *NamesEnd) { /* Calculate size of sections. */ const uint64_t DataSize = __llvm_profile_get_data_size(DataBegin, DataEnd); @@ -159,7 +161,7 @@ lprofWriteDataImpl(WriterCallback Writer, void *WriterCtx, if (!DataSize) return 0; - /* Initialize header struture. */ +/* Initialize header structure. */ #define INSTR_PROF_RAW_HEADER(Type, Name, Init) Header.Name = Init; #include "InstrProfData.inc" @@ -172,5 +174,6 @@ lprofWriteDataImpl(WriterCallback Writer, void *WriterCtx, if (Writer(IOVec, sizeof(IOVec) / sizeof(*IOVec), &WriterCtx)) return -1; - return writeValueProfData(Writer, WriterCtx, ValueDataBegin, DataSize); + return writeValueProfData(Writer, WriterCtx, VPDataGatherer, DataBegin, + DataEnd); } -- cgit v1.2.3