summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/profile/InstrProfilingFile.c20
-rw-r--r--lib/profile/InstrProfilingInternal.h11
-rw-r--r--lib/profile/InstrProfilingWriter.c32
-rw-r--r--test/profile/instrprof-bufferio.c5
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));
}