]> git.saurik.com Git - apple/libpthread.git/blob - src/resolver.c
libpthread-218.51.1.tar.gz
[apple/libpthread.git] / src / resolver.c
1 /*
2 * Copyright (c) 2015 Apple Inc. All rights reserved.
3 *
4 * @APPLE_APACHE_LICENSE_HEADER_START@
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * @APPLE_APACHE_LICENSE_HEADER_END@
19 */
20
21 #include "resolver_internal.h"
22
23 #define _OS_VARIANT_RESOLVER(s, v, ...) \
24 __attribute__((visibility(OS_STRINGIFY(v)))) extern void* s(void); \
25 void* s(void) { \
26 __asm__(".symbol_resolver _" OS_STRINGIFY(s)); \
27 __VA_ARGS__ \
28 }
29
30 #define _OS_VARIANT_UPMP_RESOLVER(s, v) \
31 _OS_VARIANT_RESOLVER(s, v, \
32 uint32_t *_c = (void*)(uintptr_t)_COMM_PAGE_CPU_CAPABILITIES; \
33 if (*_c & kUP) { \
34 extern void OS_VARIANT(s, up)(void); \
35 return &OS_VARIANT(s, up); \
36 } else { \
37 extern void OS_VARIANT(s, mp)(void); \
38 return &OS_VARIANT(s, mp); \
39 })
40
41 #define OS_VARIANT_UPMP_RESOLVER(s) \
42 _OS_VARIANT_UPMP_RESOLVER(s, default)
43
44 #define OS_VARIANT_UPMP_RESOLVER_INTERNAL(s) \
45 _OS_VARIANT_UPMP_RESOLVER(s, hidden)
46
47
48 #ifdef OS_VARIANT_SELECTOR
49
50 OS_VARIANT_UPMP_RESOLVER(pthread_mutex_lock)
51 OS_VARIANT_UPMP_RESOLVER(pthread_mutex_trylock)
52 OS_VARIANT_UPMP_RESOLVER(pthread_mutex_unlock)
53
54 #endif // OS_VARIANT_SELECTOR