예제 #1
0
static int setFilenamePossiblyWithPid(const char *Filename) {
#define MAX_PID_SIZE 16
  char PidChars[MAX_PID_SIZE] = {0};
  int NumPids = 0, PidLength = 0;
  char *Allocated;
  int I, J;

  /* Reset filename on NULL, except with env var which is checked by caller. */
  if (!Filename) {
    resetFilenameToDefault();
    return 0;
  }

  /* Check the filename for "%p", which indicates a pid-substitution. */
  for (I = 0; Filename[I]; ++I)
    if (Filename[I] == '%' && Filename[++I] == 'p')
      if (!NumPids++) {
        PidLength = snprintf(PidChars, MAX_PID_SIZE, "%d", getpid());
        if (PidLength <= 0)
          return -1;
      }
  if (!NumPids) {
    setFilename(Filename, 0);
    return 0;
  }

  /* Allocate enough space for the substituted filename. */
  Allocated = malloc(I + NumPids*(PidLength - 2) + 1);
  if (!Allocated)
    return -1;

  /* Construct the new filename. */
  for (I = 0, J = 0; Filename[I]; ++I)
    if (Filename[I] == '%') {
      if (Filename[++I] == 'p') {
        memcpy(Allocated + J, PidChars, PidLength);
        J += PidLength;
      }
      /* Drop any unknown substitutions. */
    } else
      Allocated[J++] = Filename[I];
  Allocated[J] = 0;

  /* Use the computed name. */
  setFilename(Allocated, 1);
  return 0;
}
예제 #2
0
static void parseAndSetFilename(const char *FilenamePat,
                                ProfileNameSpecifier PNS) {

    const char *OldFilenamePat = lprofCurFilename.FilenamePat;
    ProfileNameSpecifier OldPNS = lprofCurFilename.PNS;

    if (PNS < OldPNS)
        return;

    if (!FilenamePat)
        FilenamePat = DefaultProfileName;

    /* When -fprofile-instr-generate=<path> is specified on the
     * command line, each module will be instrumented with runtime
     * init call to __llvm_profile_init function which calls
     * __llvm_profile_override_default_filename. In most of the cases,
     * the path will be identical, so bypass the parsing completely.
     */
    if (OldFilenamePat && !strcmp(OldFilenamePat, FilenamePat)) {
        lprofCurFilename.PNS = PNS;
        return;
    }

    /* When PNS >= OldPNS, the last one wins. */
    if (!FilenamePat || parseFilenamePattern(FilenamePat))
        resetFilenameToDefault();
    lprofCurFilename.PNS = PNS;

    if (!OldFilenamePat) {
        PROF_NOTE("Set profile file path to \"%s\" via %s.\n",
                  lprofCurFilename.FilenamePat, getPNSStr(PNS));
    } else {
        PROF_NOTE("Override old profile path \"%s\" via %s to \"%s\" via %s.\n",
                  OldFilenamePat, getPNSStr(OldPNS), lprofCurFilename.FilenamePat,
                  getPNSStr(PNS));
    }

    if (!lprofCurFilename.MergePoolSize)
        truncateCurrentFile();
}
예제 #3
0
static void setFilenameAutomatically(void) {
  if (!setFilenameFromEnvironment())
    return;

  resetFilenameToDefault();
}