- •Содержание Назначение и условия применения программы
- •Характеристики программы
- •Обращение к программе Синтаксис командной строки и правила задания опций
- •Управление стадиями обработки и выводом компилятора
- •Опции управления диалектом языка Си
- •Опции вывода и подавления предупреждений
- •Опции отладки
- •Опции оптимизации
- •Опции препроцессора
- •Передача опций ассемблеру
- •Опции каталогов поиска
- •Опции задания целевой машины и версии компилятора
- •Машинно-зависимые опции для целевой платформы
- •Опции генерации кода
- •Переменные окружения, управляющие работой компилятора
- •Перечень опций, не описанных в данной инструкции
- •Сообщения
- •Приложение а. Бинарные утилиты
- •Утилита objcopy Общие сведения
- •Формат командной строки
- •Описание опций
- •Утилита objdump Общие сведения
- •Формат командной строки
- •Описание опций
- •Редактор связейld Общие сведения
- •Описание опций
- •Переменные окружения
- •Ассемблер as Общие сведения
- •Формат командной строки
- •Входные файлы и исходная программа
- •Выходные (объектные) файлы
- •Предупреждения и сообщения об ошибках
- •Общие опции командной строки
- •Специфические опции целевой платформы
- •Лист регистрации изменений
Опции оптимизации
-O (--optimize)
-O1 (--optimize 1)
Включить оптимизацию. Оптимизирующая компиляция требует несколько больше времени и существенно больше памяти, если число строк в функции велико.
В отсутствие опции -Oкомпилятор стремится минимизировать затраты на компиляцию и обеспечить наилучшие условия отладки. Операторы программы независимы. Если вы установили точку прерывания перед началом оператора, то после останова в этой точке вы можете присвоить новое значение любой переменной или изменить счетчик команд, установив его на нужный оператор. При этом вы получите в точности тот результат, которого следует ожидать, исходя из содержания текста программы.
Без -Oкомпилятор размещает в регистрах только те переменные, которые были декларированы с квалификаторомregister.
Если задана опция -O, то компилятор стремится уменьшить размер генерируемого кода и время выполнения программы.
Если задана опция -O, то для всех машин включаются опции‑fthread‑jumps, ‑fdefer-pop. Для машин со слотами задержки (в том числе для Багет-23В) включается также опция-fdelayed-branch, а для машин, где отладка возможна и без указателя кадра (в том числе Багет-23В), включается еще и опция-fomit-frame-pointer.
-O2 (--optimize 2)
Усилить оптимизацию. В этом случае выполняются все поддерживаемые виды оптимизации, за исключением тех, которые обеспечивают ускорение готовой программы за счет значительного увеличения ее размера, (т. е. развертывание циклов и встраивание функций). По сравнению с -O, при использовании-O2увеличивается время компиляции, и ускоряется выполнение готовой программы.
-O3 (--optimize 3)
Еще более высокий уровень оптимизации. Соответствует -O2 с встраиванием функций (т. е.-O2 -finline-functions).
-O0
Отключить оптимизацию.
При задании в командной строке нескольких опций -Oс указанием или без указания уровня оптимизации реально используется последняя из них.
Опции вида -fфлагзадают машинно-независимые флаги оптимизации. Напомним, что перечисленные далее опции имеют отрицательную форму (см. гл. 1).
-ffloat-store (--float-store)
Не размещать в регистрах переменные с плавающей точкой.
Эта опция полезна при компиляции некоторых программ, которые полагаются на точные определения для значений с плавающей точкой, принятые в стандарте IEEE.
-fno-defer-pop (--no-defer-pop)
Всегда удалять из стека аргументы функции сразу после выхода из нее. Для машин, где аргументы функций должны удаляться из стека, компилятор обычно накапливает аргументы от нескольких вызовов функций, а затем убирает их все за один раз.
-fforce-mem (--force-mem)
Перед выполнением арифметических операций всегда копировать в регистры операнды, находящиеся в памяти. Это может способствовать генерации более качественного кода, поскольку все ссылки на память становятся потенциально общими подвыражениями. В тех случаях, когда они не являются общими подвыражениями, на проходе комбинирования инструкций избыточные загрузки значений в регистры должны удаляться.
-fforce-addr (--force-addr)
Копировать в регистры адресные константы перед выполнением арифметических операций над ними. Это может способствовать порождению более качественного кода по тем же причинам, что и -fforce-mem.
-fomit-frame-pointer (--omit-frame-pointer)
Не хранить в регистре указатель кадра для тех функций, для которых это необязательно. Благодаря этому отпадает необходимость в генерации инструкций для сохранения, установки и восстановления указателя буфера; высвобождается также дополнительный регистр, который можно использовать для других целей.
СКРВ Багет поддерживает эту оптимизацию для функций, которые не обращаются к alloca.
-fno-inline (--no-inline)
Не обращать внимание на ключевое слово inline. Эта опция используется для того чтобы компилятор не обрабатывал никакие функции как встроенные. Заметим, что при неоптимизирующей компиляции встраивание функций вообще никогда не выполняется.
-finline-functions (--inline-functions)
Встраивать все простые функции в местах обращений к ним. Компилятор эвристически принимает решения о том, какие функции считать достаточно простыми для встраивания.
Если все обращения к некоторой функции обработаны как встраивания, и функция декларирована как статическая (static), то эта функция обычно не выводится в результирующий ассемблерный код.
-fkeep-inline-functions (--keep-inline-functions)
Даже если все обращения к некоторой функции обработаны как встраивания, и функция декларирована как статическая (static), все равно сформировать выполняемый код этой функции.
-fno-function-cse (--no-function-cse)
Не помещать адреса функций в регистры; для вызова константных функций генерировать инструкции, в которых явно содержится адрес функции.
-ffast-math (--fast-math)
Эта опция позволяет gccнарушать некоторые правила и спецификации ANSI и IEEE в интересах получения более быстрого выполняемого кода. Например, компилятор может исходить из предположения, что аргумент sqrt всегда неотрицателен, а значения с плавающей точкой никогда не являются нечисловыми (NaN — Not a Number).
Эта опция не подразумевается ни одним из уровней опции -O, поскольку она может привести к генерации некорректного кода для программ, полагающихся на правила и спецификации ANSI или IEEE для математических функций.
Следующие флаги могут понадобиться в редких случаях, когда необходима "тонкая настройка" оптимизации. Все они, за исключением -funroll-loops, подразумеваются опцией-O2.
-fstrength-reduce (--strength-reduce)
Выполнить оптимизацию "снижения сложности циклов" и исключения итерационных переменных.
-fthread-jumps (--thread-jumps)
Выполнить оптимизацию "протягивания переходов", которая заключается в том, чтобы проверять, не ведет ли условный переход в такую точку программы, где снова проверяется условие, результат которого можно определить, исходя из результата проверки условия для первого перехода. В таком случае первый условный переход "протягивается" непосредственно в ту точку, куда должно перейти управление в результате проверки второго условия.
-fcse-follow-jumps (--cse-follow-jumps)
Во время прохода исключения общих подвыражений (CSE) включать в зону просмотра участок, следующий за точкой, в которую выполняется переход, если в эту точку нет других переходов. Например, при обработке оператора if сelse-частью проход CSE проследует вelse-часть, если в нее нет переходов из других мест программы.
-fcse-skip-blocks (--cse-skip-blocks)
Эта опция подобна -fcse-follow-jumps, но она заставляет проход CSE включать в зону просмотра участки, следующие за условно пропускаемыми блоками. Например, при обработке простого оператораifбезelse-части проход CSE продолжит экономию общих подвыражений и на участке, следующем за телом оператораif(если в эту точку нет переходов из других мест программы).
-frerun-cse-after-loop (--rerun-cse-after-loop)
Выполнить повторное исключение общих подвыражений после прохода оптимизации циклов.
-fexpensive-optimizations (--expensive-optimizations)
Выполнить некоторые относительно дорогостоящие виды оптимизации.
-fdelayed-branch (--delayed-branch)
Выполнить оптимизацию переходов со слотами задержки. Инструкции переупорядочиваются таким образом, чтобы заполнить слоты задержки после инструкций перехода.
Употребление опции -fno-delayed-branch поможет обойти ошибку, которая выражается в неправильном редактировании внешних связей в некоторых фрагментах программ, скомпилированных с включенной оптимизацией -fdelayed-branch.
-fschedule-insns (--schedule-insns)
Выполнить оптимизацию планирования инструкций, т.е. попытаться переупорядочить инструкции таким образом, чтобы исключить задержки выполнения, связанные с тем, что данные, которые нужны для очередной инструкции, еще не вычислены. Это полезно, например для машин с медленной арифметикой для значений с плавающей точкой. За то время, пока вычисляются результаты, необходимые для следующих инструкций, могут быть выполнены некоторые другие инструкции.
-fschedule-insns2 (--schedule-insns2)
Выполнить повторный проход планирования инструкций после распределения регистров. Это полезно для машин с относительно малым числом регистров, где инструкции загрузки из памяти занимают более одного цикла.
-fcaller-saves (--caller-saves)
Допустить размещение значений в регистрах, которые портятся в результате вызовов функций. При этом до (и после) вызовов функций будут генерироваться дополнительные инструкции для сохранения (и восстановления) этих регистров. Выделение таких регистров будет производиться лишь в случаях, когда это, скорее всего приведет к генерации более эффективного кода.
-funroll-loops (--unroll-loops)
-funroll-all-loops (--unroll-all-loops)
Выполнить развертывание циклов.