7.1 Встроенные функции стандартной библиотеки C
GCC включает встроенные версии многих функций стандартной библиотеки C. Эти функции представлены в двух формах: одна начинается с префикса __builtin_, а другая — без него. Обе формы имеют тот же тип (включая прототип), тот же адрес (если взять их адрес) и то же значение, что и функции библиотеки C, даже если задан параметр -fno-builtin (см. Параметры управления диалектом C). Многие из этих функций оптимизируются только в определённых случаях; если в конкретном случае оптимизация не выполняется, генерируется вызов функции библиотеки.
Вне режима строгого соответствия ISO C (-ansi, -std=c90, -std=c99 или -std=c11) функции _exit, alloca, bcmp, bzero, dcgettext, dgettext, dremf, dreml, drem, exp10f, exp10l, exp10, ffsll, ffsl, ffs, fprintf_unlocked, fputs_unlocked, gammaf, gammal, gamma, gammaf_r, gammal_r, gamma_r, gettext, index, isascii, j0f, j0l, j0, j1f, j1l, j1, jnf, jnl, jn, lgammaf_r, lgammal_r, lgamma_r, mempcpy, pow10f, pow10l, pow10, printf_unlocked, rindex, roundeven, roundevenf, roundevenl, scalbf, scalbl, scalb, signbit, signbitf, signbitl, signbitd32, signbitd64, signbitd128, significandf, significandl, significand, sincosf, sincosl, sincos, stpcpy, stpncpy, strcasecmp, strdup, strfmon, strncasecmp, strndup, strnlen, toascii, y0f, y0l, y0, y1f, y1l, y1, ynf, ynl и yn могут обрабатываться как встроенные функции. Для всех этих функций существуют соответствующие версии с префиксом __builtin_, которые можно использовать даже в режиме строгого соответствия C90.
Функции ISO C99 _Exit, acoshf, acoshl, acosh, asinhf, asinhl, asinh, atanhf, atanhl, atanh, cabsf, cabsl, cabs, cacosf, cacoshf, cacoshl, cacosh, cacosl, cacos, cargf, cargl, carg, casinf, casinhf, casinhl, casinh, casinl, casin, catanf, catanhf, catanhl, catanh, catanl, catan, cbrtf, cbrtl, cbrt, ccosf, ccoshf, ccoshl, ccosh, ccosl, ccos, cexpf, cexpl, cexp, cimagf, cimagl, cimag, clogf, clogl, clog, conjf, conjl, conj, copysignf, copysignl, copysign, cpowf, cpowl, cpow, cprojf, cprojl, cproj, crealf, creall, creal, csinf, csinhf, csinhl, csinh, csinl, csin, csqrtf, csqrtl, csqrt, ctanf, ctanhf, ctanhl, ctanh, ctanl, ctan, erfcf, erfcl, erfc, erff, erfl, erf, exp2f, exp2l, exp2, expm1f, expm1l, expm1, fdimf, fdiml, fdim, fmaf, fmal, fmaxf, fmaxl, fmax, fma, fminf, fminl, fmin, hypotf, hypotl, hypot, ilogbf, ilogbl, ilogb, imaxabs, isblank, iswblank, lgammaf, lgammal, lgamma, llabs, llrintf, llrintl, llrint, llroundf, llroundl, llround, log1pf, log1pl, log1p, log2f, log2l, log2, logbf, logbl, logb, lrintf, lrintl, lrint, lroundf, lroundl, lround, nearbyintf, nearbyintl, nearbyint, nextafterf, nextafterl, nextafter, nexttowardf, nexttowardl, nexttoward, remainderf, remainderl, remainder, remquof, remquol, remquo, rintf, rintl, rint, roundf, roundl, round, scalblnf, scalblnl, scalbln, scalbnf, scalbnl, scalbn, snprintf, tgammaf, tgammal, tgamma, truncf, truncl, trunc, vfscanf, vscanf, vsnprintf и vsscanf обрабатываются как встроенные функции, кроме режима строгого соответствия ISO C90 (-ansi или -std=c90).
Также существуют встроенные версии функций ISO C99 acosf, acosl, asinf, asinl, atan2f, atan2l, atanf, atanl, ceilf, ceill, cosf, coshf, coshl, cosl, expf, expl, fabsf, fabsl, floorf, floorl, fmodf, fmodl, frexpf, frexpl, ldexpf, ldexpl, log10f, log10l, logf, logl, modfl, modff, powf, powl, sinf, sinhf, sinhl, sinl, sqrtf, sqrtl, tanf, tanhf, tanhl и tanl, распознаваемых в любом режиме, поскольку ISO C90 резервирует эти имена для тех целей, которым ISO C99 их предназначает. Для всех этих функций существуют соответствующие версии с префиксом __builtin_.
Также имеются встроенные функции __builtin_fabsfn, __builtin_fabsfnx, __builtin_copysignfn и __builtin_copysignfnx, соответствующие функциям TS 18661-3 fabsfn, fabsfnx, copysignfn и copysignfnx для поддерживаемых типов _Floatn и _Floatnx.
Также имеются функции-расширения GNU clog10, clog10f и clog10l, имена которых зарезервированы ISO C99 для будущего использования. Для всех этих функций существуют версии с префиксом __builtin_.
Функции ISO C94 iswalnum, iswalpha, iswcntrl, iswdigit, iswgraph, iswlower, iswprint, iswpunct, iswspace, iswupper, iswxdigit, towlower и towupper обрабатываются как встроенные функции, кроме режима строгого соответствия ISO C90 (-ansi или -std=c90).
Функции ISO C90 abort, abs, acos, asin, atan2, atan, calloc, ceil, cosh, cos, exit, exp, fabs, floor, fmod, fprintf, fputs, free, frexp, fscanf, isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit, tolower, toupper, labs, ldexp, log10, log, malloc, memchr, memcmp, memcpy, memset, modf, pow, printf, putchar, puts, realloc, scanf, sinh, sin, snprintf, sprintf, sqrt, sscanf, strcat, strchr, strcmp, strcpy, strcspn, strlen, strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, tanh, tan, vfprintf, vprintf и vsprintf распознаются как встроенные функции, если не задан параметр -fno-builtin (или параметр -fno-builtin-function для отдельной функции). Для всех этих функций существуют соответствующие версии с префиксом __builtin_.
GCC предоставляет встроенные версии макросов сравнения чисел с плавающей запятой ISO C99, которые не вызывают исключений для неупорядоченных операндов. Они имеют те же имена, что и стандартные макросы ( isgreater, isgreaterequal, isless, islessequal, islessgreater и isunordered), с добавленным префиксом __builtin_. Это позволяет реализатору библиотеки просто #define каждый стандартный макрос на его встроенный эквивалент. Аналогичным образом GCC предоставляет встроенные функции fpclassify, iseqsig, isfinite, isinf_sign, isnormal и signbit, используемые с префиксом __builtin_. Встроенные функции isinf и isnan доступны как с префиксом __builtin_, так и без него. При параметре -ffinite-math-only встроенные функции isinf и isnan всегда возвращают 0.
GCC предоставляет встроенные версии функций ISO C99 для округления чисел с плавающей запятой и обработки исключений: fegetround, feclearexcept и feraiseexcept. Они могут быть доступны не для всех целевых платформ, а из-за необходимости тесного взаимодействия с внутренними значениями libc — не для всех целевых библиотек libc; однако во всех случаях при отсутствии встроенной реализации будет использоваться вызов libc. Эти встроенные функции доступны как с префиксом __builtin_, так и без него.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Library-Builtins.html