1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 // The `annotate` attribute always pulls the annotated (inline) function into the object files, thus 20 // we should only annotate headers when we are running versioner. 21 #if defined(__BIONIC_VERSIONER) 22 23 #define __INTRODUCED_IN(api_level) __attribute__((__annotate__("introduced_in=" #api_level))) 24 #define __INTRODUCED_IN_NO_GUARD_FOR_NDK(api_level) __attribute__((__annotate__("introduced_in=" #api_level))) __VERSIONER_NO_GUARD 25 #define __DEPRECATED_IN(api_level, ...) __attribute__((__annotate__("deprecated_in=" #api_level))) 26 #define __REMOVED_IN(api_level, ...) __attribute__((__annotate__("obsoleted_in=" #api_level))) 27 #define __INTRODUCED_IN_32(api_level) __attribute__((__annotate__("introduced_in_32=" #api_level))) 28 #define __INTRODUCED_IN_64(api_level) __attribute__((__annotate__("introduced_in_64=" #api_level))) 29 30 #define __VERSIONER_NO_GUARD __attribute__((__annotate__("versioner_no_guard"))) 31 #define __VERSIONER_FORTIFY_INLINE __attribute__((__annotate__("versioner_fortify_inline"))) 32 33 #else 34 35 // When headers are not processed by the versioner (i.e. compiled into object files), 36 // the availability attributed is emitted instead. The clang compiler will make the symbol weak 37 // when targeting old api_level and enforce the reference to the symbol to be guarded with 38 // __builtin_available(android api_level, *). 39 40 // The 'strict' flag is required for NDK clients where the use of "-Wunguarded-availability" cannot 41 // be enforced. In the case, the absence of 'strict' makes it possible to call an unavailable API 42 // without the __builtin_available check, which will cause a link error at runtime. 43 // Android platform build system defines this macro along with -Wunguarded-availability 44 // 45 // The _NO_GUARD_FOR_NDK variants keep the __VERSIONER_NO_GUARD behavior working for the NDK. This 46 // allows libc++ to refer to these functions in inlines without needing to guard them, needed since 47 // libc++ doesn't currently guard these calls. There's no risk to the apps though because using 48 // those APIs will still cause a link error. 49 #if defined(__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__) 50 #define __BIONIC_AVAILABILITY(__what, ...) __attribute__((__availability__(android,__what __VA_OPT__(,) __VA_ARGS__))) 51 #define __INTRODUCED_IN_NO_GUARD_FOR_NDK(api_level) __INTRODUCED_IN(api_level) 52 #else 53 #define __BIONIC_AVAILABILITY(__what, ...) __attribute__((__availability__(android,strict,__what __VA_OPT__(,) __VA_ARGS__))) 54 #define __INTRODUCED_IN_NO_GUARD_FOR_NDK(api_level) 55 #endif 56 57 #define __INTRODUCED_IN(api_level) __BIONIC_AVAILABILITY(introduced=api_level) 58 #define __DEPRECATED_IN(api_level, ...) __BIONIC_AVAILABILITY(deprecated=api_level __VA_OPT__(,message=) __VA_ARGS__) 59 #define __REMOVED_IN(api_level, ...) __BIONIC_AVAILABILITY(obsoleted=api_level __VA_OPT__(,message=) __VA_ARGS__) 60 61 // The same availability attribute can't be annotated multiple times. Therefore, the macros are 62 // defined for the configuration that it is valid for so that declarations like the below doesn't 63 // cause inconsistent availability values which is an error with -Wavailability: 64 // 65 // void foo() __INTRODUCED_IN_32(30) __INTRODUCED_IN_64(31); 66 // 67 #if !defined(__LP64__) 68 #define __INTRODUCED_IN_32(api_level) __BIONIC_AVAILABILITY(introduced=api_level) 69 #define __INTRODUCED_IN_64(api_level) 70 #else 71 #define __INTRODUCED_IN_32(api_level) 72 #define __INTRODUCED_IN_64(api_level) __BIONIC_AVAILABILITY(introduced=api_level) 73 #endif 74 75 #define __VERSIONER_NO_GUARD 76 #define __VERSIONER_FORTIFY_INLINE 77 78 #endif // defined(__BIONIC_VERSIONER) 79 80 // Vendor modules do not follow SDK versioning. Ignore NDK guards for vendor modules. 81 #if defined(__ANDROID_VENDOR__) 82 #undef __BIONIC_AVAILABILITY 83 #define __BIONIC_AVAILABILITY(api_level, ...) 84 #endif // defined(__ANDROID_VENDOR__) 85