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, и файлами, скомпилированными другими компиляторами, особенно портативным C-компилятором (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, но сгенерированный позиционно-независимый код может быть связан только с исполняемыми файлами. Обычно эти параметры используются для компиляции кода, который будет связан с помощью параметра GCC -pie.
-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, и этот параметр не нужен.
-fno-bit-tests-
Не использовать битовые тесты для операторов switch, даже если это было бы эффективнее, чем другие стратегии генерации кода.
-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 приведено в статье «Как писать библиотеки динамической компоновки» Ульриха Дреппера (которую можно найти по адресу 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-11.4.0/gcc/Code-Gen-Options.html