Я имею дело с некоторым кодом, который на 70-80% медленнее при компиляции в виде PIC (позиционно-независимый код), и ищу способы облегчить проблему.Большая часть проблемы заключается в том, что gcc настаивает на вставке следующего в каждую функцию:
call __i686.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
, даже если это составляет 20% от содержимого функции.Теперь ebx
является регистром, сохраняющим вызов, и каждая функция в соответствующем модуле перевода (исходный файл) загружает его с адресом GOT, и легко обнаружить, что функции static
не может быть вызван извне блока перевода (их адреса никогда не принимаются).Так почему же gcc не может просто загрузить ebx
один раз в начале больших функций внешней связи и сгенерировать функции статической связи, чтобы они предполагали, что ebx
уже загружен с адресом GOT?Есть ли какой-либо флаг оптимизации, который я могу использовать, чтобы заставить gcc сделать эту очевидную и масштабную оптимизацию, за исключением того, что встроенные ограничения поднимаются до небес, чтобы все было встроено во внешние функции?