diff --git a/lib/Immediate/Immediate.cpp b/lib/Immediate/Immediate.cpp index 27c4632245db8..d1cca84e85699 100644 --- a/lib/Immediate/Immediate.cpp +++ b/lib/Immediate/Immediate.cpp @@ -239,7 +239,7 @@ int swift::RunImmediately(CompilerInstance &CI, // This must be done here, before any library loading has been done, to avoid // racing with the static initializers in user code. // Setup interpreted process arguments. - using ArgOverride = void (*)(const char **, int); + using ArgOverride = void (* SWIFT_CC(swift))(const char **, int); #if defined(_WIN32) auto stdlib = loadSwiftRuntime(Context.SearchPathOpts.RuntimeLibraryPaths); if (!stdlib) { diff --git a/stdlib/CMakeLists.txt b/stdlib/CMakeLists.txt index 38c2b7f7827dc..a21db60bb1e40 100644 --- a/stdlib/CMakeLists.txt +++ b/stdlib/CMakeLists.txt @@ -127,6 +127,10 @@ option(SWIFT_STDLIB_PASSTHROUGH_METADATA_ALLOCATOR "Build stdlib without a custom implementation of MetadataAllocator, relying on malloc+free instead." FALSE) +option(SWIFT_STDLIB_HAS_COMMANDLINE + "Build stdlib with the CommandLine enum and support for argv/argc." + TRUE) + option(SWIFT_BUILD_TEST_SUPPORT_MODULES "Whether to build StdlibUnittest and other test support modules. Defaults to On when SWIFT_BUILD_SDK_OVERLAY is On, or when SWIFT_INCLUDE_TESTS is On." "${SWIFT_BUILD_TEST_SUPPORT_MODULES_default}") diff --git a/stdlib/cmake/modules/SwiftSource.cmake b/stdlib/cmake/modules/SwiftSource.cmake index f5ade74eab0e9..de4de4bc2c688 100644 --- a/stdlib/cmake/modules/SwiftSource.cmake +++ b/stdlib/cmake/modules/SwiftSource.cmake @@ -289,6 +289,10 @@ function(_add_target_variant_swift_compile_flags list(APPEND result "-D" "SWIFT_RUNTIME_OS_VERSIONING") endif() + if(SWIFT_STDLIB_HAS_COMMANDLINE) + list(APPEND result "-D" "SWIFT_STDLIB_HAS_COMMANDLINE") + endif() + if(SWIFT_STDLIB_HAS_STDIN) list(APPEND result "-D" "SWIFT_STDLIB_HAS_STDIN") endif() diff --git a/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt b/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt index 5daf252fe7561..3c227afdc384a 100644 --- a/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt +++ b/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt @@ -3,6 +3,13 @@ if(SWIFT_STDLIB_HAS_ENVIRON) set(swift_private_libc_extras_flags "-D" "SWIFT_STDLIB_HAS_ENVIRON") endif() +set(swift_private_libc_extras_incorporate_object_libraries) +if(SWIFT_STDLIB_HAS_COMMANDLINE) + list(APPEND swift_private_libc_extras_flags "-D" "SWIFT_STDLIB_HAS_COMMANDLINE") +else() + set(swift_private_libc_extras_incorporate_object_libraries "swiftCommandLineSupport") +endif() + add_swift_target_library(swiftSwiftPrivateLibcExtras ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB # This file should be listed the first. Module name is inferred from the # filename. @@ -25,5 +32,6 @@ add_swift_target_library(swiftSwiftPrivateLibcExtras ${SWIFT_STDLIB_LIBRARY_BUIL SWIFT_MODULE_DEPENDS_CYGWIN Glibc SWIFT_MODULE_DEPENDS_HAIKU Glibc SWIFT_MODULE_DEPENDS_WINDOWS CRT WinSDK + INCORPORATE_OBJECT_LIBRARIES ${swift_private_libc_extras_incorporate_object_libraries} INSTALL_IN_COMPONENT stdlib-experimental DARWIN_INSTALL_NAME_DIR "${SWIFT_DARWIN_STDLIB_PRIVATE_INSTALL_NAME_DIR}") diff --git a/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift b/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift index 11df099afdc38..07d1ebd7673bd 100644 --- a/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift +++ b/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift @@ -57,6 +57,18 @@ public enum ProcessTerminationStatus : CustomStringConvertible { } } +#if !SWIFT_STDLIB_HAS_COMMANDLINE +@_silgen_name("_swift_stdlib_getUnsafeArgvArgc") +internal func _swift_stdlib_getUnsafeArgvArgc(_: UnsafeMutablePointer) -> UnsafeMutablePointer?> + +public enum CommandLine { + public static var arguments: [String] = { + var argc: Int32 = 0 + var unsafeArgv = _swift_stdlib_getUnsafeArgvArgc(&argc) + return (0 ..< Int(argc)).map { String(cString: unsafeArgv[$0]!) } + }() +} +#endif // !SWIFT_STDLIB_HAS_COMMANDLINE #if os(Windows) public func spawnChild(_ args: [String]) diff --git a/stdlib/public/CMakeLists.txt b/stdlib/public/CMakeLists.txt index 3c6fab55c9b0a..79e814e5804dd 100644 --- a/stdlib/public/CMakeLists.txt +++ b/stdlib/public/CMakeLists.txt @@ -55,6 +55,7 @@ if(CXX_SUPPORTS_EXIT_TIME_DESTRUCTORS_WARNING) endif() add_subdirectory(SwiftShims) +add_subdirectory(CommandLineSupport) # This static library is shared across swiftCore and swiftReflection if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_REMOTE_MIRROR) diff --git a/stdlib/public/CommandLineSupport/CMakeLists.txt b/stdlib/public/CommandLineSupport/CMakeLists.txt new file mode 100644 index 0000000000000..697e0e21b8768 --- /dev/null +++ b/stdlib/public/CommandLineSupport/CMakeLists.txt @@ -0,0 +1,8 @@ +add_swift_target_library(swiftCommandLineSupport + STATIC DONT_EMBED_BITCODE NOSWIFTRT + CommandLine.cpp + C_COMPILE_FLAGS ${SWIFT_RUNTIME_CXX_FLAGS} + LINK_FLAGS ${SWIFT_RUNTIME_LINK_FLAGS} + SWIFT_COMPILE_FLAGS ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS} + INSTALL_IN_COMPONENT never_install + ) diff --git a/stdlib/public/stubs/CommandLine.cpp b/stdlib/public/CommandLineSupport/CommandLine.cpp similarity index 95% rename from stdlib/public/stubs/CommandLine.cpp rename to stdlib/public/CommandLineSupport/CommandLine.cpp index b487b168939c0..09f75ac3bafb6 100644 --- a/stdlib/public/stubs/CommandLine.cpp +++ b/stdlib/public/CommandLineSupport/CommandLine.cpp @@ -39,7 +39,8 @@ static char **_swift_stdlib_ProcessOverrideUnsafeArgv = nullptr; static int _swift_stdlib_ProcessOverrideUnsafeArgc = 0; -SWIFT_RUNTIME_STDLIB_API +// This needs to findable by dlopen() for JIT purposes (see Immediate.cpp). +SWIFT_CC(swift) extern "C" SWIFT_ATTRIBUTE_FOR_EXPORTS void _swift_stdlib_overrideUnsafeArgvArgc(char **argv, int argc) { _swift_stdlib_ProcessOverrideUnsafeArgv = argv; _swift_stdlib_ProcessOverrideUnsafeArgc = argc; @@ -51,7 +52,7 @@ void _swift_stdlib_overrideUnsafeArgvArgc(char **argv, int argc) { extern "C" char ***_NSGetArgv(void); extern "C" int *_NSGetArgc(void); -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); @@ -64,7 +65,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { return *_NSGetArgv(); } #elif defined(__linux__) || defined(__CYGWIN__) -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); @@ -98,7 +99,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { #elif defined(_WIN32) #include -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); @@ -165,7 +166,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { #include #include -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); @@ -216,7 +217,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { #include #include -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); @@ -257,7 +258,7 @@ char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { #include #include -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { assert(outArgLen != nullptr); if (_swift_stdlib_ProcessOverrideUnsafeArgv) { @@ -289,7 +290,7 @@ char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { return argv_copy; } #else // Add your favorite OS's command line arg grabber here. -SWIFT_RUNTIME_STDLIB_API +SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL char **_swift_stdlib_getUnsafeArgvArgc(int *outArgLen) { if (_swift_stdlib_ProcessOverrideUnsafeArgv) { *outArgLen = _swift_stdlib_ProcessOverrideUnsafeArgc; diff --git a/stdlib/public/SwiftShims/RuntimeStubs.h b/stdlib/public/SwiftShims/RuntimeStubs.h index 96f73b3830d33..e17c3f766a30d 100644 --- a/stdlib/public/SwiftShims/RuntimeStubs.h +++ b/stdlib/public/SwiftShims/RuntimeStubs.h @@ -31,14 +31,6 @@ SWIFT_RUNTIME_STDLIB_API __swift_ssize_t swift_stdlib_readLine_stdin(unsigned char * _Nullable * _Nonnull LinePtr); -SWIFT_RUNTIME_STDLIB_API -char * _Nullable * _Nonnull -_swift_stdlib_getUnsafeArgvArgc(int * _Nonnull outArgLen); - -SWIFT_RUNTIME_STDLIB_API -void -_swift_stdlib_overrideUnsafeArgvArgc(char * _Nullable * _Nonnull argv, int argc); - SWIFT_END_NULLABILITY_ANNOTATIONS #ifdef __cplusplus diff --git a/stdlib/public/core/CMakeLists.txt b/stdlib/public/core/CMakeLists.txt index c2ad36ab170a3..c7bf03eeca4f1 100644 --- a/stdlib/public/core/CMakeLists.txt +++ b/stdlib/public/core/CMakeLists.txt @@ -302,6 +302,15 @@ if(SWIFT_CHECK_ESSENTIAL_STDLIB) target_link_libraries(swift_stdlib_essential ${RUNTIME_DEPENDENCY}) endif() +set(swift_core_incorporate_object_libraries) +list(APPEND swift_core_incorporate_object_libraries swiftRuntime) +list(APPEND swift_core_incorporate_object_libraries swiftLLVMSupport) +list(APPEND swift_core_incorporate_object_libraries swiftDemangling) +list(APPEND swift_core_incorporate_object_libraries swiftStdlibStubs) +if(SWIFT_STDLIB_HAS_COMMANDLINE) + list(APPEND swift_core_incorporate_object_libraries swiftCommandLineSupport) +endif() + set(swiftCore_common_options IS_STDLIB IS_STDLIB_CORE ${SWIFTLIB_SOURCES} @@ -314,7 +323,7 @@ set(swiftCore_common_options PRIVATE_LINK_LIBRARIES ${swift_core_private_link_libraries} INCORPORATE_OBJECT_LIBRARIES - swiftRuntime swiftLLVMSupport swiftDemangling swiftStdlibStubs + ${swift_core_incorporate_object_libraries} FRAMEWORK_DEPENDS ${swift_core_framework_depends}) diff --git a/stdlib/public/core/CommandLine.swift b/stdlib/public/core/CommandLine.swift index 2d311097a3f47..cdfa7a71856cd 100644 --- a/stdlib/public/core/CommandLine.swift +++ b/stdlib/public/core/CommandLine.swift @@ -12,6 +12,12 @@ import SwiftShims +#if SWIFT_STDLIB_HAS_COMMANDLINE + +@_silgen_name("_swift_stdlib_getUnsafeArgvArgc") +internal func _swift_stdlib_getUnsafeArgvArgc(_: UnsafeMutablePointer) + -> UnsafeMutablePointer?> + /// Command-line arguments for the current process. @frozen // namespace public enum CommandLine { @@ -49,3 +55,5 @@ public enum CommandLine { public static var arguments: [String] = (0..