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, elbrus-48c, elbrus-8v7. При одновременном наличии в командной строке опций -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 - компилировать программу для процессора "Эльбрус-8CВ" (работающего на системе команд v5). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-8CВ", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-12c - компилировать программу для процессора "Эльбрус-12C" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-12C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-16c - компилировать программу для процессора "Эльбрус-16C" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-16C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-2c3 - компилировать программу для процессора "Эльбрус-2C3" (работающего на системе команд v6). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-2C3", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-48c - компилировать программу для процессора "Эльбрус-48C" (работающего на системе команд v7). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-48C", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-mtune=elbrus-8v7 - компилировать программу для процессора "Эльбрус-8В7" (работающего на системе команд v7). Программы, скомпилированные в таком режиме, работают более эффективно на процессоре "Эльбрус-8В7", но могут вызывать проблемы при исполнении на других процессорах. Поэтому при помощи специального маркера в бинарном файле такие программы защищаются от исполнения на других процессорах
-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, c2x, gnu2x, c23, iso9899:2024, gnu23. По умолчанию установлен режим -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, c++2b, gnu++2b, c++23, gnu++23. По умолчанию установлен режим -std=gnu++17. Для языков C++20 и C++23 поддержка экспериментальная
В режиме языка 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
-fblas-matmul-limit=<val>
-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
-fexternal-blas
-ff2c (-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
-MG
-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
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 и -mptr128. В режиме -mptr128 опция поддержана по существу только для процессоров elbrus-v7 и выше, для процессоров elbrus-v6 и ниже опция молча игнорируется. Параметр опции может принимать следующие значения: medium, large, huge
В режиме -mdmodel=medium компилятор предполагает, что ни статический (грубо говоря, языковая переменная), ни динамический (грубо говоря, результат вызова функции malloc) объект не может иметь размер, превышающий 4 Гб. Данный режим установлен по умолчанию
В режиме -mdmodel=large компилятор предполагает, что ограничения на размер в 4 Гб есть только у статических объектов. Динамические объекты могут иметь произвольные размеры
В режиме -mdmodel=huge как статические, так и динамические объекты могут иметь произвольные размеры. Режим экспериментальный
-mfunction-to-section=<section>:<func1>,<func2>,...
-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 влияют только на работу оптимизаций.
-mold-asm-constraint-r (-mno-old-asm-constraint-r)
long double и 16-байтного векторного типа
В компиляторах версии lcc-1.27 и ниже использование constraint "r" для аргументов ассемблерной вставки типа long double и 16-байтного векторного типа приводило к принудительному использованию extended регистра. При использовании опции -mold-asm-constraint-r это поведение будет сохранено. В противном случае работа с указанными типами будет строиться симметрично любому другому типу, имеющему sizeof равным 16 байтам, т.е. будет использоваться не-extended регистр
В текущей версии компилятора опция -mold-asm-constraint-r взводится по умолчанию для сохранения старого поведения. В будущих версиях компилятора режим по умолчанию будет инвертирован
-mold-register-asm-long-double (-mno-old-register-asm-long-double)
В компиляторах версии lcc-1.28 и ниже использование конструкции register asm с указанием конкретного регистра для переменной типа long double приводило к принудительному использованию extended регистра. При использовании опции -mold-register-asm-long-double это поведение будет сохранено. В противном случае работа с указанным типом будет строиться симметрично любому другому типу, имеющему sizeof равным 16 байтам, т.е. будет использоваться не-extended регистр
В текущей версии компилятора опция -mold-register-asm-long-double взводится по умолчанию для сохранения старого поведения. В будущих версиях компилятора режим по умолчанию будет инвертирован
-mcheck-nv (-mno-check-n)
Начиная с Elbrus V7 в аппаратуре есть возможность частично управлять проверкой тегов операндов; если операнд по СК должен иметь числовой тип, а фактический операнд имеет какой-либо другой тег, то вырабатывается прерывание. Данная опция позволяет включать (выключать) указанную проверку. При генерации кода для Elbrus V2-V6 опция игнорируется.
Режим по умолчанию: -mcheck-nv для -m128, -mno-check-nv для -m32 и -m64
-fpermit-unaligned
12 Опции защищённого режима
-mprot-va-arg-semi-spec (-mno-prot-va-arg-semi-spec)
va_arg строить в полуспекулятивном режиме исполнения. Это позволяет извлекать несуществующие параметры через va_arg, но при этом их использование будет невозможным. В незащищённых режимах опция игнорируется
Опция предназначена для сборки софта, содержащего ошибки, которые по факту оказываются некритичными для режимов -mptr32 и/или -mptr64. Опция позволяет добиться работоспособности такого софта за счёт программного экранирования ошибок, т.е. без внесения исправления ошибок в исходник
Пример ошибочного кода:
#include <stdio.h>
#include <stdarg.h>
int foo (int a, ...)
{
va_list va;
int b, c;
va_start (va, a);
b = va_arg (va, int);
/* В этом месте код является ошибочным в тех случаях, когда
* в функцию foo передаётся только один неспецифицированный
* аргумент. Номинально в этом случае у переменной "c" нет
* использований. Тем не менее код по извлечению значения
* "c" является ошибочным, т.к. пытается извлечь аргумент,
* которого не было. В защищённом режиме это гарантированно
* приведёт к ошибке исполнения */
c = va_arg (va, int);
va_end (va);
#ifndef BAD
if (a == 1)
return b;
else
#endif
return b + c;
}
int main (void)
{
int r;
r = foo (2, 1000, 2000);
printf ("two args: r=%d\n", r);
r = foo (1, 1000);
printf ("one arg: r=%d\n", r);
}
В режиме -mptr64 этот код работает:
$ lcc -mptr64 t.c
$ ./a.out
two args: r=3000
one arg: r=1000
В режиме -mptr128 этот код ломается при исполнении:
$ lcc -mptr128 t.c
$ ./a.out
two args: r=3000
Segmentation fault
В режиме -mptr128 опция -mprot-va-arg-semi-spec экранирует ошибку и код начинает работать:
$ lcc -mptr128 -mprot-va-arg-semi-spec t.c
$ ./a.out
two args: r=3000
one arg: r=1000
Если теперь мы включим макрос BAD, то этим мы спровоцируем именно использование (а не просто извлечение через va_arg) переменной "c" в том случае, когда передачи значения не было. В режиме -mptr64 такой код будет работать с undefined поведением, но в режиме -mptr128 такой код будет ломаться при исполнении даже при наличии опции -mprot-va-arg-semi-spec, т.к. такая ошибка уже является опасной
$ lcc -DBAD -mptr64 t.c
$ ./a.out
two args: r=3000
one arg: r=3000
$ lcc -DBAD -mptr128 -mprot-va-arg-semi-spec t.c
$ ./a.out
two args: r=3000
Illegal instruction
-mprot-abi-promotion (-mno-prot-abi-promotion)
Опция предназначена для сборки софта, содержащего ошибки, которые по факту оказываются некритичными для режимов -mptr32 и/или -mptr64. Опция позволяет добиться работоспособности такого софта за счёт программного экранирования ошибок, т.е. без внесения исправления ошибок в исходник
Пример ошибочного кода:
#include <stdio.h>
int x;
int main (void)
{
void *p = &x;
long l = (long) p;
printf ("p=%p\n", p);
/* Данный вызов printf содержит ошибку: формат %p предполагает,
* что будет передан аргумент типа указатель, но передаётся
* аргумет типа long */
printf ("l=%p\n", l);
}
В режиме -mptr64 этот код работает:
$ lcc -mptr64 t.c
$ ./a.out
p=0x1c6260
l=0x1c6260
В режиме -mptr128 этот код ломается при исполнении:
$ lcc -mptr128 t.c
$ ./a.out
p=0x50310f80
Illegal instruction
В режиме -mptr128 опция -mprot-abi-promotion экранирует ошибку и код начинает работать:
$ lcc -mptr128 -mprot-abi-promotion t.c
$ ./a.out
p=0x5036ef80
l=0x5036ef80
-mprot-all-sw-relax
13 Опции отладочной информации
-g0
-gline
Опция используется для того, чтобы при дизассемблировании кода через дизассемблер «ldis» можно было видеть привязку операций к исходному тексту программы. Дизассемблер из утилиты «objdump» этого не умеет, поэтому о нём речи не идёт. Для обеспечения такой возможности компилятор строит дополнительные метаданные, которые затем дешифрует дизассемблер при печати кода. Эти метаданные построены с использованием секций отладочной информации в формате DWARF-2. Проблемой является то, что для работы дизассемблера данные в формате DWARF-2 нужно настраивать НЕ так, как это нужно для работы отладчика «gdb». Это приводит к тому, что если программа собрана с использованием опции -gline, то с ней будет практически невозможна привычная работа из-под отладчика
Поэтому в компиляторе предполагается, что режимы -gline и -g являются взаимосиключающими. При одновременном наличии в командной строке опций -gline и -g (или любого из синонимов опции -g), побеждает та опция, которая находится правее остальных. Т.е. нельзя построить код таким образом, чтобы с ним можно было одновременно работать в отладчике и видеть привязку к исходнику в дизассемблере
-g
-g1, -g2, -g3, -gdwarf-2, -gdwarf-3, -gdwarf-4, -gdwarf-5, -gstabs, -ggdb, -ggdb1, -ggdb2, -ggdb3, -gno-as-loc-support
-gline-tables-only
-gstrict-dwarf (-gno-strict-dwarf)
-gdwarf64 (-gdwarf32)
-grecord-gcc-switches (-gno-record-gcc-switches)
-gvect
-fverbose-asm (-fno-verbose-asm)
-fident (-fno-ident)
-frecord-gcc-switches (-fno-record-gcc-switches)
14 Опции, управляющие спекулятивным режимом исполнения
-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
15 Дополнительные опции
-faligned (-fno-aligned)
Смысл опции заключается в том, что программист как бы говорит компилятору "я обязуюсь, что в исходнике программы все обращения в память являются выровненными на свой формат", в результате чего компилятор может более эффективно выполнять некоторые оптимизации. Такими оптимизациями являются: apb (аппаратная подкачка массивов) и arracc (аппаратная поддержка доступа к массивам) для архитектур до elbrus-v4 включительно, автоматическая векторизация (в небольшой степени) и crp_opt (динамический разрыв зависимостей между чтениями и записями в память).
Необходимость в данной опции вызвана аппаратными особенностями Эльбруса. В архитектурах до elbrus-v5 включительно невыровненные обращения в память работают значительно медленнее выровненных. В архитектурах до elbrus-v4 включительно аппаратная подкачка массивов не умеет работать по невыровненным адресам; в elbrus-v5 это ограничение снято для всех операций, кроме 16-байтных; начиная с elbrus-v6 ограничение снято полностью. Таким образом, для elbrus-v6 и выше опция -faligned имеет смысл только для оптимизации crp_opt.
Использование опции в атрибутах функций имеет свои особенности. При навешивании __attribute__((optimize("-faligned"))) на функцию режим -faligned включается на весь код функции, в т.ч. подставленный фазой inline из других функций. При этом в некоторых случаях inline может сбрасывать режим -faligned у вызывающей функции под подстановке функции с режимом -fno-aligned. Режим функции и признак его сброса фазой inline печатается по опции -fopt-report=5 для архитектур до elbrus-v4 включительно.
Использование опции -faligned при компиляции программы, содержащей невыровненные обращения в память, может привести к некорректному поведению программы. Для проверки выровненности обращений в память можно использовать опцию -faligned-check
По умолчанию для языков C/C++ включен режим -fno-aligned, для Фортрана -faligned
-fexclude-ctpr2
-fsysware
-fsemi-spec-lintel, -fno-spec-ld, -fno-global-regs, -fnon-std-greg-api, -mstrict-align, -fno-loop-apb, -fno-inline-part, -fno-lcv, -fno-ipo-array-padding, -fno-params-to-locals.
-fkernel
-fno-semi-spec-ld, -fsemi-spec-ld-glob, -fsemi-spec-ld-stack, -fsemi-spec-ld-greg, -fforce-inline, -fprefetch, -fno-global-regs, -fnon-std-greg-api, -fno-loop-peeling, -fno-inline-part, -fno-lcv, -fno-params-to-locals, -fno-use-memcpy, -mstrict-align.
-fforbid-fp
Компилятор может выполнять некоторые оптимизации, закладывающиеся на отсутствие вещественной арифметики. В случае использования вещественной арифметики компилятор может выдавать ошибку.
-fipa-icf (-fno-ipa-icf)
Работает только при одновременной подаче опции -fwhole.
Включена по умолчанию начиная с уровня -O2.
-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-devirtualize)
-fno-tls-opt
-fno-tls-list=<proc1,proc2,...>
-fasm-entries-first
-fdata-sections (-fno-data-sections)
-ffunction-sections (-fno-function-sections)
-foptimize-sibling-calls (-fno-optimize-sibling-calls)
-fdelete-null-pointer-checks (-fno-delete-null-pointer-checks)
-fdelete-nan-checks (-fno-delete-nan-checks)
-fno-gnu-unique
-fstruct-to-reg ( -fno-struct-to-reg)
-O1).
-funsafe-struct-to-reg
При подаче данной опции не гарантируется корректное поведение программы в случае записи в поле структуры неинициализированных данных.
-fauto-var-expand (-fno-auto-var-expand)
Условия применения:
1. Переменная внутри цикла не изменяется или изменяется через цепочку арифметических операций сложения и вычитания;
2. Нет риска неявного изменения переменной в цикле (например, изменение глобальной переменной при вызове другой функции);
3. Переменная беззнакового типа должна являться индуктивностью цикла следующего вида: for( ...; i < ...; i++) или for(...; i > ...; i--)
Оптимизация включена по умолчанию, начиная с уровня -O2.
Опция -fauto-var-expand игнорируется в режимах -m32, -m128 с системой команд до v7, -fstrict-overflow и -fno-semi-spec-ld
-ffortran-extern-commons (-fno-fortran-extern-commons)
Данная опция отменяет понижение области видимости common переменных в режиме -fwhole. Её необходимо подавать в режиме -fwhole в случае, когда в программе есть обращения к библиотечным переменным, описанным как common.
Режим по умолчанию -fno-fortran-extern-commons
-ftrivial-auto-var-init=<choice>
Параметр опции может принимать следующие значения:
«uninitialized» - режим по умолчанию при включении оптимизаций -O1 и выше, инициализируем нулём локальные переменные классов Int, Float, Ptr, Bool, в отличии от GCC, который ничего не инициализирует;
«zero» - инициализация всех локальных переменных нулём, в том числе пользовательских классов, массивов и переменных с признаком volatile;
«pattern» - аналогична режиму zero, но инициализация паттерном 0xFE.
Опция -ftrivial-auto-var-init игнорируется в режиме -fsanitize=address и -fsanitize=memory
-fjump-tables (-fno-jump-tables)
16 Опции форматирования выдачи компилятора
-fmessage-length=<num>
<num>» символов на ширину выдаваемых сообщений. Если выдаваемое сообщение не влезает в данное ограничение, то оно разбивается на несколько строк. Если значение «<num>» равно «0», то ограничение на ширину отсутствует. На текущий момент все остальные значения параметра трактуются как ограничение ширины сообщений по умолчанию (80 символов).
-fdiagnostics-color
-fno-diagnostics-color
-fdiagnostics-color=<val>
17 Опции настройки выдачи ошибок
-Wfatal-errors (-Wno-fatal-errors)
-fmax-errors=<n>
18 Опции предупреждений
-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
-Wcpp
-Wctor-dtor-privacy
-Wdangling-else
-Wdate-time
-Wdeclaration-after-statement
-Wdeclaration-hides-builtin
-Wdelete-incomplete
-Wdelete-non-virtual-dtor
-Wdeprecated
-Wdeprecated-asm-constraint-r
-Wdeprecated-copy
-Wdeprecated-copy-dtor
-Wdeprecated-declarations
-Wdesignated-init
-Wdeprecated-register-asm-long-double
-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-diag
-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
-Wignored-using-declarations
-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
-Wliteral-suffix
-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
-Wmismatched-tags
-Wmissing-braces
-Wmissing-declarations
-Wmissing-default-constructor-on-const
-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
-Wpedantic
-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
-Wtrivial-auto-var-init
-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-field
-Wunused-function
-Wunused-function-all
-Wunused-label
-Wunused-local-typedefs
-Wunused-macros
-Wunused-parameter
-Wunused-result
-Wunused-template-constructor-parameter
-Wunused-value
-Wunused-variable
-Wunused-variable-all
-Wuse-after-free
-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
-Wremarks (-Wno-remarks)
-W
-Wframe-larger-than=<size>
-Wlarger-than=
-Wstack-usage=
-pedantic
-pedantic-errors
-w
-w<id>
19 Базовые опции оптимизаций
-O0
-O1
-O2
-O3
-O4
-Og
-Ominimal
-O
-Osize
-Os
-Ofast
-Og-devel
-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
20 Опции профилирования
-fprofile-use[=<file>]
-fprofile-generate[=<path>]
-fprofile-generate-parallel[=<path>]
-fprofile-generate-kernel
-fprofile-dir=<path>
-fprofile-subst=<old_name1>:<new_name1>,...
-fprofile-values
-fprofile-correction
-fprofile-skip-proc=<proc1,proc2,...>
-fprofile-skip-module=<module1,module2,...>
-fprofile-filter-files=<regex1;regex2;...>
-fprofile-exclude-files=<regex1;regex2;...>
-pg
-fprofile-arcs
-ftest-coverage
--coverage
21 Опции режима "вся программа"
-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 или с -fno-semantic-interposition. Пример использования:
lcc -O3 -fwhole-shared -fPIC -fno-semantic-interposition -c foo.c
lcc -O3 -fwhole-shared -fPIC -fno-semantic-interposition -c bar.c
lcc -O3 -fwhole-shared -fPIC -fno-semantic-interposition -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-расширениями, влияющими на процесс линковки.
22 Опции поддержки динамической оптимизации
-fdo-prepare
-fdo-prog=<file>
-fdo-proc=<proc>
-fdo-prof=<file>
-fdo-softprof
23 Опции выдачи отчёта о применившихся оптимизациях
-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
24 Опции пиковой производительности
-fno-loop-jam
-fno-swp-ext
-funsafe-swp-ext
-fno-sr
-fno-loop-ivrm
-fno-loop-float-ivrm
-fno-vect
-fno-tree-loop-vectorize
-fsafe-vect
-fno-maw
-fno-bit-maw
-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
-funswitch-loops (-fno-unswitch-loops)
Для отключения оптимизации необходимо использовать опцию -fno-unswitch-loops.
-fno-loop-clustering
-fno-loop-permute
-fno-loop-invup
-fno-loop-utos
-fno-loop-asr
-fgcse (-fno-gcse)
-fno-rtmd
-fno-srtmd
-fno-switch-opt
-fswitch-opt-ext
-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 для более быстрого вычисления остатка от деления.
-floop-arracc (-fno-loop-arracc)
-fforce-loop-apb
-fforce-loop-apb=<f>
-fno-loop-apb
-fno-loop-apb=<f>
-fno-dbl-mode
-floop-apb-conditional-loads (-fno-loop-apb-conditional-loads)
В защищённом режиме данная опция игнорируется.
-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>
-fswp-threshold=<f>
-fcache-opt (-fno-cache-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
-flist-prefetch
-fnon-std-greg-api
-fglobal-regs
-fprefetch (-fno-prefetch)
Режим по-умолчанию -fprefetch для архитектуры Эльбрус, -fno-prefetch для архитектуры SPARC
-fset-ld-delay=<n>
-fset-st-ld-delay=<n>
-fset-mau-delay=<n>
-fblock-size-limit=<n>
-fipo-globals2regs[=n]
Компилятор находит все глобальные скалярные переменные, на которые не брался адрес, и распределяет наиболее часто используемые из них на глобальные регистры. Может быть использована только совместно с опциями -fwhole и -ffast. В случае ручного использования глобальных регистров (например, в asm-вставках либо при распределении переменной на регистр с помощью register asm) необходимо все использованные вручную регистры дополнительно перечислить в опциях -ffixed-g*.
-finline-level=<f>
По умолчанию компилятор самостоятельно решает какие функции лучше подставлять, пытаясь достичь разумного компромисса между увеличением времени компиляции и снижением времени исполнения программы. Данная опция позволяет скорректировать эвристики компилятора, увеличивая (при значении опции более 1.0) или уменьшая (при значении опции менее 1.0) интенсивность inline-подстановок. Значение по умолчанию 1.0. Если значение опции выходит за рамки допустимого диапазона [0.1-20.0], то опция игнорируется.
-finline-scale=<f>
По умолчанию компилятор самостоятельно решает какие функции лучше подставлять, пытаясь достичь разумного компромисса между увеличением времени компиляции и снижением времени исполнения программы. При этом в эвристиках компилятора есть множество различных ограничений на размер кода. Например, если размер компилируемой программы превышает 500.000 инструкций в начале фазы inline, то компилятор ограничивает размер подставляемых функций. Данная опция позволяет масштабировать большинство ограничений inline, т.е. ограничения умножаются на значение опции. Значение по умолчанию 1.0. Если значение опции выходит за рамки допустимого диапазона [0.1-5.0], то опция игнорируется.
-finline-scale-code-size-limit=<f>
На фазе inline есть глобальное ограничение на рост размера кода в результате inline-подстановок. Это ограничение зависит от исходного размера программы в начале фазы inline и обычно играет роль только для очень больших программ при сборке в режиме -fwhole. Данная опция позволяет масштабировать указанное ограничение, т.е. ограничение умножается на значение опции. Значение по умолчанию 1.0. Если значение опции выходит за рамки допустимого диапазона [0.1-5.0], то опция игнорируется.
Указанное ограничение также может быть изменено более общей опцией -finline-scale=<f>. При одновременной подаче опций -finline-scale=<f> и -finline-scale-code-size-limit=<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)
-fipo-struct-decomp (-fno-ipo-struct-decomp)
-funsafe-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)
-fcprop (-fno-cprop)
-fipo-dce
-fipo-cec (-fno-ipo-cec)
-fmin-max (-fno-min-max)
-fgcse-calls (-fno-gcse-calls)
-O2.
-fcase (-fno-case)
d = a + b + c;
e = a + i + b + k + c;
данная оптимизация позволяет избавиться от повтороного вычисления суммы трёх слагаемых:
d = a + b + c;
e = d + i + k;
В случае вещественных операций применение оптимизации может влиять на точность вычислений,
поэтому требуется дополнительная подача опций -ffast -fassociative-math
Данная оптимизация включена по умолчанию, начиная с уровня -O3.
-fcse-alt (-fno-cse-alt)
-fipo-code-split
-fno-params-to-locals
-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, позволяющую дополнительно оптимизировать выделение/освобождение памяти в некоторых случаях.
-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
-frestrict-cross-iter
По умолчанию для restrict-указателя зависимости рвутся только в области его видимости. Поэтому, если restrict-указатель, объявлен внутри цикла:
for( i = 0; i < N; i++ ) {
double * __restrict__ p = dst;
p[i] = src[i];
}
то межитерационные зависимости для него не рвутся. Это может приводить к неприменению важных оптимизаций, таких как apb (асинхронная предподкачка данных) или overlap (программное наложение итераций цикла с аппаратной поддержкой), либо к увеличению накладных расходов на динамические проверки межитерационных зависимостей.
Указанная проблема решается выносом объявления restrict-указателя за пределы цикла (например, в начало функции). На практике весьма распространена ошибка, когда программист добавляет модификатор restrict для указателя, объявленного внутри цикла, и думает, что это позволит разрешить все зависимости с этим указателем. Также, подобная проблема может возникнуть при использовании опции -frestrict-locals. Таким образом, в случае, когда в программе есть много указателей, объявленных внутри цикла, имеет смысл использовать опцию -frestrict-cross-iter для разрешения межитерационных зависимостей в циклах без модификации исходников.
Данная опция работает только в случае, когда указатель объявлен в самом начале цикла, а не, например, во вложенных фигурных скобках. Это позволяет избежать ошибок исполнения в некоторых случаях, например, когда компилятор неявно использует restrict в коде, полученном в результате раскрытия вызова memcpy внутри цикла.
-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>
-flcv (-fno-lcv)
-fcanon-calls (-fno-canon-calls)
Оптимизация работает только в режиме -fwhole. Данная опция включена по умолчанию начиная с уровня -O2.
-fignore-getenv-call
-fnesting-ext
25 Опции, которые могут приводить к неточным преобразованиям
-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
26 Опции работы с sanitizer'ами
-fsanitize=<san1,san2,...> (-fno-sanitize=<san1,san2,...>)
-fsanitize-recover=<san1,san2,...> (-fno-sanitize-recover=<san1,san2,...>)
27 Дополнительные опции 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)
28 Дополнительные опции MemorySanitizer
-fsanitize-memory-track-origins (-fno-sanitize-memory-track-origins)
-fsanitize-memory-track-origins=<level>
29 Расширенные опции управления процессом компиляции
-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>
30 Опции управления линковкой
-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
31 Опции передаются линкеру
-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>)
32 Опции печати и настройки конфигурации
--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
33 Опции для повторения внутренних свойств gcc
-ftext-switch-table
-fcopy-aggregate-memcpy[=<size>]
34 Опции для имитации поведения 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
-mavxvnni
-mno-avxvnni
35 Игнорируемые опции (для совместимости с 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>
-fanalyzer (-fno-analyzer)
-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)
-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>
-freciprocal-math (-fno-reciprocal-math)
-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)
-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-loop-vectorize
-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)
-fzero-initialized-in-bss (-fno-zero-initialized-in-bss)
-malign-jumps (-mno-align-jumps)
-malign-jumps=<val>
-mpreferred-stack-boundary=<val>
-mfpmath=<val>
--param <str> (--param=<str>)
-pipe (--pipe)
36 Игнорируемые опции (для совместимости с прошлыми версиями lcc)
-fno-tail-calls
-fno-loop-unswitching
-finit-locals-zero
-fprofile-strict-names
-fno-gcp
--dwarf2-64bit
--no-dwarf2-64bit
37 Опции поддержки предсказания переходов
-mbp (-mno-bp)
-mbp-t-all=0.1 -mbp-t-dyn=0.5
Для всех опций -mbp* действует общее правило выбора типа перехода исходя из вероятности перехода P и регулируемого порога T:
(P <= T) || (P >= (1 - T)) => неподготовленный переход
(P > T) && (P < (1 - T)) => подготовленный переход
Выбор порога T регулируется рядом опций -mbp*.
Все переходы разделяем на статические (адрес которых известен на этапе компиляции) и динамические (адрес которых читается из памяти).
Режим по умолчанию зависит от целевой архитектуры. Для Elbrus V2-V6 опции -mbp* игнорируются, поскольку аппаратное предсказание переходов появилось только в Elbrus V7. Для Elbrus V7 и старше режим по умолчанию -mbp.
-mbp-t-all=<f>
-mbp).
-mbp-t-dyn=<f>
-mbp).
-mbp-t-proc=<f>
-mbp).
-mbp-t-formula
T = T1 - (T1 - T0)^2 / (K * X + (T1 - T0)) (*)
где X - задержка, т.е. удлинение критического пути для подготовленного перехода, в сравнении с неподготовленным (вычисляется компилятором);
T0 - порог для нулевой задержки X (по умолчанию T0=0.05, регулируется опцией -mbp-t-formula-t0);
T1 - порог для бесконечной задержки X (по умолчанию T1=0.40, регулируется опцией -mbp-t-formula-t1);
K - производная в нуле (по умолчанию K=0.05, регулируется опцией -mbp-t-formula-k).
Пороги должны удовлетворять соотношению: 0 <= T0 < T1 <= 0.5, в противном случае выдаётся ошибка.
см. также описание опции -mbp
-mbp-t-formula-t0=<f>
-mbp-t-formula).
-mbp-t-formula-t1=<f>
-mbp-t-formula).
-mbp-t-formula-k=<f>
-mbp-t-formula).
-mbp-zero-lat-ctp-ct (-mno-bp-zero-lat-ctp-ct)
Режим по умолчанию зависит от целевой архитектуры. Для Elbrus V2-V6 опции -mbp* игнорируются, поскольку аппаратное предсказание переходов появилось только в Elbrus V7. Для Elbrus V7 и старше режим по умолчанию -mno-bp-zero-lat-ctp-ct.
-mbp-zero-lat-cmp-ct (-mno-bp-zero-lat-cmp-ct)
Режим по умолчанию зависит от целевой архитектуры. Для Elbrus V2-V6 опции -mbp* игнорируются, поскольку аппаратное предсказание переходов появилось только в Elbrus V7. Для Elbrus V7 и старше режим по умолчанию -mbp-zero-lat-cmp-ct.
38 Поддерживаемые переменные окружения
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
MCST_DUMPMACHINE