Skip to content

Commit 7b6eb6c

Browse files
committed
[6.2🍒] add a new prefix mapping option to fix problems with paths including an equal sign
1 parent af09a65 commit 7b6eb6c

File tree

19 files changed

+127
-75
lines changed

19 files changed

+127
-75
lines changed

‎clang/include/clang/Driver/Options.td

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8409,11 +8409,15 @@ def fdepscan_include_tree : Flag<["-"], "fdepscan-include-tree">,
84098409
//
84108410
// FIXME: Add DepscanOption flag.
84118411
def fdepscan_prefix_map_EQ : Joined<["-"], "fdepscan-prefix-map=">,
8412-
Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
8412+
Group<f_Group>, Visibility<[ClangOption]>,
84138413
MetaVarName<"<old>=<new>">,
84148414
HelpText<"With -fdepscan, seamlessly filter the CAS filesystem to"
8415-
" apply the given prefix, updating the command-line to match.">,
8416-
MarshallingInfoStringVector<FrontendOpts<"PathPrefixMappings">>;
8415+
" apply the given prefix, updating the command-line to match.">;
8416+
def fdepscan_prefix_map : MultiArg<["-"], "fdepscan-prefix-map", 2>,
8417+
Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
8418+
MetaVarName<"<old> <new>">,
8419+
HelpText<"With -fdepscan, seamlessly filter the CAS filesystem to"
8420+
" apply the given prefix, updating the command-line to match.">;
84178421
def fdepscan_prefix_map_sdk_EQ :
84188422
Joined<["-"], "fdepscan-prefix-map-sdk=">,
84198423
Group<f_Group>, MetaVarName<"<new>">,

‎clang/include/clang/Frontend/CompileJobCacheKey.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct CompileJobCachingOptions {
4040
/// See \c FrontendOptions::WriteOutputAsCASID.
4141
bool WriteOutputAsCASID;
4242
/// See \c FrontendOptions::PathPrefixMappings.
43-
std::vector<std::string> PathPrefixMappings;
43+
std::vector<std::pair<std::string, std::string>> PathPrefixMappings;
4444
};
4545

4646
/// Create a cache key for the given \c CompilerInvocation as a \c CASID. If \p

‎clang/include/clang/Frontend/FrontendOptions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ class FrontendOptions {
587587
/// When caching is enabled, represents remappings for all the file paths that
588588
/// the compilation may access. This is useful for canonicalizing the
589589
/// compilation for caching purposes.
590-
std::vector<std::string> PathPrefixMappings;
590+
std::vector<std::pair<std::string, std::string>> PathPrefixMappings;
591591

592592
// Currently this is only used as part of the `-extract-api` action.
593593
// A comma separated list of files providing a list of APIs to

‎clang/include/clang/Tooling/DependencyScanning/ScanAndUpdateArgs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct DepscanPrefixMapping {
4646
llvm::PrefixMapper &Mapper);
4747

4848
/// Add path mappings to the \p Mapper.
49-
static void configurePrefixMapper(ArrayRef<std::string> PathPrefixMappings,
49+
static void configurePrefixMapper(ArrayRef<std::pair<std::string, std::string>> PathPrefixMappings,
5050
llvm::PrefixMapper &Mapper);
5151

5252
/// Apply the mappings from \p Mapper to \p Invocation.

‎clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4910,8 +4910,9 @@ void Clang::AddPrefixMappingOptions(const ArgList &Args, ArgStringList &CmdArgs,
49104910

49114911
if (Arg *A = Args.getLastArg(options::OPT_fdepscan_prefix_map_sdk_EQ)) {
49124912
if (IsPathApplicableAsPrefix(Sysroot)) {
4913-
CmdArgs.push_back(Args.MakeArgString(Twine("-fdepscan-prefix-map=") +
4914-
*Sysroot + "=" + A->getValue()));
4913+
CmdArgs.push_back("-fdepscan-prefix-map");
4914+
CmdArgs.push_back(Args.MakeArgString(*Sysroot));
4915+
CmdArgs.push_back(Args.MakeArgString(A->getValue()));
49154916
} else {
49164917
// FIXME: warning if we cannot infer sdk
49174918
}
@@ -4926,22 +4927,31 @@ void Clang::AddPrefixMappingOptions(const ArgList &Args, ArgStringList &CmdArgs,
49264927
Guess = llvm::sys::path::parent_path(Guess);
49274928
}
49284929
if (IsPathApplicableAsPrefix(Guess)) {
4929-
CmdArgs.push_back(Args.MakeArgString(Twine("-fdepscan-prefix-map=") +
4930-
Guess + "=" + A->getValue()));
4930+
CmdArgs.push_back("-fdepscan-prefix-map");
4931+
CmdArgs.push_back(Args.MakeArgString(Guess));
4932+
CmdArgs.push_back(Args.MakeArgString(A->getValue()));
49314933
} else {
49324934
// FIXME: warning if we cannot infer toolchain
49334935
}
49344936
}
49354937

4936-
for (const Arg *A : Args.filtered(options::OPT_fdepscan_prefix_map_EQ)) {
4938+
for (const Arg *A : Args.filtered(options::OPT_fdepscan_prefix_map, options::OPT_fdepscan_prefix_map_EQ)) {
49374939
A->claim();
4938-
StringRef Map = A->getValue();
4939-
StringRef Prefix = Map.split('=').first;
4940-
if (Prefix.size() == Map.size() || !IsPathApplicableAsPrefix(Prefix)) {
4940+
StringRef Prefix, MapTarget;
4941+
if (A->getOption().matches(options::OPT_fdepscan_prefix_map_EQ)) {
4942+
StringRef Map = A->getValue();
4943+
std::tie(Prefix, MapTarget) = Map.split('=');
4944+
} else {
4945+
Prefix = A->getValue(0);
4946+
MapTarget = A->getValue(1);
4947+
}
4948+
if (MapTarget.size() == 0 || !IsPathApplicableAsPrefix(Prefix)) {
49414949
D.Diag(diag::err_drv_invalid_argument_to_option)
49424950
<< A->getValue() << A->getOption().getName();
49434951
} else {
4944-
A->render(Args, CmdArgs);
4952+
CmdArgs.push_back("-fdepscan-prefix-map");
4953+
CmdArgs.push_back(Args.MakeArgString(Prefix));
4954+
CmdArgs.push_back(Args.MakeArgString(MapTarget));
49454955
}
49464956
}
49474957
}

‎clang/lib/Frontend/CompileJobCache.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,7 @@ std::optional<int> CompileJobCache::initialize(CompilerInstance &Clang) {
319319

320320
llvm::PrefixMapper PrefixMapper;
321321
llvm::SmallVector<llvm::MappedPrefix> Split;
322-
llvm::MappedPrefix::transformJoinedIfValid(CacheOpts.PathPrefixMappings,
323-
Split);
322+
llvm::MappedPrefix::transformPairs(CacheOpts.PathPrefixMappings, Split);
324323
for (const auto &MappedPrefix : Split) {
325324
// We use the inverse mapping because the \p PrefixMapper will be used for
326325
// de-canonicalization of paths.
@@ -607,7 +606,7 @@ Expected<std::optional<int>> CompileJobCache::replayCachedResult(
607606

608607
llvm::PrefixMapper PrefixMapper;
609608
llvm::SmallVector<llvm::MappedPrefix> Split;
610-
llvm::MappedPrefix::transformJoinedIfValid(
609+
llvm::MappedPrefix::transformPairs(
611610
Clang.getFrontendOpts().PathPrefixMappings, Split);
612611
for (const auto &MappedPrefix : Split) {
613612
// We use the inverse mapping because the \p PrefixMapper will be used for

‎clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#include "llvm/Support/MathExtras.h"
8585
#include "llvm/Support/MemoryBuffer.h"
8686
#include "llvm/Support/Path.h"
87+
#include "llvm/Support/PrefixMapper.h"
8788
#include "llvm/Support/Process.h"
8889
#include "llvm/Support/Regex.h"
8990
#include "llvm/Support/VersionTuple.h"
@@ -3022,6 +3023,9 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts,
30223023
for (const auto &A : Opts.ModuleCacheKeys)
30233024
GenerateMultiArg(Consumer, OPT_fmodule_file_cache_key, {A.first, A.second});
30243025

3026+
for (const auto &A : Opts.PathPrefixMappings)
3027+
GenerateMultiArg(Consumer, OPT_fdepscan_prefix_map, {A.first, A.second});
3028+
30253029
if (Opts.AuxTargetCPU)
30263030
GenerateArg(Consumer, OPT_aux_target_cpu, *Opts.AuxTargetCPU);
30273031

@@ -3249,6 +3253,13 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
32493253
Opts.ModuleCacheKeys.emplace_back(Values[0], Values[1]);
32503254
}
32513255

3256+
// Handle path prefix mappings
3257+
for (const Arg *A : Args.filtered(OPT_fdepscan_prefix_map)) {
3258+
ArrayRef<const char *> Values = A->getValues();
3259+
assert(Values.size() == 2);
3260+
Opts.PathPrefixMappings.emplace_back(Values[0], Values[1]);
3261+
}
3262+
32523263
if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule)
32533264
Diags.Report(diag::err_drv_argument_only_allowed_with) << "-fsystem-module"
32543265
<< "-emit-module";

‎clang/lib/Tooling/DependencyScanning/ScanAndUpdateArgs.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ void DepscanPrefixMapping::remapInvocationPaths(CompilerInvocation &Invocation,
128128
// Pass the remappings so that we can map cached diagnostics to the local
129129
// paths during diagnostic rendering.
130130
for (const llvm::MappedPrefix &Map : Mapper.getMappings()) {
131-
FrontendOpts.PathPrefixMappings.push_back(Map.Old + "=" + Map.New);
131+
FrontendOpts.PathPrefixMappings.emplace_back(Map.Old, Map.New);
132132
}
133133

134134
auto mapInPlaceAll = [&](std::vector<std::string> &Vector) {
@@ -229,12 +229,12 @@ void DepscanPrefixMapping::configurePrefixMapper(const CompilerInvocation &CI,
229229
}
230230

231231
void DepscanPrefixMapping::configurePrefixMapper(
232-
ArrayRef<std::string> PathPrefixMappings, llvm::PrefixMapper &Mapper) {
232+
ArrayRef<std::pair<std::string, std::string>> PathPrefixMappings, llvm::PrefixMapper &Mapper) {
233233
if (PathPrefixMappings.empty())
234234
return;
235235

236236
llvm::SmallVector<llvm::MappedPrefix> Split;
237-
llvm::MappedPrefix::transformJoinedIfValid(PathPrefixMappings, Split);
237+
llvm::MappedPrefix::transformPairs(PathPrefixMappings, Split);
238238
for (auto &MappedPrefix : Split)
239239
Mapper.add(MappedPrefix);
240240

‎clang/test/CAS/cached-diagnostics.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// RUN: %clang_cc1 -triple x86_64-apple-macos12 -fsyntax-only %t/src/main.c -I %t/src/inc -Wunknown-pragmas 2> %t/regular-diags1.txt
66

77
// RUN: %clang -cc1depscan -fdepscan=inline -fdepscan-include-tree -o %t/t1.rsp -cc1-args \
8-
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map=%t/src=/^src \
8+
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map %t/src /^src \
99
// RUN: -emit-obj %t/src/main.c -o %t/out/output.o -I %t/src/inc -Wunknown-pragmas
1010

1111
// Compare diagnostics after a miss.
@@ -42,7 +42,7 @@
4242
// RUN: %clang_cc1 -triple x86_64-apple-macos12 -fsyntax-only %t/src2/main.c -I %t/src2/inc -Wunknown-pragmas 2> %t/regular-diags2.txt
4343

4444
// RUN: %clang -cc1depscan -fdepscan=inline -fdepscan-include-tree -o %t/t2.rsp -cc1-args \
45-
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map=%t/src2=/^src \
45+
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map %t/src2 /^src \
4646
// RUN: -emit-obj %t/src2/main.c -o %t/out2/output.o -I %t/src2/inc -Wunknown-pragmas
4747
// RUN: %clang @%t/t2.rsp -Rcompile-job-cache 2> %t/diags-hit2.txt
4848

@@ -55,7 +55,7 @@
5555
// RUN: diff -u %t/regular-diags2.txt %t/cached-diags2.txt
5656

5757
// RUN: %clang -cc1depscan -fdepscan=inline -fdepscan-include-tree -o %t/terr.rsp -cc1-args \
58-
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map=%t/src=/^src \
58+
// RUN: -cc1 -triple x86_64-apple-macos12 -fcas-path %t/cas -fdepscan-prefix-map %t/src /^src \
5959
// RUN: -emit-obj %t/src/main.c -o %t/out/output.o -I %t/src/inc -Rcompile-job-cache -DERROR
6060

6161
// RUN: not %clang @%t/terr.rsp -ferror-limit 1 2> %t/diags_error1.txt

‎clang/test/CAS/depscan-prefix-map.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
// RUN: -internal-isystem %S/Inputs/toolchain_dir/usr/lib/clang/1000/include \
1212
// RUN: -working-directory %t.d \
1313
// RUN: -fcas-path %t.d/cas \
14-
// RUN: -fdepscan-prefix-map=%S=/^source \
15-
// RUN: -fdepscan-prefix-map=%t.d=/^testdir \
16-
// RUN: -fdepscan-prefix-map=%{objroot}=/^objroot \
17-
// RUN: -fdepscan-prefix-map=%S/Inputs/toolchain_dir=/^toolchain \
18-
// RUN: -fdepscan-prefix-map=%S/Inputs/SDK=/^sdk \
14+
// RUN: -fdepscan-prefix-map %S /^source \
15+
// RUN: -fdepscan-prefix-map %t.d /^testdir \
16+
// RUN: -fdepscan-prefix-map %{objroot} /^objroot \
17+
// RUN: -fdepscan-prefix-map %S/Inputs/toolchain_dir /^toolchain \
18+
// RUN: -fdepscan-prefix-map %S/Inputs/SDK /^sdk \
1919
// RUN: -fdepfile-entry=%t.d/extra \
2020
// RUN: | FileCheck %s -DPREFIX=%t.d
2121
// RUN: %clang -cc1depscan -dump-depscan-tree=%t.root -fdepscan=inline \
@@ -25,11 +25,11 @@
2525
// RUN: -internal-isystem %S/Inputs/toolchain_dir/lib/clang/1000/include \
2626
// RUN: -working-directory %t.d \
2727
// RUN: -fcas-path %t.d/cas \
28-
// RUN: -fdepscan-prefix-map=%S=/^source \
29-
// RUN: -fdepscan-prefix-map=%t.d=/^testdir \
30-
// RUN: -fdepscan-prefix-map=%{objroot}=/^objroot \
31-
// RUN: -fdepscan-prefix-map=%S/Inputs/toolchain_dir=/^toolchain \
32-
// RUN: -fdepscan-prefix-map=%S/Inputs/SDK=/^sdk \
28+
// RUN: -fdepscan-prefix-map %S /^source \
29+
// RUN: -fdepscan-prefix-map %t.d /^testdir \
30+
// RUN: -fdepscan-prefix-map %{objroot} /^objroot \
31+
// RUN: -fdepscan-prefix-map %S/Inputs/toolchain_dir /^toolchain \
32+
// RUN: -fdepscan-prefix-map %S/Inputs/SDK /^sdk \
3333
// RUN: -fdepfile-entry=%t.d/extra \
3434
// RUN: | FileCheck %s -DPREFIX=%t.d
3535
// RUN: %clang -cc1depscand -execute %{clang-daemon-dir}/%basename_t \
@@ -42,11 +42,11 @@
4242
// RUN: -internal-isystem %S/Inputs/toolchain_dir/usr/lib/clang/1000/include \
4343
// RUN: -working-directory %t.d \
4444
// RUN: -fcas-path %t.d/cas \
45-
// RUN: -fdepscan-prefix-map=%S=/^source \
46-
// RUN: -fdepscan-prefix-map=%t.d=/^testdir \
47-
// RUN: -fdepscan-prefix-map=%{objroot}=/^objroot \
48-
// RUN: -fdepscan-prefix-map=%S/Inputs/toolchain_dir=/^toolchain \
49-
// RUN: -fdepscan-prefix-map=%S/Inputs/SDK=/^sdk \
45+
// RUN: -fdepscan-prefix-map %S /^source \
46+
// RUN: -fdepscan-prefix-map %t.d /^testdir \
47+
// RUN: -fdepscan-prefix-map %{objroot} /^objroot \
48+
// RUN: -fdepscan-prefix-map %S/Inputs/toolchain_dir /^toolchain \
49+
// RUN: -fdepscan-prefix-map %S/Inputs/SDK /^sdk \
5050
// RUN: -fdepfile-entry=%t.d/extra \
5151
// RUN: | FileCheck %s -DPREFIX=%t.d
5252
//

‎clang/test/CAS/driver-cache-launcher.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,15 @@
9898
// SESSION-CMAKE-PREFIX: note: setting LLVM_CACHE_BUILD_SESSION_ID=
9999

100100
// CLANG-CMAKE-PREFIX: "-cc1depscan" "-fdepscan=daemon" "-fdepscan-share-identifier"
101-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=[[INPUTS]]/SDK=/^sdk"
102-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=[[INPUTS]]/toolchain_dir=/^toolchain"
103-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/build=/^build"
104-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/llvm=/^src"
105-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/clang=/^src-clang"
106-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/clang-tools-extra=/^src-clang-tools-extra"
107-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/third-party/benchmark=/^src-benchmark"
108-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/other/benchmark=/^src-benchmark-1"
109-
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map=/llvm/llvm-project/another/benchmark=/^src-benchmark-2"
101+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "[[INPUTS]]/SDK" "/^sdk"
102+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "[[INPUTS]]/toolchain_dir" "/^toolchain"
103+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/build" "/^build"
104+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/llvm" "/^src"
105+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/clang" "/^src-clang"
106+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/clang-tools-extra" "/^src-clang-tools-extra"
107+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/third-party/benchmark" "/^src-benchmark"
108+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/other/benchmark" "/^src-benchmark-1"
109+
// CLANG-CMAKE-PREFIX: "-fdepscan-prefix-map" "/llvm/llvm-project/another/benchmark" "/^src-benchmark-2"
110110

111111
// Make sure `cache-build-session` can invoke an executable script.
112112
// RUN: cache-build-session %t/clang -c %s -o %t.o 2>&1 | FileCheck %s -check-prefix=SESSION-SCRIPT -DSRC=%s -DPREFIX=%t

0 commit comments

Comments
 (0)