1 Опции печати помощи
--help
--help-raw
2 Опции управления процессом компиляции
-c
По умолчанию, имя объектного файла делается из имени исходного файла заменой суффикса «.c», «.i», «.s», и.т.д. на «.o».
При подаче на вход не распознанного файла (включая случаи, когда подается не распознанный и распознанный файл вместе) компилятор выдает следующее сообщение об ошибке: «lcc: ошибка: <имя не распознанного файла>: файл неизвестного типа передан для компиляции». При этом объектный файл не создается.
-S
По умолчанию, имя файла с ассемблерным кодом делается из имени исходного файла заменой суффикса «.c», «.i», и.т.д. на «.s».
При подаче на вход не распознанного файла (включая случаи, когда подается не распознанный и распознанный файл вместе) компилятор выдает следующее сообщение об ошибке: «lcc: ошибка: <имя не распознанного файла>: файл неизвестного типа передан для компиляции». При этом файл с ассемблерным кодом не создается.
-o<file> (-o <file>)
<file>». Эта опция применяется вне зависимости от вида порождаемого файла, есть ли это исполняемый файл, объектный файл, ассемблерный файл или препроцессированный C код.
Поскольку указывается только один выходной файл, нет смысла использовать -o при компиляции более чем одного входного файла, если вы не порождаете на выходе исполняемый файл.
Если -o не указано, по умолчанию исполняемый файл помещается в «a.out», объектный файл для «исходный.суффикс» - в «исходный.o», его ассемблерный код в «исходный.s» и все препроцессированные C файлы - в стандартный вывод.
-v (--verbose)
-vs
-save-temps
--tempdir <dir>
-pthread (-pthread)
-ww
3 Опции режима компиляции целевой архитектуры
-mtune=<cpu>
<cpu>». Параметр опции может принимать следующие значения: elbrus-2c+, elbrus-4c, elbrus-8c, elbrus-1c+, elbrus-8c2, elbrus-12c, elbrus-16c, elbrus-2c3. При одновременном наличии в командной строке опций -mtune, -march и/или -mcpu, во внимание принимается только опция -mtune, а опции -march и/или -mcpu игнорируются
-mtune=elbrus-2c+ - компилировать программу для процессора "Эльбрус-2C+" (работающего на системе команд v2). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-2C+", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-4c - компилировать программу для процессора "Эльбрус-4C" (работающего на системе команд v3). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-4C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-8c - компилировать программу для процессора "Эльбрус-8C" (работающего на системе команд v4). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-8C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-1c+ - компилировать программу для процессора "Эльбрус-1C+" (работающего на системе команд v4). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-1C+", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-8c2 - компилировать программу для процессора "Эльбрус-8C2" (работающего на системе команд v5). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-8C2", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-12c - компилировать программу для процессора "Эльбрус-12C" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-12C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-16c - компилировать программу для процессора "Эльбрус-16C" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-16C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-2c3 - компилировать программу для процессора "Эльбрус-2C3" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-2C3", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=native - для native-компилятора включить режим -mtune со значением, соответствующим модели процессора, на котором в настоящий момент запускается компилятор. Для cross-компилятора включить режим компилятора по умолчанию в отношении настройки target-процессора
-march=<arch>
<arch>». Параметр опции может принимать следующие значения: elbrus-v2, elbrus-v3, elbrus-v4, elbrus-v5, elbrus-v6. При одновременном наличии в командной строке опций -march и -mtune, опция -march игнорируется. При одновременном наличии в командной строке опций -march и -mcpu, во внимание принимается только опция -march, а опция -mcpu игнорируется
Системы команд процессоров семейства "Эльбрус" с точки зрения совместимости можно выстроить в следующем порядке: "система команд v2" - "система команд v3" - "система команд v4" - "система команд v5" - "система команд v6". Программы, скомпилированные в более ранней системе команд (согласно этой линейке слева направо), смогут исполняться на процессорах с более поздней системой команд. Программы, скомпилированные в более поздней системе команд, НЕ смогут исполняться на процессорах с более ранней системой команд (операционная система не позволит эти программы запустить). Новые процессоры, которые могут появиться в будущем, в цепочку становятся с правой стороны
-march=elbrus-v2 - компилировать программу под систему команд v2. Программа сможет исполняться на процессорах с системой команд v2 и выше
-march=elbrus-v3 - компилировать программу под систему команд v3. Программа сможет исполняться на процессорах с системой команд v3 и выше
-march=elbrus-v4 - компилировать программу под систему команд v4. Программа сможет исполняться на процессорах с системой команд v4 и выше
-march=elbrus-v5 - компилировать программу под систему команд v5. Программа сможет исполняться на процессорах с системой команд v5 и выше
-march=elbrus-v6 - компилировать программу под систему команд v6. Программа сможет исполняться на процессорах с системой команд v6 и выше
-march=native - для native-компилятора включить режим -march со значением, соответствующим модели процессора, на котором в настоящий момент запускается компилятор. Для cross-компилятора включить режим компилятора по умолчанию в отношении настройки target-процессора
-mcpu=<arch>
<arch>». Параметр опции может принимать следующие значения: elbrus-v2, elbrus-v3, elbrus-v4, elbrus-v5, elbrus-2c+, elbrus-4c, elbrus-8c, elbrus-1c+, elbrus-8c2. При одновременном наличии в командной строке опций -mtune и/или -march и -mcpu, опция -mcpu игнорируются
-mcpu=elbrus-v2 - эквивалентно -march=elbrus-v2 -D__elbrus_2cplus__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -march=elbrus-v2
-mcpu=elbrus-v3 - эквивалентно -march=elbrus-v3 -D__elbrus_4c__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -march=elbrus-v3
-mcpu=elbrus-v4 - эквивалентно -march=elbrus-v4 -D__elbrus_8c__ -D__elbrus_1cplus__. Лишние опции -D обусловлены ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -march=elbrus-v4
-mcpu=elbrus-v5 - эквивалентно -march=elbrus-v5 -D__elbrus_8c2__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -march=elbrus-v5
-mcpu=elbrus-2c+ - эквивалентно -march=elbrus-v2 -D__elbrus_2cplus__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -mtune=elbrus-2c+ или -march=elbrus-v2
-mcpu=elbrus-4c - эквивалентно -march=elbrus-v3 -D__elbrus_4c__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -mtune=elbrus-4c или -march=elbrus-v3
-mcpu=elbrus-8c - эквивалентно -march=elbrus-v4 -D__elbrus_8c__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -mtune=elbrus-8c или -march=elbrus-v4
-mcpu=elbrus-1c+ - эквивалентно -march=elbrus-v4 -D__elbrus_1cplus__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -mtune=elbrus-1c+ или -march=elbrus-v4
-mcpu=elbrus-8c2 - эквивалентно -march=elbrus-v5 -D__elbrus_8c2__. Лишняя опция -D обусловлена ошибочной настройкой предыдущих версий компилятора. Рекомендуется заменить на -mtune=elbrus-8c2 или -march=elbrus-v5
-mptr32 (-m32)
-mptr64 (-m64)
-mptr128 (-m128)
-mptr128-64
-faligned-check
В режимах для процессоров версии elbrus-v5 и выше опция игнорируется, поскольку в библиотеках для elbrus-v5 и выше есть невыровненные обращения к памяти. Кроме того, компилятор в режиме компиляции для elbrus-v5 и выше может создавать невыровненные обращения к памяти. Из-за этого коды, собранные с этой опцией для более ранних версий архитектуры не будут работать на elbrus-v5 и выше в режиме с динамическими библиотеками, собранными в кодах elbrus-v5 и выше (подробнее см. описание опции -faligned). Таким образом, программы, собранные с данной опцией, могут быть несовместимы с более новыми версиями архитектуры. Полноценная реализация опции с обеспечением обратной совместимости требует больших накладных расходов (нужно либо использовать две версии библиотек, либо заводить дополнительные биты в связующей информации), поэтому от неё решено было отказаться.
4 Опции управления языковыми настройками
-std=<standard>
<standard>»
В режиме языка C параметр может принимать значения: c89, gnu89, c90, iso9899:1990, iso9899:199409, gnu90, c9x, gnu9x, c99, iso9899:1999, gnu99, c1x, gnu1x, c11, iso9899:2011, gnu11. По умолчанию установлен режим -std=gnu11
В режиме языка C++ параметр может принимать значения: c++98, gnu++98, c++03, gnu++03, c++0x, gnu++0x, c++11, gnu++11, c++1y, gnu++1y, c++14, gnu++14, c++1z, gnu++1z, c++17, gnu++17, c++2a, gnu++2a. По умолчанию установлен режим -std=gnu++14. Для языков C++17 и C++20 поддержка экспериментальная
В режиме языка Fortran параметр может принимать значения: f95, f2003, f2008, gnu, legacy, f2008ts. По умолчанию установлен режим -std=gnu
-ansi
-gcc-version <version>
-fopenmp (-fno-openmp)
5 Опции управления языковыми настройками C/C++
-fanachronisms
-fpermissive
-fexceptions (-fno-exceptions)
-fhandle-exceptions (-fno-handle-exceptions)
-funwind-tables (-fno-unwind-tables)
-fasynchronous-unwind-tables (-fno-asynchronous-unwind-tables)
-feh-personality=<name>
-frtti (-fno-rtti)
-ffor-scope (-fno-for-scope)
-foperator-names (-fno-operator-names)
-ftemplate-depth=<num> (-ftemplate-depth-<num>)
-ftemplate-backtrace-limit=<num>
-fconstexpr-depth=<num>
-fconstexpr-loop-limit=<num>
-fconstexpr-ops-limit=<num>
-fbuilding-runtime
-fbuilding-libgcc
-funsigned-char (-fsigned-char)
char: таким, как unsigned char или таким, как signed char.
В идеале, переносимая программа всегда должна явно использовать unsigned char или signed char, когда она зависит от знаковости объекта. Но многие программы были написаны с использованием простого char в предположении, что он будет либо знаковым, либо беззнаковым, в зависимости от машины, для которой они были написаны. Эта опция и ей противоположная позволяют вам заставить такую программу работать при противоположном умолчании.
Тип char всегда отличен и от signed char, и от unsigned char (и это критично для C++), хотя его поведение всегда такое же, как у одного из этих двух типов.
-fgnu89-inline (-fno-gnu89-inline)
-flax-vector-conversions
-traditional (-traditional-cpp)
-trigraphs
-ansi включает -trigraphs
-fno-gnu-keywords
-fsized-deallocation (-fno-sized-deallocation)
void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;
Эти описания появились в стандарте C++14, где они поддерживаются по умолчанию, но по опции поддержку можно включить и при использовании более ранних стандартов
Эти описания могут быть полезными для пользовательских replacement deallocation функций, которые, например, работают быстрее, если известен размер объекта
-faligned-new (-fno-aligned-new)
Обычные операторы new выделяют память по адресам, кратным выравниванию типа std::maxalign_t. Если нужно выделить память под тип, который выровнен ещё больше (например, выравнивание типа задано с помощью спецификатора alignof), то компилятор построит вызов перегруженного (placement) оператора new, у которого вторым аргументом идёт величина выравнивания
6 Опции управления языковыми настройками Фортрана
-fstack-arrays (-fno-stack-arrays)
В режиме -fstack-arrays массивы неизвестного размера (Variable Length Arrays - VLA) размещаются в стеке, в режиме -fno-stack-arrays - в куче. По умолчанию для языков C/C++ включен режим -fstack-arrays, для Фортрана -fno-stack-arrays
В защищённом режиме для всех языков по умолчанию включен режим -fno-stack-arrays
-fno-strict-f77
-fall-intrinsics
-fallow-leading-underscore
-fautomatic (-fno-automatic)
-fbackslash
-fcray-pointer
-fd-lines-as-code
-fd-lines-as-comments
-fdec
-fdec-intrinsic-ints
-fdec-math
-fdec-static
-fdec-structure
-fdefault-double-8
-fdefault-integer-8
-fdefault-real-8
-fdiagnostics-color=<val>
-fdiagnostics-show-caret (-fno-diagnostics-show-caret)
-fdiagnostics-show-location=<val>
-fdiagnostics-show-option (-fno-diagnostics-show-option)
-fdollar-ok
-ffixed-form
-ffixed-line-length-<val>
-ffixed-line-length-none
-ffree-form
-ffree-line-length-<val>
-ffree-line-length-none
-fimplicit-none
-finteger-4-integer-8
-fintrinsic-modules-path=<path>
-fmax-identifier-length=<val>
-fmodule-private
-fprotect-parens (-fno-protect-parens)
-frange-check (-fno-range-check)
-freal-4-real-8
-freal-4-real-10
-freal-4-real-16
-freal-8-real-4
-freal-8-real-10
-freal-8-real-16
-frealloc-lhs (-fno-realloc-lhs)
7 Опции управления языковыми настройками Фортрана, влияющими на генерацию кода
-faggressive-function-elimination
-falign-commons (-fno-align-commons)
-fbacktrace (-fno-backtrace)
-ffortran-init-ieee (-fno-fortran-init-ieee)
-fbounds-check
-fcheck-array-temporaries
-fcheck=<val>
-fcoarray=<val>
-fconvert=<val>
-ffpe-summary=<val>
-ffpe-trap=<val>
-ffrontend-optimize (-fno-frontend-optimize)
-finit-character=<val>
-finit-derived
-finit-integer=<val>
-finit-local-zero
-finit-logical=<val>
-finit-real=<val>
-finline-matmul-limit=<val>
-fmax-array-constructor=<val>
-fmax-stack-var-size=<val>
-fmax-subrecord-length=<val>
-frecord-marker=<val>
-frecursive
-fsecond-underscore (-fno-second-underscore)
-fsign-zero (-fno-sign-zero)
-ftmp-stack-array-size=<val>
-funderscoring (-fno-underscoring)
-fstrict-loop-counter
По умолчанию компилятор в режиме языка Fortran строит счётчик цикла в виде знакового целого. За счёт этого к циклу без дополнительных преобразований могут применяться цикловые оптимизации с аппаратной поддержкой, такие как конвейеризация цикла с наложением итераций, аппаратная предподкачка массивов, раскрутка цикла. Однако, в таком режиме цикл может работать некорректно, если верхняя граница цикла равна максимальному значению знакового целого (2^31 - 1).
Опция -fstrict-loop-counter гарантирует корректную работу цикла в случае произвольной верхней границы. Однако это требует построения кода, к которому сложно применить вышеуказанные оптимизации. В зависимости от конкретного случая, замедление может варьироваться от процентов до нескольких раз.
По умолчанию опция выключена.
8 Опции, влияющие на программные соглашения
-fshort-wchar
unsigned short int для настройки типа wchar_t.
ВНИМАНИЕ! По этой опции генерируется код, бинарно НЕ совместимый с кодом, построенным без этой опции
-fshort-enums
ВНИМАНИЕ! По этой опции генерируется код, бинарно НЕ совместимый с кодом, построенным без этой опции
9 Опции управления препроцессированием
-I <dir> (-I<dir>)
-J<dir>
-iquote <dir> (-iquote<dir>)
-isystem <dir> (-isystem<dir>)
-idirafter <dir> (-idirafter<dir>)
-include <file> (--include <file>, -include<file>)
-imacros <file> (--imacros <file>, -imacros<file>)
-D <name[=value]> (-D<name[=value]>)
-U <name> (-U<name>)
-E
При подаче на вход нераспознанного файла (включая случаи, когда подается нераспознанный и распознанный файл вместе) компилятор выдает следующее сообщение об ошибке: «lcc: ошибка: <имя нераспознанного файла>: файл неизвестного типа передан для компиляции».
-P
-C
-dM
-dI
-dEE
N (normal): оригинальная строка исходника
X (expand): следует только за строками N в случаях, когда оригинальная строка исходного текста была изменена в процессе препроцессорных подстановок
S (skip): строка, пропускаемая за счёт условных препроцессорных директив типа #if
L (line): изменение файла и номера строки за счёт подстановки файла директивой #include
R (remark), W (warning), E (error), C (catastrofic error): индикация замечания, предупреждения, ошибки или катастрофической ошибки
-cpp (-nocpp)
-M
-MD
-MM
-MMD
-MT <name> (-MT<name>)
-MQ <name> (-MQ<name>)
-MF <file> (-MF<file>)
-MP
-H
-undef
-nostdinc
-nostdinc++
-finput-charset=
-fexec-charset=
-fwide-exec-charset=
-verbose-modules
10 Опции управления режимом компиляции
-fbuiltin (-fno-builtin)
При включенной опции вызов, например, функции abs, будет заменён на __builtin_abs. Замена происходит в случае, если прототип вызываемой функции совпадает с прототипом стандартной функции и если в модуле отсутствует определение данной функции. Дополнительно в режиме языка C включается возможность использования вызова функции с константным аргументом в качестве статического инициализатора. Если на функцию было взятие адреса, то замена на builtin не производится.
На текущий момент опция влияет на функции: abs, labs, llabs, imaxabs, cabs, cabsf, cabsl, cimag, cimagf, cimagl, conj, conjf, conjl, copysign, copysignf, copysignl, cos, cosf, cosl, creal, crealf, creall, fabs, fabsf, fabsl, ffs, ffsl, ffsll, isinf, isinff, isinfl, isnan, isnanf, isnanl, lrint, lrintf, lrintl, llrint, llrintf, llrintl, memcpy, memset, printf, fprintf, pow, powf, powl, rint, rintf, rintl, sin, sinf, sinl, strcmp, strncmp, strcpy, strncpy, strlen, sqrt, sqrtf, sqrtl,
Опция включена по умолчанию
-fno-builtin-<func>
-fcommon (-fno-common)
-fsyntax-only
-fPIC (-fno-PIC)
-fpic (-fno-pic)
-fPIE (-fno-PIE)
-fpie (-fno-pie)
-frename-statics
-pg
-fprofile-arcs
-ftest-coverage
--coverage
11 Архитектурно-зависимые опции
-ffixed-<reg>
<reg>» для распределения. Данная опция распространяется только на те случаи, когда компилятор сам выбирает регистры из списка доступных. Опция НЕ влияет на случаи, когда регистр используется в соответствии с программными соглашениями (например, опция не влияет на распределение параметров функции). Опция используется, например, в случаях, когда значения между ассемблерными вставками передаются напрямую через регистры (а не через языковые переменные). Такие ситуации могут возникнуть, например, в системном софте, когда реализация "по-человечески" оказывается слишком сложной или неэффективной.
Допустимые значения параметра «<reg>»: g0, ..., g31, r0, ..., r63, pred0, ..., pred31
Опция является полным аналогом соответствующей опции gcc
-fcall-used-<reg>
<reg>» как портящийся при вызовах.
Компилятор при построении операций вызова будет сохранять значение данного регистра, а после операции вызова восстанавливать. Опция используется, например, в системном софте, когда операция вызова происходит нестандартными методами (без переключения регистрового окна и т.п.). Допустимые значения параметра «<reg>» аналогичны опции -ffixed-<reg>
Опция является полным аналогом соответствующей опции gcc
-masm-inline (-mno-asm-inline)
-masm-check (-mno-asm-check)
-mdmodel=<dmodel>
<dmodel>». Данная опция допустима только для режима -mptr64. Параметр опции может принимать следующие значения: medium, large
В режиме -mdmodel=medium компилятор предполагает, что ни статический (грубо говоря, языковая переменная), ни динамический (грубо говоря, результат вызова функции malloc) объект не может иметь размер, превышающий 4 Гб. Данный режим установлен по умолчанию
В режиме -mdmodel=large компилятор предполагает, что ограничения на размер в 4 Гб есть только у статических объектов. Динамические объекты могут иметь произвольные размеры
-mfunction-to-section=<section>:<function1>,<function1>,...
-mno-quad-memory-atomic
-mstrict-align (-mno-strict-align)
-mstrict-align, поскольку там нет эффективной аппаратной поддержки невыровненных обращений к памяти. Начиная с elbrus-v5 режим по умолчанию -mno-strict-align.
Режим -mstrict-align включается опциями -fkernel и -fsysware.
Опция -mno-strict-align игнорируется при компиляции для архитектур без эффективной поддержки невыровненных обращений к памяти. По сути, она нужна только для отмены режима -mstrict-align, неявно включаемого другими опциями, например: -mcpu=elbrus-v5 -fkernel -mno-strict-align.
В компиляторе есть похожая по смыслу опция -fpermit-unaligned, которая работает полностью независимым образом. Опция -fpermit-unaligned влияет на построение обращений к памяти, невыровненность которых явно следует из языка, и не влияет напрямую на работу оптимизаций. Опции -mstrict-align и -mno-strict-align влияют только на работу оптимизаций.
12 Опции отладочной информации
-g0
-gline
Опция используется для того, чтобы при дизассемблировании кода через дизассемблер «ldis» можно было видеть привязку операций к исходному тексту программы. Дизассемблер из утилиты «objdump» этого не умеет, поэтому о нём речи не идёт. Для обеспечения такой возможности компилятор строит дополнительные метаданные, которые затем дешифрует дизассемблер при печати кода. Эти метаданные построены с использованием секций отладочной информации в формате DWARF-2. Проблемой является то, что для работы дизассемблера данные в формате DWARF-2 нужно настраивать НЕ так, как это нужно для работы отладчика «gdb». Это приводит к тому, что если программа собрана с использованием опции -gline, то с ней будет практически невозможна привычная работа из-под отладчика
Поэтому в компиляторе предполагается, что режимы -gline и -g являются взаимосиключающими. При одновременном наличии в командной строке опций -gline и -g (или любого из синонимов опции -g), побеждает та опция, которая находится правее остальных. Т.е. нельзя построить код таким образом, чтобы с ним можно было одновременно работать в отладчике и видеть привязку к исходнику в дизассемблере
-g
-g1, -g2, -g3, -gdwarf-2, -gstabs, -ggdb, -ggdb1, -ggdb2, -ggdb3
-gvect
-fverbose-asm (-fno-verbose-asm)
-fident (-fno-ident)
-fgos-solver (-fno-gos-solver)
-fgos-profile
-fcold-Osize
13 Опции, управляющие спекулятивным режимом исполнения
-fcontrol-spec
-fno-control-spec
-fno-control-spec-globals
-fno-ld-spec
С данной опцией нельзя собирать исходники, в которых есть builtin-ы, раскрывающиеся в (полу)спекулятивные чтения (например, __builtin_prefetch) или открытые asm-вставки с (полу)спекулятивными чтениями.
-fno-fp-spec
Экспериментальный режим.
Данный режим используется в случае, если в компилируемом модуле есть необходимость обязательно перехватывать все исключительные ситуации при работе с вещественными данными. В то время, как спекулятивный режим может скрывать некоторые исключительные ситуации.
-fdisable-spec-ctp
14 Дополнительные опции
-faligned (-fno-aligned)
Смысл опции заключается в том, что программист как бы говорит компилятору "я обязуюсь, что в исходнике программы все обращения в память являются выровненными на свой формат", в результате чего компилятор может более эффективно выполнять некоторые оптимизации. Такими оптимизациями являются: apb (аппаратная подкачка массивов) и arracc (аппаратная поддержка доступа к массивам) для архитектур до elbrus-v4 включительно, автоматическая векторизация (в небольшой степени) и crp_opt (динамический разрыв зависимостей между чтениями и записями в память).
Необходимость в данной опции вызвана аппаратными особенностями Эльбруса. В архитектурах до elbrus-v5 включительно невыровненные обращения в память работают значительно медленнее выровненных. В архитектурах до elbrus-v4 включительно аппаратная подкачка массивов не умеет работать по невыровненным адресам; в elbrus-v5 это ограничение снято для всех операций, кроме 16-байтных; начиная с elbrus-v6 ограничение снято полностью. Таким образом, для elbrus-v6 и выше опция -faligned имеет смысл только для оптимизации crp_opt.
Использование опции -faligned при компиляции программы, содержащей невыровненные обращения в память, может привести к некорректному поведению программы. Для проверки выровненности обращений в память можно использовать опцию -faligned-check
По умолчанию для языков C/C++ включен режим -fno-aligned, для Фортрана -faligned
-fexclude-ctpr2
-fsysware
-fsemi-spec-lintel, -fno-spec-ld, -fno-global-regs, -mstrict-align, -fno-loop-apb, -fno-lcv, -fno-ipo-array-padding
-fkernel
-fcontrol-spec, -fforce-inline, -fprefetch, -fcache-opt, -fno-global-regs, -fno-strict-aliasing, -fno-loop-apb, -fno-loop-peeling, -fno-lcv, -fno-use-memcpy, -mstrict-align.
-fforbid-fp
Экспериментальный режим.
Компилятор может выполнять некоторые оптимизации, закладывающиеся на отсутствие вещественной арифметики. В случае использования вещественной арифметики компилятор может выдавать ошибку.
-finline (-fno-inline)
-finline-functions
-finline-to-small-functions (-fno-inline-to-small-functions)
По умолчанию компилятор самостоятельно решает какие функции лучше подставлять, пытаясь достичь разумного компромисса между увеличением времени компиляции и снижением времени исполнения программы. При этом подставляются в основном небольшие функции. Данная опция включает подстановку функций среднего размера в небольшие функции-обёртки, содержащие единственный вызов функции. Наличие данной опции может привести к дополнительному росту кода и замедлению компиляции.
-finline-static-functions (-fno-inline-static-functions)
-finline-functions-called-once (-fno-inline-functions-called-once)
-finline-incomplete-profile
-fno-error-always-inline
always_inline.
Компилятор обязан подставить функции с атрибутом always_inline во все точки вызова. При этом у компилятора есть свои технические ограничения на inline-подстановку, например, по размеру кода, профильной информации, различию режимов сборки функций при межмодульной оптимизации, некоторых языковых особенностей и т.д.. Если компилятор не может подставить функцию с атрибутом always_inline, то он по умолчанию выдаёт ошибку. По опции -fno-error-always-inline такие ошибки игнорируются и компиляция продолжается, несмотря на то, что часть функций с атрибутом always_inline не была подставлена. Т.е. опция влияет лишь на выдачу ошибки, но не влияет на inline-подстановку. В большинстве случаев игнорирование атрибута always_inline не является фатальным и приводит только к замедлению кода. Однако в редких случаях игнорирование может приводить к ошибке, если речь идёт о специфических кодах системного уровня, где наличие операции вызова функции приводит к недопустимому изменению контекста при работе аппаратуры (характерно для ядра операционной системы, драйверов и т.п.).
Стоит отметить, что подобные ошибки могут быть вызваны не только техническими ограничениями самого компилятора, но и некорректными действиями пользователя. Например, навешиванием атрибута always_inline на рекурсивную функцию или подачу опции -fforce-inline при компиляции большого исходника на языке C++.
-fsemantic-interposition (-fno-semantic-interposition)
-ffreestanding
-fhosted
-fstdlib (-fno-stdlib)
-fno-use-memcpy
-fno-use-memset
-finhibit-size-directive
-fvisibility=<visibility>
-fvisibility-inlines-hidden (-fno-visibility-inlines-hidden)
-ftls-model=<model>
-fstrict-aliasing
-fno-strict-aliasing
-fext-strict-aliasing
-fno-ext-strict-aliasing
-fipa-attrs (-fno-ipa-attrs)
-fskip-path-in-file-macro
-falign-functions (-fno-align-functions)
-falign-functions=<val>
-falign-jumps (-fno-align-jumps)
-falign-jumps=<val>
-fdevirtualize
-fno-tls-opt
-fno-tls-list=<proclist>
-fasm-entries-first
-fdata-sections (-fno-data-sections)
-ffunction-sections (-fno-function-sections)
-fno-optimize-sibling-calls
-fno-tail-calls
-fdelete-null-pointer-checks (-fno-delete-null-pointer-checks)
-fno-delete-null-pointer-checks
-fno-gnu-unique
-funsafe-struct-to-reg
При подаче данной опции не гарантируется корректное поведение программы в случае записи в поле структуры неинициализированных данных.
-ffortran-extern-commons (-fno-fortran-extern-commons)
Данная опция отменяет понижение области видимости common переменных в режиме -fwhole. Её необходимо подавать в режиме -fwhole в случае, когда в программе есть обращения к библиотечным переменным, описанным как common.
Режим по умолчанию -fno-fortran-extern-commons
-finit-locals-zero
При компиляции под Эльбрус в режиме -mptr32 и -mptr64 оптимизирующий компилятор инициализирует нулём некоторые скалярные автоматические переменные, которые могут быть использованы неинициализированными. Эта инициализация включена по умолчанию начиная с уровня -O1 и не может быть отключена опциями.
В режиме -mptr128 компилятор по умолчанию не инициализирует переменные. Поэтому программы, в которых есть использование неинициализированных данных (а это грубая ошибка в программе), могут успешно исполняться в режиме -mptr64 и ломаться в режиме -mptr128 из-за более строгого аппаратного контроля за неинициализированными данными. Таким образом, опция -finit-locals-zero позволяет облегчить портирование программ, написанных с ошибками, для режима -mptr128. При этом нужно понимать, что эта опция не исправляет ошибки, а лишь маскирует их.
Следует различать опции -finit-local-zero и -finit-locals-zero. Первая управляет поведением фронтенда языка Фортран, вторая управляет поведением оптимизирующего бэкенда для всех языков. По смыслу эти опции близки друг к другу.
Опция -finit-locals-zero игнорируется в режиме -fsanitize=*
15 Опции настройки выдачи ошибок
-Wfatal-errors (-Wno-fatal-errors)
-fmax-errors=<n>
16 Опции предупреждений
-Wabi
-Wabi=2
-Waddress
-Waggregate-return
-Waliasing
-Walign-commons
-Waligned-new
-Waligned-new=all
-Waligned-new=global
-Waligned-new=none
-Walignment-reduction-ignored
-Walignof-incomplete-type
-Wall
Для языков C/C++ эквивалентно комбинации опций -Waddress, -Warray-bounds, -Wc++11-compat, -Wc++14-compat, -Wchar-subscripts, -Wcomment, -Wenum-compare, -Wimplicit-int, -Wimplicit-function-declaration, -Wformat, -Wmain (только в режиме языка C), -Wmaybe-return-local-addr, -Wmaybe-uninitialized, -Wnonnull, -Wparentheses, -Wpointer-sign, -Wreorder, -Wreturn-type, -Wreturn-local-addr, -Wsequence-point, -Wsign-compare (только в режиме языка C++), -Wsigned-one-bit-field, -Wstrict-aliasing, -Wstrict-overflow=1, -Wtrigraphs, -Wtrigraphs, -Wuninitialized, -Wunused-function, -Wunused-label, -Wunused-local-typedefs, -Wunused-value, -Wunused-variable, -Wvolatile-register-var.
Для языка Фортран эквивалентно комбинации опций -Waliasing, -Wampersand, -Wc-binding-type, -Wconversion, -Winteger-division, -Wintrinsic-shadow, -Wintrinsics-std, -Wline-truncation, -Wmaybe-uninitialized, -Wreal-q-constant, -Wreturn-type, -Wsurprising, -Wtabs, -Wtarget-lifetime, -Wundefined-do-loop, -Wuninitialized, -Wunused, -Wzerotrip.
В данном случае слово "all" НЕ означает, что будут выдаваться все предупреждения (опция унаследована от gcc с тем же смыслом, что и в gcc). Для получения всех возможных предупреждений пользуйтесь опцией -Wall-warnings
-Walloc-size-check
-Walloc-zero
-Walloca
-Wampersand
-Warg-mismatch
-Wargument-mismatch
-Warray-bounds
-O2)
Пример кода, вызывающего данное предупреждение:
void func (void)
{
int x[5];
x[6] = 0;
}
Исключением являются выходы за границу для одномерных массивов размером в 1 элемент, расположенных в самом конце объекта и находящихся внутри структуры (которая может быть вложенной), в случаях, когда доступ к такому массиву идёт через указатель на структуру. Сделано это из тех соображений, что статистически значимым является технический приём по выделению памяти под структуру, при этом размер выделяемой памяти может быть большим, чем размер структуры. Пример кода, в котором формально есть выход за границу массива, но предупреждение НЕ выдаётся:
struct s
{
int n;
int a[1];
};
void func (void)
{
struct s *p;
int n = 3;
p = malloc (sizeof (struct s) + (n - 1) * sizeof (int));
p->n = n;
p->a[0] = 10;
p->a[1] = 20;
p->a[2] = 30;
}
-Warray-bounds=1
-Warray-bounds=2
-Warray-bounds-all
-Warray-temporaries
-Wassign-where-compare-meant
-Wattributes
-Wbad-function-cast
-Wbad-initializer-type
-Wbad-macro-redef
-Wbad-return-value-type
-Wbuiltin-declaration-mismatch
-Wbuiltin-functions-redefined
-Wc-binding-type
-Wc90-c99-compat
-Wc99-c11-compat
-Wc++-compat
-Wc++11-compat
-Wc++0x-compat
-Wc++14-compat
-Wcast-align
-Wcast-function-type
-Wcast-qual
-Wchar-subscripts
-Wcharacter-truncation
-Wclobbered
-Wcomment
-Wcomments
-Wcompare-reals
-Wconditionally-supported
-Wconstant-var-in-c-const-expr
-Wconstant-pointer-condition
-Wconstexpr-return-not-constant
-Wconversion
-Wconversion-extra
-Wconversion-function-not-usable
-Wconversion-null
-Wcoverage-mismatch
-Wctor-dtor-privacy
-Wdangling-else
-Wdate-time
-Wdeclaration-after-statement
-Wdeclaration-hides-builtin
-Wdelete-incomplete
-Wdelete-non-virtual-dtor
-Wdeprecated
-Wdeprecated-declarations
-Wdesignated-init
-Wdiv-by-zero
-Wdisabled-optimization
-Wdouble-promotion
-Wduplicated-branches
-Wduplicate-clobber
-Wduplicated-cond
-Wduplicate-specifier
-Wduplicate-type-qualifier
-Weffc++
-Wempty-body
-Wendif-labels
-Wenum-compare
-Weof-newline
-Wextern-inline-functions-redefined
-Wextra
-Wall.
Для языков C/C++ эквивалентно комбинации опций -Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-parameter-type, -Wold-style-declaration, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wmaybe-uninitialized, -Wunused-parameter.
Для языка Фортран эквивалентно комбинации опций -Wcompare-reals, -Wunused-parameter, -Wuninitialized.
-Wextra-semi
-Wextra-semicolon
-Wfloat-conversion
-Wfloat-equal
-Wfloat-equals
-Wformat
-Wformat=1
-Wformat-extra-args
-Wformat-nonliteral
-Wformat-overflow
-Wformat-overflow=1
-Wformat-overflow=2
-Wformat-security
-Wformat-signedness
-Wformat-truncation
-Wformat-truncation=0
-Wformat-truncation=1
-Wformat-truncation=2
-Wformat-y2k
-Wformat-zero-length
-Wformat=2
-Wfree-nonheap-object
-Wfunc-prototypes
-Wfunction-elimination
-Whsa
-Wignored-pragmas
-Wignored-qualifiers
-Wimplicit
-Wimplicit-fallthrough
-Wimplicit-fallthrough=0
-Wimplicit-fallthrough=1
-Wimplicit-fallthrough=2
-Wimplicit-fallthrough=3
-Wimplicit-fallthrough=4
-Wimplicit-fallthrough=5
-Wimplicit-function-declaration
-Wimplicit-int
Пример кода, вызывающего данное предупреждение:
func (void)
{
return 1;
}
-Wimplicit-interface
-Wimplicit-procedure
-Wimplicit-vector-conversion
-Wincorrect-attribute-fallthrough
-Winit-self
-Winline
-Winline-noinline-conflict
-Wint-conversion
-Wint-to-pointer-cast
-Winteger-division
-Wintrinsic-shadow
-Wintrinsics-std
-Winteger-sign-change
-Winvalid-builtin-arg
-Winvalid-memory-model
-Winvalid-pch
-Winvalid-pragma-parameter
-Winvalid-offsetof
-Wjump-misses-init
-Wline-truncation
-Wlogical-op
-Wlong-long
-Wlto-type-mismatch
-Wmain
-Wmaybe-return-local-addr
-Wmaybe-uninitialized
-Wmissing-braces
-Wmissing-declarations
-Wmissing-include-dirs
-Wmissing-field-initializers
-Wmissing-format-attribute
-Wmissing-initializer-in-constructor
-Wmissing-initializer-on-const
-Wmissing-noreturn
-Wmissing-parameter-type
-Wmissing-prototypes
-Wmixed-enum-type
-Wmultichar
-Wnarrowing
-Wnested-externs
-Wnoexcept
-Wnoexcept-type
-Wnonnull-compare
-Wnonstd-extra-comma
-Wnon-virtual-dtor
-Wnonnull
-Wnormalized
-Wnormalized=none
-Wnormalized=id
-Wnormalized=nfc
-Wnormalized=nfkc
-Wnull-conversion
-Wnull-dereference
-Wodr
-Wold-style-cast
-Wold-style-declaration
-Wold-style-definition
-Womit-vla-deallocate
-Wopenmp-simd
-Worphan-pragmas
-Woverflow
-Woverlength-strings
-Woverloaded-virtual
-Woverride-init
-Wpacked
-Wpacked-bitfield-compat
-Wpadded
-Wparam-id-list-needs-function-def
-Wparentheses
-Wpartial-overloaded-virtual
-Wpointer-arith
-Wpointer-qual
-Wpointer-sign
-Wpointer-to-int-cast
-Wpointer-to-int-cast-same-size
-Wpointer-to-int64-cast-protected
-Wpointer-to-pointer-cast
-Wpragma-unroll-check
-Wpsabi
-Wreal-and-imag-applied-to-real-value
-Wreal-q-constant
-Wrealloc-lhs
-Wrealloc-lhs-all
-Wreduced-alignment
-Wredundant-decls
-Wreorder
-Wrestrict
-Wreturn-local-addr
-Wreturn-type
-Wsequence-point
-Wshadow=global
-Wshadow=local
-Wshadow=compatible-local
-Wshadow
-Wshadow-local
-Wshadow-compatible-local
-Wshift-count-overflow
-Wsign-compare
-Wsign-conversion
-Wsign-promo
-Wsigned-one-bit-field
-Wsized-deallocation
-Wstack-protector
-Wstringop-overflow
-Wstringop-overflow=0
-Wstringop-overflow=1
-Wstringop-overflow=2
-Wstringop-overflow=3
-Wstringop-overflow=4
-Wshift-overflow
-Wshift-overflow=1
-Wshift-overflow=2
-Wstatic-reference-in-c99-inline-function
-Wstdfunc-prototypes
-Wstrict-aliasing
-Wstrict-aliasing=1
-Wstrict-aliasing=3 и -Wstrict-aliasing=2, но за счёт включения анализа приведений типов, потенциально ведущих к нарушениям правил перекрытия объектов в памяти может иметь большое количество ложных срабатываний. Работает только в режиме -fstrict-aliasing.
Пример кода, вызывающего данное предупреждение:
float f;
int *p = (int*) &f;
-Wstrict-aliasing=2
-Wstrict-aliasing=3, но за счёт увеличения количества шаблонов, по которым выдаются нарушения может иметь ложные срабатывания. Работает только в режиме -fstrict-aliasing.
Пример кода, вызывающего данное предупреждение:
void func (int *a)
{
float *b = (float*) a;
*b = 100.0;
}
-Wstrict-aliasing=3
-fstrict-aliasing.
Пример кода, вызывающего данное предупреждение:
void func (void)
{
int z = 0;
int *a = &z;
float *b = (float*) a;
*b = 100.0;
}
-Wstrict-null-sentinel
-Wstrict-overflow
-Wstrict-overflow=1
-Wstrict-overflow=2
-Wstrict-overflow=3
-Wstrict-overflow=4
-Wstrict-overflow=5
-Wstrict-prototypes
-Wsuggest-attribute=cold
cold. Такое предложение возникает если все пути от начала функции до выхода из неё будут проходить через вызов процедур, обладающих признаком cold.
-Wsuggest-attribute=const
const. Данный признак означает что процедура не имеет побочных эффектов. Т.е. её вызов с одинаковым аргументом в любой момент исполнения программы всегда даст один и тот же результат. Это свойство позволяет удалять несколько последовательно идущих вызовов, например:
a = cos(0);
a = cos(0);
a = cos(0);
a = cos(0);
Будет преобразовано к виду
a = cos(0);
Данный признак опасно выставлять процедурам, возвращаемое значение которых зависит от переменных, меняющихся в соседних потоках, или каким-либо образом зависимым от побочных эффектов
-Wsuggest-attribute=format
-Wsuggest-attribute=malloc
malloc. Такое предложение возникает если процедура всегда возвращает указатель на выделенную в ней память или нулевой указатель.
-Wsuggest-attribute=noreturn
noreturn. Такое предложение возникает если процедура никогда не возвращает управление. Т.е. если на любом пути исполнения будет стоять вызов noreturn процедур (например exit).
-Wsuggest-attribute=pure
pure. Данный атрибут означает что процедура не имеет побочных эффектов. Т.е. её вызов с одинаковым аргументом в любой момент исполнения программы всегда даст один и тот же результат. Это свойство позволяет удалять несколько последовательно идущих вызовов, например:
a = strlen(str);
a = strlen(str);
a = strlen(str);
a = strlen(str);
Будет преобразовано к виду
a = strlen(str);
Данный атрибут отличается от атрибута const тем что позволяет процедуре читать память, указатель на которую передаётся ей в качестве аргумента и возвращать значение в зависимости от его содержимого.
Данный атрибут опасно выставлять процедурам, возвращаемое значение которых зависит от переменных, меняющихся в соседних потоках, или каким-либо образом зависимым от побочных эффектов
-Wsuggest-override
-Wsurprising
-Wswitch
-Wswitch-default
-Wswitch-enum
-Wsync-nand
-Wsynth
-Wtabs
-Wtarget-lifetime
-Wtraditional
-Wtrampolines
-Wtrigraphs
-Wtrigraphs-ignored
-Wtype-limits
-Wtypedef-redefinition
-Wundef
-Wundefined-do-loop
-Wunderflow
-Wuninitialized
-Wunknown-pragmas
-Wunreachable-code
-Wunsafe-loop-optimizations
-Wunsuffixed-float-constants
-Wunused
-Wunused-builtin-result
-Wunused-but-set-parameter
-Wunused-but-set-variable
-Wunused-const-variable
-Wunused-const-variable=1
-Wunused-const-variable=2
-Wunused-dummy-argument
-Wunused-function
-Wunused-function-all
-Wunused-label
-Wunused-local-typedefs
-Wunused-macros
-Wunused-parameter
-Wunused-result
-Wunused-value
-Wunused-variable
-Wunused-variable-all
-Wuse-without-only
-Wvarargs
-Wvariadic-macros
-Wvector-operation-performance
-Wvla
-Wvoid-pointer-to-function-pointer-cast
-Wvolatile-register-var
-Wwrite-strings
-Wzero-as-null-pointer-constant
-Wzerotrip
-Wno-<id>
-Werror=<id> (-Werror-<id>)
-Wno-error=<id>
-Werror (-Wno-error)
-Wsystem-headers (-Wno-system-headers)
-Wall-warnings
-Wno-all-warnings
-pedantic
-pedantic-errors
-Wremarks (-Wno-remarks)
-W
-Wframe-larger-than=<size>
-Wlarger-than=
-Wstack-usage=
-Wpedantic
-w
17 Базовые опции оптимизаций
-O0
-Og
-O1
-O2
-O3
-O4
-Ominimal
-O
-Osize
-Os
-Ofast
18 Опции профилирования
-fprofile-use[=<file>]
-fprofile-generate[=<path>]
-fprofile-generate-parallel[=<path>]
-fprofile-generate-kernel
-fprofile-kernel-generate
-fprofile-subst=<old_module_name1>:<new_module_name1>,...
-fprofile-strict-names
-fprofile-values
-fprofile-skip-proc=<proc1,proc2,...>
-fprofile-skip-module=<module1,module2,...>
-fprofile-filter-files=<regex1;regex2;...>
-fprofile-exclude-files=<regex1;regex2;...>
19 Опции режима "вся программа"
-fwhole
lcc -O3 -fwhole foo.c -c
lcc -O3 -fwhole bar.c -c
lcc -O3 -fwhole foo.o bar.o -o myprog
В данном примере первые два запуска lcc записывают бинарное представление EIR в специальную секцию объектных файлов foo.o и bar.o. Последний запуск lcc читает EIR из foo.o и bar.o, объединяет представление и компилирует его как один модуль. Это позволяет более эффективно проводить межпроцедурные анализы и оптимизации. Например, можно выполнять inline-подстановку функций из foo.c в bar.c и наоборот. Также, компилятор видит все места вызова функций и использования глобальных переменных, и за счёт этого может более эффективно определить независимость обращений к памяти.
Другой (более простой) способ использования опции:
lcc -O3 -fwhole foo.c bar.c -o myprog
Важно помнить о том, что линковка должна запускаться через драйвер lcc. При этом оптимизационные опции должны подаваться на стадии линковки; исключение составляют следующие опции, наличие которых записывается в EIR индивидуально для каждой функции: -faligned, -fassociative-math, -frounding-math, -fforce-delin. Проще всего запомнить следующее правило: опция -fwhole и все оптимизационные опции должны подаваться как при компиляции, так и при линковке через драйвер lcc.
В режиме -fwhole можно объединять модули, написанные на разных языках:
lcc -O3 -fwhole foo.c -c
l++ -O3 -fwhole bar.cc -c
lfortran -O3 -fwhole baz.f90 -c
l++ -O3 -fwhole foo.o bar.o baz.o -lfcc -o myprog
Обратите внимание на то, что финальная линковка делается через l++, чтобы подключить библиотеки поддержки C++, и подаётся опция -lfcc, чтобы подключить библиотеки поддержки Fortran.
Опция -fwhole требует, чтобы на компиляцию подавалась вся программа, включая функцию main. Область видимости всех глобальных переменных и функций понижается, и они становятся недоступными извне. По этой причине режим -fwhole не подходит для сборки библиотек (как статических, так и динамических) - опцию запрещено использовать совместо с -fPIC, -fPIE и -shared. Для сборки динамических библиотек следует использовать опцию -fwhole-shared.
Опция -fwhole несовместима с некоторыми gnu-расширениями, влияющими на процесс линковки.
-fwhole-shared
-fPIC или -shared. Опция экспериментальная и сейчас корректность её работы не гарантируется.
Отличие от опции -fwhole состоит в том, что область видимости глобальных переменных и функций не понижается. Также, не требуется наличие всей программы. Это делает возможным использование опции для сборки динамических библиотек.
Важно помнить о том, что по умолчанию в режиме -fPIC реализация функции может быть переопределена снаружи библиотеки, из-за чего практически все межпроцедурные оптимизации и анализы невозможны. Поэтому опцию -fwhole-shared имеет смысл использовать только совместно с -fvisibility=protected. Пример использования:
lcc -O3 -fwhole-shared -fPIC -fvisibility=protected -c foo.c
lcc -O3 -fwhole-shared -fPIC -fvisibility=protected -c bar.c
lcc -O3 -fwhole-shared -fPIC -fvisibility=protected -c baz.c
lcc -O3 -fwhole-shared -fPIC -shared -o libexample.so foo.o bar.o baz.o -lc
Важной особенностью опции -fwhole-shared является то,
что она работает только совместно с опциями -fPIC или -shared, а без них игнорируется. Это сделано для того, чтобы было удобно собирать библиотеки. Обычно библиотека собирается запуском команды «make», при этом на выходе одновременно получается как статическая, так и динамическая библиотеки, причём задать разные опции для них обычно затруднительно. Если к такому запуску добавить опцию -fwhole, то файлы *.o, из которых будет собрана статическая библиотека, в реальности будут файлами с EIR, в то время как требуются файлы с кодом. Опция -fwhole-shared подходит для таких сценариев - в статическую библиотеку попадёт оптимизированный код (без межмодульных оптимизаций), а динамическая библиотека будет собрана с межмодульными оптимизациями.
Опция -fwhole-shared несовместима с некоторыми gnu-расширениями, влияющими на процесс линковки.
20 Опции поддержки динамической оптимизации
-fdo-prepare
-fdo-prog=<file>
-fdo-proc=<proc>
-fdo-prof=<file>
21 Опции анализатора производительности
-fopt-report
-fopt-report=<N>
(0) - выключить генерацию отчёта;
(1) - вывод краткой информации о применении ключевых оптимизаций (overlap, apb, vect и т.п.);
(2) - (значение по умолчанию) краткий отчёт о применении всех оптимизаций; для наиболее важных оптимизаций - краткое указание причин, по которым они не смогли отработать;
(3) - подробный отчёт о применении всех оптимизаций; для наиболее важных оптимизаций - краткое указание причин, по которым они не смогли отработать; для некоторых оптимизаций - оценка ускорения цикла;
(4) - подробный отчёт о применении всех оптимизаций; указание причин, по которым они не смогли отработать;
(5) - подробный отчёт о применении всех оптимизаций; указание причин, по которым они не смогли отработать; подсказки по улучшению производительности.
Таким образом, более высокие уровни отчёта полностью включают в себя более низкие уровни.
Язык выдачи отчёта можно задать с помощью переменных окружения: LC_ALL, LC_MESSAGES, LANG. Поддерживаются русский (ru_RU.KOI8-R, ru_RU.UTF-8) и английский (en_US) языки.
-fopt-report-file=<file>
.optrep»
В качестве значения можно указать «stdout» или «stderr», в этом случае вывод отчёта будет направлен в соответствующий стандартный поток вывода.
-fopt-report-append
-fopt-report-file - в этом случае отчёт для очередного входного файла не будет затирать отчёт от предыдущего файла, и все отчёты о применении оптимизаций для всех входных файлов окажутся в одном файле.
-fopt-report-dir=<dir>
.optrep»
-fopt-report-phase=<phase1,phase2,...>
-fopt-report-help
-fopt-report-routine=<name1,name2,...>
-fopt-report-help
22 Опции AddressSanitizer
-fsanitize=address
-fno-asan-globals (-fasan-globals)
-fno-asan-reads (-fasan-reads)
-fno-asan-writes (-fasan-writes)
-fno-asan-stack (-fasan-stack)
-fno-asan-dynamic-stack (-fasan-dynamic-stack)
-fno-sanitize-address-use-after-scope (-fsanitize-address-use-after-scope)
23 Опции LeakSanitizer
-fsanitize=leak
24 Опции MemorySanitizer
-fsanitize=memory
-fsanitize-memory-track-origins
-fsanitize-memory-track-origins=
-fno-sanitize-memory-track-origins
25 Опции пиковой производительности
-fblack-hole
-fblack-hole=<f>
-fno-loop-blocking
-fno-loop-jam
-fno-swp-ext
-fno-sr
-fno-loop-ivrm
-fno-loop-float-ivrm
-fno-vect
-fsafe-vect
-fno-loop-unroll
-fno-loop-unroll-jam
-fno-loop-part-unroll
Оптимизация частичной раскрутки циклов в ациклической части тела цикла выделяет небольшое подмножество наиболее горячих узлов, содержащее голову цикла и хотя бы один узел цикла с переходом по обратной дуге, и такое, что для каждого его узла хотя бы один предшественник и хотя бы один преемник принадлежат этому подмножеству. Если выделенная часть пригодна для дублирования и не содержит вызовов, то производится раскрутка выделенной части цикла.
Оптимизация включена по умолчанию и применяется только на статическом профиле.
-fno-loop-reroll
-floop-reverse (-fno-loop-reverse)
-fno-loop-nesting
-fno-loop-peeling
-fno-loop-full-peeling
-fno-loop-unswitching
-fno-loop-clustering
-fno-loop-permute
-fno-loop-invup
-fno-loop-utos
-fno-loop-asr
-fno-loop-fill-objs
-fno-gcp
-fno-rtmd
-fno-srtmd
-fno-switch-opt
-fvir (-fno-vir)
Может использовать для своей работы значительное количество памяти на стеке, что может потребовать увеличения лимита на стек для нормального исполнения программы.
-fno-comb-oper
-fno-memopt
-fforce-loop-apb
-fforce-loop-apb=
-fno-loop-apb
-fno-loop-apb=
-fno-dbl-mode
-floop-apb-conditional-loads (-fno-loop-apb-conditional-loads)
В защищённом режиме данная опция игнорируется.
-floop-nesting4swp
-fcfetch=<dist>,<gap>[,<priority>]
-fno-cfetch
-fno-dam
-fno-dam4swp
-fno-dam-call
-fdam-no-rbranch
-fswp-prefetch
-fswp-regs-priority
-fguess-prefetch=<n>
-fswp-maxopers=<n>
-fcache-opt
Данная опция существенно увеличивает длину пролога и эпилога конвейеризованного цикла. Таким образом, суммарный эффект от опции зависит от наличия данных в памяти и количества итераций цикла. Для коротких циклов (например, менее 10 итераций) эффект почти всегда будет отрицательным. Имеет смысл использовать данную опцию только в том случае, когда большинство циклов имеет большое количество итераций (порядка 100 и выше).
В качестве альтернативы можно использовать более консервативную опцию -fcache-opt-l2, либо вставлять в цикл операции предподкачки данных с помощью __builtin_prefetch.
Опция может существенно увеличивать время компиляции. Это вызвано тем, что компилятор итеративно пытается спланировать цикл с различными значениями задержки от операций чтения. При больших значениях задержки планирование может быть невозможно из-за нехватки регистров. Таким образом, для каждого цикла планирование может запускаться десятки раз. Для уменьшения времени компиляции можно увеличить шаг уменьшения задержки с помощью опции -fcache-opt-step.
-fcache-opt-l2
В данном режиме также включается опция -fswp-cache-opt=4
Данная опция увеличивает длину пролога и эпилога конвейеризованного цикла. Таким образом, суммарный эффект от опции зависит от наличия данных в кэш-памяти и количества итераций цикла. Для коротких циклов (например, менее 10 итераций) эффект скорее всего будет отрицательным. В отличие от -fcache-opt, данная опция значительно реже приводит к замедлению цикла из-за малого количества итераций.
-fcache-opt-grow=<f>
-fcache-opt-step=<n>
-fswp-cache-opt=<n>
-fno-prefetch
-fibranch-bound=<f>
-fnesting-prob=<f>
-fforce-swp
-fno-ibranch
-flist-prefetch
-fno-global-regs
-fkernel и -fsysware.
При использовании данной опции не гарантируется корректная работа приложений, требующих более 4 Гб стека.
-fprefetch
-fset-ld-delay=<n>
-fset-mau-delay=<n>
-fgsh-pull-bound=<f>
-fsgsh-renaming
-fsgsh-no-reg-pressure
-fblock-size-limit=<n>
-fipo-globals2regs[=n]
Компилятор находит все глобальные скалярные переменные, на которые не брался адрес, и распределяет наиболее часто используемые из них на глобальные регистры. Может быть использована только совместно с опциями -fwhole и -ffast. В случае ручного использования глобальных регистров (например, в asm-вставках либо при распределении переменной на регистр с помощью register asm) необходимо все использованные вручную регистры дополнительно перечислить в опциях -ffixed-g*.
-finline-level=<f>
-finline-scale=<f>
-finline-part-size=<n>
-fforce-inline
По умолчанию компилятор игнорирует спецификатор inline, безусловно подставляя только функции, помеченные __attribute__((always_inline)). Данная опция включает безусловную подстановку функций со спецификатором inline. Наличие данной опции может привести к чрезвычайно агрессивной работе inline и выдаче ошибки из-за нехватки памяти.
-finline-only-native
-fsr-ext
-fOsize-selective
-fOsize-selective=<f>
-fstruct-reorg (-fno-struct-reorg)
-fwhole. Также, желательно использовать профильную информацию (опция -fprofile-use).
Опция экспериментальная, корректность её работы не гарантируется.
-farray-reorg (-fno-array-reorg)
-fdata-reorg (-fno-data-reorg)
-fipo-cprop-arrays
-fipo-code-split
-fipo-cprop-globals
-fmain-l2g
-fipa0
-fipa1
-fipa2
-fmem-functions-subst
-fmalloc-opt (-fno-malloc-opt)
-ffast-mem
- считает, что функция malloc никогда не возвращает NULL
- считает, что оператор new/new[] не бросает исключение в случае нехватки памяти
- считает, что free/delete/delete[] корректно обрабатывает NULL (стандартное поведение - ничего не делать в случае нулевого указателя)
- удаляет проверку на NULL указателя, полученного в результате вызова new/new[]/malloc
- заменяет вызовы new/new[] на malloc (не влияет на вызов конструктора)
- заменяет вызовы delete/delete[] на free (не влияет на вызов деструктора)
- может выдавать ошибку, если обнаружена пользовательская реализация функций new/new[]/delete/delete[]/malloc/free
Если хотя бы одно из указанных выше условий не выполняется, либо пользователь переопределил одну из вышеупомянутых функций, использование опции -ffast-mem может привести к некорректному поведению программы. Если же все условия выполняются, то данная опция позволяет ускорить выделение/освобождение памяти.
Кроме того, компилятор взводит опцию -fmalloc-opt, позволяющую дополнительно оптимизировать выделение/освобождение памяти в некоторых случаях.
-fswitch-opt-ext
-fstrict-overflow
-fno-strict-overflow
-floop-fusion-late
-floop-split-by-cond
Оптимизация разбиения цикла цикла по условию разбивает цикл, в котором есть ветвление с независимыми ветками, на несколько независимых циклов.
Оптимизация выключена по умолчанию. Использование опции может приводить к исчерпанию стека.
-fforce-delin
-fforce-rtmd
-fforce-split-by-index
-frtmd-aggr
-fforce-unroll=<n>
-funroll-scale=<f>
-fforce-vect
-fforce-alignopt
-fno-ipo-const
-fno-ipo-cloning
-fptr-func-spec=<n>
-fmax-iter-for-ovlpeel=<n>
-frestrict-disable=<proc1,proc2,...>
-frestrict-params
-frestrict-all
-frestrict-unsafe
По умолчанию зависимости рвутся только между простыми обращениями к памяти, например, такими:
*p = a[i];
и только если одно из обращений к памяти выполняется по restrict-указателю, а другое - по произвольному имени либо по любому другому указателю. Данная опция включает разрыв зависимостей между простым обращением к памяти по restrict-указателю и всеми остальными (сколь угодно сложными) обращениями к памяти. Данная опция может приводить к некорректному поведению программы в случае нетривиальных обращений к памяти по restrict-указателю.
-fno-strength-reduce
-fvect-verbose
-fovl-verbose
-fzero-strides(-fno-zero-strides)
С помощью опции -fno-zero-strides можно разрешить анализу цикловых зависимостей считать, что шаг адреса операции обращения в память никогда не окажется нулевым, однако данный режим является экспериментальным и не гарантирует корректное поведение программы.
-floop-st-dcache-mode=<s>
Параметр опции может принимать следующие значения:
«nocache_wc» - в соответствии с эвристиками запрещается заведение строки в кэш-памяти всех уровней и включается режим write combining;
«nocache_wc_force» - безусловно в тех циклах, где это возможно, запрещается заведение строки в кэш-памяти всех уровней и включается режим write combining.
-fno-ipo-array-padding
-fautopar
Данная опция игнорируется при одновременной подаче с ней опции -fopenmp.
-fthreads=<n>
-fpar-numa=
-fpar-distr-mem=
-fral-esb-factor=<f>
-fswitch-process-ticks=<n>
-fsetjmp-opt
-flcv (-fno-lcv)
-fcanon-calls (-fno-canon-calls)
Оптимизация работает только в режиме -fwhole. Данная опция включена по умолчанию начиная с уровня -O2.
-fignore-getenv-call
-fpermit-unaligned
26 Опции, которые могут приводить к неточным преобразованиям
-ffast
-fstdlib, -faligned, -fno-math-errno, -fno-signed-zeros, -ffinite-math-only, -fno-rounding-math, -fcx-limited-range. -fprefetch, -fmalloc-opt, -floop-apb-conditional-loads, -fstrict-aliasing, -fext-strict-aliasing.
Данная опция выключена по умолчанию, поскольку включает преобразования с вещественной арифметикой, которые могут приводить к некорректным результатам в случае программ, предполагающих строгое соблюдение стандартов IEEE или ISO для вещественных операций и функций. Тем не менее, она может существенно увеличить скорость программ, не требующих строго соблюдения этих стандартов. Кроме того, опция включает некоторые потенциально опасные оптимизации (такие как loop-apb для чтений под условием, malloc-opt, удаление операций целочисленного деления), которые в определённых случаях могут приводить к некорректному поведению программы.
-fassociative-math (-fno-associative-math)
Для успешной работы требует взведения следующих опций: -fno-signed-zeros, -ffinite-math-only, -fno-rounding-math. Эти опции взводятся в режимах -ffast и -ffast-math.
Режим по-умолчанию -fno-associative-math.
-fmath-errno (-fno-math-errno)
-funsafe-math-optimizations (-fno-unsafe-math-optimizations)
-fassociative-math, -fno-signed-zeros.
Данная опция выключена по умолчанию, поскольку включает преобразования с вещественной арифметикой, которые могут приводить к некорректным результатам в случае программ, предполагающих строгое соблюдение стандартов IEEE или ISO для вещественных операций и функций. Тем не менее, она может существенно увеличить скорость программ, не требующих строго соблюдения этих стандартов.
Режим по-умолчанию -fno-unsafe-math-optimizations.
-ffast-math (-fno-fast-math)
-funsafe-math-optimizations, -ffinite-math-only, -fno-signaling-nans, -fno-rounding-math, -fno-math-errno, -fcx-limited-range.
Данная опция выключена по умолчанию, поскольку включает преобразования с вещественной арифметикой, которые могут приводить к некорректным результатам в случае программ, предполагающих строгое соблюдение стандартов IEEE или ISO для вещественных операций и функций. Тем не менее, она может существенно увеличить скорость программ, не требующих строго соблюдения этих стандартов.
-ffinite-math-only (-fno-finite-math-only)
-fsignaling-nans (-fno-signaling-nans)
-frounding-math (-fno-rounding-math)
Режим по-умолчанию -fno-rounding-math.
Данная опция является экспериментальной и в настоящий момент не гарантирует отключение всех оптимизаций, на которые может повлиять режим округления.
-fsigned-zeros (-fno-signed-zeros)
-fno-safe-call-params
-fcx-limited-range (-fno-cx-limited-range)
-fcx-fortran-rules (-fno-cx-fortran-rules)
-fexcess-precision=fast
-fexcess-precision=standard
-ffp-contract=style
27 Расширенные опции управления процессом компиляции
-B<prefix> (-B <prefix>)
-Wa,<opt1>,<opt2>...
-Wc,<opt1>,<opt2>...
-Wl,<opt1>,<opt2>...
-Wl2,<opt1>,<opt2>...
-Wp,<opt1>,<opt2>...
-Xlinker <opt1>,<opt2>...
-x<lang> (-x <lang>)
<lang>» последующих входных файлов (даже если компилятор может выбрать язык на основании суффикса имени файла). Эта опция действует на все входные файлы вплоть до следующего появления опции -x. Возможными значениями для языка являются: c, c-header, cpp-output, c++, c++-header, c++-cpp-output, f77, f77-cpp-input, f95, f95-cpp-input, assembler, assembler-with-cpp
Опция -x none выключает любое указание языка так, что последующие файлы обрабатываются в соответствии с суффиксами имен файлов (как если бы -x вовсе бы не указывалось).
@<file>
28 Опции управления линковкой
-static (-dynamic)
-dynamic.
-L<dir> (-L <dir>)
-l<name> (-l <name>)
-nodefaultlibs
-nostartfiles
-nostdlib
-pie (-no-pie)
-rdynamic
-shared
-shared-libgcc
-static-libgcc
-static-libstdc++
-static-libgfortran
-shared-libasan
-static-libasan
-symbolic
29 Опции передаются линкеру
-e<entry> (-e <entry>)
-h<soname> (-h <soname>)
-R<path> (-R <path>)
-r
-s
-T<script> (-T <script>)
-u<symname> (-u <symname>)
-z<keyword> (-z <keyword>)
30 Опции печати и настройки конфигурации
--version
-dumpversion предназначена для того, чтобы её распознавать в автоматическом режиме всякими системами автоконфигурации. А опция --version для того, чтобы читать глазами. Такое же и отличие от опции -print-version, которая предназначена для автоматического разбора (но уже теми программами, которые изначально писались под lcc, а не под gcc).
-dumpmachine
-dumpversion
-print-multiarch
-print-file-name=<lib>
-print-prog-name=<prog>
-print-search-dirs
-print-libgcc-file-name
-print-version
-set-target-build <target-build>
-print-home-dir
-set-home-dir <dir>
-print-binutils-dir
-set-binutils-dir <dir>
--sysroot <dir> (--sysroot=<dir>)
-print-sysroot
-isysroot <dir> (-isysroot=<dir>)
-print-config
-print-config=all
-print-config=<name>
<name>». Параметр опции может принимать следующие значения: all, target-arch, target-os, target-build, cross-compiler, version, gcc-version, build-date, home-dir, binutils-dir, fs-dir, rfs-dir. Опция используется при сборке библиотек run-time поддержки и при сборке дистрибутива. Конечному пользователю использовать опцию не рекомендуется (но не запрещается), т.к. поведение опции может меняться при изменении версии компилятора
-print-mode
-print-mode=all
-print-mode=<name>
<name>». Параметр опции может принимать следующие значения: all, cpu, ptr, libc. Опция используется при сборке библиотек run-time поддержки и при сборке дистрибутива. Конечному пользователю использовать опцию не рекомендуется (но не запрещается), т.к. поведение опции может меняться при изменении версии компилятора
-print-internal-dir
-print-internal-dir=all
-print-internal-dir=<name>
<name>». Параметр опции может принимать следующие значения: all, base, bin, lib, include, include-c++, include-c++-stl, fccn-include, fccn-mod, dsp-include, libmcst-lib, libmcst-include. Опция используется при сборке библиотек run-time поддержки и при сборке дистрибутива. Конечному пользователю использовать опцию не рекомендуется (но не запрещается), т.к. поведение опции может меняться при изменении версии компилятора
-print-recognized-environment
31 Опции форматирования выдачи компилятора
-fmessage-length=<num>
<num>» символов на ширину выдаваемых сообщений. Если выдаваемое сообщение не влезает в данное ограничение, то оно разбивается на несколько строк. Если значение «<num>» равно «0», то ограничение на ширину отсутствует. На текущий момент все остальные значения параметра трактуются как ограничение ширины сообщений по умолчанию (80 символов).
32 Опции для повторения внутренних свойств gcc
-ftext-switch-table
-fcopy-aggregate-memcpy[=<size>]
33 Опции для имитации поведения gcc под x86
-mmmx
__MMX__
Остальная часть описания касается всех опций из данной группы
В gcc данные опции отвечают за то, что в x86 называется "расширение системы команд". Это операции, которые формально НЕ включены в состав базовой системы команд и находятся в статусе "расширения". Это означает, что набор операций может отсутствовать на некоторых моделях процессора, даже в том случае, если на других моделях процессоров данной серии набор операций присутствует. Опции выполняют две функции: разрешают компилятору самостоятельно использовать набор операций из соответствующего расширения и включают соответствующий предопределённый макрос
Когда речь идёт о процессорах "Эльбрус", то в них нет такого понятия, как "расширение системы команд", поэтому нет необходимости управлять компилятором в вопросе расширений. Таким образом, для компилятора "Эльбрус" данные опции не имеют никакого смысла. Они поддержаны только ради того, чтобы не спотыкаться об уже имеющиеся опции, которые по умолчанию включены в систему сборки некоторых программ. Напрямую сравнивать поведение опций в lcc и в gcc нельзя, т.к. поведение некоторых опций в gcc зависит от конкретной сборки gcc. Зависимость растёт от того, под какой минимальный процессор x86 сконфигурирован gcc. В зависимости от этого часть данных опций будет включена по умолчанию. А поведение некоторых опций зависит от того, включена опция по умолчанию, или нет. В случае lcc компилятор настроен таким образом, что все опции данной группы по умолчанию включены. Т.е. поведение lcc соответствует поведению некоторой абстрактной версии gcc, которая сконфигурирована под максимально возможный процессор x86. Обращаем внимание на то, что действие включающих и выключающих опций НЕ симметрично (аналогично тому, как это имеет место быть на gcc под x86)
Мы НЕ рекомендуем использовать опции -mno-* в качестве средства для борьбы с ошибками сборки программ. Если опция -mno-* помогла в сборке, то это в первую очередь говорит о том, что программа написана неаккуратно. Т.е. под соответствующий макрос был внесён какой-то код, напрямую к данному макросу отношения не имеющий. Более правильным вариантом было бы исправить код. Фактически это является частью процесса портирования под "Эльбрус" программы, изначально реализованной под x86
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-mssse3
-mno-ssse3
-msse4.1
-mno-sse4.1
-msse4.2
-mno-sse4.2
-msse4
-mno-sse4
-mavx
-mno-avx
-m3dnow
-mno-3dnow
-m3dnowa
-mno-3dnowa
-msse4a
-mno-sse4a
-mfma4
-mno-fma4
-mxop
-mno-xop
-maes
-mno-aes
-mpclmul
-mno-pclmul
-mrdrnd
-mno-rdrnd
-mbmi
-mno-bmi
-mtbm
-mno-tbm
-mabm
-mno-abm
-mf16c
-mno-f16c
-mpopcnt
-mno-popcnt
-mrdseed
-mno-rdseed
-mlzcnt
-mno-lzcnt
-mmwaitx
-mno-mwaitx
-mclzero
-mno-clzero
-mclflushopt
-mno-clflushopt
-mclwb
-mno-clwb
-mbmi2
-mno-bmi2
-mfma
-mno-fma
-mavx2
-mno-avx2
-msha
-mno-sha
34 Игнорируемые опции (для совместимости с gcc)
-F <dir> (-F<dir>)
-faggressive-loop-optimizations (-fno-aggressive-loop-optimizations)
-falign-labels (-fno-align-labels)
-falign-labels=<val>
-falign-loops (-fno-align-loops)
-falign-loops=<val>
-fasm (-fno-asm)
-fbranch-count-reg
-fbuilding-libgcc
-fcse-follow-jumps (-fno-cse-follow-jumps)
-fcse-skip-blocks (-fno-cse-skip-blocks)
-fcheck-new (-fno-check-new)
-fcode-hoisting (-fno-code-hoisting)
-fconserve-stack (-fno-conserve-stack)
-fdebug-prefix-map=<old>=<new>
-fdefer-pop (-fno-defer-pop)
-fdiagnostics-show-location=<val>
-fdiagnostics-show-option (-fno-diagnostics-show-option)
-fdollars-in-identifiers (-fno-dollars-in-identifiers)
-fdwarf2-indirect-strings (-fno-dwarf2-indirect-strings)
-felide-constructors
-feliminate-unused-debug-symbols (-fno-eliminate-unused-debug-symbols)
-feliminate-unused-debug-types (-fno-eliminate-unused-debug-types)
-femit-struct-debug-baseonly (-fno-emit-struct-debug-baseonly)
-femit-struct-debug-reduced (-fno-emit-struct-debug-reduced)
-femit-struct-debug-detailed=<list> (-fno-emit-struct-debug-detailed=<list>)
-fenforce-eh-specs (-fno-enforce-eh-specs)
-fexpensive-optimizations (-fno-expensive-optimizations)
-ffat-lto-objects (-fno-fat-lto-objects)
-ffile-prefix-map=<old>=<new>
-ffloat-store (-fno-float-store)
-fforce-addr
-fforce-mem
-fimplement-inlines (-fno-implement-inlines)
-fimplicit-templates (-fno-implicit-templates)
-fimplicit-inline-templates (-fno-implicit-inline-templates)
-finline-limit-<num> (-finline-limit=<num>)
-finline-small-functions (-fno-inline-small-functions)
-fipa-sra (-fno-ipa-sra)
-fkeep-inline-functions (-fno-keep-inline-functions)
-flifetime-dse (-fno-lifetime-dse)
-flifetime-dse=<val>
-flto (-fno-lto)
-flto=<n>
-flto-compression-level=<n>
-flto-partition=<alg>
-flto-report (-fno-lto-report)
-flto-report-wpa (-fno-lto-report-wpa)
-fmacro-prefix-map=<old>=<new>
-fmerge-all-constants (-fno-merge-all-constants)
-fms-extensions (-fno-ms-extensions)
-fnon-call-exceptions (-fno-non-call-exceptions)
-fomit-frame-pointer (-fno-omit-frame-pointer)
-foptimize-register-move (-fno-optimize-register-move)
-foptimize-sibling-calls
-fpch-deps
-fprefetch-loop-arrays (-fno-prefetch-loop-arrays)
-fpreprocessed
-frandom-seed=<string>
-fregmove (-fno-regmove)
-frename-registers (-fno-rename-registers)
-freorder-blocks (-fno-reorder-blocks)
-frerun-cse-after-loop (-fno-rerun-cse-after-loop)
-frerun-loop-opt (-fno-rerun-loop-opt)
-fsanitize-recover=(-fno-sanitize-recover=)
-fsanitize-recover=all (-fno-sanitize-recover=all)
-fno-sanitize=all (-fno-sanitize=all)
-fsanitize=float-divide-by-zero (-fno-sanitize=float-divide-by-zero)
-fsanitize=function (-fno-sanitize=function)
-fsanitize=undefined (-fno-sanitize=undefined)
-fsanitize=vptr (-fno-sanitize=vptr)
-fschedule-insns (-fno-schedule-insns)
-fschedule-insns2 (-fno-schedule-insns2)
-fsecond-underscore (-fno-second-underscore)
-fshow-column (-fno-show-column)
-fsingle-precision-constant (-fno-single-precision-constant)
-fstack-check (-fno-stack-check)
-fstack-clash-protection (-fno-stack-clash-protection)
-fstack-protector (-fno-stack-protector)
-fstack-protector-all (-fno-stack-protector-all)
-fstack-protector-explicit (-fno-stack-protector-explicit)
-fstack-protector-strong (-fno-stack-protector-strong)
-fstdarg-opt (-fno-stdarg-opt)
-fsync-libcalls (-fno-sync-libcalls)
-fthread-jumps (-fno-thread-jumps)
-fthreadsafe-statics (-fno-threadsafe-statics)
-ftoplevel-reorder (-fno-toplevel-reorder)
-ftrapping-math (-fno-trapping-math)
-ftree-ccp (-fno-tree-ccp)
-ftree-copyrename (-fno-tree-copyrename)
-ftree-copy-prop (-fno-tree-copy-prop)
-ftree-dominator-opts (-fno-tree-dominator-opts)
-ftree-fre (-fno-tree-fre)
-ftree-loop-distribute-patterns (-fno-tree-loop-distribute-patterns)
-ftree-loop-im (-fno-tree-loop-im)
-ftree-pre (-fno-tree-pre)
-ftree-ter (-fno-tree-ter)
-ftree-vectorize (-fno-tree-vectorize)
-ftree-vrp (-fno-tree-vrp)
-funit-at-a-time (-fno-unit-at-a-time)
-funroll-loops (-fno-unroll-loops)
-funroll-all-loops (-fno-unroll-all-loops)
-fuse-linker-plugin (-fno-use-linker-plugin)
-fvar-tracking (-fno-var-tracking)
-fvar-tracking-assignments (-fno-var-tracking-assignments)
-fweb (-fno-web)
-fno-working-directory
-fwrapv (-fno-wrapv)
-malign-jumps (-mno-align-jumps)
-malign-jumps=<val>
-mpreferred-stack-boundary=<val>
-mfpmath=<val>
--param <str> (--param=<str>)
-pipe (--pipe)
35 Игнорируемые опции (для совместимости с прошлыми версиями lcc)
-fipa3
-fcorrect-prefetchL1-sched
-ffast-adfp
-fgsh
-mkernel-profile
-fclone-by-profile
-fipo-invup
-fforce-loop2scalar
-fipo-min-region-size=
-fipo-max-region-size=
-fno-ipo-region
36 Поддерживаемые переменные окружения
TMPDIR
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
DEPENDENCIES_OUTPUT
SUNPRO_DEPENDENCIES
LIBRARY_PATH
LC_ALL
LC_MESSAGES
LANG
MCST_CFLAGS_FILE
MCST_PROF_DIR
MCST_PROF_DIR_PROG