Skip to content

Commit 157a277

Browse files
committed
[android] add an android NDK Swift overlay module, and use it instead of Glibc
1 parent dac0739 commit 157a277

File tree

29 files changed

+249
-19
lines changed

29 files changed

+249
-19
lines changed

lib/ClangImporter/ClangIncludePaths.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ static bool shouldInjectLibcModulemap(const llvm::Triple &triple) {
185185

186186
static SmallVector<std::pair<std::string, std::string>, 2>
187187
getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName,
188-
std::optional<StringRef> maybeHeaderFileName,
188+
std::optional<ArrayRef<StringRef>> maybeHeaderFileNames,
189189
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs) {
190190
const llvm::Triple &triple = ctx.LangOpts.Target;
191191
if (!shouldInjectLibcModulemap(triple))
@@ -227,18 +227,20 @@ getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName,
227227
SmallVector<std::pair<std::string, std::string>, 2> vfsMappings{
228228
{std::string(injectedModuleMapPath), std::string(actualModuleMapPath)}};
229229

230-
if (maybeHeaderFileName) {
231-
// TODO: remove the SwiftGlibc.h header and reference all Glibc headers
232-
// directly from the modulemap.
233-
Path actualHeaderPath = actualModuleMapPath;
234-
llvm::sys::path::remove_filename(actualHeaderPath);
235-
llvm::sys::path::append(actualHeaderPath, maybeHeaderFileName.value());
230+
if (maybeHeaderFileNames) {
231+
for (const auto &filename : *maybeHeaderFileNames) {
232+
// TODO: remove the SwiftGlibc.h header and reference all Glibc headers
233+
// directly from the modulemap.
234+
Path actualHeaderPath = actualModuleMapPath;
235+
llvm::sys::path::remove_filename(actualHeaderPath);
236+
llvm::sys::path::append(actualHeaderPath, filename);
236237

237-
Path injectedHeaderPath(libcDir);
238-
llvm::sys::path::append(injectedHeaderPath, maybeHeaderFileName.value());
238+
Path injectedHeaderPath(libcDir);
239+
llvm::sys::path::append(injectedHeaderPath, filename);
239240

240-
vfsMappings.push_back(
241-
{std::string(injectedHeaderPath), std::string(actualHeaderPath)});
241+
vfsMappings.push_back(
242+
{std::string(injectedHeaderPath), std::string(actualHeaderPath)});
243+
}
242244
}
243245

244246
return vfsMappings;
@@ -559,8 +561,13 @@ ClangInvocationFileMapping swift::getClangInvocationFileMapping(
559561
} else if (triple.isMusl()) {
560562
libcFileMapping =
561563
getLibcFileMapping(ctx, "musl.modulemap", StringRef("SwiftMusl.h"), vfs);
564+
} else if (triple.isAndroid()) {
565+
// Android uses the android-specific module map that overlays the NDK.
566+
StringRef headerFiles[] = {"SwiftAndroidNDK.h", "SwiftBionic.h"};
567+
libcFileMapping =
568+
getLibcFileMapping(ctx, "android.modulemap", headerFiles, vfs);
562569
} else {
563-
// Android/BSD/Linux Mappings
570+
// BSD/Linux Mappings
564571
libcFileMapping = getLibcFileMapping(ctx, "glibc.modulemap",
565572
StringRef("SwiftGlibc.h"), vfs);
566573

stdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,9 @@ endfunction()
17521752
# SWIFT_MODULE_DEPENDS_WASI
17531753
# Swift modules this library depends on when built for WASI.
17541754
#
1755+
# SWIFT_MODULE_DEPENDS_ANDROID
1756+
# Swift modules this library depends on when built for Android.
1757+
#
17551758
# FRAMEWORK_DEPENDS
17561759
# System frameworks this library depends on.
17571760
#
@@ -1875,6 +1878,7 @@ function(add_swift_target_library name)
18751878
SWIFT_COMPILE_FLAGS_XROS
18761879
SWIFT_COMPILE_FLAGS_LINUX
18771880
SWIFT_MODULE_DEPENDS
1881+
SWIFT_MODULE_DEPENDS_ANDROID
18781882
SWIFT_MODULE_DEPENDS_CYGWIN
18791883
SWIFT_MODULE_DEPENDS_FREEBSD
18801884
SWIFT_MODULE_DEPENDS_FREESTANDING
@@ -2086,12 +2090,15 @@ function(add_swift_target_library name)
20862090
elseif(sdk STREQUAL "OPENBSD")
20872091
list(APPEND swiftlib_module_depends_flattened
20882092
${SWIFTLIB_SWIFT_MODULE_DEPENDS_OPENBSD})
2089-
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
2093+
elseif(sdk STREQUAL "LINUX")
20902094
list(APPEND swiftlib_module_depends_flattened
20912095
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX})
20922096
elseif(sdk STREQUAL "LINUX_STATIC")
20932097
list(APPEND swiftlib_module_depends_flattened
20942098
${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
2099+
elseif(sdk STREQUAL "ANDROID")
2100+
list(APPEND swiftlib_module_depends_flattened
2101+
${SWIFTLIB_SWIFT_MODULE_DEPENDS_ANDROID})
20952102
elseif(sdk STREQUAL "CYGWIN")
20962103
list(APPEND swiftlib_module_depends_flattened
20972104
${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN})
@@ -2905,6 +2912,7 @@ function(add_swift_target_executable name)
29052912
DEPENDS
29062913
LINK_LIBRARIES
29072914
SWIFT_MODULE_DEPENDS
2915+
SWIFT_MODULE_DEPENDS_ANDROID
29082916
SWIFT_MODULE_DEPENDS_CYGWIN
29092917
SWIFT_MODULE_DEPENDS_FREEBSD
29102918
SWIFT_MODULE_DEPENDS_FREESTANDING
@@ -3015,12 +3023,15 @@ function(add_swift_target_executable name)
30153023
elseif(sdk STREQUAL "OPENBSD")
30163024
list(APPEND swiftexe_module_depends_flattened
30173025
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_OPENBSD})
3018-
elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID")
3026+
elseif(sdk STREQUAL "LINUX")
30193027
list(APPEND swiftexe_module_depends_flattened
30203028
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX})
30213029
elseif(sdk STREQUAL "LINUX_STATIC")
30223030
list(APPEND swiftexe_module_depends_flattened
30233031
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX_STATIC})
3032+
elseif(sdk STREQUAL "ANDROID")
3033+
list(APPEND swiftexe_module_depends_flattened
3034+
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_ANDROID})
30243035
elseif(sdk STREQUAL "CYGWIN")
30253036
list(APPEND swiftexe_module_depends_flattened
30263037
${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_CYGWIN})

stdlib/private/RuntimeUnittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ add_swift_target_library(swiftRuntimeUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES
88
ExclusivityTests.cpp
99

1010
SWIFT_MODULE_DEPENDS StdlibUnittest
11+
SWIFT_MODULE_DEPENDS_ANDROID Android
1112
SWIFT_MODULE_DEPENDS_LINUX Glibc
1213
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
1314
SWIFT_MODULE_DEPENDS_OPENBSD Glibc

stdlib/private/StdlibCollectionUnittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ add_swift_target_library(swiftStdlibCollectionUnittest ${SWIFT_STDLIB_LIBRARY_BU
1919
WriteBackMutableSlice.swift
2020

2121
SWIFT_MODULE_DEPENDS StdlibUnittest
22+
SWIFT_MODULE_DEPENDS_ANDROID Android
2223
SWIFT_MODULE_DEPENDS_LINUX Glibc
2324
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
2425
SWIFT_MODULE_DEPENDS_OPENBSD Glibc

stdlib/private/StdlibUnicodeUnittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ add_swift_target_library(swiftStdlibUnicodeUnittest ${SWIFT_STDLIB_LIBRARY_BUILD
1010
WordBreaking.swift
1111

1212
SWIFT_MODULE_DEPENDS StdlibUnittest
13+
SWIFT_MODULE_DEPENDS_ANDROID Android
1314
SWIFT_MODULE_DEPENDS_LINUX Glibc
1415
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
1516
SWIFT_MODULE_DEPENDS_OPENBSD Glibc

stdlib/private/StdlibUnittest/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ add_swift_target_library(swiftStdlibUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES}
6262
SWIFT_MODULE_DEPENDS_XROS ${swift_stdlib_unittest_darwin_dependencies}
6363
SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_stdlib_unittest_darwin_dependencies}
6464
SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}"
65+
SWIFT_MODULE_DEPENDS_ANDROID Android
6566
SWIFT_MODULE_DEPENDS_LINUX Glibc
6667
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
6768
SWIFT_MODULE_DEPENDS_OPENBSD Glibc

stdlib/private/StdlibUnittest/RaceTest.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ import Darwin
4545
import Glibc
4646
#elseif canImport(Musl)
4747
import Musl
48+
#elseif canImport(Android)
49+
import Android
4850
#elseif os(WASI)
4951
import WASILibc
5052
#elseif os(Windows)

stdlib/private/StdlibUnittest/StdlibCoreExtras.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import Darwin
1818
import Glibc
1919
#elseif canImport(Musl)
2020
import Musl
21+
#elseif canImport(Android)
22+
import Android
2123
#elseif os(WASI)
2224
import WASILibc
2325
#elseif os(Windows)

stdlib/private/StdlibUnittest/StdlibUnittest.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import Darwin
2424
import Glibc
2525
#elseif canImport(Musl)
2626
import Musl
27+
#elseif canImport(Android)
28+
import Android
2729
#elseif os(WASI)
2830
import WASILibc
2931
#elseif os(Windows)

stdlib/private/SwiftPrivate/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ add_swift_target_library(swiftSwiftPrivate ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
2727
SWIFT_MODULE_DEPENDS_WATCHOS ${swift_swiftprivate_darwin_depencencies}
2828
SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_swiftprivate_darwin_depencencies}
2929
SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}"
30+
SWIFT_MODULE_DEPENDS_ANDROID Android
3031
SWIFT_MODULE_DEPENDS_LINUX Glibc
3132
SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl
3233
SWIFT_MODULE_DEPENDS_FREEBSD Glibc

0 commit comments

Comments
 (0)