3.17 Параметры конвенций генерации кода ¶
Эти независимые от машины параметры управляют конвенциями интерфейса, используемыми при генерации кода.
Большинство из них имеют положительную и отрицательную формы; отрицательная форма -ffoo — это -fno-foo. В таблице ниже указана только одна из форм — та, которая не является значением по умолчанию. Вы можете определить другую форму, удалив «no-» или добавив ее.
-fstack-reuse=reuse-level-
Этот параметр управляет повторным использованием стека для локальных/автоматических переменных, объявленных пользователем, и временных переменных, сгенерированных компилятором. reuse_level может быть ‘all’, ‘named_vars’ или ‘none’. ‘all’ включает повторное использование стека для всех локальных переменных и временных переменных, ‘named_vars’ включает повторное использование только для определённых пользователем локальных переменных с именами, а ‘none’ полностью отключает повторное использование стека. Значение по умолчанию — ‘all’. Этот параметр необходим, когда программа продлевает жизненный цикл локальной переменной в области действия или временной переменной, сгенерированной компилятором, за пределы точки, определённой языком. Когда жизненный цикл переменной заканчивается, и если переменная существует в памяти, оптимизирующий компилятор имеет право повторно использовать её область стека для других временных переменных или локальных переменных в области действия, чей диапазон жизни не пересекается с ней. Код, расширяющий жизненный цикл локальных переменных, вероятно, вызовет ошибки при оптимизации повторного использования стека.
Например,
int *p; { int local1; p = &local1; local1 = 10; .... } { int local2; local2 = 20; ... } if (*p == 10) // out of scope use of local1 { }Другой пример:
struct A { A(int k) : i(k), j(k) { } int i; int j; }; A *ap; void foo(const A& ar) { ap = &ar; } void bar() { foo(A(10)); // temp object's lifetime ends when foo returns { A a(20); .... } ap->i+= 10; // ap references out of scope temp whose space // is reused with a. What is the value of ap->i? }Жизненный цикл временной переменной, сгенерированной компилятором, чётко определяется стандартом C++. Когда жизненный цикл временной переменной заканчивается, и если временная переменная существует в памяти, оптимизирующий компилятор имеет право повторно использовать её область стека для других временных переменных или локальных переменных в области действия, чей диапазон жизни не пересекается с ней. Однако некоторые устаревшие фрагменты кода полагаются на поведение более старых компиляторов, в которых область стека временных переменных не повторно использовалась; агрессивное повторное использование стека может привести к ошибкам во время выполнения. Этот параметр используется для управления оптимизацией повторного использования стека временных переменных.
-ftrapv-
Этот параметр генерирует ловушки для переполнения при сложении, вычитании и умножении со знаком. Параметры -ftrapv и -fwrapv перекрывают друг друга, поэтому использование -ftrapv -fwrapv в командной строке приводит к тому, что эффективным является -fwrapv. Обратите внимание, что перекрывают только активные параметры, поэтому использование -ftrapv -fwrapv -fno-wrapv в командной строке приводит к тому, что эффективным является -ftrapv.
-fwrapv-
Этот параметр сообщает компилятору, что предполагается, что переполнение арифметических операций со знаком при сложении, вычитании и умножении обнуляется при использовании представления с дополнительным кодом. Этот флаг включает некоторые оптимизации и отключает другие. Параметры -ftrapv и -fwrapv перекрывают друг друга, поэтому использование -ftrapv -fwrapv в командной строке приводит к тому, что эффективным является -fwrapv. Обратите внимание, что перекрывают только активные параметры, поэтому использование -ftrapv -fwrapv -fno-wrapv в командной строке приводит к тому, что эффективным является -ftrapv.
-fwrapv-pointer-
Этот параметр сообщает компилятору, что предполагается, что переполнение при арифметических операциях с указателями при сложении и вычитании обнуляется при использовании представления с дополнительным кодом. Этот флаг отключает некоторые оптимизации, которые предполагают, что переполнение указателей недопустимо.
-fstrict-overflow-
Этот параметр подразумевает -fno-wrapv -fno-wrapv-pointer, а при отрицании подразумевает -fwrapv -fwrapv-pointer.
-fexceptions-
Включить обработку исключений. Генерирует дополнительный код, необходимый для распространения исключений. Для некоторых целевых платформ это подразумевает, что GCC генерирует информацию о развёртывании кадра для всех функций, что может привести к значительному увеличению размера данных, хотя на выполнение это не влияет. Если вы не укажете этот параметр, GCC включит его по умолчанию для языков, таких как C++, которые обычно требуют обработки исключений, и отключит его для языков, таких как C, которые обычно её не требуют. Однако вам может потребоваться включить этот параметр при компиляции кода C, который должен правильно взаимодействовать с обработчиками исключений, написанными на C++. Вы также можете отключить этот параметр, если вы компилируете более старые программы C++, которые не используют обработку исключений.
-fnon-call-exceptions-
Генерировать код, который позволяет инструкциям ловушки генерировать исключения. Обратите внимание, что это требует поддержки среды выполнения, специфичной для платформы, которая не везде существует. Кроме того, это позволяет генерировать исключения только инструкциям ловушки, то есть обращениям к памяти или инструкциям с плавающей запятой. Это не позволяет генерировать исключения из произвольных обработчиков сигналов, таких как
SIGALRM. -fdelete-dead-exceptions-
Учитывать, что инструкции, которые могут генерировать исключения, но не вносят другого вклада в выполнение программы, могут быть оптимизированы. Этот параметр включён по умолчанию для фронтэнда Ada, как разрешено спецификацией языка Ada. Проходы оптимизации, которые приводят к удалению мёртвых исключений, включаются независимо на разных уровнях оптимизации.
-funwind-tables-
Аналогично -fexceptions, за исключением того, что он просто генерирует любые необходимые статические данные, но не влияет на сгенерированный код каким-либо другим способом. Обычно вам не нужно включать этот параметр; вместо этого процессор языка, которому нужна эта обработка, включает его за вас.
-fasynchronous-unwind-tables-
Генерировать таблицу развёртывания в формате DWARF, если это поддерживается целевой машиной. Таблица является точной на каждом граничном значении инструкции, поэтому её можно использовать для развёртывания стека из асинхронных событий (таких как отладчик или сборщик мусора).
-fno-gnu-unique-
На системах с недавним GNU ассемблером и библиотекой C, компилятор C++ использует привязку
STB_GNU_UNIQUE, чтобы гарантировать, что определения статических элементов шаблонов и статических локальных переменных во встроенных функциях уникальны, даже в присутствииRTLD_LOCAL; это необходимо, чтобы избежать проблем с библиотекой, используемой двумя разнымиRTLD_LOCALплагинами, зависящими от определения в одном из них и, следовательно, не согласующимися с другим относительно привязки символа. Но это приводит к тому, чтоdlcloseигнорируется для затронутых DSO; если ваша программа полагается на повторную инициализацию DSO черезdlcloseиdlopen, вы можете использовать -fno-gnu-unique. -fpcc-struct-return-
Возвращать «короткие»
structиunionзначения в памяти, как и более длинные, а не в регистрах. Эта конвенция менее эффективна, но имеет преимущество в обеспечении взаимной совместимости между файлами, скомпилированными GCC, и файлами, скомпилированными другими компиляторами, особенно Portable C Compiler (pcc).Точная конвенция возврата структур в памяти зависит от макросов конфигурации целевой платформы.
Короткие структуры и объединения — это те, размер и выравнивание которых совпадают с некоторым целочисленным типом.
Предупреждение: код, скомпилированный с ключом -fpcc-struct-return, не совместим в бинарном формате с кодом, скомпилированным с ключом -freg-struct-return. Используйте его для соответствия нестандартному прикладному интерфейсу.
-freg-struct-return-
Возвращать
structиunionзначения в регистрах, когда это возможно. Это более эффективно для небольших структур, чем -fpcc-struct-return.Если вы не укажете ни -fpcc-struct-return, ни -freg-struct-return, GCC по умолчанию использует ту или иную конвенцию, которая является стандартной для целевой платформы. Если нет стандартной конвенции, GCC по умолчанию использует -fpcc-struct-return, за исключением платформ, где GCC является основным компилятором. В этих случаях мы можем выбрать стандарт, и мы выбрали более эффективную альтернативу возврата в регистре.
Предупреждение: код, скомпилированный с ключом -freg-struct-return, не совместим в бинарном формате с кодом, скомпилированным с ключом -fpcc-struct-return. Используйте его для соответствия нестандартному прикладному интерфейсу.
-fshort-enums-
Выделить для типа
enumтолько столько байтов, сколько необходимо для объявленного диапазона возможных значений. В частности, типenumэквивалентен самому маленькому целочисленному типу, который имеет достаточно места.Предупреждение: ключ -fshort-enums заставляет GCC генерировать код, который не совместим в бинарном формате с кодом, сгенерированным без этого ключа. Используйте его для соответствия нестандартному прикладному интерфейсу.
-fshort-wchar-
Переопределить базовый тип для
wchar_tнаshort unsigned intвместо значения по умолчанию для целевой платформы. Этот параметр полезен для построения программ для работы под WINE.Предупреждение: ключ -fshort-wchar заставляет GCC генерировать код, который не совместим в бинарном формате с кодом, сгенерированным без этого ключа. Используйте его для соответствия нестандартному прикладному интерфейсу.
-fcommon-
В коде C этот параметр управляет размещением глобальных переменных, определённых без инициализатора, известных как временные определения в стандарте C. Временные определения отличаются от объявлений переменной с ключевым словом
extern, которые не выделяют память.Значение по умолчанию — -fno-common, которое указывает компилятору помещать неопределённые глобальные переменные в раздел BSS объектного файла. Это препятствует объединению временных определений линковщиком, поэтому вы получите ошибку множественного определения, если одна и та же переменная случайно определена более чем в одном модуле компиляции.
Ключ -fcommon помещает неопределённые глобальные переменные в общий блок. Это позволяет линковщику разрешать все временные определения одной и той же переменной в разных модулях компиляции для одного и того же объекта или для неопределённого определения. Это поведение несовместимо с C++, и на многих платформах подразумевает штраф по скорости и размеру кода при обращении к глобальным переменным. В основном это полезно для обеспечения совместимости старого кода с линковкой без ошибок.
-fno-ident-
Игнорировать директиву
#ident. -finhibit-size-directive-
Не выводить директиву ассемблера
.size, или что-либо ещё, что может вызвать проблемы, если функция разделена посередине, а две половины помещены в места, удалённые друг от друга в памяти. Этот параметр используется при компиляции crtstuff.c; вам не следует использовать его для чего-либо ещё. -fverbose-asm
-
Добавьте дополнительную информацию в сгенерированный код ассемблера, чтобы сделать его более читабельным. Этот параметр обычно полезен только тем, кто действительно нуждается в чтении сгенерированного кода ассемблера (возможно, при отладке самого компилятора).
-fno-verbose-asm, по умолчанию, исключает дополнительную информацию и полезен при сравнении двух файлов ассемблера.
Добавленные комментарии включают:
- информацию о версии компилятора и параметрах командной строки,
- строки исходного кода, связанные с инструкциями ассемблера, в формате ИМЯ_ФАЙЛА:НОМЕР_СТРОКИ:СОДЕРЖИМОЕ_СТРОКИ,
- подсказки о том, какие выражения высокого уровня соответствуют различным операндам инструкций ассемблера.
Например, данный файл исходного кода C:
int test (int n) { int i; int total = 0; for (i = 0; i < n; i++) total += i * i; return total; }компиляция в (x86_64) ассемблер с помощью -S и вывод результата непосредственно в стандартный вывод с помощью -o -
gcc -S test.c -fverbose-asm -Os -o -
дает вывод, похожий на этот:
.file "test.c" # GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu) [...snip...] # options passed: [...snip...] .text .globl test .type test, @function test: .LFB0: .cfi_startproc # test.c:4: int total = 0; xorl %eax, %eax # <retval> # test.c:6: for (i = 0; i < n; i++) xorl %edx, %edx # i .L2: # test.c:6: for (i = 0; i < n; i++) cmpl %edi, %edx # n, i jge .L5 #, # test.c:7: total += i * i; movl %edx, %ecx # i, tmp92 imull %edx, %ecx # i, tmp92 # test.c:6: for (i = 0; i < n; i++) incl %edx # i # test.c:7: total += i * i; addl %ecx, %eax # tmp92, <retval> jmp .L2 # .L5: # test.c:10: } ret .cfi_endproc .LFE0: .size test, .-test .ident "GCC: (GNU) 7.0.0 20160809 (experimental)" .section .note.GNU-stack,"",@progbits
Комментарии предназначены для людей, а не для машин, поэтому точный формат комментариев может быть изменён.
-frecord-gcc-switches-
Этот переключатель записывает используемую командную строку вызова компилятора в создаваемый объектный файл. Этот переключатель реализован только на некоторых целевых платформах, и точный формат записи зависит от целевой платформы и формата двоичного файла, но обычно он принимает форму секции, содержащей текст ASCII. Этот переключатель связан с переключателем -fverbose-asm, но этот переключатель записывает информацию только в файл вывода ассемблера в виде комментариев, поэтому он никогда не достигает объектного файла. См. также -grecord-gcc-switches для другого способа сохранения параметров компилятора в объектный файл.
-fpic-
Генерировать позиционно-независимый код (PIC), пригодный для использования в общей библиотеке, если это поддерживается для целевой машины. Такой код обращается ко всем константным адресам через таблицу глобальных смещений (GOT). Динамический загрузчик разрешает записи GOT при запуске программы (динамический загрузчик не является частью GCC; он является частью операционной системы). Если размер GOT для связанного исполняемого файла превышает машино-зависимый максимальный размер, вы получите сообщение об ошибке от компоновщика, указывающее, что -fpic не работает; в этом случае перекомпилируйте с -fPIC вместо этого. (Эти максимальные значения составляют 8 КБ на SPARC, 28 КБ на AArch64 и 32 КБ на m68k и RS/6000. У x86 нет такого ограничения.)
Позиционно-независимый код требует специальной поддержки и поэтому работает только на определённых машинах. Для x86 GCC поддерживает PIC для System V, но не для Sun 386i. Код, сгенерированный для IBM RS/6000, всегда позиционно-независим.
При установке этого флага макросы
__pic__и__PIC__определяются как 1. -fPIC-
Если это поддерживается для целевой машины, генерировать позиционно-независимый код, подходящий для динамической компоновки и избегающий каких-либо ограничений на размер таблицы глобальных смещений. Этот параметр имеет значение на AArch64, m68k, PowerPC и SPARC.
Позиционно-независимый код требует специальной поддержки и поэтому работает только на определённых машинах.
При установке этого флага макросы
__pic__и__PIC__определяются как 2. -fpie-fPIE-
Эти параметры похожи на -fpic и -fPIC, но сгенерированный позиционно-независимый код может быть связан только в исполняемые файлы. Обычно эти параметры используются для компиляции кода, который будет связан с помощью параметра -pie GCC.
-fpie и -fPIE оба определяют макросы
__pie__и__PIE__. Макросы имеют значение 1 для -fpie и 2 для -fPIE. -fno-plt-
Не использовать PLT для вызовов внешних функций в позиционно-независимом коде. Вместо этого загружать адрес вызываемой функции в местах вызова из GOT и переходить к нему. Это приводит к более эффективному коду путём устранения псевдонимов PLT и раскрытия загрузок GOT для оптимизаций. На таких архитектурах, как 32-разрядный x86, где псевдонимы PLT ожидают указатель GOT в определённом регистре, это даёт компилятору больше свободы в распределении регистров. Ленивая привязка требует использования PLT; с -fno-plt все внешние символы разрешаются во время загрузки.
В качестве альтернативы, можно использовать атрибут функции
noplt, чтобы избежать вызовов через PLT для определённых внешних функций.В позиционно-зависимом коде некоторые целевые платформы также преобразуют вызовы функций, помеченных как не использующие PLT, в использование вместо этого GOT.
-fno-jump-tables-
Не использовать таблицы переходов для операторов switch даже там, где это было бы эффективнее, чем другие стратегии генерации кода. Этот параметр полезен в сочетании с -fpic или -fPIC для создания кода, который является частью динамического загрузчика и не может ссылаться на адрес таблицы переходов. На некоторых целевых платформах таблицы переходов не требуют GOT, и этот параметр не нужен.
-ffixed-reg-
Обращаться к регистру, названному reg, как к фиксированному регистру; сгенерированный код не должен ссылаться на него (кроме, возможно, в качестве указателя стека, указателя фрейма или в какой-либо другой фиксированной роли).
reg должно быть именем регистра. Принимаемые имена регистров зависят от машины и определяются в макросе
REGISTER_NAMESв файле макросов описания машины.Этот флаг не имеет отрицательной формы, потому что он определяет трёхсторонний выбор.
-fcall-used-reg-
Обращаться к регистру, названному reg, как к регистру, который может быть распределён и перекрывается вызовами функций. Его можно использовать для временных или переменных, которые не живут после вызова. Функции, скомпилированные таким образом, не сохраняют и не восстанавливают регистр reg.
Использование этого флага с указателем фрейма или указателем стека является ошибкой. Использование этого флага для других регистров, которые играют фиксированные распространённые роли в модели выполнения машины, приводит к катастрофическим результатам.
Этот флаг не имеет отрицательной формы, потому что он определяет трёхсторонний выбор.
-fcall-saved-reg-
Обращаться к регистру, названному reg, как к регистру, который может быть распределён и сохраняется функциями. Его можно использовать даже для временных или переменных, которые существуют после вызова. Функции, скомпилированные таким образом, сохраняют и восстанавливают регистр reg, если они его используют.
Использование этого флага с указателем фрейма или указателем стека является ошибкой. Использование этого флага для других регистров, которые играют фиксированные распространённые роли в модели выполнения машины, приводит к катастрофическим результатам.
Другая разновидность катастрофы возникает при использовании этого флага для регистра, в котором могут возвращаться значения функций.
Этот флаг не имеет отрицательной формы, потому что он определяет трёхсторонний выбор.
-fpack-struct[=n]-
Без указанного значения все члены структуры упаковываются вместе без пропусков. При указании значения (которое должно быть небольшой степенью двойки), члены структуры упаковываются в соответствии с этим значением, представляющим максимальное выравнивание (то есть объекты с требованиями к выравниванию по умолчанию, большими, чем это значение, выводятся потенциально неуровненными в следующей подходящей позиции.
Предупреждение: переключатель -fpack-struct заставляет GCC генерировать код, который не является двоично совместимым с кодом, сгенерированным без этого переключателя. Кроме того, это делает код не оптимальным. Используйте его для соответствия нестандартному интерфейсу приложений.
-fleading-underscore-
Этот параметр и его аналог -fno-leading-underscore принудительно изменяют способ представления символов C в объектных файлах. Одно из применений — помощь в связывании со старым кодом ассемблера.
Предупреждение: переключатель -fleading-underscore заставляет GCC генерировать код, который не является двоично совместимым с кодом, сгенерированным без этого переключателя. Используйте его для соответствия нестандартному интерфейсу приложений. Не все целевые платформы полностью поддерживают этот переключатель.
-ftls-model=model-
Изменить используемую модель локального хранения потоков (см. Локальное хранение потоков). Аргумент model должен быть одним из ‘global-dynamic’, ‘local-dynamic’, ‘initial-exec’ или ‘local-exec’. Обратите внимание, что выбор может быть подвержен оптимизации: компилятор может использовать более эффективную модель для символов, невидимых за пределами единицы трансляции, или если -fpic не указан в командной строке.
По умолчанию без -fpic — ‘initial-exec’; с -fpic по умолчанию — ‘global-dynamic’.
-ftrampolines-
Для целевых платформ, которые обычно нуждаются в трамплинах для вложенных функций, всегда генерировать их вместо использования описателей. В противном случае, для платформ, которым они не нужны, таких как, например, HP-PA или IA-64, ничего не делать.
Трамплин — это небольшой фрагмент кода, который создаётся во время выполнения в стеке, когда берётся адрес вложенной функции, и используется для косвенного вызова вложенной функции. Поэтому для правильной работы программы требуется, чтобы стек был исполняемым.
-fno-trampolines по умолчанию включён для каждого языка, чтобы позволить компилятору избежать генерации их, если он считает это безопасным, и заменить их описателями. Описатели состоят только из данных, но сгенерированный код должен быть подготовлен к работе с ними. На момент написания этой статьи, -fno-trampolines включен по умолчанию только для Ada.
Кроме того, код, скомпилированный с -ftrampolines, и код, скомпилированный с -fno-trampolines, не являются двоично совместимыми, если присутствуют вложенные функции. Поэтому этот параметр должен использоваться во всём проекте и применяться с большой осторожностью.
-fvisibility=[default|internal|hidden|protected]
-
Установите видимость символов в ELF-образе по умолчанию на указанный вариант — все символы отмечаются этим, если не переопределены в коде. Использование этой функции может значительно улучшить время линковки и загрузки библиотек общих объектов, создать более оптимизированный код, обеспечить почти идеальный экспорт API и предотвратить конфликты символов. Настоятельно рекомендуется использовать ее во всех распространяемых общих объектах.
Несмотря на номенклатуру, «default» всегда означает «публичный»; т.е., доступный для линковки извне общего объекта. «protected» и «internal» практически бесполезны в реальном использовании, поэтому единственным другим обычно используемым вариантом является «hidden». Значение по умолчанию, если -fvisibility не указано, равно «default», т.е. все символы публичные.
Хорошее объяснение преимуществ, предлагаемых обеспечением правильной видимости ELF-символов, даётся в статье «How To Write Shared Libraries» Ульриха Дреппера (которая может быть найдена по адресу https://www.akkadia.org/drepper/) — однако, превосходное решение, позволяющее маркировать вещи как скрытые, когда значение по умолчанию — публичное, — сделать значение по умолчанию скрытым и маркировать вещи как публичные. Таков стандарт для DLL на Windows, и с -fvisibility=hidden и
__attribute__ ((visibility("default")))вместо__declspec(dllexport)вы получаете практически идентичную семантику с идентичным синтаксисом. Это большая польза для тех, кто работает с кроссплатформенными проектами.Для тех, кто добавляет поддержку видимости в существующий код, вы можете найти
#pragma GCC visibilityполезным. Это работает так, что вы заключаете объявления, для которых вы хотите установить видимость, в (например)#pragma GCC visibility push(hidden)и#pragma GCC visibility pop. Имейте в виду, что видимость символа следует рассматривать как часть контракта интерфейса API, и поэтому весь новый код всегда должен указывать видимость, если она не является значением по умолчанию; т.е., объявления, предназначенные только для использования внутри локального DSO, должны всегда явно помечаться как скрытые, чтобы избежать накладных расходов на косвенные обращения через PLT — это также делает код более читабельным и самодокументированным. Обратите внимание, что из-за требований спецификации ISO C++,operator newиoperator deleteвсегда должны иметь видимость по умолчанию.Следует иметь в виду, что заголовки извне вашего проекта, особенно системные заголовки и заголовки из любой другой используемой библиотеки, могут не ожидать компиляции с видимостью, отличной от значения по умолчанию. Возможно, вам потребуется явно указать
#pragma GCC visibility push(default)перед включением таких заголовков.Объявления
externне влияют на -fvisibility, поэтому много кода можно перекомпилировать с -fvisibility=hidden без каких-либо изменений. Однако это означает, что вызовы функцийexternбез явной видимости используют PLT, поэтому эффективнее использовать__attribute ((visibility))и/или#pragma GCC visibilityдля указания компилятору, какие объявленияexternследует рассматривать как скрытые.Обратите внимание, что -fvisibility влияет на сущности неявной связи C++. Это означает, что, например, класс исключений, который выбрасывается между DSO, должен быть явно помечен как имеющий видимость по умолчанию, чтобы узлы «type_info» были объединены между DSO.
Обзор этих техник, их преимуществ и способов их использования находится по адресу http://gcc.gnu.org/wiki/Visibility.
-fstrict-volatile-bitfields-
Этот параметр следует использовать, если доступ к переменным с модификатором volatile (или другим полям структуры, хотя компилятор обычно обрабатывает эти типы так же) должен использовать одно обращение размером типа поля, выровненное по естественному выравниванию, если это возможно. Например, целевые устройства с периферийными регистрами с отображением в памяти могут потребовать, чтобы все такие обращения имели ширину 16 бит; с этим флагом вы можете объявить все битовые поля периферийных устройств как
unsigned short(предполагая, что short имеет 16 бит на этих целевых устройствах), чтобы заставить GCC использовать обращения размером 16 бит вместо, возможно, более эффективных обращений размером 32 бита.Если этот параметр отключен, компилятор использует наиболее эффективный инструкцию. В предыдущем примере это может быть инструкция загрузки размером 32 бита, даже если она обращается к байтам, не содержащим никакой части битового поля, или к регистрам с отображением в памяти, не связанным с обновляемым регистром.
В некоторых случаях, таких как применение атрибута
packedк полю структуры, может быть невозможно получить доступ к полю с помощью единственного чтения или записи, правильно выровненного для целевого компьютера. В этом случае GCC возвращается к генерации нескольких обращений вместо кода, который приведет к ошибке или обрезке результата во время выполнения.Примечание: из-за ограничений модели памяти C/C++11 записи не могут затронуть члены, не являющиеся битовыми полями. Поэтому рекомендуется определить все биты типа поля как члены битового поля.
Значение по умолчанию этого параметра определяется интерфейсом приложения для целевого процессора.
-fsync-libcalls-
Этот параметр управляет тем, могут ли какие-либо внестрочные экземпляры функций из семейства
__syncбыть использованы для реализации функций семейства C++11__atomic.Значение по умолчанию этого параметра включено, поэтому единственной полезной формой параметра является -fno-sync-libcalls. Этот параметр используется в реализации библиотеки времени выполнения libatomic.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Code-Gen-Options.html