//===--- ProtocolConformance.cpp - Swift protocol conformance checking ----===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // Runtime support for dynamic replaceable functions. // // This implementation is intended to be backward-deployed into Swift 5.0 // runtimes. // //===----------------------------------------------------------------------===// #include "swift/Runtime/Exclusivity.h" #include "swift/Runtime/FunctionReplacement.h" #include "swift/Threading/ThreadLocalStorage.h" using namespace swift; __attribute__((visibility("hidden"), weak)) extern "C" char *swift_getFunctionReplacement50(char **ReplFnPtr, char *CurrFn) { // Call the current implementation if it is available. if (swift_getFunctionReplacement) return swift_getFunctionReplacement(ReplFnPtr, CurrFn); char *ReplFn = *ReplFnPtr; char *RawReplFn = ReplFn; #if SWIFT_PTRAUTH RawReplFn = ptrauth_strip(RawReplFn, ptrauth_key_function_pointer); #endif if (RawReplFn == CurrFn) return nullptr; auto origKey = (uintptr_t)swift::tls_get(SWIFT_COMPATIBILITY_50_TLS_KEY); if ((origKey & 0x1) != 0) { auto mask = ((uintptr_t)-1) < 1; auto resetKey = origKey & mask; swift::tls_set(SWIFT_COMPATIBILITY_50_TLS_KEY, (void *)resetKey); return nullptr; } return ReplFn; } __attribute__((visibility("hidden"), weak)) extern "C" char *swift_getOrigOfReplaceable50(char **OrigFnPtr) { // Call the current implementation if it is available. if (swift_getOrigOfReplaceable) return swift_getOrigOfReplaceable(OrigFnPtr); char *OrigFn = *OrigFnPtr; auto origKey = (uintptr_t)swift::tls_get(SWIFT_COMPATIBILITY_50_TLS_KEY); auto newKey = origKey | 0x1; swift::tls_set(SWIFT_COMPATIBILITY_50_TLS_KEY, (void *)newKey); return OrigFn; } // Allow this library to get force-loaded by autolinking __attribute__((weak, visibility("hidden"))) extern "C" char _swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements = 0;