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:
Artem Chikin
2022-02-03 14:54:48 -08:00
parent 59f29f09d4
commit d24e15812b
26 changed files with 429 additions and 307 deletions

View File

@@ -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 ------------------------===//