Реализация builtin va start(v, l)
идем вниз по кроличьей норе поддержка variadic макросы в glibc, я достиг /usr/lib/gcc/x86_64-linux-gnu/4.8.2/include/stdarg.h
где, например,va_start
макрос определяется как:
#define va_start(v,l) __builtin_va_start(v,l)
но я пытался найти фактическую реализацию __builtin_va_start(v,l)
без успеха. Я погуглил и схватил его, и самое дальнее, что я получил, это реализация Microsoft для Visual Studio, который, я полагаю, не радикально отличается.
кто-нибудь знает, где в glibc реализация?
ТИА.
3 ответов
чтобы посмотреть исходный код gcc, загрузите соответствующую версию изhttp://www.netgull.com/gcc/releases/ например, версия 4.8.2 находится вhttp://www.netgull.com/gcc/releases/gcc-4.8.2/ (82 МБ).
ключевое слово builtin обрабатывается в строке 4169 gcc/builtins.c
В общем, чтобы найти, как ССЗ расширяет встроенную в НКУ, функция которого зовут '__строение_foo', посмотрите в источнике gcc для объявления функции ' expand_builtin_foo'.
посмотрите на stdarg.h в ядре 0.01 linux для idea-va_start-это макрос, который инициализирует ap с шагом, начинающимся с первого аргумента, плюс его размер (округленный до размера машинного слова); va_arg устанавливает ap как заданный тип и увеличивает ap таким же образом (округляя тип до машинного слова)
#define __va_rounded_size(TYPE) \
( ( (sizeof (TYPE) + sizeof (int) - 1) / sizeof (int) ) * sizeof (int) )
#define va_start(AP, LASTARG) \
(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
#define va_arg(AP, TYPE) \
(AP += __va_rounded_size (TYPE), \
*((TYPE *) (AP - __va_rounded_size (TYPE)) ))