Skip to content

Commit d13d6bd

Browse files
authored
New option format for prefix mapping (swiftlang#10723)
* add a new prefix mapping option to fix problems with paths including an equal sign * make the old -fdepscan-prefix-map= option driver-only
1 parent d13646b commit d13d6bd

File tree

20 files changed

+130
-78
lines changed

20 files changed

+130
-78
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8836,11 +8836,15 @@ def fdepscan_include_tree : Flag<["-"], "fdepscan-include-tree">,
88368836
//
88378837
// FIXME: Add DepscanOption flag.
88388838
def fdepscan_prefix_map_EQ : Joined<["-"], "fdepscan-prefix-map=">,
8839-
Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
8839+
Group<f_Group>, Visibility<[ClangOption]>,
88408840
MetaVarName<"<old>=<new>">,
88418841
HelpText<"With -fdepscan, seamlessly filter the CAS filesystem to"
8842-
" apply the given prefix, updating the command-line to match.">,
8843-
MarshallingInfoStringVector<FrontendOpts<"PathPrefixMappings">>;
8842+
" apply the given prefix, updating the command-line to match.">;
8843+
def fdepscan_prefix_map : MultiArg<["-"], "fdepscan-prefix-map", 2>,
8844+
Group<f_Group>, Visibility<[ClangOption, CC1Option]>,
8845+
MetaVarName<"<old> <new>">,
8846+
HelpText<"With -fdepscan, seamlessly filter the CAS filesystem to"
8847+
" apply the given prefix, updating the command-line to match.">;
88448848
def fdepscan_prefix_map_sdk_EQ :
88458849
Joined<["-"], "fdepscan-prefix-map-sdk=">,
88468850
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
@@ -48,7 +48,7 @@ struct CompileJobCachingOptions {
4848
/// See \c FrontendOptions::WriteOutputAsCASID.
4949
bool WriteOutputAsCASID;
5050
/// See \c FrontendOptions::PathPrefixMappings.
51-
std::vector<std::string> PathPrefixMappings;
51+
std::vector<std::pair<std::string, std::string>> PathPrefixMappings;
5252
};
5353

5454
/// 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
@@ -528,7 +528,7 @@ class FrontendOptions {
528528
/// When caching is enabled, represents remappings for all the file paths that
529529
/// the compilation may access. This is useful for canonicalizing the
530530
/// compilation for caching purposes.
531-
std::vector<std::string> PathPrefixMappings;
531+
std::vector<std::pair<std::string, std::string>> PathPrefixMappings;
532532

533533
// Currently this is only used as part of the `-extract-api` action.
534534
// 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
@@ -48,7 +48,7 @@ struct DepscanPrefixMapping {
4848
llvm::PrefixMapper &Mapper);
4949

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

5454
/// 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
@@ -5059,8 +5059,9 @@ void Clang::AddPrefixMappingOptions(const ArgList &Args, ArgStringList &CmdArgs,
50595059

50605060
if (Arg *A = Args.getLastArg(options::OPT_fdepscan_prefix_map_sdk_EQ)) {
50615061
if (IsPathApplicableAsPrefix(Sysroot)) {
5062-
CmdArgs.push_back(Args.MakeArgString(Twine("-fdepscan-prefix-map=") +
5063-
*Sysroot + "=" + A->getValue()));
5062+
CmdArgs.push_back("-fdepscan-prefix-map");
5063+
CmdArgs.push_back(Args.MakeArgString(*Sysroot));
5064+
CmdArgs.push_back(Args.MakeArgString(A->getValue()));
50645065
} else {
50655066
// FIXME: warning if we cannot infer sdk
50665067
}
@@ -5075,22 +5076,31 @@ void Clang::AddPrefixMappingOptions(const ArgList &Args, ArgStringList &CmdArgs,
50755076
Guess = llvm::sys::path::parent_path(Guess);
50765077
}
50775078
if (IsPathApplicableAsPrefix(Guess)) {
5078-
CmdArgs.push_back(Args.MakeArgString(Twine("-fdepscan-prefix-map=") +
5079-
Guess + "=" + A->getValue()));
5079+
CmdArgs.push_back("-fdepscan-prefix-map");
5080+
CmdArgs.push_back(Args.MakeArgString(Guess));
5081+
CmdArgs.push_back(Args.MakeArgString(A->getValue()));
50805082
} else {
50815083
// FIXME: warning if we cannot infer toolchain
50825084
}
50835085
}
50845086

5085-
for (const Arg *A : Args.filtered(options::OPT_fdepscan_prefix_map_EQ)) {
5087+
for (const Arg *A : Args.filtered(options::OPT_fdepscan_prefix_map, options::OPT_fdepscan_prefix_map_EQ)) {
50865088
A->claim();
5087-
StringRef Map = A->getValue();
5088-
StringRef Prefix = Map.split('=').first;
5089-
if (Prefix.size() == Map.size() || !IsPathApplicableAsPrefix(Prefix)) {
5089+
StringRef Prefix, MapTarget;
5090+
if (A->getOption().matches(options::OPT_fdepscan_prefix_map_EQ)) {
5091+
StringRef Map = A->getValue();
5092+
std::tie(Prefix, MapTarget) = Map.split('=');
5093+
} else {
5094+
Prefix = A->getValue(0);
5095+
MapTarget = A->getValue(1);
5096+
}
5097+
if (MapTarget.size() == 0 || !IsPathApplicableAsPrefix(Prefix)) {
50905098
D.Diag(diag::err_drv_invalid_argument_to_option)
50915099
<< A->getValue() << A->getOption().getName();
50925100
} else {
5093-
A->render(Args, CmdArgs);
5101+
CmdArgs.push_back("-fdepscan-prefix-map");
5102+
CmdArgs.push_back(Args.MakeArgString(Prefix));
5103+
CmdArgs.push_back(Args.MakeArgString(MapTarget));
50945104
}
50955105
}
50965106
}

clang/lib/Frontend/CompileJobCache.cpp

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

331331
llvm::PrefixMapper PrefixMapper;
332332
llvm::SmallVector<llvm::MappedPrefix> Split;
333-
llvm::MappedPrefix::transformJoinedIfValid(CacheOpts.PathPrefixMappings,
334-
Split);
333+
llvm::MappedPrefix::transformPairs(CacheOpts.PathPrefixMappings, Split);
335334
for (const auto &MappedPrefix : Split) {
336335
// We use the inverse mapping because the \p PrefixMapper will be used for
337336
// de-canonicalization of paths.
@@ -629,7 +628,7 @@ Expected<std::optional<int>> CompileJobCache::replayCachedResult(
629628

630629
llvm::PrefixMapper PrefixMapper;
631630
llvm::SmallVector<llvm::MappedPrefix> Split;
632-
llvm::MappedPrefix::transformJoinedIfValid(
631+
llvm::MappedPrefix::transformPairs(
633632
Clang.getFrontendOpts().PathPrefixMappings, Split);
634633
for (const auto &MappedPrefix : Split) {
635634
// 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
@@ -86,6 +86,7 @@
8686
#include "llvm/Support/MathExtras.h"
8787
#include "llvm/Support/MemoryBuffer.h"
8888
#include "llvm/Support/Path.h"
89+
#include "llvm/Support/PrefixMapper.h"
8990
#include "llvm/Support/Process.h"
9091
#include "llvm/Support/Regex.h"
9192
#include "llvm/Support/VersionTuple.h"
@@ -3155,6 +3156,9 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts,
31553156
for (const auto &A : Opts.ModuleCacheKeys)
31563157
GenerateMultiArg(Consumer, OPT_fmodule_file_cache_key, {A.first, A.second});
31573158

3159+
for (const auto &A : Opts.PathPrefixMappings)
3160+
GenerateMultiArg(Consumer, OPT_fdepscan_prefix_map, {A.first, A.second});
3161+
31583162
if (Opts.AuxTargetCPU)
31593163
GenerateArg(Consumer, OPT_aux_target_cpu, *Opts.AuxTargetCPU);
31603164

@@ -3381,6 +3385,13 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
33813385
Opts.ModuleCacheKeys.emplace_back(Values[0], Values[1]);
33823386
}
33833387

3388+
// Handle path prefix mappings
3389+
for (const Arg *A : Args.filtered(OPT_fdepscan_prefix_map)) {
3390+
ArrayRef<const char *> Values = A->getValues();
3391+
assert(Values.size() == 2);
3392+
Opts.PathPrefixMappings.emplace_back(Values[0], Values[1]);
3393+
}
3394+
33843395
if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule)
33853396
Diags.Report(diag::err_drv_argument_only_allowed_with) << "-fsystem-module"
33863397
<< "-emit-module";

clang/lib/Tooling/DependencyScanning/ScanAndUpdateArgs.cpp

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

149149
auto mapInPlaceAll = [&](std::vector<std::string> &Vector) {
@@ -244,12 +244,12 @@ void DepscanPrefixMapping::configurePrefixMapper(const CompilerInvocation &CI,
244244
}
245245

246246
void DepscanPrefixMapping::configurePrefixMapper(
247-
ArrayRef<std::string> PathPrefixMappings, llvm::PrefixMapper &Mapper) {
247+
ArrayRef<std::pair<std::string, std::string>> PathPrefixMappings, llvm::PrefixMapper &Mapper) {
248248
if (PathPrefixMappings.empty())
249249
return;
250250

251251
llvm::SmallVector<llvm::MappedPrefix> Split;
252-
llvm::MappedPrefix::transformJoinedIfValid(PathPrefixMappings, Split);
252+
llvm::MappedPrefix::transformPairs(PathPrefixMappings, Split);
253253
for (auto &MappedPrefix : Split)
254254
Mapper.add(MappedPrefix);
255255

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)