GCC pragma optimize не отменяет настройки командной строки `-Og` - PullRequest
0 голосов
/ 04 июля 2019

Можно ли переопределить уровень оптимизации -Og GCC с помощью O2 / O3 для отдельной функции или модуля компиляции?

Похоже, что #pragma GCC optimize("O2") и __attribute__((optimize("O2")) не выполняются компилятором, если в командной строке используется -Og.

Например, эта функция делает насыщающее сложение на ARM Cortex-M4. Он компилируется в ssat, только если я компилирую с -O2, но самый правый компилятор использует -Og и игнорирует прагму.

С другой стороны, работает прагма с более низким уровнем оптимизации, т. Е. Указывается O0 в качестве переопределения прагмы -Og в командной строке.

Это ожидаемое поведение?

1 Ответ

1 голос
/ 04 июля 2019

Можно ли переопределить уровень оптимизации -Og GCC с помощью O2 / O3 для отдельной функции или модуля компиляции?

Да и нет. Документация для атрибута optimize , на которую ссылаются документы прагмы, гласит:

Атрибут optimize используется для указания того, что функция должна быть скомпилирована с параметрами оптимизации, отличными от указанных в командной строке.

Таким образом, атрибут или прагма переопределяют командную строку. Однако это применимо на уровне отдельных функций, тогда как параметр -Og имеет как отдельные функции, так и глобальные эффекты :

Как и -O0, -Og полностью отключает ряд проходов оптимизации, так что отдельные опции, управляющие ими, не действуют.

Таким образом, хотя использование атрибута или прагмы для установки уровня оптимизации O2 или O3 действительно включает все отдельные оптимизации, включенные в этот уровень, это может не иметь полного эффекта, который устанавливает их в команде линия будет делать.

Обратите внимание также на предостережение докуменов, что

Атрибут optimize должен использоваться только для целей отладки. Не подходит в производственном коде.

Я полагаю, что вы отлаживаете, так как это цель -Og, но вы должны взять из этого комментария то, что вы не должны полагаться на эту технику для принудительного выбора параметров оптимизации или выключен. Как вы обнаружили, это может быть не так эффективно или полностью.

Это ожидаемое поведение?

Поведение, которое вы описываете, похоже, согласуется с документами, хотя они не указывают подробности. Однако то, как вы его характеризуете, - это игнорирование прагмы, когда в командной строке задано значение -Og - это не ожидается, и я думаю, что это не совсем точно.

...