Commit c3324450 authored by Keith Smiley's avatar Keith Smiley
Browse files

[clang] Add -fprofile-prefix-map

This flag allows you to re-write absolute paths in coverage data analogous to -fdebug-prefix-map. This flag is also implied by -ffile-prefix-map.
parent f851db3d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ public:
  std::string RecordCommandLine;

  std::map<std::string, std::string> DebugPrefixMap;
  std::map<std::string, std::string> ProfilePrefixMap;

  /// The ABI to use for passing floating point arguments.
  std::string FloatABI;
+4 −0
Original line number Diff line number Diff line
@@ -2601,6 +2601,10 @@ def fdebug_prefix_map_EQ
  : Joined<["-"], "fdebug-prefix-map=">, Group<f_Group>,
    Flags<[CC1Option,CC1AsOption]>,
    HelpText<"remap file source paths in debug info">;
def fprofile_prefix_map_EQ
  : Joined<["-"], "fprofile-prefix-map=">, Group<f_Group>,
    Flags<[CC1Option]>,
    HelpText<"remap file source paths in coverage info">;
def ffile_prefix_map_EQ
  : Joined<["-"], "ffile-prefix-map=">, Group<f_Group>,
    HelpText<"remap file source paths in debug info and predefined preprocessor macros">;
+17 −7
Original line number Diff line number Diff line
@@ -1544,13 +1544,6 @@ struct CounterCoverageMappingBuilder
  }
};

std::string normalizeFilename(StringRef Filename) {
  llvm::SmallString<256> Path(Filename);
  llvm::sys::fs::make_absolute(Path);
  llvm::sys::path::remove_dots(Path, /*remove_dot_dot=*/true);
  return std::string(Path);
}

} // end anonymous namespace

static void dump(llvm::raw_ostream &OS, StringRef FunctionName,
@@ -1592,6 +1585,23 @@ static void dump(llvm::raw_ostream &OS, StringRef FunctionName,
  }
}

CoverageMappingModuleGen::CoverageMappingModuleGen(
    CodeGenModule &CGM, CoverageSourceInfo &SourceInfo)
    : CGM(CGM), SourceInfo(SourceInfo) {
  ProfilePrefixMap = CGM.getCodeGenOpts().ProfilePrefixMap;
}

std::string CoverageMappingModuleGen::normalizeFilename(StringRef Filename) {
  llvm::SmallString<256> Path(Filename);
  llvm::sys::fs::make_absolute(Path);
  llvm::sys::path::remove_dots(Path, /*remove_dot_dot=*/true);
  for (const auto &Entry : ProfilePrefixMap) {
    if (llvm::sys::path::replace_path_prefix(Path, Entry.first, Entry.second))
      break;
  }
  return Path.str().str();
}

static std::string getInstrProfSection(const CodeGenModule &CGM,
                                       llvm::InstrProfSectKind SK) {
  return llvm::getInstrProfSectionName(
+4 −2
Original line number Diff line number Diff line
@@ -93,6 +93,9 @@ class CoverageMappingModuleGen {
  llvm::SmallDenseMap<const FileEntry *, unsigned, 8> FileEntries;
  std::vector<llvm::Constant *> FunctionNames;
  std::vector<FunctionInfo> FunctionRecords;
  std::map<std::string, std::string> ProfilePrefixMap;

  std::string normalizeFilename(StringRef Filename);

  /// Emit a function record.
  void emitFunctionMappingRecord(const FunctionInfo &Info,
@@ -101,8 +104,7 @@ class CoverageMappingModuleGen {
public:
  static CoverageSourceInfo *setUpCoverageCallbacks(Preprocessor &PP);

  CoverageMappingModuleGen(CodeGenModule &CGM, CoverageSourceInfo &SourceInfo)
      : CGM(CGM), SourceInfo(SourceInfo) {}
  CoverageMappingModuleGen(CodeGenModule &CGM, CoverageSourceInfo &SourceInfo);

  CoverageSourceInfo &getSourceInfo() const {
    return SourceInfo;
+16 −0
Original line number Diff line number Diff line
@@ -656,6 +656,21 @@ static void addMacroPrefixMapArg(const Driver &D, const ArgList &Args,
  }
}

/// Add a CC1 and CC1AS option to specify the coverage file path prefix map.
static void addProfilePrefixMapArg(const Driver &D, const ArgList &Args,
                                   ArgStringList &CmdArgs) {
  for (const Arg *A : Args.filtered(options::OPT_ffile_prefix_map_EQ,
                                    options::OPT_fprofile_prefix_map_EQ)) {
    StringRef Map = A->getValue();
    if (Map.find('=') == StringRef::npos)
      D.Diag(diag::err_drv_invalid_argument_to_option)
          << Map << A->getOption().getName();
    else
      CmdArgs.push_back(Args.MakeArgString("-fprofile-prefix-map=" + Map));
    A->claim();
  }
}

/// Vectorize at all optimization levels greater than 1 except for -Oz.
/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is
/// enabled.
@@ -1360,6 +1375,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
  }

  addMacroPrefixMapArg(D, Args, CmdArgs);
  addProfilePrefixMapArg(D, Args, CmdArgs);
}

// FIXME: Move to target hook.
Loading