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
--tempdir <dir>
-save-temps
-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
, во внимание принимается только опция -mtune
, а опция -march
игнорируется
-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, elbrus-v7
. При одновременном наличии в командной строке опций -march
и -mtune
, опция -march
игнорируется
Системы команд процессоров семейства "Эльбрус" с точки зрения совместимости можно выстроить в следующем порядке: "система команд v2" - "система команд v3" - "система команд v4" - "система команд v5" - "система команд v6" - "система команд v7". Программы, скомпилированные в более ранней системе команд (согласно этой линейке слева направо), смогут исполняться на процессорах с более поздней системой команд. Программы, скомпилированные в более поздней системе команд, НЕ смогут исполняться на процессорах с более ранней системой команд (операционная система не позволит эти программы запустить). Новые процессоры, которые могут появиться в будущем, в цепочку становятся с правой стороны
-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=elbrus-v7
- компилировать программу под систему команд v7. Программа сможет исполняться на процессорах с системой команд v7 и выше
-march=native
- для native-компилятора включить режим -march
со значением, соответствующим модели процессора, на котором в настоящий момент запускается компилятор. Для cross-компилятора включить режим компилятора по умолчанию в отношении настройки target-процессора
-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, c17, c18, iso9899:2017, iso9899:2018, gnu17, gnu18
. По умолчанию установлен режим -std=gnu18
В режиме языка 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, c++20, gnu++20
. По умолчанию установлен режим -std=gnu++14
. Для языков C++17 и C++20 поддержка экспериментальная
В режиме языка Fortran параметр может принимать значения: f95, f2003, f2008, gnu, legacy, f2008ts, f2018
. По умолчанию установлен режим -std=gnu
-ansi
-gcc-version <version>
-fopenmp (-fno-openmp)
-fopenmp-simd (-fno-openmp-simd)
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
, у которого вторым аргументом идёт величина выравнивания
-fchar8_t (-fno-char8_t)
char8_t
. Это свойство появилось в стандарте C++20, где оно поддерживается по умолчанию, но по опции поддержку можно включить и при использовании более ранних стандартов
-fextended-identifiers (-fno-extended-identifiers)
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
-funconstrained-commons (-fno-unconstrained-commons)
-fall-intrinsics
-fallow-argument-mismatch (-fno-allow-argument-mismatch)
-fallow-invalid-boz
-fallow-leading-underscore
-fautomatic (-fno-automatic)
-fbackslash
-fcray-pointer
-fd-lines-as-code
-fd-lines-as-comments
-fdec (-fno-dec)
-fdec-blank-format-item (-fno-dec-blank-format-item)
-fdec-char-conversions (-fno-dec-char-conversions)
-fdec-format-defaults (-fno-dec-format-defaults)
-fdec-intrinsic-ints (-fno-dec-intrinsic-ints)
-fdec-math (-fno-dec-math)
-fdec-static (-fno-dec-static)
-fdec-structure (-fno-dec-structure)
-fdefault-double-8
-fdefault-integer-8
-fdefault-real-8
-fdefault-real-10
-fdefault-real-16
-fdiagnostics-show-caret (-fno-diagnostics-show-caret)
-fdiagnostics-show-location=<val>
-fdiagnostics-show-option (-fno-diagnostics-show-option)
-fdollar-ok
-fno-f2c
-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)
-ffortran-check-internal-func (-fno-fortran-check-internal-func)
-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, huge
В режиме -mdmodel=medium
компилятор предполагает, что ни статический (грубо говоря, языковая переменная), ни динамический (грубо говоря, результат вызова функции malloc
) объект не может иметь размер, превышающий 4 Гб. Данный режим установлен по умолчанию
В режиме -mdmodel=large
компилятор предполагает, что ограничения на размер в 4 Гб есть только у статических объектов. Динамические объекты могут иметь произвольные размеры
В режиме -mdmodel=huge
как статические, так и динамические объекты могут иметь произвольные размеры. Режим экспериментальный
-mfunction-to-section=<section>:<function1>,<function2>,...
-mno-quad-memory-atomic
-mno-unaligned-type-atomic
-mstrict-align (-mno-strict-align)
-mstrict-align
, поскольку там нет эффективной аппаратной поддержки невыровненных обращений к памяти. Начиная с elbrus-v5 режим по умолчанию -mno-strict-align
.
Режим -mstrict-align
включается опциями -fkernel
и -fsysware
.
Опция -mno-strict-align
игнорируется при компиляции для архитектур без эффективной поддержки невыровненных обращений к памяти. По сути, она нужна только для отмены режима -mstrict-align
, неявно включаемого другими опциями, например: -march=elbrus-v5 -fkernel -mno-strict-align
.
В компиляторе есть похожая по смыслу опция -fpermit-unaligned
, которая работает полностью независимым образом. Опция -fpermit-unaligned
влияет на построение обращений к памяти, невыровненность которых явно следует из языка, и не влияет напрямую на работу оптимизаций. Опции -mstrict-align
и -mno-strict-align
влияют только на работу оптимизаций.
-fpermit-unaligned
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, -gno-as-loc-support
-gline-tables-only
--dwarf2-64bit (--no-dwarf2-64bit)
-grecord-gcc-switches (-gno-record-gcc-switches)
-gvect
-fverbose-asm (-fno-verbose-asm)
-fident (-fno-ident)
-frecord-gcc-switches (-fno-record-gcc-switches)
13 Опции, управляющие спекулятивным режимом исполнения
-fsemi-spec-ld (-fno-semi-spec-ld)
Данное преобразование позволяет сократить критический путь и планировать код более плотно. Однако, такая оптимизация может приводить к дополнительной нагрузке на подсистему памяти и увеличению количества прерываний, вызванных отсутствием страниц в физической памяти.
Следует отметить, что данная опция лишь разрешает подобные преобразования, однако, она не влияет непосредственно на включение соответствующих оптимизаций. Оптимизации, способные ставить операции в (полу)спекулятивный режим, включаются начиная с уровня -O2
.
Опция -fno-semi-spec-ld
не только запрещает оптимизациям ставить операции чтения в полуспекулятивный режим, но и включает контроль отсутствия таких операций в открытых asm-вставках с выдачей пользовательских ошибок.
На практике режим -fno-semi-spec-ld
используется в основном для сборки очень специфичных программ, в которых лишние прерывания недопустимы (ядро и загрузчик операционной системы, драйвера и т.п.).
Режим по умолчанию: -fsemi-spec-ld
-fsemi-spec-ld-glob (-fno-semi-spec-ld-glob)
-fno-semi-spec-ld
. Её использование имеет смысл только совместно с -fno-semi-spec-ld
или -fkernel
.
-fsemi-spec-ld-stack (-fno-semi-spec-ld-stack)
-fno-semi-spec-ld
. Её использование имеет смысл только совместно с -fno-semi-spec-ld
или -fkernel
.
-fsemi-spec-ld-greg (-fno-semi-spec-ld-greg)
-fno-semi-spec-ld
. Её использование имеет смысл только совместно с -fno-semi-spec-ld
или -fkernel
.
-fsemi-spec-lintel (-fno-semi-spec-lintel)
-mptr32
разрешается ставить в полуспекулятивный режим только операции ldgdb,ldgdh,ldgdw,ldgdd,ldgdqp. В режиме -mptr64
разрешается ставить в полуспекулятивный режим только операции ldb,ldh,ldw,ldd,ldqp. Запрещается ставить в спекулятивный режим сегментные операции записи.
Режим -fsemi-spec-lintel
включается опцией -fsysware
.
Режим по умолчанию -fno-semi-spec-lintel
-fspec-ld (-fno-spec-ld)
-fspec-ld
для снятия предиката необходимо строить компенсирующий код, в котором неспекулятивное чтение перечитывает нужное значение из памяти; переход на этот компенсирующий код выполняется под предикатом исходного чтения.
Данное преобразование позволяет сократить критический путь и планировать код более плотно. Однако, плотность кода получается значительно ниже, чем при использовании полуспекулятивных чтений в режиме -fsemi-spec-ld
. Поэтому постановка чтения в спекулятивный режим применяется только в том случае, когда полуспекулятивный режим запрещён опцией либо не является выгодным для данной операции по внутренним эвристикам оптимизаций.
Следует отметить, что данная опция лишь разрешает подобные преобразования, однако, она не влияет непосредственно на включение соответствующих оптимизаций. Оптимизации, способные ставить операции в (полу)спекулятивный режим, включаются начиная с уровня -O2
.
Опция -fno-spec-ld
не только запрещает оптимизациям ставить операции чтения в спекулятивный режим, но и включает контроль отсутствия таких операций в открытых asm-вставках с выдачей пользовательских ошибок.
Режим по умолчанию: -fspec-ld
-fspec-fp (-fno-spec-fp)
Экспериментальный режим.
Режим -fno-spec-fp
используется в случае, если в компилируемом модуле есть необходимость обязательно перехватывать все исключительные ситуации при работе с вещественными числами. В то время, как спекулятивный режим может скрывать некоторые исключительные ситуации.
Режим по умолчанию -fspec-fp
-fspec-ctp (-fno-spec-ctp)
Режим по умолчанию -fspec-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-inline-part
, -fno-lcv
, -fno-ipo-array-padding
-fkernel
-fno-semi-spec-ld
, -fsemi-spec-ld-glob
, -fsemi-spec-ld-stack
, -fsemi-spec-ld-greg
, -fforce-inline
, -fprefetch
, -fcache-opt
, -fno-global-regs
, -fno-loop-peeling
, -fno-inline-part
, -fno-lcv
, -fno-use-memcpy
, -mstrict-align
.
-fforbid-fp
Компилятор может выполнять некоторые оптимизации, закладывающиеся на отсутствие вещественной арифметики. В случае использования вещественной арифметики компилятор может выдавать ошибку.
-finline (-fno-inline)
-finline-functions
-finline-part (-fno-inline-part)
-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)
-funsafe-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=<proc1,proc2,...>
-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
-fstruct-to-reg ( -fno-struct-to-reg)
-O1
).
-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 Опции форматирования выдачи компилятора
-fmessage-length=<num>
<num>»
символов на ширину выдаваемых сообщений. Если выдаваемое сообщение не влезает в данное ограничение, то оно разбивается на несколько строк. Если значение «<num>»
равно «0»
, то ограничение на ширину отсутствует. На текущий момент все остальные значения параметра трактуются как ограничение ширины сообщений по умолчанию (80 символов).
-fdiagnostics-color
-fno-diagnostics-color
-fdiagnostics-color=<val>
16 Опции настройки выдачи ошибок
-Wfatal-errors (-Wno-fatal-errors)
-fmax-errors=<n>
17 Опции предупреждений
-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-but-set-variable
, -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
-Wall-protected
-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
-Wattribute-alias
-Wattribute-alias=1
-Wattribute-alias=2
-Wattributes
-Wbad-function-cast
-Wbad-initializer-type
-Wbad-macro-redef
-Wbad-return-value-type
-Wbuiltin-declaration-mismatch
-Wbuiltin-functions-redefined
-Wc-binding-type
-Wc11-c2x-compat
-Wc90-c99-compat
-Wc99-c11-compat
-Wc++-compat
-Wc++11-compat
-Wc++0x-compat
-Wc++14-compat
-Wc++20-extensions
-Wcast-align
-Wcast-align=strict
-Wcast-function-type
-Wcast-qual
-Wchar-subscripts
-Wcharacter-truncation
-Wclobbered
-Wcomment
-Wcomments
-Wcompare-reals
-Wconditionally-supported
-Wconstant-evaluated-nonconstexpr
-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-copy
-Wdeprecated-copy-dtor
-Wdeprecated-declarations
-Wdesignated-init
-Wdiscarded-qualifiers
-Wdiv-by-zero
-Wdisabled-optimization
-Wdouble-promotion
-Wduplicated-branches
-Wduplicate-clobber
-Wduplicated-cond
-Wduplicate-specifier
-Wduplicate-type-qualifier
-Weffc++
-Wempty-body
-Wempty-throw-specification
-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-attribute-cleanup
-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
-Wincompatible-pointer-types
-Wincompatible-types-conditional-operator
-Wincorrect-attribute-fallthrough
-Wincorrect-no-math-errno
-fno-math-errno
, однако запись в переменную errno
по факту производится в данной функции или в вызываемых ею функциях.
-Winit-self
-Winline
-Winline-noinline-conflict
-Wint-conversion
-Wint-to-pointer-cast
-Wint-to-pointer-cast-same-size
-Wint32-to-pointer-cast-protected
-Wint64-to-pointer-cast-protected
-Wint128-to-pointer-cast-protected
-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
int foo( int par) { int x; if( par > 0 ) x = 1000 / par; return x; }
Если параметр «par» всегда больше нуля, то «x» будет всегда
инициализирован, однако lcc не знает об этом. Для подавления предупреждения в данном случае достаточно инициализировать «x» в начале функции или добавить блок else
с вызовом функции abort() или чем-то подобным.
Предупреждение не выдаётся для переменных, объявленных как volatile
.
Предупреждения выдаются начиная с уровня -O1
.
Некоторые избыточные предупреждения можно избежать, если пометить атрибутом noreturn
все функции, которые никогда не возвращают управление.
-Wmaybe-uninitialized-extra
-Wmaybe-uninitialized
, но в отличие от этого режима работает не только со скалярными переменными, но и с переменными типа структура и класс.
Также, по сравнению с -Wmaybe-uninitialized
выдаётся значительно больше предупреждений, в т.ч. для скалярных переменных. Это позволяет находить больше ошибок на этапе компиляции, но с другой стороны, анализ может выдавать больше ложных предупреждений.
Данные предупреждения включаются отдельной опцией, поскольку компилятор lcc выдаёт значительно больше предупреждений, чем gcc. В частности, lcc выдаёт предупреждение в случае возврата по значению или копирования в другую переменную частично инициализированной структуры, в то время как gcc в этих случаях предупреждений не печатает.
Предупреждения выдаются начиная с уровня -O1
.
-Wmaybe-use-out-of-scope
Запись адреса локальной переменной в другую локальную переменную с более широкой областью видимости. Пример кода:
{ int * ptr; ... if(...) { int var; ptr = &var; } ... }
Запись адреса локальной переменной (не параметра) в параметр. Пример кода:
void foo(int * ptr) { if(...) { int var; ptr = &var; } }
Запись адреса локальной переменной или параметра в глобальную переменную. Пример кода:
int * global_ptr; void foo( int par) { int var; global_ptr = &var; global_ptr = ∥ }
Запись адреса локала или параметра в статическую переменную функции. Пример кода:
void foo( int par) { static int * static_ptr; int var; static_ptr = &var; static_ptr = ∥ }
Предупреждения выдаются начиная с уровня -O1
-Wmisleading-indentation
-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-profile
-Wmissing-prototypes
-Wmixed-enum-type
-Wmultichar
-Wmultistatement-macros
-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-int32-cast-protected
-Wpointer-to-int64-cast-protected
-Wpointer-to-int128-cast-protected
-Wpointer-to-pointer-cast
-Wpragma-unroll-check
-Wpragmas
-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-negative
-Wshift-count-overflow
-Wshift-overflow
-Wshift-overflow=1
-Wshift-overflow=2
-Wsign-compare
-Wsign-conversion
-Wsign-promo
-Wsigned-one-bit-field
-Wsized-deallocation
-Wstack-protector
-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
-Wstringop-overflow
-Wstringop-overflow=0
-Wstringop-overflow=1
-Wstringop-overflow=2
-Wstringop-overflow=3
-Wstringop-overflow=4
-Wstringop-overread
-Wstringop-truncation
-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-final-methods
-Wsuggest-final-types
-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
volatile
.
Предупреждения выдаются начиная с уровня -O1
. Если неиницилизированная переменная используется только для вычисления значения, которое нигде не используется, то предупреждение для неё может не выдаваться, поскольку соответствующий код может быть удалён оптимизациями до фазы выдачи предупреждений.
-Wuninitialized-extra
-Wuninitialized
, но в отличие от этого режима работает не только со скалярными переменными, но и с переменными типа структура и класс.
Данные предупреждения включаются отдельной опцией, поскольку компилятор lcc выдаёт значительно больше предупреждений, чем gcc. В частности, lcc выдаёт предупреждение в случае возврата по значению или копирования в другую переменную частично инициализированной структуры, в то время как gcc в этих случаях предупреждений не печатает.
Предупреждения выдаются начиная с уровня -O1
.
-Wunknown-pragmas
-Wunreachable-code
-Wunsafe-loop-optimizations
-Wunsuffixed-float-constants
-Wunused
-Wunused-builtin-result
-Wunused-but-set-parameter
-Wunused-but-set-variable
Для выключения данного предупреждения для отдельных переменных используйте __attribute__((unused)).
Данное предупреждение включается также по опции -Wunused
, которая входит в состав -Wall
.
-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
-Wuseless-cast
-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-<warn>
-Werror=<warn> (-Werror-<warn>)
-Wno-error=<warn>
-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
-w<id>
18 Базовые опции оптимизаций
-O0
-Og
-O1
-O2
-O3
-O4
-Ominimal
-O
-Osize
-Os
-Ofast
-fgos-solver (-fno-gos-solver)
-O3
.
По сути, это некоторый искусственный интеллект, который умеет подбирать для каждой функции один из 4 наборов оптимизаций: 3 набора уровня -O3
, и 1 набор уровня -O2
. В этом состоит принципиальное различие работы опций -O*
в компиляторах gcc и lcc. В gcc опция -O*
- это просто набор опций, включающих отдельные оптимизации; и если, например, необходимо в режиме -O1
включить оптимизацию unroll, до для этого достаточно подать опцию -funroll-loops
. Т.е. можно сказать, что в gcc существует единственная линейка оптимизаций, и подавая опции можно включать и отключать отдельные оптимизации. В компиляторе lcc есть множество линеек оптимизаций, и опциями можно отключать оптимизации в текущей линейке, но нельзя включать оптимизации, которых в линейке нет; например, в режиме -O1
подача опции -funroll-loops
не включает оптимизацию unroll, поскольку её нет в соответствующей линейке.
Решатель отключается в режиме -fprofile-use
. Для его принудительного включения в этом режиме необходимо подать дополнительную опцию -fgos-profile
.
Для задания линейки оптимизации для конкретной функции можно использовать __attribute__((optimize("-O*"))). Если подать в этот атрибут опцию -O3
, то для данной функции включается решатель. Если подать -O4
, то решатель для данной функции отключается, и выбирается линейка уровня -O3
.
Посмотреть выбранный решателем уровень оптимизации можно с помощью опции -fopt-report
.
Режим по умолчанию: -fno-gos-solver
-fgos-profile
-fcold-Osize
19 Опции профилирования
-fprofile-use[=<file>]
-fprofile-generate[=<path>]
-fprofile-generate-parallel[=<path>]
-fprofile-generate-kernel
-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;...>
20 Опции режима "вся программа"
-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-расширениями, влияющими на процесс линковки.
21 Опции поддержки динамической оптимизации
-fdo-prepare
-fdo-prog=<file>
-fdo-proc=<proc>
-fdo-prof=<file>
-fdo-softprof
22 Опции анализатора производительности
-fopt-report
-fopt-report=<N>
(0) - выключить генерацию отчёта;
(1) - вывод краткой информации о применении ключевых оптимизаций (overlap, apb, vect, unroll и т.п.);
(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
23 Опции пиковой производительности
-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-global-sched
-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
-fno-merge-oper
Оптимизация позволяет объединить две пересылки значений в один и тот же объект, исполняющихся под разными условиями, в одну трёхаргументную операцию выбора merge. Это позволяет сэкономить исполнительные устройства, и в отдельных случаях получить от этого выгоду.
Оптимизация включена по умолчанию.
-fgsr (-fno-gsr)
-fdce-fp (-fno-dce-fp)
-fint-divide-opt (-fno-int-divide-opt)
* Разрешить удаление целочисленного деления на ноль без использований результата.
* Разрешить вынос из цикла целочисленного деления линейной переменной, шаг которой кратен делителю.
* Разрешить понижение силы операций (Strength Reduction) для целочисленного деления.
* Разрешить использовать инструкцию SMODX для реализации остатка от деления. В Elbrus V1-V2 инструкция SMODX не выдаёт прерывания в случае нулевого делителя, поэтому по умолчанию остаток от деления вычисляется с помощью инструкции SDIV. В Elbrus V3 и далее такой проблемы нет, поэтому компилятор может использовать инструкцию SMODX без каких-либо опций. Однако, инструкция SMODX не конвейеризована, поэтому во многих случаях компилятор всё равно будет использовать SDIV для более быстрого вычисления остатка от деления.
-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-eq-arrays
-fdam-no-rbranch
-fno-swp
-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>
-fibranch-bound=<f>
-fnesting-prob=<f>
-fswp-cond-cc (-fno-swp-cond-cc)
-fforce-swp
-fno-ibranch
-flist-prefetch
-fno-global-regs
-fkernel
и -fsysware
.
При использовании данной опции не гарантируется корректная работа приложений, требующих более 4 Гб стека.
-fprefetch
Режим по-умолчанию -fprefetch
для архитектуры Эльбрус, -fno-prefetch
для архитектуры SPARC
-fno-prefetch
-fset-ld-delay=<n>
-fset-mau-delay=<n>
-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-подстановки каких конкретно функций выполнять. Спецификатор inline на этот выбор не влияет. Принудительная inline-подстановка выполняется только для функций, помеченных __attribute__((always_inline)). При наличии данной опции принудительная inline-подстановка выполняется в том числе и для функций, имеющих спецификатор inline.
Данная опция является потенциально опасной, особенно в случае языка C++, в котором спецификатор inline включается автоматически для всех методов классов, реализованных в заголовочном файле. Эта опция может привести к чрезвычайно агрессивной работе inline, значительному замедлению компиляции и увеличению размера кода программы, выдаче ошибок компиляции (например, из-за нехватки памяти) и к последующим ошибкам линковки (например, из-за слишком большого размера кода).
-finline-only-native
-fsr-ext
-fOsize-selective
-fOsize-selective=<f>
-fstruct-unite (-fno-struct-unite)
-fstruct-decomp (-fno-struct-decomp)
-fstruct-reorg (-fno-struct-reorg)
-fwhole
. Также, желательно использовать профильную информацию (опция -fprofile-use
).
Опция экспериментальная, корректность её работы не гарантируется.
-farray-reorg (-fno-array-reorg)
-fdata-reorg (-fno-data-reorg)
-fipo-call-under-cond
pure
здесь подразумеваются либо функции, явно помеченные __attribute__((pure)), либо функции, для которых компилятор определил отсутствие побочных эффектов и как бы навесил __attribute__((pure)).
Включает опцию -fipa-attrs
, по которой включается анализ функций на наличие побочных эффектов.
-fipo-cprop-globals
-fipo-cprop-cond
-fipo-cprop (-fno-ipo-cprop)
-fipo-code-split
-fmain-l2g
-fipa-align (-fno-ipa-align)
-fipa-ptrs (-fno-ipa-ptrs)
-fipa-pta (-fno-ipa-pta)
-fipa0
-fno-ipa-align
, -fno-ipa-ptrs
, -fno-ipa-attrs
, -fno-canon-calls
, -fno-ipo-cprop
.
Данная опция включена по умолчанию начиная с уровня -O1
.
-fipa1
-fipa-align
, -fipa-ptrs
, -fcanon-calls
, -fno-ipo-cprop
.
Данная опция включена по умолчанию начиная с уровня -O2
.
-fipa2
-fipa-align
, -fipa-ptrs
, -fcanon-calls
, -fipo-cprop
.
Данная опция включена по умолчанию начиная с уровня -O3
.
-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
-fforce-loop-unswitching
-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-locals
-frestrict-all
-frestrict-safe
Данная опция включает анализ пересечения restrict-указателей. Если некоторый restrict-указатель может пересекаться с другим указателем, то для одного из них отключается разрешение зависимостей по признаку restrict. В некоторых случаях это позволяет избежать неопределённого поведения в случае некорректного использования признака restrict. Это особенно актуально при использовании опций вроде -frestrict-params
и -frestrict-locals
, которые массово навешивают признак restrict на большое количество указателей.
Данная опция не гарантирует корректную работу кода при некорректном использовании признака restrict, поскольку анализ пересечений указателей не является полным.
Выбор указателя, для которого отключается разрешение зависимостей в случае пересечения, выполняется эвристически на основании счётчиков профиля. Использование профильной информации по опции -fprofile-use
позволяет таким образом улучшить точность анализа.
Данная опция работает независимо от -frestrict-unsafe
-frestrict-unsafe
По умолчанию зависимости разрешаются только между простыми обращениями к памяти, например, такими:
*p = a[i];и только если одно из обращений к памяти выполняется по restrict-указателю, а другое - по произвольному имени либо по любому другому указателю. Данная опция позволяет разрешить зависимости между простым обращением к памяти по restrict-указателю и всеми остальными (сколь угодно сложными) обращениями к памяти. Это может привести к некорректному поведению программы в случае нетривиальных обращений к памяти по restrict-указателю.
По умолчанию restrict позволяет разрешить зависимости только между инструкциями, пришедшими из одной функции исходной программы. Если в коде есть инструкции, подставленные inline'ом из разных функций, то зависимости между ними не разрешаются за счёт подсказок restrict. Опция -frestrict-unsafe
снимает данное ограничение. Это может привести к некорректному поведению программы в случае передачи restrict-указателя в вызов функции, который подставляется inline'ом.
Данная опция является потенциально опасной, поскольку проверка накладываемых ей ограничений на исходный код программы может быть нетривиальной.
Данная опция работает независимо от -frestrict-safe
-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>
-fsetjmp-opt
-flcv (-fno-lcv)
-fcanon-calls (-fno-canon-calls)
Оптимизация работает только в режиме -fwhole
. Данная опция включена по умолчанию начиная с уровня -O2
.
-fignore-getenv-call
24 Опции, которые могут приводить к неточным преобразованиям
-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
, -fipa-attrs
, -fgsr
, -fdce-fp
, -fint-divide-opt
.
Данная опция включает оптимизации над вещественной арифметикой, которые могут приводить к некорректным результатам в случае программ, предполагающих строгое соблюдение стандартов IEEE или ISO для вещественных операций и функций. Тем не менее, она может существенно увеличить скорость программ, не требующих строго соблюдения этих стандартов.
Опции, входящие в состав -ffast
, накладывают ряд ограничений на компилируемую программу. Наручешие этих ограничений может приводить к некорректному поведению программы. Перечислим вкратце основные ограничения:
Опция -fstdlib
требует, чтобы в программе не были переопределены стандартные библиотечные функции. Опция -fmalloc-opt
накладывает аналогичные ограничения на стандартные функции выделения памяти, такие как malloc и free.
Опция -faligned
требует, чтобы все обращения к памяти были выровнены на свой размер.
Опция -fno-math-errno
требует, чтобы в программе не использовалась переменная errno. При этом допустимо вызывать стандартные библиотечные функции, в которых errno модифицируется.
Опция -fno-signed-zeros
требует, программа работала корректно при замене знака нуля в некоторых вещественных вычислениях.
Опция -ffinite-math-only
требует, чтобы в процессе вычислений не возникали бесконечные (Inf) и неопределённые (NaN) значения. Аналогичные требования накладывает опция -fcx-limited-range
на операции комплексного умножения и деления.
Опция -fno-rounding-math
требует, чтобы в программе не менялся режим округления по умолчанию.
Опция -floop-apb-conditional-loads
требует, чтобы в циклах не было регулярных чтений под условием по некорректному адресу. Фактически, требуется, чтобы при выносе всех чтений из-под их условий программа работала корректно.
Опции -fstrict-aliasing
и -fext-strict-aliasing
требуют, чтобы в программе соблюдались правила строгой типизации, прописанные в современных стандартах языков C, C++. Например, стандарт запрещает писать в память значение типа double, а затем читать его как long long int.
Опция -fdce-fp
предполагает, что вещественные операции в программе не вызывают прерываний и не изменяют состояние системных регистров, т.ч. их можно удалять в случае, если их результат не используется в явном виде.
Опция -fint-divide-opt
требует, чтобы в программе не было целочисленного деления на ноль и остатка от деления на ноль.
По факту в большинстве современных программ все эти требования соблюдаются, и при их компиляции можно безопасно подавать опцию -ffast
, чтобы улучшить оптимизацию кода.
-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
, -ffp-contract=fast
.
Данная опция выключена по умолчанию, поскольку включает преобразования с вещественной арифметикой, которые могут приводить к некорректным результатам в случае программ, предполагающих строгое соблюдение стандартов 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
25 Опции работы с sanitizer'ами
-fsanitize=<san1,san2,...> (-fno-sanitize=<san1,san2,...>)
26 Дополнительные опции AddressSanitizer
-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)
-fno-sanitize-address-use-after-return (-fsanitize-address-use-after-return)
27 Дополнительные опции MemorySanitizer
-fsanitize-memory-track-origins
-fsanitize-memory-track-origins=
-fno-sanitize-memory-track-origins
28 Расширенные опции управления процессом компиляции
-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>
29 Опции управления линковкой
-static (-dynamic)
-dynamic
.
-L<dir> (-L <dir>)
-l<name> (-l <name>)
-nodefaultlibs
-nostartfiles
-nostdlib
-pie (-no-pie)
-static-pie
-r
-rdynamic
-shared
-shared-libgcc
-static-libgcc
-static-libstdc++
-static-libgfortran
-shared-libasan
-static-libasan
-symbolic
30 Опции передаются линкеру
-e<entry> (-e <entry>)
-h<soname> (-h <soname>)
-R<path> (-R <path>)
-s
-T<script> (-T <script>)
-u<symname> (-u <symname>)
-z<keyword> (-z <keyword>)
31 Опции печати и настройки конфигурации
--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
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
-fgcse (-fno-gcse)
-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)
-fdevirtualize-at-ltrans (-fno-devirtualize-at-ltrans)
-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)
-foffload=disable
-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)
-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-slp-vectorize (-fno-tree-slp-vectorize)
-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)
-funsafe-loop-optimizations (-fno-unsafe-loop-optimizations)
-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)
-fipo-cprop-arrays
36 Поддерживаемые переменные окружения
TMPDIR
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
DEPENDENCIES_OUTPUT
SUNPRO_DEPENDENCIES
LIBRARY_PATH
LC_ALL
LC_MESSAGES
LANG
MCST_CFLAGS_FILE
GCC_COLORS
TERM
MCST_PROF_DIR
MCST_PROF_DIR_PROG