Spec-Zone.ru › GCC 7

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.

-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, которые не выделяют память.

Компиляторы Unix C традиционно выделяли память для неопределённых глобальных переменных в общем блоке. Это позволяет компоновщику разрешать все временные определения одной переменной в разных единицах компиляции для одного объекта или для неопределённого определения. Это поведение задаётся ключом -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, содержится в статье «Как писать общие библиотеки» Ульриха Дреппера (которую можно найти по адресу 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.

Далее: Параметры разработчика, Предыдущий: Параметры каталогов, Вверх: Вызов GCC [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Code-Gen-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API