Skip to content

Drop read/write/close LibcShims and use the platform APIs directly from the SwiftPrivate module #40211

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions stdlib/private/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_SDK_OVERLAY)
add_subdirectory(SwiftPrivate)
endif()

if(SWIFT_BUILD_SDK_OVERLAY)
# SwiftPrivateThreadExtras makes use of Darwin/Glibc, which is part of the
# SDK overlay. It can't be built separately from the SDK overlay.
Expand All @@ -11,6 +7,7 @@ if(SWIFT_BUILD_SDK_OVERLAY)
endif()

if(SWIFT_BUILD_SDK_OVERLAY OR SWIFT_BUILD_TEST_SUPPORT_MODULES)
add_subdirectory(SwiftPrivate)
add_subdirectory(RuntimeUnittest)
add_subdirectory(StdlibUnicodeUnittest)
add_subdirectory(StdlibCollectionUnittest)
Expand Down
10 changes: 10 additions & 0 deletions stdlib/private/SwiftPrivate/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ add_swift_target_library(swiftSwiftPrivate ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I
GYB_SOURCES
AtomicInt.swift.gyb

SWIFT_MODULE_DEPENDS_OSX Darwin
SWIFT_MODULE_DEPENDS_IOS Darwin
SWIFT_MODULE_DEPENDS_TVOS Darwin
SWIFT_MODULE_DEPENDS_WATCHOS Darwin
SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}"
SWIFT_MODULE_DEPENDS_LINUX Glibc
SWIFT_MODULE_DEPENDS_FREEBSD Glibc
SWIFT_MODULE_DEPENDS_OPENBSD Glibc
SWIFT_MODULE_DEPENDS_CYGWIN Glibc
SWIFT_MODULE_DEPENDS_HAIKU Glibc
SWIFT_MODULE_DEPENDS_WINDOWS CRT WinSDK
SWIFT_COMPILE_FLAGS ${swift_swiftprivate_compile_flags} ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
INSTALL_IN_COMPONENT stdlib-experimental
Expand Down
18 changes: 12 additions & 6 deletions stdlib/private/SwiftPrivate/IO.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@
import Swift
import SwiftShims

#if os(Windows)
#if canImport(Darwin)
import Darwin
let (platform_read, platform_write, platform_close) = (read, write, close)
#elseif canImport(Glibc)
import Glibc
let (platform_read, platform_write, platform_close) = (read, write, close)
#elseif os(Windows)
import CRT
import WinSDK
#endif
Expand Down Expand Up @@ -119,11 +125,11 @@ public struct _FDInputStream {
}
}
let fd = self.fd
let readResult: __swift_ssize_t = _buffer.withUnsafeMutableBufferPointer {
let readResult: Int = _buffer.withUnsafeMutableBufferPointer {
(_buffer) in
let addr = _buffer.baseAddress! + self._bufferUsed
let size = bufferFree
return _swift_stdlib_read(fd, addr, size)
return platform_read(fd, addr, size)
}
if readResult == 0 {
isEOF = true
Expand All @@ -139,7 +145,7 @@ public struct _FDInputStream {
if isClosed {
return
}
let result = _swift_stdlib_close(fd)
let result = platform_close(fd)
if result < 0 {
fatalError("close() returned an error")
}
Expand Down Expand Up @@ -207,7 +213,7 @@ public struct _FDOutputStream : TextOutputStream {
var writtenBytes = 0
let bufferSize = utf8CStr.count - 1
while writtenBytes != bufferSize {
let result = _swift_stdlib_write(
let result = platform_write(
self.fd, UnsafeRawPointer(utf8CStr.baseAddress! + Int(writtenBytes)),
bufferSize - writtenBytes)
if result < 0 {
Expand All @@ -222,7 +228,7 @@ public struct _FDOutputStream : TextOutputStream {
if isClosed {
return
}
let result = _swift_stdlib_close(fd)
let result = platform_close(fd)
if result < 0 {
fatalError("close() returned an error")
}
Expand Down
8 changes: 0 additions & 8 deletions stdlib/public/SwiftShims/LibcShims.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,6 @@ static inline void _swift_stdlib_free(void *_Nullable ptr) {
free(ptr);
}

// <unistd.h>
SWIFT_RUNTIME_STDLIB_SPI
__swift_ssize_t _swift_stdlib_read(int fd, void *buf, __swift_size_t nbyte);
SWIFT_RUNTIME_STDLIB_SPI
__swift_ssize_t _swift_stdlib_write(int fd, const void *buf, __swift_size_t nbyte);
SWIFT_RUNTIME_STDLIB_SPI
int _swift_stdlib_close(int fd);

// String handling <string.h>
SWIFT_READONLY
static inline __swift_size_t _swift_stdlib_strlen(const char *s) {
Expand Down
35 changes: 0 additions & 35 deletions stdlib/public/stubs/LibcShims.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@
#endif

#include <stdio.h>
#include <sys/types.h>
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__wasi__)
#include <unistd.h>
#endif

#include <type_traits>

#include "../SwiftShims/LibcShims.h"

Expand All @@ -37,32 +31,3 @@ __swift_size_t _swift_stdlib_fwrite_stdout(const void *ptr,
__swift_size_t nitems) {
return fwrite(ptr, size, nitems, stdout);
}

SWIFT_RUNTIME_STDLIB_SPI
__swift_ssize_t
_swift_stdlib_read(int fd, void *buf, __swift_size_t nbyte) {
#if defined(_WIN32)
return _read(fd, buf, nbyte);
#else
return read(fd, buf, nbyte);
#endif
}

SWIFT_RUNTIME_STDLIB_SPI
__swift_ssize_t
_swift_stdlib_write(int fd, const void *buf, __swift_size_t nbyte) {
#if defined(_WIN32)
return _write(fd, buf, nbyte);
#else
return write(fd, buf, nbyte);
#endif
}

SWIFT_RUNTIME_STDLIB_SPI
int _swift_stdlib_close(int fd) {
#if defined(_WIN32)
return _close(fd);
#else
return close(fd);
#endif
}