Skip to content

Commit 30a9353

Browse files
committed
[cxx-interop] Add CxxShim library; move __swift_interopStaticCast into it.
1 parent ed88700 commit 30a9353

File tree

14 files changed

+121
-27
lines changed

14 files changed

+121
-27
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,12 @@ getLibStdCxxModuleMapPath(SearchPathOptions &opts, llvm::Triple triple,
498498
return getModuleMapFilePath("libstdcxx.modulemap", opts, triple, buffer);
499499
}
500500

501+
static Optional<StringRef>
502+
getLibShimCxxModuleMapPath(SearchPathOptions &Opts, llvm::Triple triple,
503+
SmallVectorImpl<char> &buffer) {
504+
return getModuleMapFilePath("libcxxshim.modulemap", Opts, triple, buffer);
505+
}
506+
501507
static bool clangSupportsPragmaAttributeWithSwiftAttr() {
502508
clang::AttributeCommonInfo swiftAttrInfo(clang::SourceRange(),
503509
clang::AttributeCommonInfo::AT_SwiftAttr,
@@ -611,6 +617,11 @@ importer::getNormalInvocationArguments(
611617
});
612618
}
613619

620+
SmallString<128> buffer;
621+
if (auto path = getLibShimCxxModuleMapPath(searchPathOpts, triple, buffer)) {
622+
invocationArgStrs.push_back((Twine("-fmodule-map-file=") + *path).str());
623+
}
624+
614625
// Set C language options.
615626
if (triple.isOSDarwin()) {
616627
invocationArgStrs.insert(invocationArgStrs.end(), {
@@ -4545,10 +4556,12 @@ DeclRefExpr *getInteropStaticCastDeclRefExpr(ASTContext &ctx,
45454556
derived = derived->wrapInPointer(PTK_UnsafePointer);
45464557
}
45474558

4548-
// Lookup our static cast helper function.
4549-
// TODO: change this to stdlib or something.
4550-
auto wrapperModule =
4551-
ctx.getClangModuleLoader()->getWrapperForModule(owningModule);
4559+
// Lookup our static cast helper function in the C++ shim module.
4560+
auto wrapperModule = ctx.getLoadedModule(ctx.getIdentifier("CxxShim"));
4561+
assert(wrapperModule &&
4562+
"CxxShim module is required when using members of a base class. "
4563+
"Make sure you `import CxxShim`.");
4564+
45524565
SmallVector<ValueDecl *, 1> results;
45534566
ctx.lookupInModule(wrapperModule, "__swift_interopStaticCast", results);
45544567
assert(

stdlib/public/Cxx/CMakeLists.txt

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,92 @@
11
set(libstdcxx_modulemap_target_list)
2+
set(libcxxshim_modulemap_target_list)
23
foreach(sdk ${SWIFT_SDKS})
3-
if(NOT ${sdk} IN_LIST SWIFT_LIBSTDCXX_PLATFORMS)
4-
continue()
5-
endif()
4+
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
5+
set(arch_suffix "${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
6+
set(arch_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")
7+
8+
set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}")
9+
set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}")
10+
11+
set(libcxxshim_header "libcxxshim.h")
12+
set(libcxxshim_header_out "${module_dir}/libcxxshim.h")
13+
set(libcxxshim_header_out_static "${module_dir_static}/libcxxshim.h")
14+
set(libcxxshim_modulemap "libcxxshim.modulemap")
15+
set(libcxxshim_modulemap_out "${module_dir}/libcxxshim.modulemap")
16+
set(libcxxshim_modulemap_out_static "${module_dir_static}/libcxxshim.modulemap")
17+
18+
add_custom_command_target(
19+
copy_libcxxshim_modulemap
20+
COMMAND
21+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
22+
COMMAND
23+
"${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${libcxxshim_modulemap}" "${libcxxshim_modulemap_out}"
24+
OUTPUT ${libcxxshim_modulemap_out}
25+
DEPENDS ${libcxxshim_modulemap}
26+
COMMENT "Copying libcxxshim modulemap to resources")
27+
list(APPEND libcxxshim_modulemap_target_list ${copy_libcxxshim_modulemap})
28+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_libcxxshim_modulemap})
29+
30+
add_custom_command_target(
31+
copy_libcxxshim_header
32+
COMMAND
33+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
34+
COMMAND
35+
"${CMAKE_COMMAND}" "-E" "copy_if_different" "${CMAKE_CURRENT_SOURCE_DIR}/${libcxxshim_header}" "${libcxxshim_header_out}"
36+
OUTPUT ${libcxxshim_header_out}
37+
DEPENDS ${libcxxshim_header}
38+
COMMENT "Copying libcxxshim header to resources")
39+
list(APPEND libcxxshim_modulemap_target_list ${copy_libcxxshim_header})
40+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_libcxxshim_header})
41+
42+
if(SWIFT_BUILD_STATIC_STDLIB)
43+
add_custom_command_target(
44+
copy_libcxxshim_modulemap_static
45+
COMMAND
46+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
47+
COMMAND
48+
"${CMAKE_COMMAND}" "-E" "copy_if_different"
49+
"${libcxxshim_modulemap_out}" "${libcxxshim_modulemap_out_static}"
50+
OUTPUT ${libcxxshim_modulemap_out_static}
51+
DEPENDS ${copy_libcxxshim_modulemap}
52+
COMMENT "Copying libcxxshim modulemap to static resources")
53+
list(APPEND libcxxshim_modulemap_target_list ${copy_libcxxshim_modulemap_static})
54+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_libcxxshim_modulemap_static})
55+
56+
add_custom_command_target(
57+
copy_libcxxshim_header_static
58+
COMMAND
59+
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir_static}
60+
COMMAND
61+
"${CMAKE_COMMAND}" "-E" "copy_if_different"
62+
"${libcxxshim_header_out}" "${libcxxshim_header_out_static}"
63+
OUTPUT ${libcxxshim_header_out_static}
64+
DEPENDS ${copy_libcxxshim_header}
65+
COMMENT "Copying libcxxshim header to static resources")
66+
list(APPEND libcxxshim_modulemap_target_list ${copy_libcxxshim_header_static})
67+
add_dependencies(swift-stdlib-${arch_suffix} ${copy_libcxxshim_header_static})
68+
endif()
69+
70+
swift_install_in_component(FILES "${libcxxshim_modulemap_out}"
71+
DESTINATION "lib/swift/${arch_subdir}"
72+
COMPONENT sdk-overlay)
73+
swift_install_in_component(FILES "${libcxxshim_header_out}"
74+
DESTINATION "lib/swift/${arch_subdir}"
75+
COMPONENT sdk-overlay)
76+
77+
if(SWIFT_BUILD_STATIC_STDLIB)
78+
swift_install_in_component(FILES "${libcxxshim_modulemap_out_static}"
79+
DESTINATION "lib/swift_static/${arch_subdir}"
80+
COMPONENT sdk-overlay)
81+
swift_install_in_component(FILES "${libcxxshim_header_out_static}"
82+
DESTINATION "lib/swift_static/${arch_subdir}"
83+
COMPONENT sdk-overlay)
84+
endif()
85+
endforeach()
86+
87+
# if(NOT ${sdk} IN_LIST SWIFT_LIBSTDCXX_PLATFORMS)
88+
# continue()
89+
# endif()
690

791
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
892
set(arch_suffix "${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
@@ -119,10 +203,15 @@ foreach(sdk ${SWIFT_SDKS})
119203
endif()
120204
endforeach()
121205
endforeach()
206+
122207
add_custom_target(libstdcxx-modulemap DEPENDS ${libstdcxx_modulemap_target_list})
123208
set_property(TARGET libstdcxx-modulemap PROPERTY FOLDER "Miscellaneous")
124209
add_dependencies(sdk-overlay libstdcxx-modulemap)
125210

211+
add_custom_target(libcxxshim-modulemap DEPENDS ${libcxxshim_modulemap_target_list})
212+
set_property(TARGET libcxxshim-modulemap PROPERTY FOLDER "Miscellaneous")
213+
add_dependencies(sdk-overlay libcxxshim-modulemap)
214+
126215

127216
#
128217
# C++ Standard Library Overlay.
@@ -152,4 +241,4 @@ add_swift_target_library(swiftstd ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVE
152241
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
153242
TARGET_SDKS ALL_APPLE_PLATFORMS LINUX
154243
INSTALL_IN_COMPONENT sdk-overlay
155-
DEPENDS libstdcxx-modulemap)
244+
DEPENDS libcxxshim-modulemap libstdcxx-modulemap)

stdlib/public/Cxx/libcxxshim.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
template <class From, class To>
2+
To __swift_interopStaticCast(From from) { return static_cast<To>(from); }
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module CxxShim {
2+
header "libcxxshim.h"
3+
requires cplusplus
4+
}

stdlib/public/Cxx/libcxxshim.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@_exported import CxxShim // Clang module

test/Interop/Cxx/class/inheritance/Inputs/fields.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
template <class From, class To>
2-
To __swift_interopStaticCast(From from) { return from; }
3-
41
struct HasThreeFields {
52
int a = 1;
63
int b = 2;

test/Interop/Cxx/class/inheritance/Inputs/functions.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
template <class From, class To>
2-
To __swift_interopStaticCast(From from) {
3-
return static_cast<To>(from);
4-
}
5-
61
struct NonTrivial {
72
NonTrivial() {}
83
~NonTrivial() {}

test/Interop/Cxx/class/inheritance/Inputs/type-aliases.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
template <class From, class To>
2-
To __swift_interopStaticCast(From from) {
3-
return static_cast<To>(from);
4-
}
5-
61
struct Base {
72
struct Struct {};
83

test/Interop/Cxx/class/inheritance/fields.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// UNSUPPORTED: OS=windows-msvc
77

88
import StdlibUnittest
9+
import CxxShim
910
import Fields
1011

1112
var FieldsTestSuite = TestSuite("Getting and setting fields in base classes")

test/Interop/Cxx/class/inheritance/functions.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// REQUIRES: executable_test
44

55
import StdlibUnittest
6+
import CxxShim
67
import Functions
78

89
var FunctionsTestSuite = TestSuite("Calling functions in base classes")

test/Interop/Cxx/foreign-reference/Inputs/pod.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55

66
#include "visibility.h"
77

8-
template <class From, class To>
9-
To __swift_interopStaticCast(From from) { return from; }
10-
118
inline void *operator new(size_t, void *p) { return p; }
129

1310
SWIFT_BEGIN_NULLABILITY_ANNOTATIONS

test/Interop/Cxx/foreign-reference/pod.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// XFAIL: OS=windows-msvc
55

66
import StdlibUnittest
7+
import CxxShim
78
import POD
89

910
struct StructHoldingPair {

test/Interop/Cxx/operators/Inputs/member-inline.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
#ifndef TEST_INTEROP_CXX_OPERATORS_INPUTS_MEMBER_INLINE_H
22
#define TEST_INTEROP_CXX_OPERATORS_INPUTS_MEMBER_INLINE_H
33

4-
template <class From, class To>
5-
To __swift_interopStaticCast(From from) { return from; }
6-
74
struct LoadableIntWrapper {
85
int value;
96
LoadableIntWrapper operator-(LoadableIntWrapper rhs) {

test/Interop/Cxx/operators/member-inline.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// REQUIRES: executable_test
44

55
import MemberInline
6+
import CxxShim
67
import StdlibUnittest
78

89
var OperatorsTestSuite = TestSuite("Operators")

0 commit comments

Comments
 (0)