diff options
-rw-r--r-- | lib/profile/InstrProfilingFile.c | 20 | ||||
-rw-r--r-- | lib/profile/InstrProfilingInternal.h | 11 | ||||
-rw-r--r-- | lib/profile/InstrProfilingWriter.c | 32 | ||||
-rw-r--r-- | test/profile/instrprof-bufferio.c | 5 |
4 files changed, 38 insertions, 30 deletions
diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c index 14f7517b6..e2f68002e 100644 --- a/lib/profile/InstrProfilingFile.c +++ b/lib/profile/InstrProfilingFile.c @@ -32,18 +32,24 @@ static uint32_t fileWriter(ProfDataIOVec *IOVecs, uint32_t NumIOVecs, COMPILER_RT_VISIBILITY ProfBufferIO * lprofCreateBufferIOInternal(void *File, uint32_t BufferSz) { - CallocHook = calloc; - FreeHook = free; - return lprofCreateBufferIO(fileWriter, File, BufferSz); + FreeHook = &free; + DynamicBufferIOBuffer = (uint8_t *)calloc(BufferSz, 1); + VPBufferSize = BufferSz; + return lprofCreateBufferIO(fileWriter, File); } -static int writeFile(FILE *File) { +static void setupIOBuffer() { const char *BufferSzStr = 0; - FreeHook = &free; - CallocHook = &calloc; BufferSzStr = getenv("LLVM_VP_BUFFER_SIZE"); - if (BufferSzStr && BufferSzStr[0]) + if (BufferSzStr && BufferSzStr[0]) { VPBufferSize = atoi(BufferSzStr); + DynamicBufferIOBuffer = (uint8_t *)calloc(VPBufferSize, 1); + } +} + +static int writeFile(FILE *File) { + FreeHook = &free; + setupIOBuffer(); return lprofWriteData(fileWriter, File, lprofGatherValueProfData); } diff --git a/lib/profile/InstrProfilingInternal.h b/lib/profile/InstrProfilingInternal.h index a349244c5..5f75baa3a 100644 --- a/lib/profile/InstrProfilingInternal.h +++ b/lib/profile/InstrProfilingInternal.h @@ -68,12 +68,13 @@ typedef struct ProfBufferIO { } ProfBufferIO; /* The creator interface used by testing. */ -ProfBufferIO *lprofCreateBufferIOInternal(void *File, uint32_t DefaultBufferSz); +ProfBufferIO *lprofCreateBufferIOInternal(void *File, uint32_t BufferSz); + /*! * This is the interface to create a handle for buffered IO. */ -ProfBufferIO *lprofCreateBufferIO(WriterCallback FileWriter, void *File, - uint32_t DefaultBufferSz); +ProfBufferIO *lprofCreateBufferIO(WriterCallback FileWriter, void *File); + /*! * The interface to destroy the bufferIO handle and reclaim * the memory. @@ -119,8 +120,8 @@ void lprofMergeValueProfData(struct ValueProfData *SrcValueProfData, COMPILER_RT_VISIBILITY extern char *(*GetEnvHook)(const char *); COMPILER_RT_VISIBILITY extern void (*FreeHook)(void *); -COMPILER_RT_VISIBILITY extern void *(*CallocHook)(size_t, size_t); +COMPILER_RT_VISIBILITY extern uint8_t *DynamicBufferIOBuffer; +COMPILER_RT_VISIBILITY extern uint32_t VPBufferSize; extern void (*VPMergeHook)(struct ValueProfData *, __llvm_profile_data *); -extern uint32_t VPBufferSize; #endif diff --git a/lib/profile/InstrProfilingWriter.c b/lib/profile/InstrProfilingWriter.c index aebe30468..db944e20f 100644 --- a/lib/profile/InstrProfilingWriter.c +++ b/lib/profile/InstrProfilingWriter.c @@ -13,9 +13,13 @@ #define INSTR_PROF_VALUE_PROF_DATA #include "InstrProfData.inc" + COMPILER_RT_VISIBILITY void (*FreeHook)(void *) = NULL; -COMPILER_RT_VISIBILITY void *(*CallocHook)(size_t, size_t) = NULL; -uint32_t VPBufferSize = 0; +static ProfBufferIO TheBufferIO; +#define VP_BUFFER_SIZE 8 * 1024 +static uint8_t BufferIOBuffer[VP_BUFFER_SIZE]; +COMPILER_RT_VISIBILITY uint8_t *DynamicBufferIOBuffer = 0; +COMPILER_RT_VISIBILITY uint32_t VPBufferSize = 0; /* The buffer writer is reponsponsible in keeping writer state * across the call. @@ -43,20 +47,20 @@ static void llvmInitBufferIO(ProfBufferIO *BufferIO, WriterCallback FileWriter, } COMPILER_RT_VISIBILITY ProfBufferIO * -lprofCreateBufferIO(WriterCallback FileWriter, void *File, uint32_t BufferSz) { - ProfBufferIO *BufferIO = (ProfBufferIO *)CallocHook(1, sizeof(ProfBufferIO)); - uint8_t *Buffer = (uint8_t *)CallocHook(1, BufferSz); +lprofCreateBufferIO(WriterCallback FileWriter, void *File) { + uint8_t *Buffer = DynamicBufferIOBuffer; + uint32_t BufferSize = VPBufferSize; if (!Buffer) { - FreeHook(BufferIO); - return 0; + Buffer = &BufferIOBuffer[0]; + BufferSize = sizeof(BufferIOBuffer); } - llvmInitBufferIO(BufferIO, FileWriter, File, Buffer, BufferSz); - return BufferIO; + llvmInitBufferIO(&TheBufferIO, FileWriter, File, Buffer, BufferSize); + return &TheBufferIO; } COMPILER_RT_VISIBILITY void lprofDeleteBufferIO(ProfBufferIO *BufferIO) { - FreeHook(BufferIO->BufferStart); - FreeHook(BufferIO); + if (DynamicBufferIOBuffer) + FreeHook(DynamicBufferIOBuffer); } COMPILER_RT_VISIBILITY int @@ -91,8 +95,6 @@ COMPILER_RT_VISIBILITY int lprofBufferIOFlush(ProfBufferIO *BufferIO) { return 0; } -#define VP_BUFFER_SIZE 8 * 1024 - static int writeOneValueProfData(ProfBufferIO *BufferIO, VPGatherHookType VPDataGatherer, const __llvm_profile_data *Data) { @@ -111,14 +113,12 @@ static int writeValueProfData(WriterCallback Writer, void *WriterCtx, const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd) { ProfBufferIO *BufferIO; - uint32_t BufferSz; const __llvm_profile_data *DI = 0; if (!VPDataGatherer) return 0; - BufferSz = VPBufferSize ? VPBufferSize : VP_BUFFER_SIZE; - BufferIO = lprofCreateBufferIO(Writer, WriterCtx, BufferSz); + BufferIO = lprofCreateBufferIO(Writer, WriterCtx); for (DI = DataBegin; DI < DataEnd; DI++) { if (writeOneValueProfData(BufferIO, VPDataGatherer, DI)) diff --git a/test/profile/instrprof-bufferio.c b/test/profile/instrprof-bufferio.c index b0d5d37b8..558425486 100644 --- a/test/profile/instrprof-bufferio.c +++ b/test/profile/instrprof-bufferio.c @@ -11,7 +11,7 @@ #include <string.h> typedef struct ProfBufferIO ProfBufferIO; -ProfBufferIO *lprofCreateBufferIOInternal(FILE *File, uint32_t DefaultBufferSz); +ProfBufferIO *lprofCreateBufferIOInternal(void *File, uint32_t BufferSz); void lprofDeleteBufferIO(ProfBufferIO *BufferIO); int lprofBufferIOWrite(ProfBufferIO *BufferIO, const char *Data, uint32_t Size); @@ -44,7 +44,8 @@ int main(int argc, const char *argv[]) { BufferIO = lprofCreateBufferIOInternal(File[J], IOBufferSize[J]); - lprofBufferIOWrite(BufferIO, "Short Strings:\n", strlen("Short Strings:\n")); + lprofBufferIOWrite(BufferIO, "Short Strings:\n", + strlen("Short Strings:\n")); for (I = 0; I < 1024; I++) { lprofBufferIOWrite(BufferIO, SmallData, strlen(SmallData)); } |