mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 11:39:35 +00:00
[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.
This commit is contained in:
parent
f851db3dae
commit
c3324450b2
@ -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;
|
||||
|
@ -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">;
|
||||
|
@ -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(
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -990,6 +990,12 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
|
||||
{std::string(Split.first), std::string(Split.second)});
|
||||
}
|
||||
|
||||
for (const auto &Arg : Args.getAllArgValues(OPT_fprofile_prefix_map_EQ)) {
|
||||
auto Split = StringRef(Arg).split('=');
|
||||
Opts.ProfilePrefixMap.insert(
|
||||
{std::string(Split.first), std::string(Split.second)});
|
||||
}
|
||||
|
||||
const llvm::Triple::ArchType DebugEntryValueArchs[] = {
|
||||
llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
|
||||
llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
|
||||
|
@ -1,28 +1,39 @@
|
||||
// RUN: %clang -### -fdebug-prefix-map=old %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-INVALID
|
||||
// RUN: %clang -### -fmacro-prefix-map=old %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-INVALID
|
||||
// RUN: %clang -### -fprofile-prefix-map=old %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-INVALID
|
||||
// RUN: %clang -### -ffile-prefix-map=old %s 2>&1 | FileCheck %s -check-prefix CHECK-FILE-INVALID
|
||||
|
||||
// RUN: %clang -### -fdebug-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-SIMPLE
|
||||
// RUN: %clang -### -fmacro-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-SIMPLE
|
||||
// RUN: %clang -### -fprofile-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-SIMPLE
|
||||
// RUN: %clang -### -ffile-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-SIMPLE
|
||||
// RUN: %clang -### -ffile-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-SIMPLE
|
||||
// RUN: %clang -### -ffile-prefix-map=old=new %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-SIMPLE
|
||||
|
||||
// RUN: %clang -### -fdebug-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-COMPLEX
|
||||
// RUN: %clang -### -fmacro-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-COMPLEX
|
||||
// RUN: %clang -### -fprofile-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-COMPLEX
|
||||
// RUN: %clang -### -ffile-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-COMPLEX
|
||||
// RUN: %clang -### -ffile-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-COMPLEX
|
||||
// RUN: %clang -### -ffile-prefix-map=old=n=ew %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-COMPLEX
|
||||
|
||||
// RUN: %clang -### -fdebug-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-EMPTY
|
||||
// RUN: %clang -### -fmacro-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-EMPTY
|
||||
// RUN: %clang -### -fprofile-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-EMPTY
|
||||
// RUN: %clang -### -ffile-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-DEBUG-EMPTY
|
||||
// RUN: %clang -### -ffile-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-MACRO-EMPTY
|
||||
// RUN: %clang -### -ffile-prefix-map=old= %s 2>&1 | FileCheck %s -check-prefix CHECK-PROFILE-EMPTY
|
||||
|
||||
// CHECK-DEBUG-INVALID: error: invalid argument 'old' to -fdebug-prefix-map
|
||||
// CHECK-MACRO-INVALID: error: invalid argument 'old' to -fmacro-prefix-map
|
||||
// CHECK-PROFILE-INVALID: error: invalid argument 'old' to -fprofile-prefix-map
|
||||
// CHECK-FILE-INVALID: error: invalid argument 'old' to -ffile-prefix-map
|
||||
// CHECK-DEBUG-SIMPLE: fdebug-prefix-map=old=new
|
||||
// CHECK-MACRO-SIMPLE: fmacro-prefix-map=old=new
|
||||
// CHECK-PROFILE-SIMPLE: fprofile-prefix-map=old=new
|
||||
// CHECK-DEBUG-COMPLEX: fdebug-prefix-map=old=n=ew
|
||||
// CHECK-MACRO-COMPLEX: fmacro-prefix-map=old=n=ew
|
||||
// CHECK-PROFILE-COMPLEX: fprofile-prefix-map=old=n=ew
|
||||
// CHECK-DEBUG-EMPTY: fdebug-prefix-map=old=
|
||||
// CHECK-MACRO-EMPTY: fmacro-prefix-map=old=
|
||||
// CHECK-PROFILE-EMPTY: fprofile-prefix-map=old=
|
||||
|
14
clang/test/Profile/profile-prefix-map.c
Normal file
14
clang/test/Profile/profile-prefix-map.c
Normal file
@ -0,0 +1,14 @@
|
||||
// %s expands to an absolute path, so to test relative paths we need to create a
|
||||
// clean directory, put the source there, and cd into it.
|
||||
// RUN: rm -rf %t
|
||||
// RUN: mkdir -p %t/root/nested
|
||||
// RUN: echo "void f1() {}" > %t/root/nested/profile-prefix-map.c
|
||||
// RUN: cd %t/root
|
||||
|
||||
// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -mllvm -enable-name-compression=false -main-file-name profile-prefix-map.c nested/profile-prefix-map.c -o - | FileCheck --check-prefix=ABSOLUTE %s
|
||||
//
|
||||
// ABSOLUTE: @__llvm_coverage_mapping = {{.*"\\01.*root.*nested.*profile-prefix-map\.c}}
|
||||
|
||||
// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -mllvm -enable-name-compression=false -main-file-name profile-prefix-map.c nested/profile-prefix-map.c -fprofile-prefix-map=%/t/root=. -o - | FileCheck --check-prefix=PROFILE-PREFIX-MAP %s --implicit-check-not=root
|
||||
//
|
||||
// PROFILE-PREFIX-MAP: @__llvm_coverage_mapping = {{.*"\\01[^/]*}}.{{/|\\+}}nested{{.*profile-prefix-map\.c}}
|
Loading…
Reference in New Issue
Block a user