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. Это включает -fexceptions. -fdelete-dead-exceptions-
Считается, что инструкции, которые могут генерировать исключения, но не вносят иного вклада в выполнение программы, могут быть оптимизированы. Это не затрагивает вызовы функций, за исключением функций с атрибутами
pureилиconst. Этот параметр включен по умолчанию для компиляторов Ada и C++, как разрешено спецификациями языка. Процессы оптимизации, которые приводят к удалению мёртвых исключений, включаются независимо на разных уровнях оптимизации. -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 этот параметр управляет размещением глобальных переменных, определённых без инициализации, известных как tentative definitions в стандарте C. Tentative definitions отличаются от объявлений переменной с ключевым словом
extern, которые не выделяют память.Значение по умолчанию — -fno-common, которое указывает компилятору размещать неинициализированные глобальные переменные в секции BSS объектного файла. Это препятствует объединению tentative definitions линковщиком, поэтому вы получите ошибку множественного определения, если одна и та же переменная случайно определена в более чем одном модуле компиляции.
Параметр -fcommon размещает неинициализированные глобальные переменные в общем блоке. Это позволяет линковщику разрешать все tentative definitions одной и той же переменной в разных модулях компиляции в один и тот же объект или до не-tentative определения. Это поведение несовместимо с 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, и этот параметр не нужен.
-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, не совместимы двоично, если присутствуют вложенные функции. Поэтому этот параметр должен использоваться на уровне всего программы и с большой осторожностью.
Для языков программирования, отличных от 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.
Обзор этих методов, их преимуществ и способов их использования находится по адресу https://gcc.gnu.org/wiki/Visibility.
-fstrict-volatile-bitfields-
Этот параметр следует использовать, если обращения к переменным типа volatile bit-fields (или другим полям структуры, хотя компилятор обычно обрабатывает такие типы так же) должны использовать единственное обращение шириной типа поля, выровненное по возможному естественному выравниванию. Например, целевые устройства с отображаемыми в памяти периферийными регистрами могут потребовать, чтобы все такие обращения имели ширину 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-12.2.0/gcc/Code-Gen-Options.html