Реализация 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)) ))