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>
-mcpu=<cpu>
<cpu>». Параметр опции может принимать следующие значения: v8, v9, ultrasparc, ultrasparc3, r1000, r2000, r2000+, native. Значения параметра «v8», «v9» и «ultrasparc» трактуются как «ultrasparc3». Значение параметра «native» соответствует режиму компилятора по умолчанию в отношении настройки target-процессора
-m32
-m64
-fpermit-unaligned-ldd-std
В настоящем sparc'е такой режим включен по умолчанию. Невыровненные обращения в память реально исполняются через прерывание операционной системы (т.е. работают очень медленно). Включенный режим по умолчанию неудобен для программиста там, что на этапе разработки программы он может не увидеть, что программа работает по невыровненным адресам, и, соотвественно, не увидеть, что программа работает не эффективно. Невыровненные обращения используются крайне редко и в большинстве случаев говорят о наличии ошибки в исходнике программы. Именно поэтому в lcc такой режим вынесен под опцию
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-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
-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>»: fp, sp, g0, ..., g7, o0, ..., o7, i0, ..., i7, f0, ..., f63
Опция является полным аналогом соответствующей опции gcc
-fcall-used-<reg>
<reg>» как портящийся при вызовах.
Компилятор при построении операций вызова будет сохранять значение данного регистра, а после операции вызова восстанавливать. Опция используется, например, в системном софте, когда операция вызова происходит нестандартными методами (без переключения регистрового окна и т.п.). Допустимые значения параметра «<reg>» аналогичны опции -ffixed-<reg>
Опция является полным аналогом соответствующей опции gcc
-masm-inline (-mno-asm-inline)
-mcmodel=<cmodel>
<cmodel>». Данная опция допустима только для режима -mptr64. Параметр опции может принимать следующие значения: medlow, medmid, medany, embmedany
-mno-fpu (-fpu)
-mno-integer-ldd-std (-minteger-ldd-std)
-mno-app-regs (-mapp-regs)
-mvis (-mno-vis)
-mv8
-mno-unaligned-type-atomic
12 Опции отладочной информации
-g0
-g
-g1, -g2, -g3, -gdwarf-2, -gstabs, -ggdb, -ggdb1, -ggdb2, -ggdb3, -gno-as-loc-support
--dwarf2-64bit
-grecord-gcc-switches (-gno-record-gcc-switches)
-fverbose-asm (-fno-verbose-asm)
-fident (-fno-ident)
-frecord-gcc-switches (-fno-record-gcc-switches)
13 Дополнительные опции
-fkernel
-fforce-inline, -fno-global-regs, -fno-devirtualize, -fno-vect, -fno-inline-part, -fno-loop-peeling, -fno-loop-nesting.
-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
-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=*
14 Опции форматирования выдачи компилятора
-fmessage-length=<num>
<num>» символов на ширину выдаваемых сообщений. Если выдаваемое сообщение не влезает в данное ограничение, то оно разбивается на несколько строк. Если значение «<num>» равно «0», то ограничение на ширину отсутствует. На текущий момент все остальные значения параметра трактуются как ограничение ширины сообщений по умолчанию (80 символов).
-fdiagnostics-color
-fno-diagnostics-color
-fdiagnostics-color=<val>
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-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
-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
-Wc++20-extensions
-Wcast-align
-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-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
-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-overflow
-Wsign-compare
-Wsign-conversion
-Wsign-promo
-Wsigned-one-bit-field
-Wsized-deallocation
-Wshift-overflow
-Wshift-overflow=1
-Wshift-overflow=2
-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-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
-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>
17 Базовые опции оптимизаций
-O0
-Og
-O1
-O2
-O3
-O4
-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
18 Опции профилирования
-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;...>
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 Опции пиковой производительности
-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 для более быстрого вычисления остатка от деления.
-fno-global-regs
-fkernel.
-fprefetch
Режим по-умолчанию -fprefetch для архитектуры Эльбрус, -fno-prefetch для архитектуры SPARC
-fno-prefetch
-fset-ld-delay=<n>
-fset-mau-delay=<n>
-fblock-size-limit=<n>
-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-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)
-fmain-l2g
-fipa-align (-fno-ipa-align)
-fipa-ptrs (-fno-ipa-ptrs)
-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 можно разрешить анализу цикловых зависимостей считать, что шаг адреса операции обращения в память никогда не окажется нулевым, однако данный режим является экспериментальным и не гарантирует корректное поведение программы.
-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
21 Опции, которые могут приводить к неточным преобразованиям
-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
22 Опции работы с sanitizer'ами
-fsanitize=<san1,san2,...> (-fno-sanitize=<san1,san2,...>)
23 Расширенные опции управления процессом компиляции
-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>
24 Опции управления линковкой
-static (-dynamic)
-dynamic.
-L<dir> (-L <dir>)
-l<name> (-l <name>)
-nodefaultlibs
-nostartfiles
-nostdlib
-pie (-no-pie)
-r
-rdynamic
-shared
-shared-libgcc
-static-libgcc
-static-libstdc++
-static-libgfortran
-symbolic
25 Опции передаются линкеру
-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>)
26 Опции печати и настройки конфигурации
--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, il. Опция используется при сборке библиотек run-time поддержки и при сборке дистрибутива. Конечному пользователю использовать опцию не рекомендуется (но не запрещается), т.к. поведение опции может меняться при изменении версии компилятора
-print-recognized-environment
27 Опции для повторения внутренних свойств gcc
-ftext-switch-table
-fcopy-aggregate-memcpy[=<size>]
28 Игнорируемые опции (для совместимости с 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)
-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-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>
-mlong-double-128
-mv8plus (-mno-v8plus)
--param <str> (--param=<str>)
-pipe (--pipe)
29 Игнорируемые опции (для совместимости с прошлыми версиями lcc)
-fipo-cprop-arrays
30 Поддерживаемые переменные окружения
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