mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[CAS] swift dependency scanning using CAS for compiler caching (#66366)
Teach swift dependency scanner to use CAS to capture the full dependencies for a build and construct build commands with immutable inputs from CAS. This allows swift compilation caching using CAS.
This commit is contained in:
@@ -20,11 +20,15 @@
|
||||
#include "swift/DependencyScan/DependencyScanImpl.h"
|
||||
#include "swift/DependencyScan/DependencyScanningTool.h"
|
||||
#include "swift/DependencyScan/StringUtils.h"
|
||||
#include "swift/Frontend/CachingUtils.h"
|
||||
#include "swift/Option/Options.h"
|
||||
#include "llvm/CAS/ObjectStore.h"
|
||||
|
||||
using namespace swift::dependencies;
|
||||
using namespace swift::cas;
|
||||
|
||||
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningTool, swiftscan_scanner_t)
|
||||
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(CachingTool, swiftscan_cas_t)
|
||||
|
||||
//=== Private Cleanup Functions -------------------------------------------===//
|
||||
|
||||
@@ -48,6 +52,12 @@ void swiftscan_dependency_info_details_dispose(
|
||||
swiftscan_string_set_dispose(
|
||||
details_impl->swift_textual_details.extra_pcm_args);
|
||||
swiftscan_string_dispose(details_impl->swift_textual_details.context_hash);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_textual_details.cas_fs_root_id);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_textual_details.bridging_header_include_tree);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_textual_details.module_cache_key);
|
||||
break;
|
||||
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY:
|
||||
swiftscan_string_dispose(
|
||||
@@ -56,6 +66,8 @@ void swiftscan_dependency_info_details_dispose(
|
||||
details_impl->swift_binary_details.module_doc_path);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_binary_details.module_source_info_path);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_binary_details.module_cache_key);
|
||||
break;
|
||||
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER:
|
||||
swiftscan_string_dispose(
|
||||
@@ -70,6 +82,8 @@ void swiftscan_dependency_info_details_dispose(
|
||||
swiftscan_string_dispose(details_impl->clang_details.context_hash);
|
||||
swiftscan_string_set_dispose(details_impl->clang_details.command_line);
|
||||
swiftscan_string_set_dispose(details_impl->clang_details.captured_pcm_args);
|
||||
swiftscan_string_dispose(details_impl->clang_details.cas_fs_root_id);
|
||||
swiftscan_string_dispose(details_impl->clang_details.module_cache_key);
|
||||
break;
|
||||
}
|
||||
delete details_impl;
|
||||
@@ -276,6 +290,12 @@ swiftscan_string_set_t *swiftscan_swift_textual_detail_get_command_line(
|
||||
return details->swift_textual_details.command_line;
|
||||
}
|
||||
|
||||
swiftscan_string_set_t *
|
||||
swiftscan_swift_textual_detail_get_bridging_pch_command_line(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_textual_details.bridging_pch_command_line;
|
||||
}
|
||||
|
||||
swiftscan_string_set_t *swiftscan_swift_textual_detail_get_extra_pcm_args(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_textual_details.extra_pcm_args;
|
||||
@@ -296,6 +316,16 @@ swiftscan_string_set_t *swiftscan_swift_textual_detail_get_swift_overlay_depende
|
||||
return details->swift_textual_details.swift_overlay_module_dependencies;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_swift_textual_detail_get_cas_fs_root_id(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_textual_details.cas_fs_root_id;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_swift_textual_detail_get_module_cache_key(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_textual_details.module_cache_key;
|
||||
}
|
||||
|
||||
//=== Swift Binary Module Details query APIs ------------------------------===//
|
||||
|
||||
swiftscan_string_ref_t swiftscan_swift_binary_detail_get_compiled_module_path(
|
||||
@@ -319,6 +349,12 @@ bool swiftscan_swift_binary_detail_get_is_framework(
|
||||
return details->swift_binary_details.is_framework;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_swift_binary_detail_get_module_cache_key(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_binary_details.module_cache_key;
|
||||
}
|
||||
|
||||
|
||||
//=== Swift Placeholder Module Details query APIs -------------------------===//
|
||||
|
||||
swiftscan_string_ref_t
|
||||
@@ -360,6 +396,16 @@ swiftscan_clang_detail_get_captured_pcm_args(swiftscan_module_details_t details)
|
||||
return details->clang_details.captured_pcm_args;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_clang_detail_get_cas_fs_root_id(swiftscan_module_details_t details) {
|
||||
return details->clang_details.cas_fs_root_id;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_clang_detail_get_module_cache_key(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->clang_details.module_cache_key;
|
||||
}
|
||||
|
||||
//=== Batch Scan Input Functions ------------------------------------------===//
|
||||
|
||||
swiftscan_batch_scan_input_t *swiftscan_batch_scan_input_create() {
|
||||
@@ -617,6 +663,60 @@ swiftscan_diagnostics_set_dispose(swiftscan_diagnostic_set_t* diagnostics){
|
||||
delete diagnostics;
|
||||
}
|
||||
|
||||
//=== CAS Functions ----------------------------------------------------------//
|
||||
|
||||
swiftscan_cas_t swiftscan_cas_create(const char *path) {
|
||||
std::string CASPath(path);
|
||||
if (CASPath.empty())
|
||||
CASPath = llvm::cas::getDefaultOnDiskCASPath();
|
||||
|
||||
CachingTool *tool = new CachingTool(CASPath);
|
||||
if (!tool->isValid()) {
|
||||
delete tool;
|
||||
return nullptr;
|
||||
}
|
||||
return wrap(tool);
|
||||
}
|
||||
|
||||
void swiftscan_cas_dispose(swiftscan_cas_t cas) { delete unwrap(cas); }
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_cas_store(swiftscan_cas_t cas, uint8_t *data, unsigned size) {
|
||||
llvm::StringRef StrContent((char*)data, size);
|
||||
auto ID = unwrap(cas)->storeContent(StrContent);
|
||||
return swift::c_string_utils::create_clone(ID.c_str());
|
||||
}
|
||||
|
||||
static swift::file_types::ID
|
||||
getFileTypeFromScanOutputKind(swiftscan_output_kind_t kind) {
|
||||
switch (kind) {
|
||||
case SWIFTSCAN_OUTPUT_TYPE_OBJECT:
|
||||
return swift::file_types::ID::TY_Object;
|
||||
case SWIFTSCAN_OUTPUT_TYPE_SWIFTMODULE:
|
||||
return swift::file_types::ID::TY_SwiftModuleFile;
|
||||
case SWIFTSCAN_OUTPUT_TYPE_SWIFTINTERFACE:
|
||||
return swift::file_types::ID::TY_SwiftModuleInterfaceFile;
|
||||
case SWIFTSCAN_OUTPUT_TYPE_SWIFTPRIAVEINTERFACE:
|
||||
return swift::file_types::ID::TY_PrivateSwiftModuleInterfaceFile;
|
||||
case SWIFTSCAN_OUTPUT_TYPE_CLANG_MODULE:
|
||||
return swift::file_types::ID::TY_ClangModuleFile;
|
||||
case SWIFTSCAN_OUTPUT_TYPE_CLANG_PCH:
|
||||
return swift::file_types::ID::TY_PCH;
|
||||
}
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_compute_cache_key(swiftscan_cas_t cas, int argc, const char **argv,
|
||||
const char *input, swiftscan_output_kind_t kind) {
|
||||
std::vector<const char *> Compilation;
|
||||
for (int i = 0; i < argc; ++i)
|
||||
Compilation.push_back(argv[i]);
|
||||
|
||||
auto ID = unwrap(cas)->computeCacheKey(Compilation, input,
|
||||
getFileTypeFromScanOutputKind(kind));
|
||||
return swift::c_string_utils::create_clone(ID.c_str());
|
||||
}
|
||||
|
||||
//=== Experimental Compiler Invocation Functions ------------------------===//
|
||||
|
||||
int invoke_swift_compiler(int argc, const char **argv) {
|
||||
|
||||
Reference in New Issue
Block a user