From 9b13d1f8bbde73c3a8af325e6a5c40fa5df7915b Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 1 Sep 2021 08:43:58 +0000 Subject: [PATCH] [stdlib] Fix cc mismatch violation on swift_isClassType _isClassType is mainly called by compiler-generated code, but it's also called by stdlib. The call-site of stdlib used @_silgen_name to link the function, so it's called through swiftcc. However its cc is defined as C-cc, so caller and callee used different cc. This patch adds C-compatible decl of swift_isClassType in shims so that it can be called by stdlib with C-cc. This change doesn't break ABI because `_isClassType` in stdlib was defined as internal API. --- stdlib/public/SwiftShims/RuntimeShims.h | 7 +++++++ stdlib/public/core/ReflectionMirror.swift | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/stdlib/public/SwiftShims/RuntimeShims.h b/stdlib/public/SwiftShims/RuntimeShims.h index b5ffb04c81958..c133adae411a2 100644 --- a/stdlib/public/SwiftShims/RuntimeShims.h +++ b/stdlib/public/SwiftShims/RuntimeShims.h @@ -20,6 +20,7 @@ #include "SwiftStddef.h" #include "SwiftStdint.h" +#include "SwiftStdbool.h" #include "Visibility.h" #ifdef __cplusplus @@ -61,6 +62,12 @@ int _swift_stdlib_putc_stderr(int C); SWIFT_RUNTIME_STDLIB_API __swift_size_t _swift_stdlib_getHardwareConcurrency(void); +#ifdef __swift__ +/// Called by ReflectionMirror in stdlib through C-calling-convention +SWIFT_RUNTIME_STDLIB_API +__swift_bool swift_isClassType(const void *type); +#endif + /// Manually allocated memory is at least 16-byte aligned in Swift. /// /// When swift_slowAlloc is called with "default" alignment (alignMask == diff --git a/stdlib/public/core/ReflectionMirror.swift b/stdlib/public/core/ReflectionMirror.swift index 2f68b9078aa21..8631695d99e79 100644 --- a/stdlib/public/core/ReflectionMirror.swift +++ b/stdlib/public/core/ReflectionMirror.swift @@ -12,8 +12,11 @@ import SwiftShims -@_silgen_name("swift_isClassType") -internal func _isClassType(_: Any.Type) -> Bool +internal func _isClassType(_ type: Any.Type) -> Bool { + // a thick metatype is represented with a pointer metadata structure, + // so this unsafeBitCast is a safe operation here. + return swift_isClassType(unsafeBitCast(type, to: UnsafeRawPointer.self)) +} @_silgen_name("swift_getMetadataKind") internal func _metadataKind(_: Any.Type) -> UInt