3.16 Параметры для соглашений о генерации кода
Эти независимые от машины параметры управляют соглашениями интерфейса, используемыми при генерации кода.
Большинство из них имеют положительную и отрицательную формы; отрицательная форма -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 генерировать код, который не является бинарно совместимым с кодом, сгенерированным без этого ключа. Используйте его для соответствия нестандартному интерфейсу приложения.
-fno-common-
В коде C этот параметр управляет размещением глобальных переменных, определённых без инициализатора, известных как *временные определения* в стандарте C. Временные определения отличаются от объявлений переменной с ключевым словом
extern, которые не выделяют память.Компиляторы C для Unix традиционно выделяют память для неинициализированных глобальных переменных в общем блоке. Это позволяет компоновщику разрешить все временные определения одной переменной в разных единицах компиляции к одному объекту или к невременному определению. Это поведение задаётся параметром -fcommon и является по умолчанию для GCC на большинстве целей. С другой стороны, это поведение не требуется стандартом ISO C, и на некоторых целях может нести затраты на скорость или размер кода при обращениях к переменной.
Параметр -fno-common указывает, что компилятор должен вместо этого размещать неинициализированные глобальные переменные в секции данных файла объекта. Это препятствует слиянию временных определений компоновщиком, поэтому вы получите ошибку множественного определения, если одна и та же переменная определена более чем в одной единице компиляции. Компиляция с -fno-common полезна на тех целях, для которых она обеспечивает лучшую производительность, или если вы хотите убедиться, что программа будет работать на других системах, которые всегда обрабатывают определения неинициализированных переменных таким образом.
-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, и этот параметр не нужен.
-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-
Этот параметр следует использовать, если при доступе к изменяемым битовым полям (или другим полям структуры, хотя компилятор обычно соблюдает их типы) должен использоваться один доступ размером типа поля, выровненный по естественному выравниванию, если это возможно. Например, целевым устройствам с периферийными регистрами с отображением в памяти может потребоваться, чтобы все такие обращения имели ширину 16 бит; с помощью этого флага вы можете объявить все периферийные битовые поля как
unsigned short(предполагая, что short имеет 16 бит на этих целевых устройствах), чтобы заставить GCC использовать 16-битные обращения вместо, возможно, более эффективного 32-битного обращения.Если этот параметр отключен, компилятор использует наиболее эффективный инструкцию. В предыдущем примере это может быть 32-битная инструкция загрузки, даже если она обращается к байтам, которые не содержат никакой части битового поля или к периферийным регистрам, не связанным с тем, который обновляется.
В некоторых случаях, например, когда атрибут
packedприменяется к полю структуры, доступ к полю может быть невозможен с помощью одного чтения или записи, правильно выровненного для целевой машины. В этом случае GCC возвращается к генерации нескольких обращений, а не к коду, который приведет к ошибке или усечению результата во время выполнения.Примечание: из-за ограничений модели памяти C/C++11 записи не разрешается затрагивать члены, которые не являются битовыми полями. Поэтому рекомендуется определять все биты типа поля как члены битового поля.
Значение по умолчанию этого параметра определяется интерфейсом бинарного приложения для целевого процессора.
-fsync-libcalls-
Этот параметр управляет тем, может ли любая внестрочная инстанция функций семейства
__syncбыть использована для реализации функций семейства C++11__atomic.Значение по умолчанию этого параметра включено, поэтому единственная полезная форма параметра — -fno-sync-libcalls. Этот параметр используется в реализации библиотеки времени выполнения libatomic.
Далее: Параметры разработчика, Предыдущее: Параметры каталога, Наверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Code-Gen-Options.html