Skip to content

Commit 9ddb035

Browse files
authored
Merge pull request swiftlang#35882 from artemcm/swiftscan_argument_support_query
Add libSwiftScan entry-points to query supported compiler flags and compiler features
2 parents 449424f + 0e6f6a5 commit 9ddb035

File tree

6 files changed

+122
-12
lines changed

6 files changed

+122
-12
lines changed

include/swift-c/DependencyScan/DependencyScan.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
/// SWIFTSCAN_VERSION_MINOR should increase when there are API additions.
2828
/// SWIFTSCAN_VERSION_MAJOR is intended for "major" source/ABI breaking changes.
2929
#define SWIFTSCAN_VERSION_MAJOR 0
30-
#define SWIFTSCAN_VERSION_MINOR 1
30+
#define SWIFTSCAN_VERSION_MINOR 2
3131

3232
SWIFTSCAN_BEGIN_DECLS
3333

@@ -274,6 +274,9 @@ swiftscan_scan_invocation_get_argv(swiftscan_scan_invocation_t invocation);
274274

275275
//=== Cleanup Functions ---------------------------------------------------===//
276276

277+
SWIFTSCAN_PUBLIC void
278+
swiftscan_string_set_dispose(swiftscan_string_set_t *set);
279+
277280
SWIFTSCAN_PUBLIC void
278281
swiftscan_dependency_graph_dispose(swiftscan_dependency_graph_t result);
279282

@@ -292,6 +295,13 @@ swiftscan_batch_scan_result_dispose(swiftscan_batch_scan_result_t *result);
292295
SWIFTSCAN_PUBLIC void
293296
swiftscan_scan_invocation_dispose(swiftscan_scan_invocation_t invocation);
294297

298+
//=== Feature-Query Functions -----------------------------------------===//
299+
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
300+
swiftscan_compiler_supported_arguments_query();
301+
302+
SWIFTSCAN_PUBLIC swiftscan_string_set_t *
303+
swiftscan_compiler_supported_features_query();
304+
295305
//=== Scanner Functions ---------------------------------------------------===//
296306

297307
/// Container of the configuration state and shared cache for dependency

tools/libSwiftScan/libSwiftScan.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "swift/DependencyScan/DependencyScanImpl.h"
1919
#include "swift/DependencyScan/DependencyScanningTool.h"
2020
#include "swift/DependencyScan/StringUtils.h"
21+
#include "swift/Option/Options.h"
2122

2223
using namespace swift::dependencies;
2324

@@ -31,14 +32,6 @@ void swiftscan_string_dispose(swiftscan_string_ref_t string) {
3132
free(const_cast<void *>(string.data));
3233
}
3334

34-
/// Free the given string set.
35-
void swiftscan_string_set_dispose(swiftscan_string_set_t *set) {
36-
for (unsigned SI = 0, SE = set->count; SI < SE; ++SI)
37-
swiftscan_string_dispose(set->strings[SI]);
38-
delete[] set->strings;
39-
delete set;
40-
}
41-
4235
void swiftscan_dependency_info_details_dispose(
4336
swiftscan_module_details_t details) {
4437
swiftscan_module_details_s *details_impl = details;
@@ -422,6 +415,13 @@ swiftscan_scan_invocation_get_argv(swiftscan_scan_invocation_t invocation) {
422415

423416
//=== Public Cleanup Functions --------------------------------------------===//
424417

418+
void swiftscan_string_set_dispose(swiftscan_string_set_t *set) {
419+
for (unsigned SI = 0, SE = set->count; SI < SE; ++SI)
420+
swiftscan_string_dispose(set->strings[SI]);
421+
delete[] set->strings;
422+
delete set;
423+
}
424+
425425
void swiftscan_dependency_graph_dispose(swiftscan_dependency_graph_t result) {
426426
swiftscan_string_dispose(result->main_module_name);
427427
swiftscan_dependency_set_dispose(result->dependencies);
@@ -461,3 +461,33 @@ void swiftscan_scan_invocation_dispose(swiftscan_scan_invocation_t invocation) {
461461
swiftscan_string_set_dispose(invocation->argv);
462462
delete invocation;
463463
}
464+
465+
//=== Feature-Query Functions -----------------------------------------===//
466+
static void addFrontendFlagOption(llvm::opt::OptTable &table,
467+
swift::options::ID id,
468+
std::vector<std::string> &frontendOptions) {
469+
if (table.getOption(id).hasFlag(swift::options::FrontendOption)) {
470+
auto name = table.getOptionName(id);
471+
if (strlen(name) > 0) {
472+
frontendOptions.push_back(std::string(name));
473+
}
474+
}
475+
}
476+
477+
swiftscan_string_set_t *
478+
swiftscan_compiler_supported_arguments_query() {
479+
std::unique_ptr<llvm::opt::OptTable> table = swift::createSwiftOptTable();
480+
std::vector<std::string> frontendFlags;
481+
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
482+
HELPTEXT, METAVAR, VALUES) \
483+
addFrontendFlagOption(*table, swift::options::OPT_##ID, frontendFlags);
484+
#include "swift/Option/Options.inc"
485+
#undef OPTION
486+
return create_set(frontendFlags);
487+
}
488+
489+
swiftscan_string_set_t *
490+
swiftscan_compiler_supported_features_query() {
491+
// TODO: We are yet to figure out how "Features" will be organized.
492+
return nullptr;
493+
}

tools/libSwiftScan/libSwiftScan.exports

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,13 @@ swiftscan_dependency_graph_create
4444
swiftscan_batch_scan_result_create
4545
swiftscan_import_set_create
4646
swiftscan_scanner_create
47+
swiftscan_string_set_dispose
4748
swiftscan_scan_invocation_dispose
4849
swiftscan_batch_scan_input_dispose
4950
swiftscan_batch_scan_entry_dispose
5051
swiftscan_dependency_graph_dispose
5152
swiftscan_batch_scan_result_dispose
5253
swiftscan_import_set_dispose
5354
swiftscan_scanner_dispose
55+
swiftscan_compiler_supported_arguments_query
56+
swiftscan_compiler_supported_features_query

unittests/DependencyScan/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
add_swift_unittest(swiftScanTests
22
ScanFixture.cpp
3+
Features.cpp
34
ModuleDeps.cpp)
45

56
target_link_libraries(swiftScanTests

unittests/DependencyScan/Features.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "ScanFixture.h"
14+
#include "swift-c/DependencyScan/DependencyScan.h"
15+
#include "swift/Basic/LLVM.h"
16+
#include "swift/Option/Options.h"
17+
#include "llvm/ADT/StringRef.h"
18+
#include <vector>
19+
#include <unordered_set>
20+
#include "gtest/gtest.h"
21+
22+
using namespace swift;
23+
using namespace swift::unittest;
24+
25+
static void
26+
testHasOption(llvm::opt::OptTable &table, options::ID id,
27+
const std::unordered_set<std::string> &optionSet) {
28+
if (table.getOption(id).hasFlag(swift::options::FrontendOption)) {
29+
auto name = table.getOptionName(id);
30+
if (strlen(name) > 0) {
31+
auto nameStr = std::string(name);
32+
bool setContainsOption = optionSet.find(nameStr) != optionSet.end();
33+
EXPECT_EQ(setContainsOption, true);
34+
}
35+
}
36+
}
37+
38+
TEST_F(ScanTest, TestHasArgumentQuery) {
39+
std::unique_ptr<llvm::opt::OptTable> table = swift::createSwiftOptTable();
40+
auto supported_args_set = swiftscan_compiler_supported_arguments_query();
41+
std::unordered_set<std::string> optionSet;
42+
for (size_t i = 0; i < supported_args_set->count; ++i) {
43+
swiftscan_string_ref_t option = supported_args_set->strings[i];
44+
const char* data = static_cast<const char*>(option.data);
45+
optionSet.insert(std::string(data, option.length));
46+
}
47+
swiftscan_string_set_dispose(supported_args_set);
48+
#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
49+
HELPTEXT, METAVAR, VALUES) \
50+
testHasOption(*table, swift::options::OPT_##ID, optionSet);
51+
#include "swift/Option/Options.inc"
52+
#undef OPTION
53+
}
54+
55+
TEST_F(ScanTest, TestDoesNotHaveArgumentQuery) {
56+
auto supported_args_set = swiftscan_compiler_supported_arguments_query();
57+
std::unordered_set<std::string> optionSet;
58+
for (size_t i = 0; i < supported_args_set->count; ++i) {
59+
swiftscan_string_ref_t option = supported_args_set->strings[i];
60+
const char* data = static_cast<const char*>(option.data);
61+
optionSet.insert(std::string(data, option.length));
62+
}
63+
swiftscan_string_set_dispose(supported_args_set);
64+
bool hasOption;
65+
hasOption = optionSet.find("-clearly-not-a-compiler-flag") != optionSet.end();
66+
EXPECT_EQ(hasOption, false);
67+
hasOption = optionSet.find("-emit-modul") != optionSet.end();
68+
EXPECT_EQ(hasOption, false);
69+
}

unittests/DependencyScan/ModuleDeps.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ TEST_F(ScanTest, TestModuleDeps) {
5656
// Create test input file
5757
std::string TestPathStr = createFilename(tempDir, "foo.swift");
5858
ASSERT_FALSE(emitFileWithContents(tempDir, "foo.swift", "import A\n"));
59-
llvm::dbgs() << "Input File: " << TestPathStr << "\n";
6059

6160
// Create includes
6261
std::string IncludeDirPath = createFilename(tempDir, "include");
@@ -172,10 +171,8 @@ export *\n\
172171
}
173172

174173
std::vector<const char*> Command;
175-
llvm::dbgs() << "Compiler Command: \n";
176174
for (auto &command : CommandStrArr) {
177175
Command.push_back(command.c_str());
178-
llvm::dbgs() << command.c_str() << "\n";
179176
}
180177
auto DependenciesOrErr = ScannerTool.getDependencies(Command, {});
181178
ASSERT_FALSE(DependenciesOrErr.getError());

0 commit comments

Comments
 (0)