Пример #1
0
static void setFilename(const char *Filename, int OwnsFilename) {
  /* Check if this is a new filename and therefore needs truncation. */
  int NewFile = !__llvm_profile_CurrentFilename ||
      (Filename && strcmp(Filename, __llvm_profile_CurrentFilename));
  if (__llvm_profile_OwnsFilename)
    free(UNCONST(__llvm_profile_CurrentFilename));

  __llvm_profile_CurrentFilename = Filename;
  __llvm_profile_OwnsFilename = OwnsFilename;

  /* If not a new file, append to support profiling multiple shared objects. */
  if (NewFile)
    truncateCurrentFile();
}
Пример #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();
}