Где определяется __builtin_va_start? - PullRequest
2 голосов
/ 02 июня 2019

Я пытаюсь найти, где __builtin_va_start определено в исходном коде GCC, и посмотреть, как это реализовано.(Я искал, где определено va_start, а затем обнаружил, что этот макрос определен как __builtin_va_start.) Я использовал cscope -r в каталоге исходного кода GCC 9.1 для поиска определения, но не нашел его.Кто-нибудь может указать, где эта функция определена?

1 Ответ

5 голосов
/ 02 июня 2019

То, что __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.

...