mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Build libSwiftStaticMirror as a standalone library with minimal required dependencies.
This separates it from `libSwiftScan` and allows us to build this library without building much of the rest of the compiler. Also refactor `utils/build-parser-lib` into `utils/build-tooling-libs` which builds both SwiftSyntaxParser and SwiftStaticMirror.
This commit is contained in:
@@ -18,25 +18,13 @@
|
||||
#include "swift/DriverTool/DriverTool.h"
|
||||
#include "swift/DependencyScan/DependencyScanImpl.h"
|
||||
#include "swift/DependencyScan/DependencyScanningTool.h"
|
||||
#include "swift/StaticMirror/BinaryScanningTool.h"
|
||||
#include "swift/StaticMirror/BinaryScanImpl.h"
|
||||
#include "swift/DependencyScan/StringUtils.h"
|
||||
#include "swift/Option/Options.h"
|
||||
|
||||
using namespace swift::dependencies;
|
||||
using namespace swift::static_mirror;
|
||||
|
||||
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningTool, swiftscan_scanner_t)
|
||||
|
||||
inline BinaryScanningTool *unwrap_static_mirror(swiftscan_static_mirror_t P) {
|
||||
return reinterpret_cast<BinaryScanningTool *>(P);
|
||||
}
|
||||
inline swiftscan_static_mirror_t
|
||||
wrap_static_mirror(const BinaryScanningTool *P) {
|
||||
return reinterpret_cast<swiftscan_static_mirror_t>(
|
||||
const_cast<BinaryScanningTool *>(P));
|
||||
}
|
||||
|
||||
//=== Private Cleanup Functions -------------------------------------------===//
|
||||
|
||||
/// Free the given string.
|
||||
@@ -146,7 +134,7 @@ swiftscan_dependency_graph_create(swiftscan_scanner_t scanner,
|
||||
int argc = invocation->argv->count;
|
||||
std::vector<const char *> Compilation;
|
||||
for (int i = 0; i < argc; ++i)
|
||||
Compilation.push_back(get_C_string(invocation->argv->strings[i]));
|
||||
Compilation.push_back(swift::c_string_utils::get_C_string(invocation->argv->strings[i]));
|
||||
|
||||
// Execute the scan and bridge the result
|
||||
auto ScanResult = ScanningTool->getDependencies(Compilation, {});
|
||||
@@ -164,13 +152,13 @@ swiftscan_batch_scan_result_create(swiftscan_scanner_t scanner,
|
||||
int argc = invocation->argv->count;
|
||||
std::vector<const char *> Compilation;
|
||||
for (int i = 0; i < argc; ++i)
|
||||
Compilation.push_back(get_C_string(invocation->argv->strings[i]));
|
||||
Compilation.push_back(swift::c_string_utils::get_C_string(invocation->argv->strings[i]));
|
||||
|
||||
std::vector<BatchScanInput> BatchInput;
|
||||
for (size_t i = 0; i < batch_input->count; ++i) {
|
||||
swiftscan_batch_scan_entry_s *Entry = batch_input->modules[i];
|
||||
BatchInput.push_back({get_C_string(Entry->module_name),
|
||||
get_C_string(Entry->arguments),
|
||||
BatchInput.push_back({swift::c_string_utils::get_C_string(Entry->module_name),
|
||||
swift::c_string_utils::get_C_string(Entry->arguments),
|
||||
/*outputPath*/ "", Entry->is_swift});
|
||||
}
|
||||
|
||||
@@ -201,7 +189,7 @@ swiftscan_import_set_create(swiftscan_scanner_t scanner,
|
||||
int argc = invocation->argv->count;
|
||||
std::vector<const char *> Compilation;
|
||||
for (int i = 0; i < argc; ++i)
|
||||
Compilation.push_back(get_C_string(invocation->argv->strings[i]));
|
||||
Compilation.push_back(swift::c_string_utils::get_C_string(invocation->argv->strings[i]));
|
||||
|
||||
// Execute the scan and bridge the result
|
||||
auto PreScanResult = ScanningTool->getImports(Compilation);
|
||||
@@ -385,12 +373,12 @@ swiftscan_batch_scan_entry_t swiftscan_batch_scan_entry_create() {
|
||||
|
||||
void swiftscan_batch_scan_entry_set_module_name(
|
||||
swiftscan_batch_scan_entry_t entry, const char *name) {
|
||||
entry->module_name = create_clone(name);
|
||||
entry->module_name = swift::c_string_utils::create_clone(name);
|
||||
}
|
||||
|
||||
void swiftscan_batch_scan_entry_set_arguments(
|
||||
swiftscan_batch_scan_entry_t entry, const char *arguments) {
|
||||
entry->arguments = create_clone(arguments);
|
||||
entry->arguments = swift::c_string_utils::create_clone(arguments);
|
||||
}
|
||||
|
||||
void swiftscan_batch_scan_entry_set_is_swift(swiftscan_batch_scan_entry_t entry,
|
||||
@@ -428,13 +416,13 @@ swiftscan_scan_invocation_t swiftscan_scan_invocation_create() {
|
||||
|
||||
void swiftscan_scan_invocation_set_working_directory(
|
||||
swiftscan_scan_invocation_t invocation, const char *working_directory) {
|
||||
invocation->working_directory = create_clone(working_directory);
|
||||
invocation->working_directory = swift::c_string_utils::create_clone(working_directory);
|
||||
}
|
||||
|
||||
SWIFTSCAN_PUBLIC void
|
||||
swiftscan_scan_invocation_set_argv(swiftscan_scan_invocation_t invocation,
|
||||
int argc, const char **argv) {
|
||||
invocation->argv = create_set(argc, argv);
|
||||
invocation->argv = swift::c_string_utils::create_set(argc, argv);
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_scan_invocation_get_working_directory(
|
||||
@@ -518,11 +506,11 @@ swiftscan_compiler_target_info_query(swiftscan_scan_invocation_t invocation) {
|
||||
int argc = invocation->argv->count;
|
||||
std::vector<const char *> Compilation;
|
||||
for (int i = 0; i < argc; ++i)
|
||||
Compilation.push_back(get_C_string(invocation->argv->strings[i]));
|
||||
Compilation.push_back(swift::c_string_utils::get_C_string(invocation->argv->strings[i]));
|
||||
|
||||
auto TargetInfo = getTargetInfo(Compilation);
|
||||
if (TargetInfo.getError())
|
||||
return create_null();
|
||||
return swift::c_string_utils::create_null();
|
||||
return TargetInfo.get();
|
||||
}
|
||||
|
||||
@@ -535,7 +523,7 @@ swiftscan_compiler_supported_arguments_query() {
|
||||
addFrontendFlagOption(*table, swift::options::OPT_##ID, frontendFlags);
|
||||
#include "swift/Option/Options.inc"
|
||||
#undef OPTION
|
||||
return create_set(frontendFlags);
|
||||
return swift::c_string_utils::create_set(frontendFlags);
|
||||
}
|
||||
|
||||
swiftscan_string_set_t *
|
||||
@@ -543,85 +531,7 @@ swiftscan_compiler_supported_features_query() {
|
||||
std::vector<std::string> allFeatures;
|
||||
allFeatures.emplace_back("library-level");
|
||||
allFeatures.emplace_back("emit-abi-descriptor");
|
||||
return create_set(allFeatures);
|
||||
}
|
||||
|
||||
//=== Static Mirror Scan Functions ---------------------------------------===//
|
||||
swiftscan_static_mirror_t
|
||||
swiftscan_static_mirror_create(int num_binaries, const char **binary_paths,
|
||||
const char *arch) {
|
||||
INITIALIZE_LLVM();
|
||||
std::vector<std::string> inputBinaryPaths;
|
||||
for (unsigned SI = 0, SE = num_binaries; SI < SE; ++SI)
|
||||
inputBinaryPaths.push_back(binary_paths[SI]);
|
||||
|
||||
return wrap_static_mirror(new BinaryScanningTool(inputBinaryPaths, arch));
|
||||
}
|
||||
|
||||
void swiftscan_static_mirror_dispose(
|
||||
swiftscan_static_mirror_t c_static_mirror) {
|
||||
delete unwrap_static_mirror(c_static_mirror);
|
||||
}
|
||||
|
||||
swiftscan_static_mirror_conformances_set_t *
|
||||
swiftscan_static_mirror_conformances_set_create(
|
||||
swiftscan_static_mirror_t static_mirror, int num_protocols,
|
||||
const char **protocol_names) {
|
||||
std::vector<std::string> protocols;
|
||||
for (unsigned SI = 0, SE = num_protocols; SI < SE; ++SI)
|
||||
protocols.push_back(protocol_names[SI]);
|
||||
BinaryScanningTool *scanTool = unwrap_static_mirror(static_mirror);
|
||||
auto scanResult = scanTool->collectConformances(protocols);
|
||||
|
||||
// Bridge to the C interface
|
||||
swiftscan_static_mirror_conformances_set_t *conformanceSet =
|
||||
new swiftscan_static_mirror_conformances_set_t;
|
||||
conformanceSet->count = scanResult.Conformances.size();
|
||||
conformanceSet->conformances =
|
||||
new swiftscan_static_mirror_conformance_info_t[conformanceSet->count];
|
||||
|
||||
size_t idx = 0;
|
||||
for (auto &conformance : scanResult.Conformances) {
|
||||
swiftscan_conformance_info_s *conformanceInfo = new swiftscan_conformance_info_s;
|
||||
conformanceSet->conformances[idx] = conformanceInfo;
|
||||
conformanceInfo->type_name = create_clone(conformance.TypeName.c_str());
|
||||
conformanceInfo->mangled_type_name = create_clone(conformance.MangledTypeName.c_str());
|
||||
conformanceInfo->protocol_name = create_clone(conformance.ProtocolName.c_str());
|
||||
idx += 1;
|
||||
}
|
||||
return conformanceSet;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_static_mirror_conformance_info_get_type_name(swiftscan_static_mirror_conformance_info_t info) {
|
||||
return info->type_name;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_static_mirror_conformance_info_get_protocol_name(swiftscan_static_mirror_conformance_info_t info) {
|
||||
return info->protocol_name;
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_static_mirror_conformance_info_get_mangled_type_name(swiftscan_static_mirror_conformance_info_t info) {
|
||||
return info->mangled_type_name;
|
||||
}
|
||||
|
||||
void swiftscan_static_mirror_conformance_info_dispose(
|
||||
swiftscan_static_mirror_conformance_info_t info) {
|
||||
swiftscan_conformance_info_s *info_impl = info;
|
||||
swiftscan_string_dispose(info_impl->type_name);
|
||||
swiftscan_string_dispose(info_impl->mangled_type_name);
|
||||
swiftscan_string_dispose(info_impl->protocol_name);
|
||||
}
|
||||
|
||||
void swiftscan_static_mirror_conformances_set_dispose(
|
||||
swiftscan_static_mirror_conformances_set_t *set) {
|
||||
for (size_t i = 0; i < set->count; ++i) {
|
||||
swiftscan_static_mirror_conformance_info_dispose(set->conformances[i]);
|
||||
}
|
||||
delete[] set->conformances;
|
||||
delete set;
|
||||
return swift::c_string_utils::create_set(allFeatures);
|
||||
}
|
||||
|
||||
//=== Experimental Compiler Invocation Functions ------------------------===//
|
||||
|
||||
Reference in New Issue
Block a user