mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Caching][NFC] Restructure CASOption in swift. NFC
Clean up how CASOptions are kept and passed inside swift to make the code more readable. Also avoid a copy of CAS configuration in ClangImporter.
This commit is contained in:
@@ -270,10 +270,6 @@ setIRGenOutputOptsFromFrontendOptions(IRGenOptions &IRGenOpts,
|
||||
}
|
||||
}(FrontendOpts.RequestedAction);
|
||||
|
||||
IRGenOpts.UseCASBackend = FrontendOpts.UseCASBackend;
|
||||
IRGenOpts.CASObjMode = FrontendOpts.CASObjMode;
|
||||
IRGenOpts.EmitCASIDFile = FrontendOpts.EmitCASIDFile;
|
||||
|
||||
// If we're in JIT mode, set the requisite flags.
|
||||
if (FrontendOpts.RequestedAction == FrontendOptions::ActionType::Immediate) {
|
||||
IRGenOpts.UseJIT = true;
|
||||
@@ -531,6 +527,50 @@ parseStrictConcurrency(StringRef value) {
|
||||
.Default(llvm::None);
|
||||
}
|
||||
|
||||
static bool ParseCASArgs(CASOptions &Opts, ArgList &Args,
|
||||
DiagnosticEngine &Diags,
|
||||
const FrontendOptions &FrontendOpts) {
|
||||
using namespace options;
|
||||
Opts.EnableCaching |= Args.hasArg(OPT_cache_compile_job);
|
||||
Opts.EnableCachingRemarks |= Args.hasArg(OPT_cache_remarks);
|
||||
Opts.CacheSkipReplay |= Args.hasArg(OPT_cache_disable_replay);
|
||||
if (const Arg *A = Args.getLastArg(OPT_cas_path))
|
||||
Opts.CASOpts.CASPath = A->getValue();
|
||||
else if (Opts.CASOpts.CASPath.empty())
|
||||
Opts.CASOpts.CASPath = llvm::cas::getDefaultOnDiskCASPath();
|
||||
|
||||
if (const Arg *A = Args.getLastArg(OPT_cas_plugin_path))
|
||||
Opts.CASOpts.PluginPath = A->getValue();
|
||||
|
||||
for (StringRef Opt : Args.getAllArgValues(OPT_cas_plugin_option)) {
|
||||
StringRef Name, Value;
|
||||
std::tie(Name, Value) = Opt.split('=');
|
||||
Opts.CASOpts.PluginOptions.emplace_back(std::string(Name),
|
||||
std::string(Value));
|
||||
}
|
||||
|
||||
for (const auto &A : Args.getAllArgValues(OPT_cas_fs))
|
||||
Opts.CASFSRootIDs.emplace_back(A);
|
||||
for (const auto &A : Args.getAllArgValues(OPT_clang_include_tree_root))
|
||||
Opts.ClangIncludeTrees.emplace_back(A);
|
||||
|
||||
if (const Arg *A = Args.getLastArg(OPT_input_file_key))
|
||||
Opts.InputFileKey = A->getValue();
|
||||
|
||||
if (const Arg*A = Args.getLastArg(OPT_bridging_header_pch_key))
|
||||
Opts.BridgingHeaderPCHCacheKey = A->getValue();
|
||||
|
||||
if (Opts.EnableCaching && Opts.CASFSRootIDs.empty() &&
|
||||
Opts.ClangIncludeTrees.empty() &&
|
||||
FrontendOptions::supportCompilationCaching(
|
||||
FrontendOpts.RequestedAction)) {
|
||||
Diags.diagnose(SourceLoc(), diag::error_caching_no_cas_fs);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
|
||||
DiagnosticEngine &Diags,
|
||||
const FrontendOptions &FrontendOpts) {
|
||||
@@ -1565,7 +1605,8 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts, ArgList &Args,
|
||||
DiagnosticEngine &Diags,
|
||||
StringRef workingDirectory,
|
||||
const LangOptions &LangOpts,
|
||||
const FrontendOptions &FrontendOpts) {
|
||||
const FrontendOptions &FrontendOpts,
|
||||
const CASOptions &CASOpts) {
|
||||
using namespace options;
|
||||
|
||||
if (const Arg *a = Args.getLastArg(OPT_tools_directory)) {
|
||||
@@ -1633,8 +1674,8 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts, ArgList &Args,
|
||||
Opts.ExtraArgs.push_back("-ffile-compilation-dir=" + Val);
|
||||
}
|
||||
|
||||
if (FrontendOpts.CASFSRootIDs.empty() &&
|
||||
FrontendOpts.ClangIncludeTrees.empty()) {
|
||||
if (CASOpts.CASFSRootIDs.empty() &&
|
||||
CASOpts.ClangIncludeTrees.empty()) {
|
||||
if (!workingDirectory.empty()) {
|
||||
// Provide a working directory to Clang as well if there are any -Xcc
|
||||
// options, in case some of them are search-related. But do it at the
|
||||
@@ -1661,8 +1702,6 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts, ArgList &Args,
|
||||
|
||||
if (auto *A = Args.getLastArg(OPT_import_objc_header))
|
||||
Opts.BridgingHeader = A->getValue();
|
||||
Opts.BridgingHeaderPCHCacheKey =
|
||||
Args.getLastArgValue(OPT_bridging_header_pch_key);
|
||||
Opts.DisableSwiftBridgeAttr |= Args.hasArg(OPT_disable_swift_bridge_attr);
|
||||
|
||||
Opts.DisableOverlayModules |= Args.hasArg(OPT_emit_imported_modules);
|
||||
@@ -1698,12 +1737,11 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts, ArgList &Args,
|
||||
|
||||
// Forward the FrontendOptions to clang importer option so it can be
|
||||
// accessed when creating clang module compilation invocation.
|
||||
if (FrontendOpts.EnableCaching) {
|
||||
Opts.CASOpts = FrontendOpts.CASOpts;
|
||||
if (CASOpts.EnableCaching) {
|
||||
// Only set UseClangIncludeTree when caching is enabled since it is not
|
||||
// useful in non-caching context.
|
||||
Opts.UseClangIncludeTree = !Args.hasArg(OPT_no_clang_include_tree);
|
||||
Opts.HasClangIncludeTreeRoot = Args.hasArg(OPT_clang_include_tree_root);
|
||||
Opts.UseClangIncludeTree |= !Args.hasArg(OPT_no_clang_include_tree);
|
||||
Opts.HasClangIncludeTreeRoot |= Args.hasArg(OPT_clang_include_tree_root);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -3026,6 +3064,17 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
|
||||
.Default(llvm::CallingConv::C);
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_cas_backend_mode)) {
|
||||
Opts.CASObjMode = llvm::StringSwitch<llvm::CASBackendMode>(A->getValue())
|
||||
.Case("native", llvm::CASBackendMode::Native)
|
||||
.Case("casid", llvm::CASBackendMode::CASID)
|
||||
.Case("verify", llvm::CASBackendMode::Verify)
|
||||
.Default(llvm::CASBackendMode::Native);
|
||||
}
|
||||
|
||||
Opts.UseCASBackend |= Args.hasArg(OPT_cas_backend);
|
||||
Opts.EmitCASIDFile |= Args.hasArg(OPT_cas_emit_casid_file);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -3160,6 +3209,10 @@ bool CompilerInvocation::parseArgs(
|
||||
ParseModuleInterfaceArgs(ModuleInterfaceOpts, ParsedArgs);
|
||||
SaveModuleInterfaceArgs(ModuleInterfaceOpts, FrontendOpts, ParsedArgs, Diags);
|
||||
|
||||
if (ParseCASArgs(CASOpts, ParsedArgs, Diags, FrontendOpts)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ParseLangArgs(LangOpts, ParsedArgs, Diags, FrontendOpts)) {
|
||||
return true;
|
||||
}
|
||||
@@ -3169,7 +3222,8 @@ bool CompilerInvocation::parseArgs(
|
||||
}
|
||||
|
||||
if (ParseClangImporterArgs(ClangImporterOpts, ParsedArgs, Diags,
|
||||
workingDirectory, LangOpts, FrontendOpts)) {
|
||||
workingDirectory, LangOpts, FrontendOpts,
|
||||
CASOpts)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user