gcc -fPIC, кажется, испортил флаги оптимизации

Следуя этому вопросу: how-do- i-check-if-gcc-is-performing-tail-recursion-optimization я заметил, что использование gcc с -fPIC, кажется, разрушает эту оптимизацию. Я создаю общую библиотеку, но мне не нужна опция -fPIC.

Ну, мой вопрос: почему -fPIC меняет оптимизацию gcc? Нужно ли мне сохранять -fPIC по какой-либо причине?


person user212658    schedule 17.11.2009    source источник
comment
Не могли бы вы предоставить средства для воспроизведения описываемого вами поведения? Это звучит неправильно. Однако некоторые внутренние ограничения в реализации gcc могут привести к отключению оптимизации в режиме PIC...   -  person Pascal Cuoq    schedule 17.11.2009
comment
Какая версия GCC? Какая платформа? «-fPIC» иногда изменяет сгенерированный код, чтобы он был «кодом, независимым от позиции» (отсюда PIC), что означает, что он отличается от «кода, зависящего от позиции» - возможно. Какие варианты вы используете?   -  person Jonathan Leffler    schedule 17.11.2009
comment
Ах, на наших 64-битных серверах gcc говорит, что требуется -fPIC.   -  person user212658    schedule 17.11.2009


Ответы (2)


При отсутствии подробностей, таких как целевая архитектура и версия компилятора, возможное объяснение таково:

В позиционно-зависимом коде оптимизация хвостовой рекурсии, по сути, заключается в повторном использовании текущего кадра стека и замене рассматриваемого call на jump. Синтаксис может быть call function заменен на jmp <small offset of function>.

В позиционно-независимом коде вызов может быть записан как call function@PLT, если это позволяет набор инструкций (в данном примере это amd64). Его вполне можно было бы заменить на jmp <small offset of function>@PLT, но эти две настройки мешают, и, возможно, разработчики gcc не удосужились реализовать оптимизацию хвостового вызова в последнем режиме.

person Pascal Cuoq    schedule 17.11.2009

В ia32 linux использование fpic означает, что у вас нет ebx для общего использования, что, несомненно, повлияет на оптимизацию. Возможно, компилятор отказался от оптимизации хвостовой рекурсии из-за давления на регистры планирования.

person Peeter Joot    schedule 19.11.2009