[llvm-commits] [llvm] r167269 - /llvm/trunk/runtime/libprofile/CommonProfiling.c

NAKAMURA Takumi geek4civic at gmail.com
Thu Nov 1 18:33:55 PDT 2012


2012/11/2 Manman Ren <mren at apple.com>:
> Author: mren
> Date: Thu Nov  1 20:10:15 2012
> New Revision: 167269
>
> URL: http://llvm.org/viewvc/llvm-project?rev=167269&view=rev
> Log:
> PGO: allows the profile data file name to be specified by the LLVMPROF_OUTPUT
> environment variable.
>
> This allows parallel make for profiling code, without it there are file
> collisions as each parallel run uses the default file name.
>
> There is already code in the runtime library to specify the output file name
> via the command line, but this only works for programs which already process
> argc/argv.  This patch builds on that support.
>
> Patch by Alastair Murray.
>
> Modified:
>     llvm/trunk/runtime/libprofile/CommonProfiling.c
>
> Modified: llvm/trunk/runtime/libprofile/CommonProfiling.c
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/runtime/libprofile/CommonProfiling.c?rev=167269&r1=167268&r2=167269&view=diff
> ==============================================================================
> --- llvm/trunk/runtime/libprofile/CommonProfiling.c (original)
> +++ llvm/trunk/runtime/libprofile/CommonProfiling.c Thu Nov  1 20:10:15 2012
> @@ -28,14 +28,35 @@
>
>  static char *SavedArgs = 0;
>  static unsigned SavedArgsLength = 0;
> +static const char *SavedEnvVar = 0;
>
>  static const char *OutputFilename = "llvmprof.out";
>
> +/* check_environment_variable - Check to see if the LLVMPROF_OUTPUT environment
> + * variable is set.  If it is then save it and set OutputFilename.
> + */
> +static void check_environment_variable(void) {
> +  if (SavedEnvVar) return; /* Guarantee that we can't leak memory. */
> +
> +  const char *EnvVar = getenv("LLVMPROF_OUTPUT");

It's not C89 compliant. Fixed in r167272.

> +  if (EnvVar) {
> +    /* The string that getenv returns is allowed to be statically allocated,
> +     * which means it may be changed by future calls to getenv, so copy it.
> +     */
> +    SavedEnvVar = strdup(EnvVar);
> +    OutputFilename = SavedEnvVar;
> +  }
> +}
> +
>  /* save_arguments - Save argc and argv as passed into the program for the file
>   * we output.
> + * If either the LLVMPROF_OUTPUT environment variable or the -llvmprof-output
> + * command line argument are set then change OutputFilename to the provided
> + * value.  The command line argument value overrides the environment variable.
>   */
>  int save_arguments(int argc, const char **argv) {
>    unsigned Length, i;
> +  if (!SavedEnvVar && !SavedArgs) check_environment_variable();
>    if (SavedArgs || !argv) return argc;  /* This can be called multiple times */
>
>    /* Check to see if there are any arguments passed into the program for the
> @@ -54,6 +75,7 @@
>          puts("-llvmprof-output requires a filename argument!");
>        else {
>          OutputFilename = strdup(argv[1]);
> +        if (SavedEnvVar) { free((void *)SavedEnvVar); SavedEnvVar = 0; }
>          memmove((char**)&argv[1], &argv[2], (argc-1)*sizeof(char*));
>          --argc;
>        }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list