[compiler-rt] r269453 - [profile] Eliminate dynamic memory allocation for buffered writer
Sean Silva via llvm-commits
llvm-commits at lists.llvm.org
Fri May 13 19:30:48 PDT 2016
On Fri, May 13, 2016 at 11:26 AM, Xinliang David Li via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: davidxl
> Date: Fri May 13 13:26:26 2016
> New Revision: 269453
>
> URL: http://llvm.org/viewvc/llvm-project?rev=269453&view=rev
> Log:
> [profile] Eliminate dynamic memory allocation for buffered writer
>
> With this change, dynamic memory allocation is only used
> for testing purpose. This change is one of the many steps to
> make instrument profiler dynamic allocation free.
>
>
> Modified:
> compiler-rt/trunk/lib/profile/InstrProfilingFile.c
> compiler-rt/trunk/lib/profile/InstrProfilingInternal.h
> compiler-rt/trunk/lib/profile/InstrProfilingWriter.c
> compiler-rt/trunk/test/profile/instrprof-bufferio.c
>
> Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=269453&r1=269452&r2=269453&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
> +++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Fri May 13 13:26:26
> 2016
> @@ -32,18 +32,24 @@ static uint32_t fileWriter(ProfDataIOVec
>
> 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);
> }
>
>
> Modified: compiler-rt/trunk/lib/profile/InstrProfilingInternal.h
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingInternal.h?rev=269453&r1=269452&r2=269453&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/InstrProfilingInternal.h (original)
> +++ compiler-rt/trunk/lib/profile/InstrProfilingInternal.h Fri May 13
> 13:26:26 2016
> @@ -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 Valu
>
> 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
>
> Modified: compiler-rt/trunk/lib/profile/InstrProfilingWriter.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingWriter.c?rev=269453&r1=269452&r2=269453&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/lib/profile/InstrProfilingWriter.c (original)
> +++ compiler-rt/trunk/lib/profile/InstrProfilingWriter.c Fri May 13
> 13:26:26 2016
> @@ -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(ProfBufferI
> }
>
> 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);
>
Should we set DynamicBufferIOBuffer to NULL to avoid trying to free it
again?
-- Sean Silva
> }
>
> COMPILER_RT_VISIBILITY int
> @@ -91,8 +95,6 @@ COMPILER_RT_VISIBILITY int lprofBufferIO
> 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(WriterCall
> 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))
>
> Modified: compiler-rt/trunk/test/profile/instrprof-bufferio.c
> URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-bufferio.c?rev=269453&r1=269452&r2=269453&view=diff
>
> ==============================================================================
> --- compiler-rt/trunk/test/profile/instrprof-bufferio.c (original)
> +++ compiler-rt/trunk/test/profile/instrprof-bufferio.c Fri May 13
> 13:26:26 2016
> @@ -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));
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160513/3de72d3e/attachment.html>
More information about the llvm-commits
mailing list