То, что __builtin_va_start
равно , не определено в любом месте .Это компилятор GCC, встроенный (немного похоже на sizeof
- оператор времени компиляции).Это подробности реализации , относящиеся к <stdarg.h>
стандартному заголовку (предоставляется компилятором, а не реализацией стандартной библиотеки C libc
).Что действительно важно, так это соглашения о вызовах и ABI , за которыми следует сгенерированный ассемблер.
GCC имеет специальный код для работы со встроенными компиляторами.И этот код не определяет встроенную функцию, а реализует его специальное поведение внутри компилятора.И __builtin_va_start
является расширенным в некоторое специфичное для компилятора внутреннее представление вашего скомпилированного кода C / C ++, специфичное для GCC (некоторые GIMPLE возможно)
Из вашего комментария я бы сделал вывод, что вы заинтересованы в деталях реализации.Но , что должно быть в вашем вопросе
Если вы изучаете исходный код GCC 9.1, загляните внутрь некоторые из gcc-9.1.0/gcc/builtins.c
(expand_builtin_va_start
функция), а для других встроенных внутри gcc-9.1.0/gcc/c-family/c-cppbuiltin.c
, gcc-9.1.0/gcc/cppbuiltin.c
, gcc-9.1.0/gcc/jit/jit-builtins.c
Вы можете написать свой собственный плагин GCC (во 2кв2019, для GCC 9, и код C ++ вашего плагина, возможно, придется изменить для будущего GCC 10), чтобы добавить свои собственные встроенные GCC.Кстати, вы можете даже перегрузить поведение существующего __builtin_va_start
вашим собственным конкретным кодом, и / или вы можете иметь - по крайней мере для исследовательских целей - свой собственный stdarg.h
заголовок с #define va_start(v,l) __my_builtin_va_start(v,l)
и ваш плагин GCC понимает ваш встроенный плагин __my_builtin_va_start
.Однако помните об исключительной ситуации библиотеки времени выполнения *1067* GCC и прочитайте ее обоснование: я не юрист, но я склонен считать, что вы должны (и этот юридический документ требует от вас) опубликовать свой плагин GCC с некоторыми открытымиЛицензия на источник.
Сначала вам нужно прочитать учебник по компиляторам, например, Книга Дракона , чтобы понять, что Оптимизирующий компилятор в основном преобразует внутренние представления вашего скомпилированного кода.
Вам также нужно потратить месяцы на изучение многих внутренних представлений GCC.Помните, что GCC - это очень сложная программа (около десяти миллионов строк кода).Не ждите, чтобы понять это всего за несколько дней работы.Загляните на веб-сайт ресурсного центра GCC .
Мой мертвый GCC MELT содержит ссылки и слайды , объясняющие больше GCC (философия дизайна иархитектура GCC меняется медленно, поэтому концепции по-прежнему актуальны, даже если отдельные детали изменились). Мне потребовалось почти десять лет полного времени, чтобы частично понять некоторые промежуточные уровни GCC .Я не могу передать эти знания в ответе StackOverflow.
Мой черновик Отчет Бисмона (работа в процессе, финансируется H2020, так много бюрократии) имеет дюжинустраницы (в разделах §1.3 и 1.4), представляющие внутренние представления GCC.