Skip to content

Commit f58c143

Browse files
authored
Merge pull request #34672 from benlangmuir/sourcekit-inproc-and-xpc-together
[sourcekit] Make it possible to install both sourcekitdInProc and sourcekitd efficiently
2 parents dcc42bc + 16dd929 commit f58c143

File tree

18 files changed

+498
-174
lines changed

18 files changed

+498
-174
lines changed

tools/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
include(CheckIncludeFiles)
22
check_include_files("xpc/xpc.h" HAVE_XPC_H)
33

4-
swift_is_installing_component(sourcekit-inproc SOURCEKIT_INSTALLING_INPROC)
5-
6-
if(HAVE_XPC_H AND SWIFT_BUILD_SOURCEKIT AND NOT SOURCEKIT_INSTALLING_INPROC)
4+
if(HAVE_XPC_H AND SWIFT_BUILD_SOURCEKIT)
75
set(BUILD_SOURCEKIT_XPC_SERVICE TRUE)
86
else()
97
set(BUILD_SOURCEKIT_XPC_SERVICE FALSE)

tools/SourceKit/cmake/modules/AddSwiftSourceKit.cmake

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,11 +363,10 @@ macro(add_sourcekit_xpc_service name framework_target)
363363

364364
add_dependencies(${framework_target} ${name})
365365

366-
# This is necessary to avoid having an rpath with an absolute build directory.
367-
# Without this, such an rpath is added during build time and preserved at install time.
366+
# Add rpath for sourcekitdInProc
368367
set_target_properties(${name} PROPERTIES
369368
BUILD_WITH_INSTALL_RPATH On
370-
INSTALL_RPATH "@loader_path/../lib"
369+
INSTALL_RPATH "@loader_path/../../../../../../.."
371370
INSTALL_NAME_DIR "@rpath")
372371

373372
if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx")

tools/SourceKit/include/SourceKit/Core/NotificationCenter.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,33 @@
1414
#define LLVM_SOURCEKIT_CORE_NOTIFICATIONCENTER_H
1515

1616
#include "SourceKit/Core/LLVM.h"
17+
#include "SourceKit/Support/Tracing.h"
18+
#include "SourceKit/Support/UIdent.h"
1719
#include "llvm/Support/Mutex.h"
1820
#include <functional>
1921
#include <vector>
2022

2123
namespace SourceKit {
2224

25+
struct DiagnosticEntryInfo;
26+
2327
typedef std::function<void(StringRef DocumentName)>
2428
DocumentUpdateNotificationReceiver;
2529

30+
typedef std::function<void(uint64_t CompileID, trace::OperationKind,
31+
const trace::SwiftInvocation &)>
32+
CompileWillStartNotificationReceiver;
33+
typedef std::function<void(uint64_t CompileID, trace::OperationKind,
34+
ArrayRef<DiagnosticEntryInfo>)>
35+
CompileDidFinishNotificationReceiver;
36+
2637
class NotificationCenter {
2738
bool DispatchToMain;
2839
std::vector<DocumentUpdateNotificationReceiver> DocUpdReceivers;
40+
std::vector<std::function<void(void)>> TestReceivers;
41+
std::vector<std::function<void(void)>> SemaEnabledReceivers;
42+
std::vector<CompileWillStartNotificationReceiver> CompileWillStartReceivers;
43+
std::vector<CompileDidFinishNotificationReceiver> CompileDidFinishReceivers;
2944
mutable llvm::sys::Mutex Mtx;
3045

3146
public:
@@ -34,8 +49,23 @@ class NotificationCenter {
3449

3550
void addDocumentUpdateNotificationReceiver(
3651
DocumentUpdateNotificationReceiver Receiver);
52+
void addTestNotificationReceiver(std::function<void(void)> Receiver);
53+
void addSemaEnabledNotificationReceiver(std::function<void(void)> Receiver);
54+
void addCompileWillStartNotificationReceiver(
55+
CompileWillStartNotificationReceiver Receiver);
56+
void addCompileDidFinishNotificationReceiver(
57+
CompileDidFinishNotificationReceiver Receiver);
3758

3859
void postDocumentUpdateNotification(StringRef DocumentName) const;
60+
void postTestNotification() const;
61+
void postSemaEnabledNotification() const;
62+
void
63+
postCompileWillStartNotification(uint64_t CompileID,
64+
trace::OperationKind OpKind,
65+
const trace::SwiftInvocation &Inv) const;
66+
void postCompileDidFinishNotification(
67+
uint64_t CompileID, trace::OperationKind OpKind,
68+
ArrayRef<DiagnosticEntryInfo> Diagnostics) const;
3969
};
4070

4171
} // namespace SourceKit

tools/SourceKit/lib/Core/NotificationCenter.cpp

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "SourceKit/Core/NotificationCenter.h"
14+
#include "SourceKit/Core/LangSupport.h"
1415
#include "SourceKit/Support/Concurrency.h"
1516

1617
using namespace SourceKit;
@@ -27,21 +28,64 @@ void NotificationCenter::addDocumentUpdateNotificationReceiver(
2728
DocUpdReceivers.push_back(Receiver);
2829
}
2930

31+
void NotificationCenter::addTestNotificationReceiver(
32+
std::function<void(void)> Receiver) {
33+
llvm::sys::ScopedLock L(Mtx);
34+
TestReceivers.push_back(std::move(Receiver));
35+
}
36+
void NotificationCenter::addSemaEnabledNotificationReceiver(
37+
std::function<void(void)> Receiver) {
38+
llvm::sys::ScopedLock L(Mtx);
39+
SemaEnabledReceivers.push_back(std::move(Receiver));
40+
}
41+
void NotificationCenter::addCompileWillStartNotificationReceiver(
42+
CompileWillStartNotificationReceiver Receiver) {
43+
llvm::sys::ScopedLock L(Mtx);
44+
CompileWillStartReceivers.push_back(std::move(Receiver));
45+
}
46+
void NotificationCenter::addCompileDidFinishNotificationReceiver(
47+
CompileDidFinishNotificationReceiver Receiver) {
48+
llvm::sys::ScopedLock L(Mtx);
49+
CompileDidFinishReceivers.push_back(std::move(Receiver));
50+
}
51+
52+
#define POST_NOTIFICATION(Receivers, Args...) \
53+
do { \
54+
decltype(Receivers) recvs; \
55+
{ \
56+
llvm::sys::ScopedLock L(Mtx); \
57+
recvs = Receivers; \
58+
} \
59+
auto sendNote = [=] { \
60+
for (auto &Fn : recvs) \
61+
Fn(Args); \
62+
}; \
63+
if (DispatchToMain) \
64+
WorkQueue::dispatchOnMain(sendNote); \
65+
else \
66+
sendNote(); \
67+
} while (0)
68+
3069
void NotificationCenter::postDocumentUpdateNotification(
3170
StringRef DocumentName) const {
32-
33-
std::vector<DocumentUpdateNotificationReceiver> recvs;
34-
{
35-
llvm::sys::ScopedLock L(Mtx);
36-
recvs = DocUpdReceivers;
37-
}
3871
std::string docName = DocumentName.str();
39-
auto sendNote = [recvs, docName]{
40-
for (auto &Fn : recvs)
41-
Fn(docName);
42-
};
43-
if (DispatchToMain)
44-
WorkQueue::dispatchOnMain(sendNote);
45-
else
46-
sendNote();
72+
POST_NOTIFICATION(DocUpdReceivers, docName);
73+
}
74+
void NotificationCenter::postTestNotification() const {
75+
POST_NOTIFICATION(TestReceivers, );
76+
}
77+
void NotificationCenter::postSemaEnabledNotification() const {
78+
POST_NOTIFICATION(SemaEnabledReceivers, );
79+
}
80+
void NotificationCenter::postCompileWillStartNotification(
81+
uint64_t CompileID, trace::OperationKind OpKind,
82+
const trace::SwiftInvocation &Inv) const {
83+
trace::SwiftInvocation inv(Inv);
84+
POST_NOTIFICATION(CompileWillStartReceivers, CompileID, OpKind, inv);
85+
}
86+
void NotificationCenter::postCompileDidFinishNotification(
87+
uint64_t CompileID, trace::OperationKind OpKind,
88+
ArrayRef<DiagnosticEntryInfo> Diagnostics) const {
89+
std::vector<DiagnosticEntryInfo> diags(Diagnostics);
90+
POST_NOTIFICATION(CompileDidFinishReceivers, CompileID, OpKind, diags);
4791
}

tools/SourceKit/tools/sourcekitd/bin/InProc/CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
set(EXPORTED_SYMBOL_FILE "${SOURCEKITD_SOURCE_DIR}/bin/sourcekitd.exports")
1+
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
2+
set(EXPORTED_SYMBOL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/sourcekitdInProc-darwin.exports")
3+
else()
4+
set(EXPORTED_SYMBOL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/sourcekitdInProc.exports")
5+
endif()
26

37
option(SOURCEKITD_BUILD_STATIC_INPROC
48
"Build sourcekitdInProc as a static library (in addition to a shared one)" OFF)
59

10+
swift_is_installing_component(sourcekit-inproc SOURCEKIT_INSTALLING_INPROC)
11+
612
set(sourcekitdInProc_args
713
sourcekitdInProc.cpp
814
LLVM_LINK_COMPONENTS support coverage
@@ -17,6 +23,11 @@ if (SOURCEKIT_INSTALLING_INPROC)
1723
INSTALL_IN_COMPONENT sourcekit-inproc
1824
)
1925
set_property(TARGET sourcekitdInProc APPEND_STRING PROPERTY LINK_FLAGS " -fapplication-extension")
26+
if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx")
27+
add_definitions(-DSOURCEKIT_VERSIONED_FRAMEWORK_BUNDLE)
28+
else()
29+
add_definitions(-DSOURCEKIT_UNVERSIONED_FRAMEWORK_BUNDLE)
30+
endif()
2031
else()
2132
add_sourcekit_library(sourcekitdInProc
2233
${sourcekitdInProc_args}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
sourcekitd_cancel_request
2+
sourcekitd_initialize
3+
sourcekitd_request_array_create
4+
sourcekitd_request_array_set_int64
5+
sourcekitd_request_array_set_string
6+
sourcekitd_request_array_set_stringbuf
7+
sourcekitd_request_array_set_uid
8+
sourcekitd_request_array_set_value
9+
sourcekitd_request_create_from_yaml
10+
sourcekitd_request_description_copy
11+
sourcekitd_request_description_dump
12+
sourcekitd_request_dictionary_create
13+
sourcekitd_request_dictionary_set_int64
14+
sourcekitd_request_dictionary_set_string
15+
sourcekitd_request_dictionary_set_stringbuf
16+
sourcekitd_request_dictionary_set_uid
17+
sourcekitd_request_dictionary_set_value
18+
sourcekitd_request_int64_create
19+
sourcekitd_request_retain
20+
sourcekitd_request_release
21+
sourcekitd_request_string_create
22+
sourcekitd_request_uid_create
23+
sourcekitd_response_description_copy
24+
sourcekitd_response_description_dump
25+
sourcekitd_response_description_dump_filedesc
26+
sourcekitd_response_dispose
27+
sourcekitd_response_error_get_description
28+
sourcekitd_response_error_get_kind
29+
sourcekitd_response_get_value
30+
sourcekitd_response_is_error
31+
sourcekitd_send_request
32+
sourcekitd_send_request_sync
33+
sourcekitd_set_interrupted_connection_handler
34+
sourcekitd_set_notification_handler
35+
sourcekitd_set_uid_handler
36+
sourcekitd_set_uid_handlers
37+
sourcekitd_shutdown
38+
sourcekitd_uid_get_from_buf
39+
sourcekitd_uid_get_from_cstr
40+
sourcekitd_uid_get_length
41+
sourcekitd_uid_get_string_ptr
42+
sourcekitd_variant_array_apply
43+
sourcekitd_variant_array_apply_f
44+
sourcekitd_variant_array_get_bool
45+
sourcekitd_variant_array_get_count
46+
sourcekitd_variant_array_get_int64
47+
sourcekitd_variant_array_get_string
48+
sourcekitd_variant_array_get_uid
49+
sourcekitd_variant_array_get_value
50+
sourcekitd_variant_bool_get_value
51+
sourcekitd_variant_description_copy
52+
sourcekitd_variant_description_dump
53+
sourcekitd_variant_description_dump_filedesc
54+
sourcekitd_variant_dictionary_apply
55+
sourcekitd_variant_dictionary_apply_f
56+
sourcekitd_variant_dictionary_get_bool
57+
sourcekitd_variant_dictionary_get_int64
58+
sourcekitd_variant_dictionary_get_string
59+
sourcekitd_variant_dictionary_get_value
60+
sourcekitd_variant_dictionary_get_uid
61+
sourcekitd_variant_get_type
62+
sourcekitd_variant_json_description_copy
63+
sourcekitd_variant_string_get_length
64+
sourcekitd_variant_string_get_ptr
65+
sourcekitd_variant_data_get_size
66+
sourcekitd_variant_data_get_ptr
67+
sourcekitd_variant_int64_get_value
68+
sourcekitd_variant_uid_get_value
69+
_ZN10sourcekitd13enableLoggingEN4llvm9StringRefE
70+
_ZN10sourcekitd13handleRequestEPvNSt3__18functionIFvS0_EEE
71+
_ZN10sourcekitd17initializeServiceEN4llvm9StringRefES1_NSt3__18functionIFvPvEEE
72+
_ZN10sourcekitd24createErrorRequestFailedEN4llvm9StringRefE
73+
_ZN9SourceKit6Logger12LoggingLevelE
74+
_ZN9SourceKit6LoggerD1Ev
75+
_ZN9SourceKit6UIdent6setTagEPv
76+
_ZN9SourceKit6UIdentC1EN4llvm9StringRefE
77+
_ZN9SourceKit9WorkQueue4Impl12dispatchSyncEPvRKNS0_12DispatchDataE
78+
_ZN9SourceKit9WorkQueue4Impl15dispatchBarrierEPvRKNS0_12DispatchDataE
79+
_ZN9SourceKit9WorkQueue4Impl6createENS0_9DequeuingENS0_8PriorityEN4llvm9StringRefE
80+
_ZN9SourceKit9WorkQueue4Impl7releaseEPv
81+
_ZNK9SourceKit6UIdent5c_strEv
82+
_ZNK9SourceKit6UIdent6getTagEv

0 commit comments

Comments
 (0)