PageRenderTime 62ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/llvm-3.1.src/tools/clang/include/clang/Basic/Builtins.def

#
Module-Definition | 836 lines | 775 code | 61 blank | 0 comment | 11 complexity | c40643bdc2cb02119f1f363b7afdff8e MD5 | raw file
Possible License(s): JSON, BSD-3-Clause
  1. //===--- Builtins.def - Builtin function info database ----------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file defines the standard builtin function database. Users of this file
  11. // must define the BUILTIN macro to make use of this information.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. // FIXME: This should really be a .td file, but that requires modifying tblgen.
  15. // Perhaps tblgen should have plugins.
  16. // The first value provided to the macro specifies the function name of the
  17. // builtin, and results in a clang::builtin::BIXX enum value for XX.
  18. // The second value provided to the macro specifies the type of the function
  19. // (result value, then each argument) as follows:
  20. // v -> void
  21. // b -> boolean
  22. // c -> char
  23. // s -> short
  24. // i -> int
  25. // f -> float
  26. // d -> double
  27. // z -> size_t
  28. // F -> constant CFString
  29. // G -> id
  30. // H -> SEL
  31. // a -> __builtin_va_list
  32. // A -> "reference" to __builtin_va_list
  33. // V -> Vector, following num elements and a base type.
  34. // X -> _Complex, followed by the base type.
  35. // Y -> ptrdiff_t
  36. // P -> FILE
  37. // J -> jmp_buf
  38. // SJ -> sigjmp_buf
  39. // K -> ucontext_t
  40. // . -> "...". This may only occur at the end of the function list.
  41. //
  42. // Types may be prefixed with the following modifiers:
  43. // L -> long (e.g. Li for 'long int')
  44. // LL -> long long
  45. // LLL -> __int128_t (e.g. LLLi)
  46. // S -> signed
  47. // U -> unsigned
  48. // I -> Required to constant fold to an integer constant expression.
  49. //
  50. // Types may be postfixed with the following modifiers:
  51. // * -> pointer (optionally followed by an address space number)
  52. // & -> reference (optionally followed by an address space number)
  53. // C -> const
  54. // D -> volatile
  55. // The third value provided to the macro specifies information about attributes
  56. // of the function. These must be kept in sync with the predicates in the
  57. // Builtin::Context class. Currently we have:
  58. // n -> nothrow
  59. // r -> noreturn
  60. // c -> const
  61. // t -> signature is meaningless, use custom typechecking
  62. // F -> this is a libc/libm function with a '__builtin_' prefix added.
  63. // f -> this is a libc/libm function without the '__builtin_' prefix. It can
  64. // be followed by ':headername:' to state which header this function
  65. // comes from.
  66. // p:N: -> this is a printf-like function whose Nth argument is the format
  67. // string.
  68. // P:N: -> similar to the p:N: attribute, but the function is like vprintf
  69. // in that it accepts its arguments as a va_list rather than
  70. // through an ellipsis
  71. // s:N: -> this is a scanf-like function whose Nth argument is the format
  72. // string.
  73. // S:N: -> similar to the s:N: attribute, but the function is like vscanf
  74. // in that it accepts its arguments as a va_list rather than
  75. // through an ellipsis
  76. // e -> const, but only when -fmath-errno=0
  77. // j -> returns_twice (like setjmp)
  78. // FIXME: gcc has nonnull
  79. #if defined(BUILTIN) && !defined(LIBBUILTIN)
  80. # define LIBBUILTIN(ID, TYPE, ATTRS, HEADER, BUILTIN_LANG) BUILTIN(ID, TYPE, ATTRS)
  81. #endif
  82. // Standard libc/libm functions:
  83. BUILTIN(__builtin_atan2 , "ddd" , "Fnc")
  84. BUILTIN(__builtin_atan2f, "fff" , "Fnc")
  85. BUILTIN(__builtin_atan2l, "LdLdLd", "Fnc")
  86. BUILTIN(__builtin_abs , "ii" , "ncF")
  87. BUILTIN(__builtin_copysign, "ddd", "ncF")
  88. BUILTIN(__builtin_copysignf, "fff", "ncF")
  89. BUILTIN(__builtin_copysignl, "LdLdLd", "ncF")
  90. BUILTIN(__builtin_fabs , "dd" , "ncF")
  91. BUILTIN(__builtin_fabsf, "ff" , "ncF")
  92. BUILTIN(__builtin_fabsl, "LdLd", "ncF")
  93. BUILTIN(__builtin_fmod , "ddd" , "Fnc")
  94. BUILTIN(__builtin_fmodf, "fff" , "Fnc")
  95. BUILTIN(__builtin_fmodl, "LdLdLd", "Fnc")
  96. BUILTIN(__builtin_frexp , "ddi*" , "Fn")
  97. BUILTIN(__builtin_frexpf, "ffi*" , "Fn")
  98. BUILTIN(__builtin_frexpl, "LdLdi*", "Fn")
  99. BUILTIN(__builtin_huge_val, "d", "nc")
  100. BUILTIN(__builtin_huge_valf, "f", "nc")
  101. BUILTIN(__builtin_huge_vall, "Ld", "nc")
  102. BUILTIN(__builtin_inf , "d" , "nc")
  103. BUILTIN(__builtin_inff , "f" , "nc")
  104. BUILTIN(__builtin_infl , "Ld" , "nc")
  105. BUILTIN(__builtin_labs , "LiLi" , "Fnc")
  106. BUILTIN(__builtin_llabs, "LLiLLi", "Fnc")
  107. BUILTIN(__builtin_ldexp , "ddi" , "Fnc")
  108. BUILTIN(__builtin_ldexpf, "ffi" , "Fnc")
  109. BUILTIN(__builtin_ldexpl, "LdLdi", "Fnc")
  110. BUILTIN(__builtin_modf , "ddd*" , "Fn")
  111. BUILTIN(__builtin_modff, "fff*" , "Fn")
  112. BUILTIN(__builtin_modfl, "LdLdLd*", "Fn")
  113. BUILTIN(__builtin_nan, "dcC*" , "ncF")
  114. BUILTIN(__builtin_nanf, "fcC*" , "ncF")
  115. BUILTIN(__builtin_nanl, "LdcC*", "ncF")
  116. BUILTIN(__builtin_nans, "dcC*" , "ncF")
  117. BUILTIN(__builtin_nansf, "fcC*" , "ncF")
  118. BUILTIN(__builtin_nansl, "LdcC*", "ncF")
  119. BUILTIN(__builtin_powi , "ddi" , "Fnc")
  120. BUILTIN(__builtin_powif, "ffi" , "Fnc")
  121. BUILTIN(__builtin_powil, "LdLdi", "Fnc")
  122. BUILTIN(__builtin_pow , "ddd" , "Fnc")
  123. BUILTIN(__builtin_powf, "fff" , "Fnc")
  124. BUILTIN(__builtin_powl, "LdLdLd", "Fnc")
  125. // Standard unary libc/libm functions with double/float/long double variants:
  126. BUILTIN(__builtin_acos , "dd" , "Fnc")
  127. BUILTIN(__builtin_acosf, "ff" , "Fnc")
  128. BUILTIN(__builtin_acosl, "LdLd", "Fnc")
  129. BUILTIN(__builtin_acosh , "dd" , "Fnc")
  130. BUILTIN(__builtin_acoshf, "ff" , "Fnc")
  131. BUILTIN(__builtin_acoshl, "LdLd", "Fnc")
  132. BUILTIN(__builtin_asin , "dd" , "Fnc")
  133. BUILTIN(__builtin_asinf, "ff" , "Fnc")
  134. BUILTIN(__builtin_asinl, "LdLd", "Fnc")
  135. BUILTIN(__builtin_asinh , "dd" , "Fnc")
  136. BUILTIN(__builtin_asinhf, "ff" , "Fnc")
  137. BUILTIN(__builtin_asinhl, "LdLd", "Fnc")
  138. BUILTIN(__builtin_atan , "dd" , "Fnc")
  139. BUILTIN(__builtin_atanf, "ff" , "Fnc")
  140. BUILTIN(__builtin_atanl, "LdLd", "Fnc")
  141. BUILTIN(__builtin_atanh , "dd", "Fnc")
  142. BUILTIN(__builtin_atanhf, "ff", "Fnc")
  143. BUILTIN(__builtin_atanhl, "LdLd", "Fnc")
  144. BUILTIN(__builtin_cbrt , "dd", "Fnc")
  145. BUILTIN(__builtin_cbrtf, "ff", "Fnc")
  146. BUILTIN(__builtin_cbrtl, "LdLd", "Fnc")
  147. BUILTIN(__builtin_ceil , "dd" , "Fnc")
  148. BUILTIN(__builtin_ceilf, "ff" , "Fnc")
  149. BUILTIN(__builtin_ceill, "LdLd", "Fnc")
  150. BUILTIN(__builtin_cos , "dd" , "Fnc")
  151. BUILTIN(__builtin_cosf, "ff" , "Fnc")
  152. BUILTIN(__builtin_cosh , "dd" , "Fnc")
  153. BUILTIN(__builtin_coshf, "ff" , "Fnc")
  154. BUILTIN(__builtin_coshl, "LdLd", "Fnc")
  155. BUILTIN(__builtin_cosl, "LdLd", "Fnc")
  156. BUILTIN(__builtin_erf , "dd", "Fnc")
  157. BUILTIN(__builtin_erff, "ff", "Fnc")
  158. BUILTIN(__builtin_erfl, "LdLd", "Fnc")
  159. BUILTIN(__builtin_erfc , "dd", "Fnc")
  160. BUILTIN(__builtin_erfcf, "ff", "Fnc")
  161. BUILTIN(__builtin_erfcl, "LdLd", "Fnc")
  162. BUILTIN(__builtin_exp , "dd" , "Fnc")
  163. BUILTIN(__builtin_expf, "ff" , "Fnc")
  164. BUILTIN(__builtin_expl, "LdLd", "Fnc")
  165. BUILTIN(__builtin_exp2 , "dd" , "Fnc")
  166. BUILTIN(__builtin_exp2f, "ff" , "Fnc")
  167. BUILTIN(__builtin_exp2l, "LdLd", "Fnc")
  168. BUILTIN(__builtin_expm1 , "dd", "Fnc")
  169. BUILTIN(__builtin_expm1f, "ff", "Fnc")
  170. BUILTIN(__builtin_expm1l, "LdLd", "Fnc")
  171. BUILTIN(__builtin_fdim, "ddd", "Fnc")
  172. BUILTIN(__builtin_fdimf, "fff", "Fnc")
  173. BUILTIN(__builtin_fdiml, "LdLdLd", "Fnc")
  174. BUILTIN(__builtin_floor , "dd" , "Fnc")
  175. BUILTIN(__builtin_floorf, "ff" , "Fnc")
  176. BUILTIN(__builtin_floorl, "LdLd", "Fnc")
  177. BUILTIN(__builtin_fma, "dddd", "Fnc")
  178. BUILTIN(__builtin_fmaf, "ffff", "Fnc")
  179. BUILTIN(__builtin_fmal, "LdLdLdLd", "Fnc")
  180. BUILTIN(__builtin_fmax, "ddd", "Fnc")
  181. BUILTIN(__builtin_fmaxf, "fff", "Fnc")
  182. BUILTIN(__builtin_fmaxl, "LdLdLd", "Fnc")
  183. BUILTIN(__builtin_fmin, "ddd", "Fnc")
  184. BUILTIN(__builtin_fminf, "fff", "Fnc")
  185. BUILTIN(__builtin_fminl, "LdLdLd", "Fnc")
  186. BUILTIN(__builtin_hypot , "ddd" , "Fnc")
  187. BUILTIN(__builtin_hypotf, "fff" , "Fnc")
  188. BUILTIN(__builtin_hypotl, "LdLdLd", "Fnc")
  189. BUILTIN(__builtin_ilogb , "id", "Fnc")
  190. BUILTIN(__builtin_ilogbf, "if", "Fnc")
  191. BUILTIN(__builtin_ilogbl, "iLd", "Fnc")
  192. BUILTIN(__builtin_lgamma , "dd", "Fnc")
  193. BUILTIN(__builtin_lgammaf, "ff", "Fnc")
  194. BUILTIN(__builtin_lgammal, "LdLd", "Fnc")
  195. BUILTIN(__builtin_llrint, "LLid", "Fnc")
  196. BUILTIN(__builtin_llrintf, "LLif", "Fnc")
  197. BUILTIN(__builtin_llrintl, "LLiLd", "Fnc")
  198. BUILTIN(__builtin_llround , "LLid", "Fnc")
  199. BUILTIN(__builtin_llroundf, "LLif", "Fnc")
  200. BUILTIN(__builtin_llroundl, "LLiLd", "Fnc")
  201. BUILTIN(__builtin_log , "dd" , "Fnc")
  202. BUILTIN(__builtin_log10 , "dd" , "Fnc")
  203. BUILTIN(__builtin_log10f, "ff" , "Fnc")
  204. BUILTIN(__builtin_log10l, "LdLd", "Fnc")
  205. BUILTIN(__builtin_log1p , "dd" , "Fnc")
  206. BUILTIN(__builtin_log1pf, "ff" , "Fnc")
  207. BUILTIN(__builtin_log1pl, "LdLd", "Fnc")
  208. BUILTIN(__builtin_log2, "dd" , "Fnc")
  209. BUILTIN(__builtin_log2f, "ff" , "Fnc")
  210. BUILTIN(__builtin_log2l, "LdLd" , "Fnc")
  211. BUILTIN(__builtin_logb , "dd", "Fnc")
  212. BUILTIN(__builtin_logbf, "ff", "Fnc")
  213. BUILTIN(__builtin_logbl, "LdLd", "Fnc")
  214. BUILTIN(__builtin_logf, "ff" , "Fnc")
  215. BUILTIN(__builtin_logl, "LdLd", "Fnc")
  216. BUILTIN(__builtin_lrint , "Lid", "Fnc")
  217. BUILTIN(__builtin_lrintf, "Lif", "Fnc")
  218. BUILTIN(__builtin_lrintl, "LiLd", "Fnc")
  219. BUILTIN(__builtin_lround , "Lid", "Fnc")
  220. BUILTIN(__builtin_lroundf, "Lif", "Fnc")
  221. BUILTIN(__builtin_lroundl, "LiLd", "Fnc")
  222. BUILTIN(__builtin_nearbyint , "dd", "Fnc")
  223. BUILTIN(__builtin_nearbyintf, "ff", "Fnc")
  224. BUILTIN(__builtin_nearbyintl, "LdLd", "Fnc")
  225. BUILTIN(__builtin_nextafter , "ddd", "Fnc")
  226. BUILTIN(__builtin_nextafterf, "fff", "Fnc")
  227. BUILTIN(__builtin_nextafterl, "LdLdLd", "Fnc")
  228. BUILTIN(__builtin_nexttoward , "ddd", "Fnc")
  229. BUILTIN(__builtin_nexttowardf, "fff", "Fnc")
  230. BUILTIN(__builtin_nexttowardl, "LdLdLd", "Fnc")
  231. BUILTIN(__builtin_remainder , "ddd", "Fnc")
  232. BUILTIN(__builtin_remainderf, "fff", "Fnc")
  233. BUILTIN(__builtin_remainderl, "LdLdLd", "Fnc")
  234. BUILTIN(__builtin_remquo , "dddi*", "Fn")
  235. BUILTIN(__builtin_remquof, "fffi*", "Fn")
  236. BUILTIN(__builtin_remquol, "LdLdLdi*", "Fn")
  237. BUILTIN(__builtin_rint , "dd", "Fnc")
  238. BUILTIN(__builtin_rintf, "ff", "Fnc")
  239. BUILTIN(__builtin_rintl, "LdLd", "Fnc")
  240. BUILTIN(__builtin_round, "dd" , "Fnc")
  241. BUILTIN(__builtin_roundf, "ff" , "Fnc")
  242. BUILTIN(__builtin_roundl, "LdLd" , "Fnc")
  243. BUILTIN(__builtin_scalbln , "ddLi", "Fnc")
  244. BUILTIN(__builtin_scalblnf, "ffLi", "Fnc")
  245. BUILTIN(__builtin_scalblnl, "LdLdLi", "Fnc")
  246. BUILTIN(__builtin_scalbn , "ddi", "Fnc")
  247. BUILTIN(__builtin_scalbnf, "ffi", "Fnc")
  248. BUILTIN(__builtin_scalbnl, "LdLdi", "Fnc")
  249. BUILTIN(__builtin_sin , "dd" , "Fnc")
  250. BUILTIN(__builtin_sinf, "ff" , "Fnc")
  251. BUILTIN(__builtin_sinh , "dd" , "Fnc")
  252. BUILTIN(__builtin_sinhf, "ff" , "Fnc")
  253. BUILTIN(__builtin_sinhl, "LdLd", "Fnc")
  254. BUILTIN(__builtin_sinl, "LdLd", "Fnc")
  255. BUILTIN(__builtin_sqrt , "dd" , "Fnc")
  256. BUILTIN(__builtin_sqrtf, "ff" , "Fnc")
  257. BUILTIN(__builtin_sqrtl, "LdLd", "Fnc")
  258. BUILTIN(__builtin_tan , "dd" , "Fnc")
  259. BUILTIN(__builtin_tanf, "ff" , "Fnc")
  260. BUILTIN(__builtin_tanh , "dd" , "Fnc")
  261. BUILTIN(__builtin_tanhf, "ff" , "Fnc")
  262. BUILTIN(__builtin_tanhl, "LdLd", "Fnc")
  263. BUILTIN(__builtin_tanl, "LdLd", "Fnc")
  264. BUILTIN(__builtin_tgamma , "dd", "Fnc")
  265. BUILTIN(__builtin_tgammaf, "ff", "Fnc")
  266. BUILTIN(__builtin_tgammal, "LdLd", "Fnc")
  267. BUILTIN(__builtin_trunc , "dd", "Fnc")
  268. BUILTIN(__builtin_truncf, "ff", "Fnc")
  269. BUILTIN(__builtin_truncl, "LdLd", "Fnc")
  270. // C99 complex builtins
  271. BUILTIN(__builtin_cabs, "dXd", "Fnc")
  272. BUILTIN(__builtin_cabsf, "fXf", "Fnc")
  273. BUILTIN(__builtin_cabsl, "LdXLd", "Fnc")
  274. BUILTIN(__builtin_cacos, "XdXd", "Fnc")
  275. BUILTIN(__builtin_cacosf, "XfXf", "Fnc")
  276. BUILTIN(__builtin_cacosh, "XdXd", "Fnc")
  277. BUILTIN(__builtin_cacoshf, "XfXf", "Fnc")
  278. BUILTIN(__builtin_cacoshl, "XLdXLd", "Fnc")
  279. BUILTIN(__builtin_cacosl, "XLdXLd", "Fnc")
  280. BUILTIN(__builtin_carg, "dXd", "Fnc")
  281. BUILTIN(__builtin_cargf, "fXf", "Fnc")
  282. BUILTIN(__builtin_cargl, "LdXLd", "Fnc")
  283. BUILTIN(__builtin_casin, "XdXd", "Fnc")
  284. BUILTIN(__builtin_casinf, "XfXf", "Fnc")
  285. BUILTIN(__builtin_casinh, "XdXd", "Fnc")
  286. BUILTIN(__builtin_casinhf, "XfXf", "Fnc")
  287. BUILTIN(__builtin_casinhl, "XLdXLd", "Fnc")
  288. BUILTIN(__builtin_casinl, "XLdXLd", "Fnc")
  289. BUILTIN(__builtin_catan, "XdXd", "Fnc")
  290. BUILTIN(__builtin_catanf, "XfXf", "Fnc")
  291. BUILTIN(__builtin_catanh, "XdXd", "Fnc")
  292. BUILTIN(__builtin_catanhf, "XfXf", "Fnc")
  293. BUILTIN(__builtin_catanhl, "XLdXLd", "Fnc")
  294. BUILTIN(__builtin_catanl, "XLdXLd", "Fnc")
  295. BUILTIN(__builtin_ccos, "XdXd", "Fnc")
  296. BUILTIN(__builtin_ccosf, "XfXf", "Fnc")
  297. BUILTIN(__builtin_ccosl, "XLdXLd", "Fnc")
  298. BUILTIN(__builtin_ccosh, "XdXd", "Fnc")
  299. BUILTIN(__builtin_ccoshf, "XfXf", "Fnc")
  300. BUILTIN(__builtin_ccoshl, "XLdXLd", "Fnc")
  301. BUILTIN(__builtin_cexp, "XdXd", "Fnc")
  302. BUILTIN(__builtin_cexpf, "XfXf", "Fnc")
  303. BUILTIN(__builtin_cexpl, "XLdXLd", "Fnc")
  304. BUILTIN(__builtin_cimag, "dXd", "Fnc")
  305. BUILTIN(__builtin_cimagf, "fXf", "Fnc")
  306. BUILTIN(__builtin_cimagl, "LdXLd", "Fnc")
  307. BUILTIN(__builtin_conj, "XdXd", "Fnc")
  308. BUILTIN(__builtin_conjf, "XfXf", "Fnc")
  309. BUILTIN(__builtin_conjl, "XLdXLd", "Fnc")
  310. BUILTIN(__builtin_clog, "XdXd", "Fnc")
  311. BUILTIN(__builtin_clogf, "XfXf", "Fnc")
  312. BUILTIN(__builtin_clogl, "XLdXLd", "Fnc")
  313. BUILTIN(__builtin_cproj, "XdXd", "Fnc")
  314. BUILTIN(__builtin_cprojf, "XfXf", "Fnc")
  315. BUILTIN(__builtin_cprojl, "XLdXLd", "Fnc")
  316. BUILTIN(__builtin_cpow, "XdXdXd", "Fnc")
  317. BUILTIN(__builtin_cpowf, "XfXfXf", "Fnc")
  318. BUILTIN(__builtin_cpowl, "XLdXLdXLd", "Fnc")
  319. BUILTIN(__builtin_creal, "dXd", "Fnc")
  320. BUILTIN(__builtin_crealf, "fXf", "Fnc")
  321. BUILTIN(__builtin_creall, "LdXLd", "Fnc")
  322. BUILTIN(__builtin_csin, "XdXd", "Fnc")
  323. BUILTIN(__builtin_csinf, "XfXf", "Fnc")
  324. BUILTIN(__builtin_csinl, "XLdXLd", "Fnc")
  325. BUILTIN(__builtin_csinh, "XdXd", "Fnc")
  326. BUILTIN(__builtin_csinhf, "XfXf", "Fnc")
  327. BUILTIN(__builtin_csinhl, "XLdXLd", "Fnc")
  328. BUILTIN(__builtin_csqrt, "XdXd", "Fnc")
  329. BUILTIN(__builtin_csqrtf, "XfXf", "Fnc")
  330. BUILTIN(__builtin_csqrtl, "XLdXLd", "Fnc")
  331. BUILTIN(__builtin_ctan, "XdXd", "Fnc")
  332. BUILTIN(__builtin_ctanf, "XfXf", "Fnc")
  333. BUILTIN(__builtin_ctanl, "XLdXLd", "Fnc")
  334. BUILTIN(__builtin_ctanh, "XdXd", "Fnc")
  335. BUILTIN(__builtin_ctanhf, "XfXf", "Fnc")
  336. BUILTIN(__builtin_ctanhl, "XLdXLd", "Fnc")
  337. // FP Comparisons.
  338. BUILTIN(__builtin_isgreater , "i.", "nc")
  339. BUILTIN(__builtin_isgreaterequal, "i.", "nc")
  340. BUILTIN(__builtin_isless , "i.", "nc")
  341. BUILTIN(__builtin_islessequal , "i.", "nc")
  342. BUILTIN(__builtin_islessgreater , "i.", "nc")
  343. BUILTIN(__builtin_isunordered , "i.", "nc")
  344. // Unary FP classification
  345. BUILTIN(__builtin_fpclassify, "iiiii.", "nc")
  346. BUILTIN(__builtin_isfinite, "i.", "nc")
  347. BUILTIN(__builtin_isinf, "i.", "nc")
  348. BUILTIN(__builtin_isinf_sign, "i.", "nc")
  349. BUILTIN(__builtin_isnan, "i.", "nc")
  350. BUILTIN(__builtin_isnormal, "i.", "nc")
  351. // FP signbit builtins
  352. BUILTIN(__builtin_signbit, "id", "nc")
  353. BUILTIN(__builtin_signbitf, "if", "nc")
  354. BUILTIN(__builtin_signbitl, "iLd", "nc")
  355. // Builtins for arithmetic.
  356. BUILTIN(__builtin_clzs , "iUs" , "nc")
  357. BUILTIN(__builtin_clz , "iUi" , "nc")
  358. BUILTIN(__builtin_clzl , "iULi" , "nc")
  359. BUILTIN(__builtin_clzll, "iULLi", "nc")
  360. // TODO: int clzimax(uintmax_t)
  361. BUILTIN(__builtin_ctzs , "iUs" , "nc")
  362. BUILTIN(__builtin_ctz , "iUi" , "nc")
  363. BUILTIN(__builtin_ctzl , "iULi" , "nc")
  364. BUILTIN(__builtin_ctzll, "iULLi", "nc")
  365. // TODO: int ctzimax(uintmax_t)
  366. BUILTIN(__builtin_ffs , "iUi" , "nc")
  367. BUILTIN(__builtin_ffsl , "iULi" , "nc")
  368. BUILTIN(__builtin_ffsll, "iULLi", "nc")
  369. BUILTIN(__builtin_parity , "iUi" , "nc")
  370. BUILTIN(__builtin_parityl , "iULi" , "nc")
  371. BUILTIN(__builtin_parityll, "iULLi", "nc")
  372. BUILTIN(__builtin_popcount , "iUi" , "nc")
  373. BUILTIN(__builtin_popcountl , "iULi" , "nc")
  374. BUILTIN(__builtin_popcountll, "iULLi", "nc")
  375. // FIXME: These type signatures are not correct for targets with int != 32-bits
  376. // or with ULL != 64-bits.
  377. BUILTIN(__builtin_bswap32, "UiUi", "nc")
  378. BUILTIN(__builtin_bswap64, "ULLiULLi", "nc")
  379. // Random GCC builtins
  380. BUILTIN(__builtin_constant_p, "i.", "nct")
  381. BUILTIN(__builtin_classify_type, "i.", "nct")
  382. BUILTIN(__builtin___CFStringMakeConstantString, "FC*cC*", "nc")
  383. BUILTIN(__builtin___NSStringMakeConstantString, "FC*cC*", "nc")
  384. BUILTIN(__builtin_va_start, "vA.", "nt")
  385. BUILTIN(__builtin_va_end, "vA", "n")
  386. BUILTIN(__builtin_va_copy, "vAA", "n")
  387. BUILTIN(__builtin_stdarg_start, "vA.", "n")
  388. BUILTIN(__builtin_bcmp, "iv*v*z", "n")
  389. BUILTIN(__builtin_bcopy, "vv*v*z", "n")
  390. BUILTIN(__builtin_bzero, "vv*z", "nF")
  391. BUILTIN(__builtin_fprintf, "iP*cC*.", "Fp:1:")
  392. BUILTIN(__builtin_memchr, "v*vC*iz", "nF")
  393. BUILTIN(__builtin_memcmp, "ivC*vC*z", "nF")
  394. BUILTIN(__builtin_memcpy, "v*v*vC*z", "nF")
  395. BUILTIN(__builtin_memmove, "v*v*vC*z", "nF")
  396. BUILTIN(__builtin_mempcpy, "v*v*vC*z", "nF")
  397. BUILTIN(__builtin_memset, "v*v*iz", "nF")
  398. BUILTIN(__builtin_printf, "icC*.", "Fp:0:")
  399. BUILTIN(__builtin_stpcpy, "c*c*cC*", "nF")
  400. BUILTIN(__builtin_stpncpy, "c*c*cC*z", "nF")
  401. BUILTIN(__builtin_strcasecmp, "icC*cC*", "nF")
  402. BUILTIN(__builtin_strcat, "c*c*cC*", "nF")
  403. BUILTIN(__builtin_strchr, "c*cC*i", "nF")
  404. BUILTIN(__builtin_strcmp, "icC*cC*", "nF")
  405. BUILTIN(__builtin_strcpy, "c*c*cC*", "nF")
  406. BUILTIN(__builtin_strcspn, "zcC*cC*", "nF")
  407. BUILTIN(__builtin_strdup, "c*cC*", "nF")
  408. BUILTIN(__builtin_strlen, "zcC*", "nF")
  409. BUILTIN(__builtin_strncasecmp, "icC*cC*z", "nF")
  410. BUILTIN(__builtin_strncat, "c*c*cC*z", "nF")
  411. BUILTIN(__builtin_strncmp, "icC*cC*z", "nF")
  412. BUILTIN(__builtin_strncpy, "c*c*cC*z", "nF")
  413. BUILTIN(__builtin_strndup, "c*cC*z", "nF")
  414. BUILTIN(__builtin_strpbrk, "c*cC*cC*", "nF")
  415. BUILTIN(__builtin_strrchr, "c*cC*i", "nF")
  416. BUILTIN(__builtin_strspn, "zcC*cC*", "nF")
  417. BUILTIN(__builtin_strstr, "c*cC*cC*", "nF")
  418. BUILTIN(__builtin_return_address, "v*IUi", "n")
  419. BUILTIN(__builtin_extract_return_addr, "v*v*", "n")
  420. BUILTIN(__builtin_frame_address, "v*IUi", "n")
  421. BUILTIN(__builtin_flt_rounds, "i", "nc")
  422. BUILTIN(__builtin_setjmp, "iv**", "j")
  423. BUILTIN(__builtin_longjmp, "vv**i", "r")
  424. BUILTIN(__builtin_unwind_init, "v", "")
  425. BUILTIN(__builtin_eh_return_data_regno, "iIi", "nc")
  426. BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:")
  427. BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
  428. BUILTIN(__builtin_vsnprintf, "ic*zcC*a", "nFP:2:")
  429. // GCC exception builtins
  430. BUILTIN(__builtin_eh_return, "vzv*", "r") // FIXME: Takes intptr_t, not size_t!
  431. BUILTIN(__builtin_frob_return_addr, "v*v*", "n")
  432. BUILTIN(__builtin_dwarf_cfa, "v*", "n")
  433. BUILTIN(__builtin_init_dwarf_reg_size_table, "vv*", "n")
  434. BUILTIN(__builtin_dwarf_sp_column, "Ui", "n")
  435. BUILTIN(__builtin_extend_pointer, "ULLiv*", "n") // _Unwind_Word == uint64_t
  436. // GCC Object size checking builtins
  437. BUILTIN(__builtin_object_size, "zvC*i", "n")
  438. BUILTIN(__builtin___memcpy_chk, "v*v*vC*zz", "nF")
  439. BUILTIN(__builtin___memccpy_chk, "v*v*vC*iz", "nF")
  440. BUILTIN(__builtin___memmove_chk, "v*v*vC*zz", "nF")
  441. BUILTIN(__builtin___mempcpy_chk, "v*v*vC*zz", "nF")
  442. BUILTIN(__builtin___memset_chk, "v*v*izz", "nF")
  443. BUILTIN(__builtin___stpcpy_chk, "c*c*cC*z", "nF")
  444. BUILTIN(__builtin___strcat_chk, "c*c*cC*z", "nF")
  445. BUILTIN(__builtin___strcpy_chk, "c*c*cC*z", "nF")
  446. BUILTIN(__builtin___strlcat_chk, "c*c*cC*zz", "nF")
  447. BUILTIN(__builtin___strlcpy_chk, "c*c*cC*zz", "nF")
  448. BUILTIN(__builtin___strncat_chk, "c*c*cC*zz", "nF")
  449. BUILTIN(__builtin___strncpy_chk, "c*c*cC*zz", "nF")
  450. BUILTIN(__builtin___stpncpy_chk, "c*c*cC*zz", "nF")
  451. BUILTIN(__builtin___snprintf_chk, "ic*zizcC*.", "Fp:4:")
  452. BUILTIN(__builtin___sprintf_chk, "ic*izcC*.", "Fp:3:")
  453. BUILTIN(__builtin___vsnprintf_chk, "ic*zizcC*a", "FP:4:")
  454. BUILTIN(__builtin___vsprintf_chk, "ic*izcC*a", "FP:3:")
  455. BUILTIN(__builtin___fprintf_chk, "iP*icC*.", "Fp:2:")
  456. BUILTIN(__builtin___printf_chk, "iicC*.", "Fp:1:")
  457. BUILTIN(__builtin___vfprintf_chk, "iP*icC*a", "FP:2:")
  458. BUILTIN(__builtin___vprintf_chk, "iicC*a", "FP:1:")
  459. BUILTIN(__builtin_expect, "LiLiLi" , "nc")
  460. BUILTIN(__builtin_prefetch, "vvC*.", "nc")
  461. BUILTIN(__builtin_trap, "v", "nr")
  462. BUILTIN(__builtin_unreachable, "v", "nr")
  463. BUILTIN(__builtin_shufflevector, "v." , "nc")
  464. BUILTIN(__builtin_alloca, "v*z" , "n")
  465. // "Overloaded" Atomic operator builtins. These are overloaded to support data
  466. // types of i8, i16, i32, i64, and i128. The front-end sees calls to the
  467. // non-suffixed version of these (which has a bogus type) and transforms them to
  468. // the right overloaded version in Sema (plus casts).
  469. // FIXME: These assume that char -> i8, short -> i16, int -> i32,
  470. // long long -> i64.
  471. BUILTIN(__sync_fetch_and_add, "v.", "t")
  472. BUILTIN(__sync_fetch_and_add_1, "ccD*c.", "nt")
  473. BUILTIN(__sync_fetch_and_add_2, "ssD*s.", "nt")
  474. BUILTIN(__sync_fetch_and_add_4, "iiD*i.", "nt")
  475. BUILTIN(__sync_fetch_and_add_8, "LLiLLiD*LLi.", "nt")
  476. BUILTIN(__sync_fetch_and_add_16, "LLLiLLLiD*LLLi.", "nt")
  477. BUILTIN(__sync_fetch_and_sub, "v.", "t")
  478. BUILTIN(__sync_fetch_and_sub_1, "ccD*c.", "nt")
  479. BUILTIN(__sync_fetch_and_sub_2, "ssD*s.", "nt")
  480. BUILTIN(__sync_fetch_and_sub_4, "iiD*i.", "nt")
  481. BUILTIN(__sync_fetch_and_sub_8, "LLiLLiD*LLi.", "nt")
  482. BUILTIN(__sync_fetch_and_sub_16, "LLLiLLLiD*LLLi.", "nt")
  483. BUILTIN(__sync_fetch_and_or, "v.", "t")
  484. BUILTIN(__sync_fetch_and_or_1, "ccD*c.", "nt")
  485. BUILTIN(__sync_fetch_and_or_2, "ssD*s.", "nt")
  486. BUILTIN(__sync_fetch_and_or_4, "iiD*i.", "nt")
  487. BUILTIN(__sync_fetch_and_or_8, "LLiLLiD*LLi.", "nt")
  488. BUILTIN(__sync_fetch_and_or_16, "LLLiLLLiD*LLLi.", "nt")
  489. BUILTIN(__sync_fetch_and_and, "v.", "t")
  490. BUILTIN(__sync_fetch_and_and_1, "ccD*c.", "tn")
  491. BUILTIN(__sync_fetch_and_and_2, "ssD*s.", "tn")
  492. BUILTIN(__sync_fetch_and_and_4, "iiD*i.", "tn")
  493. BUILTIN(__sync_fetch_and_and_8, "LLiLLiD*LLi.", "tn")
  494. BUILTIN(__sync_fetch_and_and_16, "LLLiLLLiD*LLLi.", "tn")
  495. BUILTIN(__sync_fetch_and_xor, "v.", "t")
  496. BUILTIN(__sync_fetch_and_xor_1, "ccD*c.", "tn")
  497. BUILTIN(__sync_fetch_and_xor_2, "ssD*s.", "tn")
  498. BUILTIN(__sync_fetch_and_xor_4, "iiD*i.", "tn")
  499. BUILTIN(__sync_fetch_and_xor_8, "LLiLLiD*LLi.", "tn")
  500. BUILTIN(__sync_fetch_and_xor_16, "LLLiLLLiD*LLLi.", "tn")
  501. BUILTIN(__sync_add_and_fetch, "v.", "t")
  502. BUILTIN(__sync_add_and_fetch_1, "ccD*c.", "tn")
  503. BUILTIN(__sync_add_and_fetch_2, "ssD*s.", "tn")
  504. BUILTIN(__sync_add_and_fetch_4, "iiD*i.", "tn")
  505. BUILTIN(__sync_add_and_fetch_8, "LLiLLiD*LLi.", "tn")
  506. BUILTIN(__sync_add_and_fetch_16, "LLLiLLLiD*LLLi.", "tn")
  507. BUILTIN(__sync_sub_and_fetch, "v.", "t")
  508. BUILTIN(__sync_sub_and_fetch_1, "ccD*c.", "tn")
  509. BUILTIN(__sync_sub_and_fetch_2, "ssD*s.", "tn")
  510. BUILTIN(__sync_sub_and_fetch_4, "iiD*i.", "tn")
  511. BUILTIN(__sync_sub_and_fetch_8, "LLiLLiD*LLi.", "tn")
  512. BUILTIN(__sync_sub_and_fetch_16, "LLLiLLLiD*LLLi.", "tn")
  513. BUILTIN(__sync_or_and_fetch, "v.", "t")
  514. BUILTIN(__sync_or_and_fetch_1, "ccD*c.", "tn")
  515. BUILTIN(__sync_or_and_fetch_2, "ssD*s.", "tn")
  516. BUILTIN(__sync_or_and_fetch_4, "iiD*i.", "tn")
  517. BUILTIN(__sync_or_and_fetch_8, "LLiLLiD*LLi.", "tn")
  518. BUILTIN(__sync_or_and_fetch_16, "LLLiLLLiD*LLLi.", "tn")
  519. BUILTIN(__sync_and_and_fetch, "v.", "t")
  520. BUILTIN(__sync_and_and_fetch_1, "ccD*c.", "tn")
  521. BUILTIN(__sync_and_and_fetch_2, "ssD*s.", "tn")
  522. BUILTIN(__sync_and_and_fetch_4, "iiD*i.", "tn")
  523. BUILTIN(__sync_and_and_fetch_8, "LLiLLiD*LLi.", "tn")
  524. BUILTIN(__sync_and_and_fetch_16, "LLLiLLLiD*LLLi.", "tn")
  525. BUILTIN(__sync_xor_and_fetch, "v.", "t")
  526. BUILTIN(__sync_xor_and_fetch_1, "ccD*c.", "tn")
  527. BUILTIN(__sync_xor_and_fetch_2, "ssD*s.", "tn")
  528. BUILTIN(__sync_xor_and_fetch_4, "iiD*i.", "tn")
  529. BUILTIN(__sync_xor_and_fetch_8, "LLiLLiD*LLi.", "tn")
  530. BUILTIN(__sync_xor_and_fetch_16, "LLLiLLLiD*LLLi.", "tn")
  531. BUILTIN(__sync_bool_compare_and_swap, "v.", "t")
  532. BUILTIN(__sync_bool_compare_and_swap_1, "bcD*cc.", "tn")
  533. BUILTIN(__sync_bool_compare_and_swap_2, "bsD*ss.", "tn")
  534. BUILTIN(__sync_bool_compare_and_swap_4, "biD*ii.", "tn")
  535. BUILTIN(__sync_bool_compare_and_swap_8, "bLLiD*LLiLLi.", "tn")
  536. BUILTIN(__sync_bool_compare_and_swap_16, "bLLLiD*LLLiLLLi.", "tn")
  537. BUILTIN(__sync_val_compare_and_swap, "v.", "t")
  538. BUILTIN(__sync_val_compare_and_swap_1, "ccD*cc.", "tn")
  539. BUILTIN(__sync_val_compare_and_swap_2, "ssD*ss.", "tn")
  540. BUILTIN(__sync_val_compare_and_swap_4, "iiD*ii.", "tn")
  541. BUILTIN(__sync_val_compare_and_swap_8, "LLiLLiD*LLiLLi.", "tn")
  542. BUILTIN(__sync_val_compare_and_swap_16, "LLLiLLLiD*LLLiLLLi.", "tn")
  543. BUILTIN(__sync_lock_test_and_set, "v.", "t")
  544. BUILTIN(__sync_lock_test_and_set_1, "ccD*c.", "tn")
  545. BUILTIN(__sync_lock_test_and_set_2, "ssD*s.", "tn")
  546. BUILTIN(__sync_lock_test_and_set_4, "iiD*i.", "tn")
  547. BUILTIN(__sync_lock_test_and_set_8, "LLiLLiD*LLi.", "tn")
  548. BUILTIN(__sync_lock_test_and_set_16, "LLLiLLLiD*LLLi.", "tn")
  549. BUILTIN(__sync_lock_release, "v.", "t")
  550. BUILTIN(__sync_lock_release_1, "vcD*.", "tn")
  551. BUILTIN(__sync_lock_release_2, "vsD*.", "tn")
  552. BUILTIN(__sync_lock_release_4, "viD*.", "tn")
  553. BUILTIN(__sync_lock_release_8, "vLLiD*.", "tn")
  554. BUILTIN(__sync_lock_release_16, "vLLLiD*.", "tn")
  555. BUILTIN(__sync_swap, "v.", "t")
  556. BUILTIN(__sync_swap_1, "ccD*c.", "tn")
  557. BUILTIN(__sync_swap_2, "ssD*s.", "tn")
  558. BUILTIN(__sync_swap_4, "iiD*i.", "tn")
  559. BUILTIN(__sync_swap_8, "LLiLLiD*LLi.", "tn")
  560. BUILTIN(__sync_swap_16, "LLLiLLLiD*LLLi.", "tn")
  561. // Some of our atomics builtins are handled by AtomicExpr rather than
  562. // as normal builtin CallExprs. This macro is used for such builtins.
  563. #ifndef ATOMIC_BUILTIN
  564. #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) BUILTIN(ID, TYPE, ATTRS)
  565. #endif
  566. // C11 _Atomic operations for <stdatomic.h>.
  567. ATOMIC_BUILTIN(__c11_atomic_init, "v.", "t")
  568. ATOMIC_BUILTIN(__c11_atomic_load, "v.", "t")
  569. ATOMIC_BUILTIN(__c11_atomic_store, "v.", "t")
  570. ATOMIC_BUILTIN(__c11_atomic_exchange, "v.", "t")
  571. ATOMIC_BUILTIN(__c11_atomic_compare_exchange_strong, "v.", "t")
  572. ATOMIC_BUILTIN(__c11_atomic_compare_exchange_weak, "v.", "t")
  573. ATOMIC_BUILTIN(__c11_atomic_fetch_add, "v.", "t")
  574. ATOMIC_BUILTIN(__c11_atomic_fetch_sub, "v.", "t")
  575. ATOMIC_BUILTIN(__c11_atomic_fetch_and, "v.", "t")
  576. ATOMIC_BUILTIN(__c11_atomic_fetch_or, "v.", "t")
  577. ATOMIC_BUILTIN(__c11_atomic_fetch_xor, "v.", "t")
  578. BUILTIN(__c11_atomic_thread_fence, "vi", "n")
  579. BUILTIN(__c11_atomic_signal_fence, "vi", "n")
  580. BUILTIN(__c11_atomic_is_lock_free, "iz", "n")
  581. // GNU atomic builtins.
  582. ATOMIC_BUILTIN(__atomic_load, "v.", "t")
  583. ATOMIC_BUILTIN(__atomic_load_n, "v.", "t")
  584. ATOMIC_BUILTIN(__atomic_store, "v.", "t")
  585. ATOMIC_BUILTIN(__atomic_store_n, "v.", "t")
  586. ATOMIC_BUILTIN(__atomic_exchange, "v.", "t")
  587. ATOMIC_BUILTIN(__atomic_exchange_n, "v.", "t")
  588. ATOMIC_BUILTIN(__atomic_compare_exchange, "v.", "t")
  589. ATOMIC_BUILTIN(__atomic_compare_exchange_n, "v.", "t")
  590. ATOMIC_BUILTIN(__atomic_fetch_add, "v.", "t")
  591. ATOMIC_BUILTIN(__atomic_fetch_sub, "v.", "t")
  592. ATOMIC_BUILTIN(__atomic_fetch_and, "v.", "t")
  593. ATOMIC_BUILTIN(__atomic_fetch_or, "v.", "t")
  594. ATOMIC_BUILTIN(__atomic_fetch_xor, "v.", "t")
  595. ATOMIC_BUILTIN(__atomic_fetch_nand, "v.", "t")
  596. ATOMIC_BUILTIN(__atomic_add_fetch, "v.", "t")
  597. ATOMIC_BUILTIN(__atomic_sub_fetch, "v.", "t")
  598. ATOMIC_BUILTIN(__atomic_and_fetch, "v.", "t")
  599. ATOMIC_BUILTIN(__atomic_or_fetch, "v.", "t")
  600. ATOMIC_BUILTIN(__atomic_xor_fetch, "v.", "t")
  601. ATOMIC_BUILTIN(__atomic_nand_fetch, "v.", "t")
  602. BUILTIN(__atomic_test_and_set, "bvD*i", "n")
  603. BUILTIN(__atomic_clear, "vvD*i", "n")
  604. BUILTIN(__atomic_thread_fence, "vi", "n")
  605. BUILTIN(__atomic_signal_fence, "vi", "n")
  606. BUILTIN(__atomic_always_lock_free, "izvCD*", "n")
  607. BUILTIN(__atomic_is_lock_free, "izvCD*", "n")
  608. #undef ATOMIC_BUILTIN
  609. // Non-overloaded atomic builtins.
  610. BUILTIN(__sync_synchronize, "v.", "n")
  611. // GCC does not support these, they are a Clang extension.
  612. BUILTIN(__sync_fetch_and_min, "iiD*i", "n")
  613. BUILTIN(__sync_fetch_and_max, "iiD*i", "n")
  614. BUILTIN(__sync_fetch_and_umin, "UiUiD*Ui", "n")
  615. BUILTIN(__sync_fetch_and_umax, "UiUiD*Ui", "n")
  616. // Random libc builtins.
  617. BUILTIN(__builtin_abort, "v", "Fnr")
  618. BUILTIN(__builtin_index, "c*cC*i", "Fn")
  619. BUILTIN(__builtin_rindex, "c*cC*i", "Fn")
  620. // Microsoft builtins.
  621. BUILTIN(__assume, "vb", "n")
  622. BUILTIN(__noop, "v.", "n")
  623. BUILTIN(__debugbreak, "v", "n")
  624. // C99 library functions
  625. // C99 stdlib.h
  626. LIBBUILTIN(abort, "v", "fr", "stdlib.h", ALL_LANGUAGES)
  627. LIBBUILTIN(calloc, "v*zz", "f", "stdlib.h", ALL_LANGUAGES)
  628. LIBBUILTIN(exit, "vi", "fr", "stdlib.h", ALL_LANGUAGES)
  629. LIBBUILTIN(_Exit, "vi", "fr", "stdlib.h", ALL_LANGUAGES)
  630. LIBBUILTIN(malloc, "v*z", "f", "stdlib.h", ALL_LANGUAGES)
  631. LIBBUILTIN(realloc, "v*v*z", "f", "stdlib.h", ALL_LANGUAGES)
  632. // C99 string.h
  633. LIBBUILTIN(memcpy, "v*v*vC*z", "f", "string.h", ALL_LANGUAGES)
  634. LIBBUILTIN(memcmp, "ivC*vC*z", "f", "string.h", ALL_LANGUAGES)
  635. LIBBUILTIN(memmove, "v*v*vC*z", "f", "string.h", ALL_LANGUAGES)
  636. LIBBUILTIN(strcpy, "c*c*cC*", "f", "string.h", ALL_LANGUAGES)
  637. LIBBUILTIN(strncpy, "c*c*cC*z", "f", "string.h", ALL_LANGUAGES)
  638. LIBBUILTIN(strcmp, "icC*cC*", "f", "string.h", ALL_LANGUAGES)
  639. LIBBUILTIN(strncmp, "icC*cC*z", "f", "string.h", ALL_LANGUAGES)
  640. LIBBUILTIN(strcat, "c*c*cC*", "f", "string.h", ALL_LANGUAGES)
  641. LIBBUILTIN(strncat, "c*c*cC*z", "f", "string.h", ALL_LANGUAGES)
  642. LIBBUILTIN(strxfrm, "zc*cC*z", "f", "string.h", ALL_LANGUAGES)
  643. LIBBUILTIN(memchr, "v*vC*iz", "f", "string.h", ALL_LANGUAGES)
  644. LIBBUILTIN(strchr, "c*cC*i", "f", "string.h", ALL_LANGUAGES)
  645. LIBBUILTIN(strcspn, "zcC*cC*", "f", "string.h", ALL_LANGUAGES)
  646. LIBBUILTIN(strpbrk, "c*cC*cC*", "f", "string.h", ALL_LANGUAGES)
  647. LIBBUILTIN(strrchr, "c*cC*i", "f", "string.h", ALL_LANGUAGES)
  648. LIBBUILTIN(strspn, "zcC*cC*", "f", "string.h", ALL_LANGUAGES)
  649. LIBBUILTIN(strstr, "c*cC*cC*", "f", "string.h", ALL_LANGUAGES)
  650. LIBBUILTIN(strtok, "c*c*cC*", "f", "string.h", ALL_LANGUAGES)
  651. LIBBUILTIN(memset, "v*v*iz", "f", "string.h", ALL_LANGUAGES)
  652. LIBBUILTIN(strerror, "c*i", "f", "string.h", ALL_LANGUAGES)
  653. LIBBUILTIN(strlen, "zcC*", "f", "string.h", ALL_LANGUAGES)
  654. // C99 stdio.h
  655. LIBBUILTIN(printf, "icC*.", "fp:0:", "stdio.h", ALL_LANGUAGES)
  656. LIBBUILTIN(fprintf, "iP*cC*.", "fp:1:", "stdio.h", ALL_LANGUAGES)
  657. LIBBUILTIN(snprintf, "ic*zcC*.", "fp:2:", "stdio.h", ALL_LANGUAGES)
  658. LIBBUILTIN(sprintf, "ic*cC*.", "fp:1:", "stdio.h", ALL_LANGUAGES)
  659. LIBBUILTIN(vprintf, "icC*a", "fP:0:", "stdio.h", ALL_LANGUAGES)
  660. LIBBUILTIN(vfprintf, "i.", "fP:1:", "stdio.h", ALL_LANGUAGES)
  661. LIBBUILTIN(vsnprintf, "ic*zcC*a", "fP:2:", "stdio.h", ALL_LANGUAGES)
  662. LIBBUILTIN(vsprintf, "ic*cC*a", "fP:1:", "stdio.h", ALL_LANGUAGES)
  663. LIBBUILTIN(scanf, "icC*R.", "fs:0:", "stdio.h", ALL_LANGUAGES)
  664. LIBBUILTIN(fscanf, "iP*RcC*R.", "fs:1:", "stdio.h", ALL_LANGUAGES)
  665. LIBBUILTIN(sscanf, "icC*RcC*R.", "fs:1:", "stdio.h", ALL_LANGUAGES)
  666. LIBBUILTIN(vscanf, "icC*Ra", "fS:0:", "stdio.h", ALL_LANGUAGES)
  667. LIBBUILTIN(vfscanf, "iP*RcC*Ra", "fS:1:", "stdio.h", ALL_LANGUAGES)
  668. LIBBUILTIN(vsscanf, "icC*RcC*Ra", "fS:1:", "stdio.h", ALL_LANGUAGES)
  669. // C99
  670. LIBBUILTIN(longjmp, "vJi", "fr", "setjmp.h", ALL_LANGUAGES)
  671. // Non-C library functions
  672. // FIXME: Non-C-standard stuff shouldn't be builtins in non-GNU mode!
  673. LIBBUILTIN(alloca, "v*z", "f", "stdlib.h", ALL_LANGUAGES)
  674. // POSIX string.h
  675. LIBBUILTIN(stpcpy, "c*c*cC*", "f", "string.h", ALL_LANGUAGES)
  676. LIBBUILTIN(stpncpy, "c*c*cC*z", "f", "string.h", ALL_LANGUAGES)
  677. LIBBUILTIN(strdup, "c*cC*", "f", "string.h", ALL_LANGUAGES)
  678. LIBBUILTIN(strndup, "c*cC*z", "f", "string.h", ALL_LANGUAGES)
  679. // POSIX strings.h
  680. LIBBUILTIN(index, "c*cC*i", "f", "strings.h", ALL_LANGUAGES)
  681. LIBBUILTIN(rindex, "c*cC*i", "f", "strings.h", ALL_LANGUAGES)
  682. LIBBUILTIN(bzero, "vv*z", "f", "strings.h", ALL_LANGUAGES)
  683. LIBBUILTIN(strcasecmp, "icC*cC*", "f", "strings.h", ALL_LANGUAGES)
  684. LIBBUILTIN(strncasecmp, "icC*cC*z", "f", "strings.h", ALL_LANGUAGES)
  685. // POSIX unistd.h
  686. LIBBUILTIN(_exit, "vi", "fr", "unistd.h", ALL_LANGUAGES)
  687. LIBBUILTIN(vfork, "i", "fj", "unistd.h", ALL_LANGUAGES)
  688. // POSIX setjmp.h
  689. // In some systems setjmp is a macro that expands to _setjmp. We undefine
  690. // it here to avoid having two identical LIBBUILTIN entries.
  691. #undef setjmp
  692. LIBBUILTIN(_setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
  693. LIBBUILTIN(__sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_LANGUAGES)
  694. LIBBUILTIN(setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
  695. LIBBUILTIN(sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_LANGUAGES)
  696. LIBBUILTIN(setjmp_syscall, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
  697. LIBBUILTIN(savectx, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
  698. LIBBUILTIN(qsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
  699. LIBBUILTIN(getcontext, "iK*", "fj", "setjmp.h", ALL_LANGUAGES)
  700. LIBBUILTIN(_longjmp, "vJi", "fr", "setjmp.h", ALL_LANGUAGES)
  701. LIBBUILTIN(siglongjmp, "vSJi", "fr", "setjmp.h", ALL_LANGUAGES)
  702. // non-standard but very common
  703. LIBBUILTIN(strlcpy, "zc*cC*z", "f", "string.h", ALL_LANGUAGES)
  704. LIBBUILTIN(strlcat, "zc*cC*z", "f", "string.h", ALL_LANGUAGES)
  705. // id objc_msgSend(id, SEL, ...)
  706. LIBBUILTIN(objc_msgSend, "GGH.", "f", "objc/message.h", OBJC_LANG)
  707. // long double objc_msgSend_fpret(id self, SEL op, ...)
  708. LIBBUILTIN(objc_msgSend_fpret, "LdGH.", "f", "objc/message.h", OBJC_LANG)
  709. // _Complex long double objc_msgSend_fp2ret(id self, SEL op, ...)
  710. LIBBUILTIN(objc_msgSend_fp2ret, "XLdGH.", "f", "objc/message.h", OBJC_LANG)
  711. // id objc_msgSend_stret (id, SEL, ...)
  712. LIBBUILTIN(objc_msgSend_stret, "GGH.", "f", "objc/message.h", OBJC_LANG)
  713. // id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
  714. LIBBUILTIN(objc_msgSendSuper, "Gv*H.", "f", "objc/message.h", OBJC_LANG)
  715. // void objc_msgSendSuper_stret(struct objc_super *super, SEL op, ...)
  716. LIBBUILTIN(objc_msgSendSuper_stret, "vv*H.", "f", "objc/message.h", OBJC_LANG)
  717. // id objc_getClass(const char *name)
  718. LIBBUILTIN(objc_getClass, "GcC*", "f", "objc/runtime.h", OBJC_LANG)
  719. // id objc_getMetaClass(const char *name)
  720. LIBBUILTIN(objc_getMetaClass, "GcC*", "f", "objc/runtime.h", OBJC_LANG)
  721. // void objc_enumerationMutation(id)
  722. LIBBUILTIN(objc_enumerationMutation, "vG", "f", "objc/runtime.h", OBJC_LANG)
  723. // id objc_read_weak(id *location)
  724. LIBBUILTIN(objc_read_weak, "GG*", "f", "objc/objc-auto.h", OBJC_LANG)
  725. // id objc_assign_weak(id value, id *location)
  726. LIBBUILTIN(objc_assign_weak, "GGG*", "f", "objc/objc-auto.h", OBJC_LANG)
  727. // id objc_assign_ivar(id value, id dest, ptrdiff_t offset)
  728. LIBBUILTIN(objc_assign_ivar, "GGGY", "f", "objc/objc-auto.h", OBJC_LANG)
  729. // id objc_assign_global(id val, id *dest)
  730. LIBBUILTIN(objc_assign_global, "GGG*", "f", "objc/objc-auto.h", OBJC_LANG)
  731. // id objc_assign_strongCast(id val, id *dest
  732. LIBBUILTIN(objc_assign_strongCast, "GGG*", "f", "objc/objc-auto.h", OBJC_LANG)
  733. // id objc_exception_extract(void *localExceptionData)
  734. LIBBUILTIN(objc_exception_extract, "Gv*", "f", "objc/objc-exception.h", OBJC_LANG)
  735. // void objc_exception_try_enter(void *localExceptionData)
  736. LIBBUILTIN(objc_exception_try_enter, "vv*", "f", "objc/objc-exception.h", OBJC_LANG)
  737. // void objc_exception_try_exit(void *localExceptionData)
  738. LIBBUILTIN(objc_exception_try_exit, "vv*", "f", "objc/objc-exception.h", OBJC_LANG)
  739. // int objc_exception_match(Class exceptionClass, id exception)
  740. LIBBUILTIN(objc_exception_match, "iGG", "f", "objc/objc-exception.h", OBJC_LANG)
  741. // void objc_exception_throw(id exception)
  742. LIBBUILTIN(objc_exception_throw, "vG", "f", "objc/objc-exception.h", OBJC_LANG)
  743. // int objc_sync_enter(id obj)
  744. LIBBUILTIN(objc_sync_enter, "iG", "f", "objc/objc-sync.h", OBJC_LANG)
  745. // int objc_sync_exit(id obj)
  746. LIBBUILTIN(objc_sync_exit, "iG", "f", "objc/objc-sync.h", OBJC_LANG)
  747. BUILTIN(__builtin_objc_memmove_collectable, "v*v*vC*z", "nF")
  748. // void NSLog(NSString *fmt, ...)
  749. LIBBUILTIN(NSLog, "vG.", "fp:0:", "Foundation/NSObjCRuntime.h", OBJC_LANG)
  750. // void NSLogv(NSString *fmt, va_list args)
  751. LIBBUILTIN(NSLogv, "vGa", "fP:0:", "Foundation/NSObjCRuntime.h", OBJC_LANG)
  752. // Builtin math library functions
  753. LIBBUILTIN(pow, "ddd", "fe", "math.h", ALL_LANGUAGES)
  754. LIBBUILTIN(powl, "LdLdLd", "fe", "math.h", ALL_LANGUAGES)
  755. LIBBUILTIN(powf, "fff", "fe", "math.h", ALL_LANGUAGES)
  756. LIBBUILTIN(sqrt, "dd", "fe", "math.h", ALL_LANGUAGES)
  757. LIBBUILTIN(sqrtl, "LdLd", "fe", "math.h", ALL_LANGUAGES)
  758. LIBBUILTIN(sqrtf, "ff", "fe", "math.h", ALL_LANGUAGES)
  759. LIBBUILTIN(sin, "dd", "fe", "math.h", ALL_LANGUAGES)
  760. LIBBUILTIN(sinl, "LdLd", "fe", "math.h", ALL_LANGUAGES)
  761. LIBBUILTIN(sinf, "ff", "fe", "math.h", ALL_LANGUAGES)
  762. LIBBUILTIN(cos, "dd", "fe", "math.h", ALL_LANGUAGES)
  763. LIBBUILTIN(cosl, "LdLd", "fe", "math.h", ALL_LANGUAGES)
  764. LIBBUILTIN(cosf, "ff", "fe", "math.h", ALL_LANGUAGES)
  765. LIBBUILTIN(fma, "dddd", "fc", "math.h", ALL_LANGUAGES)
  766. LIBBUILTIN(fmal, "LdLdLdLd", "fc", "math.h", ALL_LANGUAGES)
  767. LIBBUILTIN(fmaf, "ffff", "fc", "math.h", ALL_LANGUAGES)
  768. // Blocks runtime Builtin math library functions
  769. LIBBUILTIN(_Block_object_assign, "vv*vC*iC", "f", "Blocks.h", ALL_LANGUAGES)
  770. LIBBUILTIN(_Block_object_dispose, "vvC*iC", "f", "Blocks.h", ALL_LANGUAGES)
  771. // FIXME: Also declare NSConcreteGlobalBlock and NSConcreteStackBlock.
  772. // Annotation function
  773. BUILTIN(__builtin_annotation, "UiUicC*", "nc")
  774. #undef BUILTIN
  775. #undef LIBBUILTIN