Add ClangImporterOptions::getRemappedExtraArgs

This commit adds a function to remap the clang arguments passed
during compilation. This is intented to be shared across the
Swift compiler and LLDB to apply path remapping for debug info
paths.
This commit is contained in:
Richard Howell
2021-09-13 13:25:16 -07:00
parent b0678ca524
commit 58d67be645
4 changed files with 107 additions and 0 deletions

View File

@@ -771,6 +771,9 @@ namespace swift {
DisableOverlayModules,
EnableClangSPI);
}
std::vector<std::string> getRemappedExtraArgs(
std::function<std::string(StringRef)> pathRemapCallback) const;
};
} // end namespace swift

View File

@@ -408,3 +408,56 @@ DiagnosticBehavior LangOptions::getAccessNoteFailureLimit() const {
}
llvm_unreachable("covered switch");
}
std::vector<std::string> ClangImporterOptions::getRemappedExtraArgs(
std::function<std::string(StringRef)> pathRemapCallback) const {
auto consumeIncludeOption = [](StringRef &arg, StringRef &prefix) {
static StringRef options[] = {"-I",
"-F",
"-fmodule-map-file=",
"-iquote",
"-idirafter",
"-iframeworkwithsysroot",
"-iframework",
"-iprefix",
"-iwithprefixbefore",
"-iwithprefix",
"-isystemafter",
"-isystem",
"-isysroot",
"-ivfsoverlay",
"-working-directory=",
"-working-directory"};
for (StringRef &option : options)
if (arg.consume_front(option)) {
prefix = option;
return true;
}
return false;
};
// true if the previous argument was the dash-option of an option pair
bool remap_next = false;
std::vector<std::string> args;
for (auto A : ExtraArgs) {
StringRef prefix;
StringRef arg(A);
if (remap_next) {
remap_next = false;
args.push_back(pathRemapCallback(arg));
} else if (consumeIncludeOption(arg, prefix)) {
if (arg.empty()) {
// Option pair
remap_next = true;
args.push_back(prefix.str());
} else {
// Combine prefix with remapped path value
args.push_back(prefix.str() + pathRemapCallback(arg));
}
} else {
args.push_back(A);
}
}
return args;
}

View File

@@ -8,6 +8,7 @@ handle_gyb_sources(
add_swift_unittest(SwiftBasicTests
BlotMapVectorTest.cpp
CacheTest.cpp
ClangImporterOptionsTest.cpp
ClusteredBitVectorTest.cpp
DemangleTest.cpp
DiverseStackTest.cpp

View File

@@ -0,0 +1,50 @@
//===--- ClangImporterOptionsTest.cpp -------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#include "swift/Basic/LangOptions.h"
#include "llvm/ADT/StringRef.h"
#include "gtest/gtest.h"
static std::string remap(llvm::StringRef path) { return "remapped"; }
TEST(ClangImporterOptions, nonPathsSkipped) {
std::vector<std::string> args = {"-unmapped", "-another=unmapped"};
swift::ClangImporterOptions options;
options.ExtraArgs = args;
EXPECT_EQ(options.getRemappedExtraArgs(remap), args);
}
TEST(ClangImporterOptions, optionPairs) {
std::vector<std::string> args = {"-unmapped", "-another=unmapped",
"-I", "some/path",
"-ivfsoverlay", "another/path"};
swift::ClangImporterOptions options;
options.ExtraArgs = args;
std::vector<std::string> expected = {"-unmapped", "-another=unmapped",
"-I", "remapped",
"-ivfsoverlay", "remapped"};
EXPECT_EQ(options.getRemappedExtraArgs(remap), expected);
}
TEST(ClangImporterOptions, joinedPaths) {
std::vector<std::string> args = {"-unmapped", "-another=unmapped",
"-Isome/path",
"-working-directory=another/path"};
swift::ClangImporterOptions options;
options.ExtraArgs = args;
std::vector<std::string> expected = {"-unmapped", "-another=unmapped",
"-Iremapped",
"-working-directory=remapped"};
EXPECT_EQ(options.getRemappedExtraArgs(remap), expected);
}