···100100#define MAC_OS_X_VERSION_10_8 1080
101101#define MAC_OS_X_VERSION_10_9 1090
102102#define MAC_OS_X_VERSION_10_10 101000
103103+#define MAC_OS_X_VERSION_10_10_2 101002
104104+#define MAC_OS_X_VERSION_10_10_3 101003
105105+#define MAC_OS_X_VERSION_10_11 101100
106106+#define MAC_OS_X_VERSION_10_11_2 101102
103107104108/*
105109 * If min OS not specified, assume 10.4 for intel
···123127#endif
124128125129/*
126126- * if max OS not specified, assume larger of (10.10, min)
130130+ * if max OS not specified, assume larger of (10.11.2, min)
127131 */
128132#ifndef MAC_OS_X_VERSION_MAX_ALLOWED
129129- #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_10
133133+ #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_11_2
130134 #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_MIN_REQUIRED
131135 #else
132132- #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_10
136136+ #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_11_2
133137 #endif
134138#endif
135139···14191423 #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_AND_LATER DEPRECATED_ATTRIBUTE
14201424#else
14211425 #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_AND_LATER
14261426+#endif
14271427+14281428+14291429+/*
14301430+ * AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
14311431+ *
14321432+ * Used on declarations introduced in Mac OS X 10.10.2
14331433+ */
14341434+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
14351435+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER __OSX_AVAILABLE_STARTING(__MAC_10_10_2, __IPHONE_NA)
14361436+#elif MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_10_2
14371437+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER UNAVAILABLE_ATTRIBUTE
14381438+#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10_2
14391439+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER WEAK_IMPORT_ATTRIBUTE
14401440+#else
14411441+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
14421442+#endif
14431443+14441444+/*
14451445+ * AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED
14461446+ *
14471447+ * Used on declarations introduced in Mac OS X 10.10.2,
14481448+ * and deprecated in Mac OS X 10.10.2
14491449+ */
14501450+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
14511451+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_2, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
14521452+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
14531453+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED DEPRECATED_ATTRIBUTE
14541454+#else
14551455+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
14561456+#endif
14571457+14581458+/*
14591459+ * AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
14601460+ *
14611461+ * Used on declarations introduced in Mac OS X 10.0,
14621462+ * but later deprecated in Mac OS X 10.10.2
14631463+ */
14641464+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
14651465+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
14661466+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
14671467+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
14681468+#else
14691469+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER
14701470+#endif
14711471+14721472+/*
14731473+ * AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
14741474+ *
14751475+ * Used on declarations introduced in Mac OS X 10.1,
14761476+ * but later deprecated in Mac OS X 10.10.2
14771477+ */
14781478+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
14791479+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
14801480+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
14811481+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
14821482+#else
14831483+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER
14841484+#endif
14851485+14861486+/*
14871487+ * AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
14881488+ *
14891489+ * Used on declarations introduced in Mac OS X 10.2,
14901490+ * but later deprecated in Mac OS X 10.10.2
14911491+ */
14921492+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
14931493+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
14941494+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
14951495+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
14961496+#else
14971497+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
14981498+#endif
14991499+15001500+/*
15011501+ * AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15021502+ *
15031503+ * Used on declarations introduced in Mac OS X 10.3,
15041504+ * but later deprecated in Mac OS X 10.10.2
15051505+ */
15061506+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15071507+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_3, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15081508+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15091509+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15101510+#else
15111511+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
15121512+#endif
15131513+15141514+/*
15151515+ * AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15161516+ *
15171517+ * Used on declarations introduced in Mac OS X 10.4,
15181518+ * but later deprecated in Mac OS X 10.10.2
15191519+ */
15201520+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15211521+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15221522+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15231523+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15241524+#else
15251525+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
15261526+#endif
15271527+15281528+/*
15291529+ * AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15301530+ *
15311531+ * Used on declarations introduced in Mac OS X 10.5,
15321532+ * but later deprecated in Mac OS X 10.10.2
15331533+ */
15341534+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15351535+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15361536+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15371537+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15381538+#else
15391539+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
15401540+#endif
15411541+15421542+/*
15431543+ * AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15441544+ *
15451545+ * Used on declarations introduced in Mac OS X 10.6,
15461546+ * but later deprecated in Mac OS X 10.10.2
15471547+ */
15481548+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15491549+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15501550+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15511551+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15521552+#else
15531553+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
15541554+#endif
15551555+15561556+/*
15571557+ * AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15581558+ *
15591559+ * Used on declarations introduced in Mac OS X 10.7,
15601560+ * but later deprecated in Mac OS X 10.10.2
15611561+ */
15621562+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15631563+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_7, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15641564+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15651565+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15661566+#else
15671567+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
15681568+#endif
15691569+15701570+/*
15711571+ * AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15721572+ *
15731573+ * Used on declarations introduced in Mac OS X 10.8,
15741574+ * but later deprecated in Mac OS X 10.10.2
15751575+ */
15761576+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15771577+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_8, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15781578+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15791579+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15801580+#else
15811581+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
15821582+#endif
15831583+15841584+/*
15851585+ * AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
15861586+ *
15871587+ * Used on declarations introduced in Mac OS X 10.9,
15881588+ * but later deprecated in Mac OS X 10.10.2
15891589+ */
15901590+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
15911591+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_9, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
15921592+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
15931593+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
15941594+#else
15951595+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
15961596+#endif
15971597+15981598+/*
15991599+ * AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2
16001600+ *
16011601+ * Used on declarations introduced in Mac OS X 10.10,
16021602+ * but later deprecated in Mac OS X 10.10.2
16031603+ */
16041604+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16051605+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
16061606+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
16071607+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 DEPRECATED_ATTRIBUTE
16081608+#else
16091609+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
16101610+#endif
16111611+16121612+/*
16131613+ * DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2_AND_LATER
16141614+ *
16151615+ * Used on types deprecated in Mac OS X 10.10.2
16161616+ */
16171617+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16181618+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2_AND_LATER __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_10_2, __IPHONE_NA, __IPHONE_NA)
16191619+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_2
16201620+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2_AND_LATER DEPRECATED_ATTRIBUTE
16211621+#else
16221622+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_2_AND_LATER
16231623+#endif
16241624+16251625+16261626+/*
16271627+ * AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER
16281628+ *
16291629+ * Used on declarations introduced in Mac OS X 10.10.3
16301630+ */
16311631+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16321632+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER __OSX_AVAILABLE_STARTING(__MAC_10_10_3, __IPHONE_NA)
16331633+#elif MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_10_3
16341634+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER UNAVAILABLE_ATTRIBUTE
16351635+#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10_3
16361636+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER WEAK_IMPORT_ATTRIBUTE
16371637+#else
16381638+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER
16391639+#endif
16401640+16411641+/*
16421642+ * AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED
16431643+ *
16441644+ * Used on declarations introduced in Mac OS X 10.10.3,
16451645+ * and deprecated in Mac OS X 10.10.3
16461646+ */
16471647+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16481648+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_3, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
16491649+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
16501650+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED DEPRECATED_ATTRIBUTE
16511651+#else
16521652+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER
16531653+#endif
16541654+16551655+/*
16561656+ * AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
16571657+ *
16581658+ * Used on declarations introduced in Mac OS X 10.0,
16591659+ * but later deprecated in Mac OS X 10.10.3
16601660+ */
16611661+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16621662+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
16631663+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
16641664+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
16651665+#else
16661666+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER
16671667+#endif
16681668+16691669+/*
16701670+ * AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
16711671+ *
16721672+ * Used on declarations introduced in Mac OS X 10.1,
16731673+ * but later deprecated in Mac OS X 10.10.3
16741674+ */
16751675+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16761676+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
16771677+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
16781678+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
16791679+#else
16801680+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER
16811681+#endif
16821682+16831683+/*
16841684+ * AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
16851685+ *
16861686+ * Used on declarations introduced in Mac OS X 10.2,
16871687+ * but later deprecated in Mac OS X 10.10.3
16881688+ */
16891689+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
16901690+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
16911691+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
16921692+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
16931693+#else
16941694+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
16951695+#endif
16961696+16971697+/*
16981698+ * AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
16991699+ *
17001700+ * Used on declarations introduced in Mac OS X 10.3,
17011701+ * but later deprecated in Mac OS X 10.10.3
17021702+ */
17031703+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17041704+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_3, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17051705+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17061706+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17071707+#else
17081708+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
17091709+#endif
17101710+17111711+/*
17121712+ * AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17131713+ *
17141714+ * Used on declarations introduced in Mac OS X 10.4,
17151715+ * but later deprecated in Mac OS X 10.10.3
17161716+ */
17171717+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17181718+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17191719+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17201720+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17211721+#else
17221722+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
17231723+#endif
17241724+17251725+/*
17261726+ * AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17271727+ *
17281728+ * Used on declarations introduced in Mac OS X 10.5,
17291729+ * but later deprecated in Mac OS X 10.10.3
17301730+ */
17311731+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17321732+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17331733+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17341734+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17351735+#else
17361736+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
17371737+#endif
17381738+17391739+/*
17401740+ * AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17411741+ *
17421742+ * Used on declarations introduced in Mac OS X 10.6,
17431743+ * but later deprecated in Mac OS X 10.10.3
17441744+ */
17451745+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17461746+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17471747+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17481748+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17491749+#else
17501750+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
17511751+#endif
17521752+17531753+/*
17541754+ * AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17551755+ *
17561756+ * Used on declarations introduced in Mac OS X 10.7,
17571757+ * but later deprecated in Mac OS X 10.10.3
17581758+ */
17591759+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17601760+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_7, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17611761+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17621762+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17631763+#else
17641764+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
17651765+#endif
17661766+17671767+/*
17681768+ * AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17691769+ *
17701770+ * Used on declarations introduced in Mac OS X 10.8,
17711771+ * but later deprecated in Mac OS X 10.10.3
17721772+ */
17731773+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17741774+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_8, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17751775+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17761776+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17771777+#else
17781778+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
17791779+#endif
17801780+17811781+/*
17821782+ * AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17831783+ *
17841784+ * Used on declarations introduced in Mac OS X 10.9,
17851785+ * but later deprecated in Mac OS X 10.10.3
17861786+ */
17871787+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
17881788+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_9, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
17891789+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
17901790+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
17911791+#else
17921792+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
17931793+#endif
17941794+17951795+/*
17961796+ * AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
17971797+ *
17981798+ * Used on declarations introduced in Mac OS X 10.10,
17991799+ * but later deprecated in Mac OS X 10.10.3
18001800+ */
18011801+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18021802+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
18031803+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
18041804+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
18051805+#else
18061806+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
18071807+#endif
18081808+18091809+/*
18101810+ * AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3
18111811+ *
18121812+ * Used on declarations introduced in Mac OS X 10.10.2,
18131813+ * but later deprecated in Mac OS X 10.10.3
18141814+ */
18151815+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18161816+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_2, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
18171817+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
18181818+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 DEPRECATED_ATTRIBUTE
18191819+#else
18201820+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3 AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
18211821+#endif
18221822+18231823+/*
18241824+ * DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3_AND_LATER
18251825+ *
18261826+ * Used on types deprecated in Mac OS X 10.10.3
18271827+ */
18281828+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18291829+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3_AND_LATER __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_10_3, __IPHONE_NA, __IPHONE_NA)
18301830+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10_3
18311831+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3_AND_LATER DEPRECATED_ATTRIBUTE
18321832+#else
18331833+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_10_3_AND_LATER
18341834+#endif
18351835+18361836+18371837+/*
18381838+ * AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
18391839+ *
18401840+ * Used on declarations introduced in Mac OS X 10.11
18411841+ */
18421842+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18431843+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_NA)
18441844+#elif MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
18451845+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER UNAVAILABLE_ATTRIBUTE
18461846+#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11
18471847+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER WEAK_IMPORT_ATTRIBUTE
18481848+#else
18491849+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
18501850+#endif
18511851+18521852+/*
18531853+ * AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED
18541854+ *
18551855+ * Used on declarations introduced in Mac OS X 10.11,
18561856+ * and deprecated in Mac OS X 10.11
18571857+ */
18581858+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18591859+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_11, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
18601860+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
18611861+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED DEPRECATED_ATTRIBUTE
18621862+#else
18631863+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
18641864+#endif
18651865+18661866+/*
18671867+ * AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
18681868+ *
18691869+ * Used on declarations introduced in Mac OS X 10.0,
18701870+ * but later deprecated in Mac OS X 10.11
18711871+ */
18721872+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18731873+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
18741874+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
18751875+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
18761876+#else
18771877+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER
18781878+#endif
18791879+18801880+/*
18811881+ * AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
18821882+ *
18831883+ * Used on declarations introduced in Mac OS X 10.1,
18841884+ * but later deprecated in Mac OS X 10.11
18851885+ */
18861886+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
18871887+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
18881888+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
18891889+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
18901890+#else
18911891+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER
18921892+#endif
18931893+18941894+/*
18951895+ * AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
18961896+ *
18971897+ * Used on declarations introduced in Mac OS X 10.2,
18981898+ * but later deprecated in Mac OS X 10.11
18991899+ */
19001900+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19011901+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19021902+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19031903+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19041904+#else
19051905+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
19061906+#endif
19071907+19081908+/*
19091909+ * AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19101910+ *
19111911+ * Used on declarations introduced in Mac OS X 10.3,
19121912+ * but later deprecated in Mac OS X 10.11
19131913+ */
19141914+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19151915+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_3, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19161916+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19171917+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19181918+#else
19191919+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
19201920+#endif
19211921+19221922+/*
19231923+ * AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19241924+ *
19251925+ * Used on declarations introduced in Mac OS X 10.4,
19261926+ * but later deprecated in Mac OS X 10.11
19271927+ */
19281928+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19291929+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19301930+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19311931+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19321932+#else
19331933+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
19341934+#endif
19351935+19361936+/*
19371937+ * AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19381938+ *
19391939+ * Used on declarations introduced in Mac OS X 10.5,
19401940+ * but later deprecated in Mac OS X 10.11
19411941+ */
19421942+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19431943+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19441944+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19451945+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19461946+#else
19471947+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
19481948+#endif
19491949+19501950+/*
19511951+ * AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19521952+ *
19531953+ * Used on declarations introduced in Mac OS X 10.6,
19541954+ * but later deprecated in Mac OS X 10.11
19551955+ */
19561956+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19571957+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19581958+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19591959+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19601960+#else
19611961+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
19621962+#endif
19631963+19641964+/*
19651965+ * AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19661966+ *
19671967+ * Used on declarations introduced in Mac OS X 10.7,
19681968+ * but later deprecated in Mac OS X 10.11
19691969+ */
19701970+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19711971+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_7, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19721972+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19731973+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19741974+#else
19751975+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
19761976+#endif
19771977+19781978+/*
19791979+ * AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19801980+ *
19811981+ * Used on declarations introduced in Mac OS X 10.8,
19821982+ * but later deprecated in Mac OS X 10.11
19831983+ */
19841984+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19851985+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_8, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
19861986+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
19871987+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
19881988+#else
19891989+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
19901990+#endif
19911991+19921992+/*
19931993+ * AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
19941994+ *
19951995+ * Used on declarations introduced in Mac OS X 10.9,
19961996+ * but later deprecated in Mac OS X 10.11
19971997+ */
19981998+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
19991999+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_9, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
20002000+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
20012001+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
20022002+#else
20032003+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
20042004+#endif
20052005+20062006+/*
20072007+ * AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
20082008+ *
20092009+ * Used on declarations introduced in Mac OS X 10.10,
20102010+ * but later deprecated in Mac OS X 10.11
20112011+ */
20122012+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20132013+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
20142014+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
20152015+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
20162016+#else
20172017+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
20182018+#endif
20192019+20202020+/*
20212021+ * AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
20222022+ *
20232023+ * Used on declarations introduced in Mac OS X 10.10.2,
20242024+ * but later deprecated in Mac OS X 10.11
20252025+ */
20262026+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20272027+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_2, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
20282028+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
20292029+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
20302030+#else
20312031+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
20322032+#endif
20332033+20342034+/*
20352035+ * AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11
20362036+ *
20372037+ * Used on declarations introduced in Mac OS X 10.10.3,
20382038+ * but later deprecated in Mac OS X 10.11
20392039+ */
20402040+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20412041+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_3, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
20422042+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
20432043+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 DEPRECATED_ATTRIBUTE
20442044+#else
20452045+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11 AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER
20462046+#endif
20472047+20482048+/*
20492049+ * DEPRECATED_IN_MAC_OS_X_VERSION_10_11_AND_LATER
20502050+ *
20512051+ * Used on types deprecated in Mac OS X 10.11
20522052+ */
20532053+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20542054+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_AND_LATER __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_11, __IPHONE_NA, __IPHONE_NA)
20552055+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11
20562056+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_AND_LATER DEPRECATED_ATTRIBUTE
20572057+#else
20582058+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_AND_LATER
20592059+#endif
20602060+20612061+20622062+/*
20632063+ * AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER
20642064+ *
20652065+ * Used on declarations introduced in Mac OS X 10.11.2
20662066+ */
20672067+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20682068+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER __OSX_AVAILABLE_STARTING(__MAC_10_11_2, __IPHONE_NA)
20692069+#elif MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11_2
20702070+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER UNAVAILABLE_ATTRIBUTE
20712071+#elif MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11_2
20722072+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER WEAK_IMPORT_ATTRIBUTE
20732073+#else
20742074+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER
20752075+#endif
20762076+20772077+/*
20782078+ * AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER_BUT_DEPRECATED
20792079+ *
20802080+ * Used on declarations introduced in Mac OS X 10.11.2,
20812081+ * and deprecated in Mac OS X 10.11.2
20822082+ */
20832083+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20842084+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER_BUT_DEPRECATED __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_11_2, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
20852085+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
20862086+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER_BUT_DEPRECATED DEPRECATED_ATTRIBUTE
20872087+#else
20882088+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER_BUT_DEPRECATED AVAILABLE_MAC_OS_X_VERSION_10_11_2_AND_LATER
20892089+#endif
20902090+20912091+/*
20922092+ * AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
20932093+ *
20942094+ * Used on declarations introduced in Mac OS X 10.0,
20952095+ * but later deprecated in Mac OS X 10.11.2
20962096+ */
20972097+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
20982098+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
20992099+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21002100+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21012101+#else
21022102+ #define AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER
21032103+#endif
21042104+21052105+/*
21062106+ * AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21072107+ *
21082108+ * Used on declarations introduced in Mac OS X 10.1,
21092109+ * but later deprecated in Mac OS X 10.11.2
21102110+ */
21112111+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21122112+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_1, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21132113+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21142114+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21152115+#else
21162116+ #define AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER
21172117+#endif
21182118+21192119+/*
21202120+ * AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21212121+ *
21222122+ * Used on declarations introduced in Mac OS X 10.2,
21232123+ * but later deprecated in Mac OS X 10.11.2
21242124+ */
21252125+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21262126+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21272127+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21282128+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21292129+#else
21302130+ #define AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
21312131+#endif
21322132+21332133+/*
21342134+ * AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21352135+ *
21362136+ * Used on declarations introduced in Mac OS X 10.3,
21372137+ * but later deprecated in Mac OS X 10.11.2
21382138+ */
21392139+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21402140+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_3, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21412141+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21422142+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21432143+#else
21442144+ #define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
21452145+#endif
21462146+21472147+/*
21482148+ * AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21492149+ *
21502150+ * Used on declarations introduced in Mac OS X 10.4,
21512151+ * but later deprecated in Mac OS X 10.11.2
21522152+ */
21532153+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21542154+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21552155+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21562156+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21572157+#else
21582158+ #define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER
21592159+#endif
21602160+21612161+/*
21622162+ * AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21632163+ *
21642164+ * Used on declarations introduced in Mac OS X 10.5,
21652165+ * but later deprecated in Mac OS X 10.11.2
21662166+ */
21672167+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21682168+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21692169+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21702170+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21712171+#else
21722172+ #define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
21732173+#endif
21742174+21752175+/*
21762176+ * AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21772177+ *
21782178+ * Used on declarations introduced in Mac OS X 10.6,
21792179+ * but later deprecated in Mac OS X 10.11.2
21802180+ */
21812181+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21822182+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21832183+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21842184+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21852185+#else
21862186+ #define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
21872187+#endif
21882188+21892189+/*
21902190+ * AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
21912191+ *
21922192+ * Used on declarations introduced in Mac OS X 10.7,
21932193+ * but later deprecated in Mac OS X 10.11.2
21942194+ */
21952195+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
21962196+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_7, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
21972197+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
21982198+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
21992199+#else
22002200+ #define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
22012201+#endif
22022202+22032203+/*
22042204+ * AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22052205+ *
22062206+ * Used on declarations introduced in Mac OS X 10.8,
22072207+ * but later deprecated in Mac OS X 10.11.2
22082208+ */
22092209+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22102210+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_8, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22112211+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22122212+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22132213+#else
22142214+ #define AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
22152215+#endif
22162216+22172217+/*
22182218+ * AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22192219+ *
22202220+ * Used on declarations introduced in Mac OS X 10.9,
22212221+ * but later deprecated in Mac OS X 10.11.2
22222222+ */
22232223+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22242224+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_9, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22252225+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22262226+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22272227+#else
22282228+ #define AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_9_AND_LATER
22292229+#endif
22302230+22312231+/*
22322232+ * AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22332233+ *
22342234+ * Used on declarations introduced in Mac OS X 10.10,
22352235+ * but later deprecated in Mac OS X 10.11.2
22362236+ */
22372237+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22382238+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22392239+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22402240+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22412241+#else
22422242+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_10_AND_LATER
22432243+#endif
22442244+22452245+/*
22462246+ * AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22472247+ *
22482248+ * Used on declarations introduced in Mac OS X 10.10.2,
22492249+ * but later deprecated in Mac OS X 10.11.2
22502250+ */
22512251+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22522252+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_2, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22532253+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22542254+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22552255+#else
22562256+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_10_2_AND_LATER
22572257+#endif
22582258+22592259+/*
22602260+ * AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22612261+ *
22622262+ * Used on declarations introduced in Mac OS X 10.10.3,
22632263+ * but later deprecated in Mac OS X 10.11.2
22642264+ */
22652265+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22662266+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_10_3, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22672267+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22682268+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22692269+#else
22702270+ #define AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_10_3_AND_LATER
22712271+#endif
22722272+22732273+/*
22742274+ * AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2
22752275+ *
22762276+ * Used on declarations introduced in Mac OS X 10.11,
22772277+ * but later deprecated in Mac OS X 10.11.2
22782278+ */
22792279+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22802280+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_11, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22812281+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22822282+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 DEPRECATED_ATTRIBUTE
22832283+#else
22842284+ #define AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2 AVAILABLE_MAC_OS_X_VERSION_10_11_AND_LATER
22852285+#endif
22862286+22872287+/*
22882288+ * DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2_AND_LATER
22892289+ *
22902290+ * Used on types deprecated in Mac OS X 10.11.2
22912291+ */
22922292+#if __AVAILABILITY_MACROS_USES_AVAILABILITY
22932293+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2_AND_LATER __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_11_2, __IPHONE_NA, __IPHONE_NA)
22942294+#elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11_2
22952295+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2_AND_LATER DEPRECATED_ATTRIBUTE
22962296+#else
22972297+ #define DEPRECATED_IN_MAC_OS_X_VERSION_10_11_2_AND_LATER
14222298#endif
1423229914242300
···11+/*
22+ * Copyright (c) 2012-2013 Apple Inc. All rights reserved.
33+ *
44+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
55+ *
66+ * This file contains Original Code and/or Modifications of Original Code
77+ * as defined in and that are subject to the Apple Public Source License
88+ * Version 2.0 (the 'License'). You may not use this file except in
99+ * compliance with the License. The rights granted to you under the License
1010+ * may not be used to create, or enable the creation or redistribution of,
1111+ * unlawful or unlicensed copies of an Apple operating system, or to
1212+ * circumvent, violate, or enable the circumvention or violation of, any
1313+ * terms of an Apple operating system software license agreement.
1414+ *
1515+ * Please obtain a copy of the License at
1616+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
1717+ *
1818+ * The Original Code and all software distributed under the License are
1919+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
2020+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
2121+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2222+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
2323+ * Please see the License for the specific language governing rights and
2424+ * limitations under the License.
2525+ *
2626+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
2727+ */
2828+2929+#ifndef __OS_ALLOC__
3030+#define __OS_ALLOC__
3131+3232+#ifndef __OS_ALLOC_INDIRECT__
3333+#define __OS_ALLOC_INDIRECT__
3434+#endif // __OS_ALLOC_INDIRECT__
3535+3636+#include <os/alloc_once_impl.h>
3737+3838+/* Keys for use with os_once_alloc. */
3939+4040+/* Keys for Libsystem. */
4141+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_NOTIFY 0
4242+#define OS_ALLOC_ONCE_KEY_LIBXPC 1
4343+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_C 2
4444+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_INFO 3
4545+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_NETWORK 4
4646+#define OS_ALLOC_ONCE_KEY_LIBCACHE 5
4747+#define OS_ALLOC_ONCE_KEY_LIBCOMMONCRYPTO 6
4848+#define OS_ALLOC_ONCE_KEY_LIBDISPATCH 7
4949+#define OS_ALLOC_ONCE_KEY_LIBDYLD 8
5050+#define OS_ALLOC_ONCE_KEY_LIBKEYMGR 9
5151+#define OS_ALLOC_ONCE_KEY_LIBLAUNCH 10
5252+#define OS_ALLOC_ONCE_KEY_LIBMACHO 11
5353+#define OS_ALLOC_ONCE_KEY_OS_TRACE 12
5454+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_BLOCKS 13
5555+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_MALLOC 14
5656+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_PLATFORM 15
5757+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_PTHREAD 16
5858+#define OS_ALLOC_ONCE_KEY_LIBSYSTEM_STATS 17
5959+6060+/* Keys OS_ALLOC_ONCE_KEY_MAX - 10 upwards are reserved for the system. */
6161+#define OS_ALLOC_ONCE_KEY_RESERVED_0 (OS_ALLOC_ONCE_KEY_MAX - 10)
6262+#define OS_ALLOC_ONCE_KEY_RESERVED_1 (OS_ALLOC_ONCE_KEY_MAX - 9)
6363+#define OS_ALLOC_ONCE_KEY_RESERVED_2 (OS_ALLOC_ONCE_KEY_MAX - 8)
6464+#define OS_ALLOC_ONCE_KEY_RESERVED_3 (OS_ALLOC_ONCE_KEY_MAX - 7)
6565+#define OS_ALLOC_ONCE_KEY_RESERVED_4 (OS_ALLOC_ONCE_KEY_MAX - 6)
6666+#define OS_ALLOC_ONCE_KEY_RESERVED_5 (OS_ALLOC_ONCE_KEY_MAX - 5)
6767+#define OS_ALLOC_ONCE_KEY_RESERVED_6 (OS_ALLOC_ONCE_KEY_MAX - 4)
6868+#define OS_ALLOC_ONCE_KEY_RESERVED_7 (OS_ALLOC_ONCE_KEY_MAX - 3)
6969+#define OS_ALLOC_ONCE_KEY_RESERVED_8 (OS_ALLOC_ONCE_KEY_MAX - 2)
7070+#define OS_ALLOC_ONCE_KEY_RESERVED_9 (OS_ALLOC_ONCE_KEY_MAX - 1)
7171+7272+/* OS_ALLOC_ONCE_KEY_MAX cannot be used. */
7373+7474+#endif // __OS_ALLOC__
+416
src/libc/os/assumes.c
···11+/*
22+ * Copyright (c) 2011, 2012 Apple Inc. All rights reserved.
33+ *
44+ * @APPLE_LICENSE_HEADER_START@
55+ *
66+ * This file contains Original Code and/or Modifications of Original Code
77+ * as defined in and that are subject to the Apple Public Source License
88+ * Version 2.0 (the 'License'). You may not use this file except in
99+ * compliance with the License. Please obtain a copy of the License at
1010+ * http://www.opensource.apple.com/apsl/ and read it before using this
1111+ * file.
1212+ *
1313+ * The Original Code and all software distributed under the License are
1414+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1515+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1616+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
1717+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1818+ * Please see the License for the specific language governing rights and
1919+ * limitations under the License.
2020+ *
2121+ * @APPLE_LICENSE_HEADER_END@
2222+ */
2323+2424+#include <TargetConditionals.h>
2525+#include <dispatch/dispatch.h>
2626+#include <uuid/uuid.h>
2727+#include <sys/types.h>
2828+#include <sys/sysctl.h>
2929+#include <mach-o/loader.h>
3030+#include <mach-o/fat.h>
3131+#include <mach-o/arch.h>
3232+#include <mach-o/getsect.h>
3333+#include <pthread.h>
3434+#include <sys/types.h>
3535+#include <execinfo.h>
3636+#include <stdio.h>
3737+#include <dlfcn.h>
3838+#include <_simple.h>
3939+#include <errno.h>
4040+#include <pthread.h>
4141+#include <string.h>
4242+#include "os/assumes.h"
4343+#include "gen/assumes.h"
4444+#include <os/debug_private.h>
4545+4646+#define OSX_ASSUMES_LOG_REDIRECT_SECT_NAME "__osx_log_func"
4747+#define os_atomic_cmpxchg(p, o, n) __sync_bool_compare_and_swap((p), (o), (n))
4848+4949+static bool _os_should_abort_on_assumes = false;
5050+5151+static const char *
5252+_os_basename(const char *p)
5353+{
5454+ return ((strrchr(p, '/') ? : p - 1) + 1);
5555+}
5656+5757+static void
5858+_os_get_build(char *build, size_t sz)
5959+{
6060+ /* Get the build every time. We used to cache it, but if PID 1 experiences
6161+ * an assumes() failure before the build has been set, that would mean that
6262+ * all future failures would get bad build info. So we fetch it every time.
6363+ * Since assumes() failures are on the slow path anyway, not a huge deal.
6464+ */
6565+ int mib[] = { CTL_KERN, KERN_OSVERSION };
6666+6767+ size_t oldsz = sz;
6868+ int r = sysctl(mib, 2, build, &sz, NULL, 0);
6969+ if (r == 0 && sz == 1) {
7070+ (void)strlcpy(build, "99Z999", oldsz);
7171+ }
7272+#if TARGET_IPHONE_SIMULATOR
7373+ char *simVersion = getenv("SIMULATOR_RUNTIME_BUILD_VERSION");
7474+ if (simVersion) {
7575+ strlcat(build, " ", oldsz);
7676+ strlcat(build, simVersion, oldsz);
7777+ }
7878+#endif
7979+}
8080+8181+static void
8282+_os_get_image_uuid(void *hdr, uuid_t uuid)
8383+{
8484+#if __LP64__
8585+ struct mach_header_64 *hdr32or64 = (struct mach_header_64 *)hdr;
8686+#else
8787+ struct mach_header *hdr32or64 = (struct mach_header *)hdr;
8888+#endif /* __LP64__ */
8989+9090+ size_t i = 0;
9191+ size_t next = sizeof(*hdr32or64);
9292+ struct load_command *cur = NULL;
9393+ for (i = 0; i < hdr32or64->ncmds; i++) {
9494+ cur = (struct load_command *)((uintptr_t)hdr32or64 + next);
9595+ if (cur->cmd == LC_UUID) {
9696+ struct uuid_command *cmd = (struct uuid_command *)cur;
9797+ uuid_copy(uuid, cmd->uuid);
9898+ break;
9999+ }
100100+101101+ next += cur->cmdsize;
102102+ }
103103+104104+ if (i == hdr32or64->ncmds) {
105105+ uuid_clear(uuid);
106106+ }
107107+}
108108+109109+static void
110110+_os_abort_on_assumes_once(void)
111111+{
112112+ /* Embedded boot-args can get pretty long. Let's just hope this is big
113113+ * enough.
114114+ */
115115+ char bootargs[2048];
116116+ size_t len = sizeof(bootargs) - 1;
117117+118118+ if (sysctlbyname("kern.bootargs", bootargs, &len, NULL, 0) == 0) {
119119+ if (strnstr(bootargs, "-os_assumes_fatal", len)) {
120120+ _os_should_abort_on_assumes = true;
121121+ }
122122+ }
123123+}
124124+125125+static bool
126126+_os_abort_on_assumes(void)
127127+{
128128+ static pthread_once_t once = PTHREAD_ONCE_INIT;
129129+ bool result = false;
130130+131131+ if (getpid() != 1) {
132132+ if (getenv("OS_ASSUMES_FATAL")) {
133133+ result = true;
134134+ } else {
135135+ pthread_once(&once, _os_abort_on_assumes_once);
136136+ result = _os_should_abort_on_assumes;
137137+ }
138138+ } else {
139139+ if (getenv("OS_ASSUMES_FATAL_PID1")) {
140140+ result = true;
141141+ }
142142+ }
143143+144144+ return result;
145145+}
146146+147147+#if __LP64__
148148+typedef struct mach_header_64 os_mach_header;
149149+#else
150150+typedef struct mach_header os_mach_header;
151151+#endif
152152+153153+static os_redirect_t
154154+_os_find_log_redirect_func(os_mach_header *hdr)
155155+{
156156+ os_redirect_t result = NULL;
157157+158158+ char name[128];
159159+ unsigned long size = 0;
160160+ uint8_t *data = getsectiondata(hdr, OS_ASSUMES_REDIRECT_SEG, OS_ASSUMES_REDIRECT_SECT, &size);
161161+ if (!data) {
162162+ data = getsectiondata(hdr, "__TEXT", OSX_ASSUMES_LOG_REDIRECT_SECT_NAME, &size);
163163+164164+ if (data && size < sizeof(name) - 2) {
165165+ (void)strlcpy(name, (const char *)data, size + 1);
166166+ result = dlsym(RTLD_DEFAULT, name);
167167+ }
168168+ } else if (size == sizeof(struct _os_redirect_assumes_s)) {
169169+ struct _os_redirect_assumes_s *redirect = (struct _os_redirect_assumes_s *)data;
170170+ result = redirect->redirect;
171171+ }
172172+173173+ return result;
174174+}
175175+176176+static bool
177177+_os_log_redirect(void *hdr, const char *msg)
178178+{
179179+ bool result = false;
180180+181181+ os_redirect_t redirect_func = _os_find_log_redirect_func(hdr);
182182+ if (redirect_func) {
183183+ result = redirect_func(msg);
184184+ }
185185+186186+ return result;
187187+}
188188+189189+__attribute__((always_inline))
190190+static void
191191+_os_construct_message(uint64_t code, _SIMPLE_STRING asl_message, Dl_info *info, char *buff, size_t sz)
192192+{
193193+ const char *image_name = NULL;
194194+ uintptr_t offset = 0;
195195+ uuid_string_t uuid_str;
196196+197197+ void *ret = __builtin_return_address(0);
198198+ if (dladdr(ret, info)) {
199199+ uuid_t uuid;
200200+ _os_get_image_uuid(info->dli_fbase, uuid);
201201+202202+ uuid_unparse(uuid, uuid_str);
203203+ image_name = _os_basename(info->dli_fname);
204204+205205+ offset = ret - info->dli_fbase;
206206+ }
207207+208208+ char sig[64];
209209+ (void)snprintf(sig, sizeof(sig), "%s:%lu", uuid_str, offset);
210210+211211+ char result[24];
212212+ (void)snprintf(result, sizeof(result), "0x%llx", code);
213213+214214+ char build[32];
215215+ size_t bsz = sizeof(build);
216216+ _os_get_build(build, bsz);
217217+218218+ (void)snprintf(buff, sz, "assertion failed: %s: %s + %lu [%s]: %s", build, image_name, offset, uuid_str, result);
219219+220220+ _simple_asl_msg_set(asl_message, "com.apple.message.domain", "com.apple.assumes.failure");
221221+ _simple_asl_msg_set(asl_message, "com.apple.message.signature", sig);
222222+ _simple_asl_msg_set(asl_message, "com.apple.message.signature2", result);
223223+ _simple_asl_msg_set(asl_message, "com.apple.message.signature3", image_name);
224224+ _simple_asl_msg_set(asl_message, "com.apple.message.summarize", "YES");
225225+}
226226+227227+#pragma mark Internal Implementations
228228+229229+os_crash_callback_t _os_crash_callback = NULL;
230230+231231+__attribute__((always_inline))
232232+static inline void
233233+_os_crash_impl(const char *message) {
234234+ os_set_crash_message(message);
235235+ if (!_os_crash_callback) {
236236+ _os_crash_callback = dlsym(RTLD_MAIN_ONLY, "os_crash_function");
237237+ }
238238+ if (_os_crash_callback) {
239239+ _os_crash_callback(message);
240240+ }
241241+}
242242+243243+__attribute__((always_inline))
244244+static inline void
245245+_os_assumes_log_impl(uint64_t code)
246246+{
247247+ char message[256] = "";
248248+249249+ _SIMPLE_STRING asl_message = _simple_asl_msg_new();
250250+ if (asl_message) {
251251+ Dl_info info;
252252+ _os_construct_message(code, asl_message, &info, message, sizeof(message));
253253+ if (!_os_log_redirect(info.dli_fbase, message)) {
254254+ _os_debug_log_error_str(message);
255255+ _simple_asl_msg_set(asl_message, "Level", "Error");
256256+ _simple_asl_msg_set(asl_message, "Message", "");
257257+ _simple_asl_send(asl_message);
258258+ }
259259+260260+ _simple_sfree(asl_message);
261261+ }
262262+263263+ if (_os_abort_on_assumes()) {
264264+ os_crash(message);
265265+ }
266266+}
267267+268268+__attribute__((always_inline))
269269+static inline char *
270270+_os_assert_log_impl(uint64_t code)
271271+{
272272+ char *result = NULL;
273273+274274+ _SIMPLE_STRING asl_message = _simple_asl_msg_new();
275275+ if (asl_message) {
276276+ Dl_info info;
277277+ char message[256];
278278+ _os_construct_message(code, asl_message, &info, message, sizeof(message));
279279+ if (!_os_log_redirect(info.dli_fbase, message)) {
280280+ _os_debug_log_error_str(message);
281281+ _simple_asl_msg_set(asl_message, "Level", "Error");
282282+ _simple_asl_msg_set(asl_message, "Message", "");
283283+ _simple_asl_send(asl_message);
284284+ }
285285+286286+ _simple_sfree(asl_message);
287287+ result = strdup(message);
288288+ }
289289+290290+#if LIBC_NO_LIBCRASHREPORTERCLIENT
291291+ /* There is no crash report information facility on embedded, which is
292292+ * really regrettable. Fortunately, all we need to capture is the value
293293+ * which tripped up the assertion. We can just stuff that into the thread's
294294+ * name.
295295+ */
296296+ char name[64];
297297+ (void)pthread_getname_np(pthread_self(), name, sizeof(name));
298298+299299+ char newname[64];
300300+ if (strlen(name) == 0) {
301301+ (void)snprintf(newname, sizeof(newname), "[Fatal bug: 0x%llx]", code);
302302+ } else {
303303+ (void)snprintf(newname, sizeof(newname), "%s [Fatal bug: 0x%llx]", name, code);
304304+ }
305305+306306+ (void)pthread_setname_np(newname);
307307+#endif
308308+309309+ return result;
310310+}
311311+312312+__attribute__((always_inline))
313313+static inline void
314314+_os_assumes_log_ctx_impl(os_log_callout_t callout, void *ctx, uint64_t code)
315315+{
316316+ char message[256] = "";
317317+318318+ _SIMPLE_STRING asl_message = _simple_asl_msg_new();
319319+ if (asl_message) {
320320+ Dl_info info;
321321+ _os_construct_message(code, asl_message, &info, message, sizeof(message));
322322+323323+ (void)callout(asl_message, ctx, message);
324324+ _simple_sfree(asl_message);
325325+ }
326326+327327+ if (_os_abort_on_assumes()) {
328328+ os_crash(message);
329329+ }
330330+}
331331+332332+__attribute__((always_inline))
333333+static inline char *
334334+_os_assert_log_ctx_impl(os_log_callout_t callout, void *ctx, uint64_t code)
335335+{
336336+ char *result = NULL;
337337+338338+ _SIMPLE_STRING asl_message = _simple_asl_msg_new();
339339+ if (asl_message) {
340340+ Dl_info info;
341341+ char message[256];
342342+ _os_construct_message(code, asl_message, &info, message, sizeof(message));
343343+344344+ (void)callout(asl_message, ctx, message);
345345+ _simple_sfree(asl_message);
346346+ result = strdup(message);
347347+ }
348348+ return result;
349349+}
350350+351351+#pragma mark Public Interfaces
352352+void _os_crash(const char *message)
353353+{
354354+ _os_crash_impl(message);
355355+}
356356+357357+void
358358+_os_assumes_log(uint64_t code)
359359+{
360360+ _os_assumes_log_impl(code);
361361+}
362362+363363+char *
364364+_os_assert_log(uint64_t code)
365365+{
366366+ return _os_assert_log_impl(code);
367367+}
368368+369369+void
370370+_os_assumes_log_ctx(os_log_callout_t callout, void *ctx, uint64_t code)
371371+{
372372+ _os_assumes_log_ctx_impl(callout, ctx, code);
373373+}
374374+375375+char *
376376+_os_assert_log_ctx(os_log_callout_t callout, void *ctx, uint64_t code)
377377+{
378378+ return _os_assert_log_ctx_impl(callout, ctx, code);
379379+}
380380+381381+void
382382+_os_avoid_tail_call(void)
383383+{
384384+ // no-op
385385+}
386386+387387+#pragma mark Legacy
388388+void
389389+_osx_assumes_log(uint64_t code)
390390+{
391391+ _os_assumes_log(code);
392392+}
393393+394394+char *
395395+_osx_assert_log(uint64_t code)
396396+{
397397+ return _os_assert_log_impl(code);
398398+}
399399+400400+void
401401+_osx_assumes_log_ctx(osx_log_callout_t callout, void *ctx, uint64_t code)
402402+{
403403+ _os_assumes_log_ctx_impl(callout, ctx, code);
404404+}
405405+406406+char *
407407+_osx_assert_log_ctx(osx_log_callout_t callout, void *ctx, uint64_t code)
408408+{
409409+ return _os_assert_log_ctx_impl(callout, ctx, code);
410410+}
411411+412412+void
413413+_osx_avoid_tail_call(void)
414414+{
415415+ _os_avoid_tail_call();
416416+}
+284
src/libc/os/assumes.h
···11+/* Copyright (c) 2012, 2012 Apple Inc. All rights reserved.
22+ *
33+ * @APPLE_LICENSE_HEADER_START@
44+ *
55+ * This file contains Original Code and/or Modifications of Original Code
66+ * as defined in and that are subject to the Apple Public Source License
77+ * Version 2.0 (the 'License'). You may not use this file except in
88+ * compliance with the License. Please obtain a copy of the License at
99+ * http://www.opensource.apple.com/apsl/ and read it before using this
1010+ * file.
1111+ *
1212+ * The Original Code and all software distributed under the License are
1313+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1414+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1515+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
1616+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1717+ * Please see the License for the specific language governing rights and
1818+ * limitations under the License.
1919+ *
2020+ * @APPLE_LICENSE_HEADER_END@
2121+ */
2222+2323+#ifndef __OS_ASSUMES_H__
2424+#define __OS_ASSUMES_H__
2525+2626+#include <sys/cdefs.h>
2727+2828+__BEGIN_DECLS
2929+3030+#include <Availability.h>
3131+#include <TargetConditionals.h>
3232+#include <stdlib.h>
3333+#include <stdint.h>
3434+#include <stdarg.h>
3535+#include <stdbool.h>
3636+#include <_simple.h>
3737+#include <errno.h>
3838+#include <os/base_private.h>
3939+4040+#if __GNUC__
4141+#define os_constant(x) __builtin_constant_p((x))
4242+#define os_hardware_trap() __asm__ __volatile__ (""); __builtin_trap()
4343+#define __OS_COMPILETIME_ASSERT__(e) __extension__({ \
4444+ char __compile_time_assert__[(e) ? 1 : -1]; \
4545+ (void)__compile_time_assert__; \
4646+})
4747+#else /* __GNUC__ */
4848+#define os_constant(x) ((long)0)
4949+#define os_hardware_trap() abort()
5050+#define __OS_COMPILETIME_ASSERT__(e) (e)
5151+#endif /* __GNUC__ */
5252+5353+5454+/* os_crash() is like os_hardware_trap(), except you get to pass in a crash
5555+ * message, and it can be redirected to a callback function using
5656+ * os_set_crash_callback() */
5757+#define os_crash(msg) \
5858+ ({ \
5959+ _os_crash(msg); \
6060+ os_hardware_trap(); \
6161+ })
6262+6363+/* This is useful for clients who wish for the messages generated by assumes()
6464+ * failures to go somewhere other than (or in addition to) the system log. If
6565+ * you don't wish for the message to be logged to the system log, then return
6666+ * true (to indicate that the message has been handled). If you want the default
6767+ * behavior, return false.
6868+ */
6969+typedef bool (*os_redirect_t)(const char *);
7070+struct _os_redirect_assumes_s {
7171+ os_redirect_t redirect;
7272+};
7373+7474+#define OS_ASSUMES_REDIRECT_SEG "__DATA"
7575+#define OS_ASSUMES_REDIRECT_SECT "__os_assumes_log"
7676+7777+#define os_redirect_assumes(func) \
7878+ __attribute__((__used__)) \
7979+ __attribute__((__section__(OS_ASSUMES_REDIRECT_SEG "," OS_ASSUMES_REDIRECT_SECT))) \
8080+ static struct _os_redirect_assumes_s _os_redirect_##func = { \
8181+ .redirect = &func, \
8282+ };
8383+8484+8585+typedef void (*os_crash_callback_t) (const char *);
8686+8787+/* private. use os_get_crash_callback and os_set_crash_callback */
8888+extern os_crash_callback_t _os_crash_callback;
8989+9090+static inline os_crash_callback_t
9191+os_get_crash_callback() {
9292+ return _os_crash_callback;
9393+}
9494+9595+static inline void
9696+os_set_crash_callback(os_crash_callback_t callback) {
9797+ _os_crash_callback = callback;
9898+}
9999+100100+/* The asl_message argument is a _SIMPLE_STRING that, when given to _simple_asl_send(), will
101101+ * direct the message to the MessageTracer diagnostic messages store rather than
102102+ * the default system log store.
103103+ */
104104+typedef bool (*os_log_callout_t)(_SIMPLE_STRING asl_message, void *ctx, const char *);
105105+106106+#include <CrashReporterClient.h>
107107+#define os_set_crash_message(arg) CRSetCrashLogMessage(arg)
108108+109109+#define os_assumes(e) __extension__({ \
110110+ __typeof__(e) _e = os_fastpath(e); \
111111+ if (!_e) { \
112112+ if (os_constant(e)) { \
113113+ __OS_COMPILETIME_ASSERT__(e); \
114114+ } \
115115+ _os_assumes_log((uint64_t)(uintptr_t)_e); \
116116+ _os_avoid_tail_call(); \
117117+ } \
118118+ _e; \
119119+})
120120+121121+#define os_assumes_zero(e) __extension__({ \
122122+ __typeof__(e) _e = os_slowpath(e); \
123123+ if (_e) { \
124124+ if (os_constant(e)) { \
125125+ __OS_COMPILETIME_ASSERT__(!e); \
126126+ } \
127127+ _os_assumes_log((uint64_t)(uintptr_t)_e); \
128128+ _os_avoid_tail_call(); \
129129+ } \
130130+ _e; \
131131+})
132132+133133+/* This variant is for use with old-style POSIX APIs that return -1 on failure
134134+ * and set errno. If the return code is -1, the value logged will be as though
135135+ * os_assumes_zero(errno) was used. It encapsulates the following pattern:
136136+ *
137137+ * int tubes[2];
138138+ * if (pipe(tubes) == -1) {
139139+ * (void)os_assumes_zero(errno);
140140+ * }
141141+ */
142142+#define posix_assumes_zero(e) __extension__({ \
143143+ __typeof__(e) _e = os_slowpath(e); \
144144+ if (_e == (typeof(e))-1) { \
145145+ _os_assumes_log((uint64_t)(uintptr_t)errno); \
146146+ _os_avoid_tail_call(); \
147147+ } \
148148+ _e; \
149149+})
150150+151151+#define os_assert(e) __extension__({ \
152152+ __typeof__(e) _e = os_fastpath(e); \
153153+ if (!_e) { \
154154+ if (os_constant(e)) { \
155155+ __OS_COMPILETIME_ASSERT__(e); \
156156+ } \
157157+\
158158+ char *_fail_message = _os_assert_log((uint64_t)(uintptr_t)_e); \
159159+ os_crash(_fail_message); \
160160+ free(_fail_message); \
161161+ } \
162162+})
163163+164164+#define os_assert_zero(e) __extension__({ \
165165+ __typeof__(e) _e = os_slowpath(e); \
166166+ if (_e) { \
167167+ if (os_constant(e)) { \
168168+ __OS_COMPILETIME_ASSERT__(!e); \
169169+ } \
170170+\
171171+ char *_fail_message = _os_assert_log((uint64_t)(uintptr_t)_e); \
172172+ os_crash(_fail_message); \
173173+ free(_fail_message); \
174174+ } \
175175+})
176176+177177+#define posix_assert_zero(e) __extension__({ \
178178+ __typeof__(e) _e = os_slowpath(e); \
179179+ if (_e == (__typeof__(e))-1) { \
180180+ char *_fail_message = _os_assert_log((uint64_t)(uintptr_t)errno); \
181181+ os_crash(_fail_message); \
182182+ free(_fail_message); \
183183+ } \
184184+})
185185+186186+/* These are for defining your own assumes()-like wrapper calls so that you can
187187+ * log additional information, such as the about-PID, sender, etc. They're
188188+ * generally not useful for direct inclusion in your code.
189189+ */
190190+#define os_assumes_ctx(f, ctx, e) __extension__({ \
191191+ __typeof__(e) _e = os_fastpath(e); \
192192+ if (!_e) { \
193193+ if (os_constant(e)) { \
194194+ __OS_COMPILETIME_ASSERT__(e); \
195195+ } \
196196+ _os_assumes_log_ctx(f, ctx, (uintptr_t)_e); \
197197+ _os_avoid_tail_call(); \
198198+ } \
199199+ _e; \
200200+})
201201+202202+#define os_assumes_zero_ctx(f, ctx, e) __extension__({ \
203203+ __typeof__(e) _e = os_slowpath(e); \
204204+ if (_e) { \
205205+ if (os_constant(e)) { \
206206+ __OS_COMPILETIME_ASSERT__(!e); \
207207+ } \
208208+ _os_assumes_log_ctx((f), (ctx), (uintptr_t)_e); \
209209+ _os_avoid_tail_call(); \
210210+ } \
211211+ _e; \
212212+})
213213+214214+#define posix_assumes_zero_ctx(f, ctx, e) __extension__({ \
215215+ __typeof__(e) _e = os_slowpath(e); \
216216+ if (_e == (__typeof__(e))-1) { \
217217+ _os_assumes_log_ctx((f), (ctx), (uintptr_t)errno); \
218218+ _os_avoid_tail_call(); \
219219+ } \
220220+ _e; \
221221+})
222222+223223+#define os_assert_ctx(f, ctx, e) __extension__({ \
224224+ __typeof__(e) _e = os_fastpath(e); \
225225+ if (!_e) { \
226226+ if (os_constant(e)) { \
227227+ __OS_COMPILETIME_ASSERT__(e); \
228228+ } \
229229+ \
230230+ char *_fail_message = _os_assert_log_ctx((f), (ctx), (uint64_t)(uintptr_t)_e); \
231231+ os_crash(_fail_message); \
232232+ free(_fail_message); \
233233+ } \
234234+})
235235+236236+#define os_assert_zero_ctx(f, ctx, e) __extension__({ \
237237+ __typeof__(e) _e = os_slowpath(e); \
238238+ if (_e) { \
239239+ if (os_constant(e)) { \
240240+ __OS_COMPILETIME_ASSERT__(!e); \
241241+ } \
242242+\
243243+ char *_fail_message = _os_assert_log_ctx((f), (ctx), (uint64_t)(uintptr_t)_e); \
244244+ os_crash(_fail_message); \
245245+ free(_fail_message); \
246246+ } \
247247+})
248248+249249+#define posix_assert_zero_ctx(f, ctx, e) __extension__({ \
250250+ __typeof__(e) _e = os_slowpath(e); \
251251+ if (_e == (__typeof__(e))-1) { \
252252+ char *_fail_message = _os_assert_log_ctx((f), (ctx), (uint64_t)(uintptr_t)errno); \
253253+ os_crash(_fail_message); \
254254+ free(_fail_message); \
255255+ } \
256256+})
257257+258258+__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0)
259259+extern void
260260+_os_crash(const char *);
261261+262262+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
263263+extern void
264264+_os_assumes_log(uint64_t code);
265265+266266+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
267267+extern char *
268268+_os_assert_log(uint64_t code);
269269+270270+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
271271+extern void
272272+_os_assumes_log_ctx(os_log_callout_t callout, void *ctx, uint64_t code);
273273+274274+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
275275+extern char *
276276+_os_assert_log_ctx(os_log_callout_t callout, void *ctx, uint64_t code);
277277+278278+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
279279+extern void
280280+_os_avoid_tail_call(void);
281281+282282+__END_DECLS
283283+284284+#endif /* __OS_ASSUMES_H__ */
+51
src/libc/os/base.h
···11+/* Copyright (c) 2012 Apple Inc. All rights reserved.
22+ *
33+ * @APPLE_LICENSE_HEADER_START@
44+ *
55+ * This file contains Original Code and/or Modifications of Original Code
66+ * as defined in and that are subject to the Apple Public Source License
77+ * Version 2.0 (the 'License'). You may not use this file except in
88+ * compliance with the License. Please obtain a copy of the License at
99+ * http://www.opensource.apple.com/apsl/ and read it before using this
1010+ * file.
1111+ *
1212+ * The Original Code and all software distributed under the License are
1313+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1414+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1515+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
1616+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1717+ * Please see the License for the specific language governing rights and
1818+ * limitations under the License.
1919+ *
2020+ * @APPLE_LICENSE_HEADER_END@
2121+ */
2222+2323+#ifndef __OS_BASE_H__
2424+#define __OS_BASE_H__
2525+2626+#if __GNUC__
2727+#define os_fastpath(x) ((__typeof__(x))(uintptr_t)__builtin_expect((uintptr_t)(x), ~0l))
2828+#define os_slowpath(x) ((__typeof__(x))(uintptr_t)__builtin_expect((uintptr_t)(x), 0l))
2929+#define os_constant(x) __builtin_constant_p((x))
3030+#define os_hardware_trap() __asm__ __volatile__ (""); __builtin_trap()
3131+3232+#define __OS_COMPILETIME_ASSERT__(e) __extension__({ \
3333+ char __compile_time_assert__[(e) ? 1 : -1]; \
3434+ (void)__compile_time_assert__; \
3535+})
3636+3737+#define __OS_CONST __attribute__((__const__))
3838+#define __OS_PRINTFLIKE(x,y) __attribute__((__format__(printf,x,y)))
3939+#else /* __GNUC__ */
4040+#define os_fastpath(x) (x)
4141+#define os_slowpath(x) (x)
4242+#define os_constant(x) ((long)0)
4343+#define os_hardware_trap() abort()
4444+4545+#define __OS_COMPILETIME_ASSERT__(e) (e)
4646+4747+#define __OS_CONST
4848+#define __OS_PRINTFLIKE(x,y)
4949+#endif /* __GNUC__ */
5050+5151+#endif /* __OS_BASE_H__ */
···11+/* Copyright (c) 2012-2013 Apple Inc. All rights reserved.
22+ *
33+ * @APPLE_LICENSE_HEADER_START@
44+ *
55+ * This file contains Original Code and/or Modifications of Original Code
66+ * as defined in and that are subject to the Apple Public Source License
77+ * Version 2.0 (the 'License'). You may not use this file except in
88+ * compliance with the License. Please obtain a copy of the License at
99+ * http://www.opensource.apple.com/apsl/ and read it before using this
1010+ * file.
1111+ *
1212+ * The Original Code and all software distributed under the License are
1313+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1414+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1515+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
1616+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1717+ * Please see the License for the specific language governing rights and
1818+ * limitations under the License.
1919+ *
2020+ * @APPLE_LICENSE_HEADER_END@
2121+ */
2222+2323+#include <dlfcn.h>
2424+#include <errno.h>
2525+#include <fcntl.h>
2626+#include <limits.h>
2727+#include <mach/mach_time.h>
2828+#include <os/alloc_once_private.h>
2929+#include <os/assumes.h>
3030+#include <os/debug_private.h>
3131+#include <_simple.h>
3232+#include <stdarg.h>
3333+#include <stdbool.h>
3434+#include <stdio.h>
3535+#include <stdlib.h>
3636+#include <string.h>
3737+#include <syslog.h>
3838+#include <sys/time.h>
3939+#include <unistd.h>
4040+4141+struct os_debug_log_globals_s {
4242+ uint64_t start;
4343+ os_redirect_t redirect;
4444+ int logfd;
4545+ bool prepend_timestamp : 1;
4646+ bool errors_only : 1;
4747+};
4848+4949+// If user picked a filename, use it and only it.
5050+// Otherwise, first try /var/tmp, then $TMPDIR, then give up.
5151+static inline
5252+int
5353+_os_debug_log_open_file(const char *suggestion)
5454+{
5555+ if (suggestion) {
5656+ return open(suggestion, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW |
5757+ O_EXCL | O_CLOEXEC, 0644);
5858+ }
5959+6060+ int fd;
6161+ char filename[PATH_MAX];
6262+ char path[PATH_MAX];
6363+6464+ snprintf(filename, sizeof(filename), "os_debug_log.%s.%d.log", getprogname(),
6565+ getpid());
6666+6767+ strlcpy(path, "/var/tmp/", sizeof(path));
6868+ if (access(path, W_OK) == 0) {
6969+ strlcat(path, filename, sizeof(path));
7070+ fd = open(path, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_EXCL |
7171+ O_CLOEXEC, 0644);
7272+ if (fd >= 0) {
7373+ return fd;
7474+ }
7575+ }
7676+7777+ const char *tmpdir = getenv("TMPDIR");
7878+ if (tmpdir) {
7979+ strlcpy(path, tmpdir, sizeof(path));
8080+ if (access(path, W_OK) == 0) {
8181+ strlcat(path, filename, sizeof(path));
8282+ fd = open(path, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW |
8383+ O_EXCL | O_CLOEXEC, 0644);
8484+ if (fd >= 0) {
8585+ return fd;
8686+ }
8787+ }
8888+ }
8989+9090+ return -1;
9191+}
9292+9393+static
9494+void
9595+_os_debug_log_init(void *globals)
9696+{
9797+ struct os_debug_log_globals_s *g = globals;
9898+9999+ g->errors_only = false;
100100+101101+ g->redirect = dlsym(RTLD_MAIN_ONLY, "_os_debug_log_redirect_func");
102102+103103+ // This is a bit of a hack. LIBDISPATCH_LOG is part of dispatch's API.
104104+ // But now all dispatch logging goes through os_debug_log. So we have to
105105+ // recognize this env var here in Libc.
106106+ // rdar://problem/11685359 tracks deprecating LIBDISPATCH_LOG from dispatch.
107107+ char *e = getenv("LIBDISPATCH_LOG");
108108+ if (!e) {
109109+ e = getenv("OS_DEBUG_LOG");
110110+ }
111111+112112+ // Default log destination
113113+ if (!e || strcmp(e, "YES") == 0) {
114114+#if DEBUG
115115+ e = "file";
116116+#else
117117+ e = "syslog";
118118+#endif
119119+ }
120120+121121+ if (strcmp(e, "NO") == 0) {
122122+ g->logfd = -1;
123123+ g->errors_only = true;
124124+ } else if (strcmp(e, "syslog") == 0) {
125125+ g->logfd = -1;
126126+ } else if (strcmp(e, "stderr") == 0) {
127127+ g->logfd = STDERR_FILENO;
128128+ } else if (strcmp(e, "stdout") == 0) {
129129+ g->logfd = STDOUT_FILENO;
130130+ } else if (strcmp(e, "file") == 0) {
131131+ g->logfd = _os_debug_log_open_file(NULL);
132132+ if (g->logfd == -1) {
133133+ g->errors_only = true;
134134+ }
135135+ } else {
136136+ g->logfd = _os_debug_log_open_file(e);
137137+ if (g->logfd == -1) {
138138+ g->errors_only = true;
139139+ }
140140+ }
141141+142142+ // From now on, g->logfd == -1 means syslog; anything >= 0 is the
143143+ // fd to use. Remember that file descriptor 0 is a perfectly valid
144144+ // value for open() to return if you closed (or never had) stdin.
145145+146146+ // Timestamp every log message if logging directly to file and no
147147+ // redirector is set up.
148148+ if (g->logfd >= 0 && !g->redirect) {
149149+ g->prepend_timestamp = true;
150150+151151+ struct timeval tv;
152152+ gettimeofday(&tv, NULL);
153153+154154+ g->start = mach_absolute_time();
155155+156156+ dprintf(g->logfd,
157157+ "=== os_debug_log log file opened for %s[%u] at %ld.%06u",
158158+ getprogname(), getpid(),
159159+ tv.tv_sec, tv.tv_usec);
160160+ if (g->prepend_timestamp) {
161161+ mach_timebase_info_data_t tbi;
162162+ if (mach_timebase_info(&tbi) == 0) {
163163+ dprintf(g->logfd, " [ns=ticks*%u/%u]",
164164+ tbi.numer, tbi.denom);
165165+ }
166166+ }
167167+ dprintf(g->logfd, " ===\n");
168168+ }
169169+}
170170+171171+#ifndef OS_ALLOC_ONCE_KEY_OS_DEBUG_LOG
172172+#define OS_ALLOC_ONCE_KEY_OS_DEBUG_LOG OS_ALLOC_ONCE_KEY_OS_TRACE
173173+#endif
174174+175175+static inline /* OS_CONST */
176176+struct os_debug_log_globals_s *
177177+os_debug_log_globals(void)
178178+{
179179+ return (struct os_debug_log_globals_s *)
180180+ os_alloc_once(OS_ALLOC_ONCE_KEY_OS_DEBUG_LOG,
181181+ sizeof(struct os_debug_log_globals_s),
182182+ _os_debug_log_init);
183183+}
184184+185185+static __attribute__((always_inline))
186186+uint64_t
187187+_os_debug_log_ticks_since_start(void)
188188+{
189189+ return mach_absolute_time() - os_debug_log_globals()->start;
190190+}
191191+192192+// False on error writing to file
193193+static inline
194194+bool
195195+_os_debug_log_write_fd(int level __attribute__((__unused__)),
196196+ char *str, int fd)
197197+{
198198+ size_t len = strlen(str);
199199+200200+ str[len++] = '\n'; // overwrite null - don't use str*() anymore
201201+202202+ ssize_t rc, wlen = 0;
203203+ do {
204204+ rc = write(fd, &str[wlen], len - wlen);
205205+ if (os_slowpath(rc == -1)) {
206206+ if(errno == EINTR) {
207207+ rc = 0;
208208+ } else {
209209+ return false;
210210+ }
211211+ }
212212+ wlen += rc;
213213+ } while (wlen < len);
214214+215215+ return true;
216216+}
217217+218218+static __attribute__((__noinline__))
219219+void
220220+_os_debug_log_write_error(void)
221221+{
222222+ char err_str[256];
223223+ const char *pfx = "os_debug_log() :";
224224+ size_t pfxlen = strlen(pfx);
225225+226226+ strlcpy(err_str, pfx, sizeof(err_str));
227227+ strerror_r(errno, err_str+pfxlen, sizeof(err_str)-pfxlen);
228228+ _simple_asl_log(LOG_ERR, "com.apple.os_debug_log", err_str);
229229+}
230230+231231+static inline
232232+void
233233+_os_debug_log_write(int level, char *str)
234234+{
235235+ int fd = os_debug_log_globals()->logfd;
236236+ os_redirect_t rdr = os_debug_log_globals()->redirect;
237237+ // true = redirect has fully handled, don't log
238238+ if (os_slowpath(rdr) && os_fastpath(rdr(str))) {
239239+ return;
240240+ }
241241+ if (os_slowpath(fd >= 0)) {
242242+ if (os_fastpath(_os_debug_log_write_fd(level, str, fd))) {
243243+ return;
244244+ } else {
245245+ _os_debug_log_write_error();
246246+ os_debug_log_globals()->logfd = -1;
247247+ // Don't return, fall out to syslog().
248248+ }
249249+ }
250250+ _simple_asl_log(level, "com.apple.os_debug_log", str);
251251+}
252252+253253+static __attribute__((always_inline))
254254+void
255255+_os_debug_logv(int level, const char *msg, va_list ap)
256256+{
257257+ if (os_slowpath(os_debug_log_globals()->errors_only) && level > LOG_ERR) {
258258+ // more important = lower integer
259259+ return;
260260+ }
261261+ char *buf, *freebuf;
262262+ size_t len;
263263+264264+ len = vasprintf(&buf, msg, ap);
265265+ if (!buf) {
266266+ return;
267267+ }
268268+ freebuf = buf;
269269+270270+ // The os_debug_log macros prepend many spaces to the format string.
271271+ // Overwrite them with a timestamp, *or* skip them.
272272+ const size_t pfxlen = strlen(_OS_DEBUG_LOG_PREFIX);
273273+ const size_t timelen = 16;
274274+ __OS_COMPILETIME_ASSERT__(pfxlen >= timelen);
275275+276276+ if (os_fastpath(len > pfxlen)) {
277277+ if (os_slowpath(os_debug_log_globals()->prepend_timestamp)) {
278278+ char tmp = buf[timelen];
279279+ snprintf(buf, timelen + 1, "%16llu", _os_debug_log_ticks_since_start());
280280+ buf[timelen] = tmp; // snprintf's null
281281+ } else {
282282+ buf += pfxlen;
283283+ }
284284+ }
285285+286286+ _os_debug_log_write(level, buf);
287287+ free(freebuf);
288288+}
289289+290290+void
291291+_os_debug_log_error_str(char *msg)
292292+{
293293+ _os_debug_log_write(LOG_ERR, msg);
294294+}
295295+296296+OS_FORMAT_PRINTF(1, 2)
297297+void
298298+_os_debug_log(const char *msg, ...)
299299+{
300300+ va_list ap;
301301+ va_start(ap, msg);
302302+ _os_debug_logv(LOG_DEBUG, msg, ap);
303303+ va_end(ap);
304304+}
+77
src/libc/os/debug_private.h
···11+/* Copyright (c) 2012-2013 Apple Inc. All rights reserved.
22+ *
33+ * @APPLE_LICENSE_HEADER_START@
44+ *
55+ * This file contains Original Code and/or Modifications of Original Code
66+ * as defined in and that are subject to the Apple Public Source License
77+ * Version 2.0 (the 'License'). You may not use this file except in
88+ * compliance with the License. Please obtain a copy of the License at
99+ * http://www.opensource.apple.com/apsl/ and read it before using this
1010+ * file.
1111+ *
1212+ * The Original Code and all software distributed under the License are
1313+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1414+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
1515+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
1616+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
1717+ * Please see the License for the specific language governing rights and
1818+ * limitations under the License.
1919+ *
2020+ * @APPLE_LICENSE_HEADER_END@
2121+ */
2222+2323+#ifndef __OS_DEBUG_LOG_H__
2424+#define __OS_DEBUG_LOG_H__
2525+2626+#include <Availability.h>
2727+#include <TargetConditionals.h>
2828+2929+#include <os/base_private.h>
3030+#include <stdarg.h>
3131+3232+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
3333+OS_FORMAT_PRINTF(1, 2)
3434+extern void
3535+_os_debug_log(const char *msg, ...);
3636+3737+/* The os_debug_log macros insert spaces before the message. If logging to a file,
3838+ * the spaces will be replaced by a timestamp. If logging to syslog, they will
3939+ * be skipped (syslog knows what time it is). There are 20 spaces because the
4040+ * timestamp is printed as %16llu + 4 spaces before the next column.
4141+ * 10^16 ns = 3.8 months. Don't run your process in _debug for that long. This
4242+ * isn't syslog.
4343+ */
4444+#define _OS_DEBUG_LOG_PREFIX " "
4545+4646+#define os_debug_log(tag, fmt, ...) __extension__({\
4747+ _os_debug_log(_OS_DEBUG_LOG_PREFIX "%s: " fmt, tag, ## __VA_ARGS__); \
4848+})
4949+5050+#define os_debug_log_ctx(tag, ctx, fmt, ...) __extension__({\
5151+ _os_debug_log(_OS_DEBUG_LOG_PREFIX "[%p] %s: " fmt, ctx, tag, ## __VA_ARGS__); \
5252+})
5353+5454+/* This is useful for clients who wish for the messages generated by os_debug_log()
5555+ * or os_assumes() failures to go somewhere other than (or in addition to) the
5656+ * system log, for example launchd or syslogd itself. If you don't wish for the
5757+ * message to be logged to the system log, then return true (to indicate that
5858+ * the message has been handled). If you want the default behavior, return
5959+ * false. Please use this macro, rather than directly declaring a function,
6060+ * since the declaration magic may change in the future.
6161+ */
6262+#define os_debug_log_redirect(func) \
6363+ __attribute__((__used__)) \
6464+ __attribute__((__visibility__("default"))) \
6565+ bool _os_debug_log_redirect_func(const char *msg) { \
6666+ return func(msg); \
6767+ }
6868+6969+# pragma mark -
7070+# pragma mark Private To Libc
7171+7272+// str must be modifiable (non-const)!
7373+__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
7474+extern void
7575+_os_debug_log_error_str(char *str);
7676+7777+#endif /* __OS_DEBUG_LOG_H__ */