Spec-Zone.ru › GCC 9

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

Этот параметр сообщает компилятору, что переполнение при арифметических операциях со знаком (сложение, вычитание, умножение) происходит с обходом по модулю 2's complement. Этот флаг позволяет использовать некоторые оптимизации и отключает другие. Параметры -ftrapv и -fwrapv перекрывают друг друга, поэтому использование -ftrapv -fwrapv в командной строке приводит к тому, что -fwrapv имеет эффект. Обратите внимание, что только активные параметры перекрывают, поэтому использование -ftrapv -fwrapv -fno-wrapv в командной строке приводит к тому, что -ftrapv имеет эффект.

-fwrapv-pointer

Этот параметр сообщает компилятору, что переполнение при арифметике указателей при сложении и вычитании происходит с обходом по модулю 2's complement. Этот флаг отключает некоторые оптимизации, предполагающие, что переполнение указателя недопустимо.

-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 указывает, что компилятор должен вместо этого разместить неопределённые глобальные переменные в секции BSS файла объекта. Это препятствует слиянию временных определений компоновщиком, поэтому вы получите ошибку множественного определения, если одна и та же переменная определена более чем в одной единице компиляции. Компиляция с параметром -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, но сгенерированный позиционно-независимый код может быть связан только в исполняемые файлы. Обычно эти параметры используются для компиляции кода, который будет связан с помощью параметра -pie GCC.

-fpie и -fPIE оба определяют макросы __pie__ и __PIE__. Макросы имеют значение 1 для -fpie и 2 для -fPIE.

-fno-plt

Не использовать PLT для вызовов внешних функций в позиционно-независимом коде. Вместо этого загружать адрес вызываемой функции в точках вызова из GOT и переходить к нему. Это приводит к более эффективному коду, исключая PLT-подпрограммы и позволяя оптимизировать загрузки из GOT. На архитектурах, таких как 32-битный x86, где PLT-подпрограммы ожидают указатель GOT в определённом регистре, это даёт компилятору больше свободы при распределении регистров. Ленивая привязка требует использования PLT; с -fno-plt все внешние символы разрешаются во время загрузки.

В качестве альтернативы, атрибут функции noplt может быть использован для избежания вызовов через PLT для определённых внешних функций.

В позиционно-зависимом коде некоторые целевые платформы также преобразуют вызовы функций, которые помечены как не использующие PLT, в использование GOT вместо этого.

-fno-jump-tables

Не использовать таблицы переходов для операторов switch даже в тех случаях, когда это было бы эффективнее, чем другие стратегии генерации кода. Этот параметр полезен в сочетании с -fpic или -fPIC для построения кода, который является частью динамического загрузчика и не может ссылаться на адрес таблицы переходов. На некоторых целевых платформах таблицы переходов не требуют GOT, и этот параметр не нужен.

-ffixed-reg

Обрабатывать регистр с именем reg как фиксированный регистр; сгенерированный код не должен ссылаться на него (кроме, возможно, как на указатель стека, указатель кадра или в какой-либо другой фиксированной роли).

reg должно быть именем регистра. Принимаемые имена регистров зависят от машины и определяются в макросе REGISTER_NAMES в файле макросов описания машины.

У этого флага нет отрицательной формы, так как он задаёт трёхсторонний выбор.

-fcall-used-reg

Обрабатывать регистр с именем reg как регистр, который может быть выделен и уничтожается вызовами функций. Он может быть выделен для временных переменных или переменных, которые не существуют между вызовами. Функции, скомпилированные таким образом, не сохраняют и не восстанавливают регистр reg.

Использование этого флага с указателем кадра или указателем стека является ошибкой. Использование этого флага для других регистров, которые играют фиксированные роли в модели выполнения машины, приводит к катастрофическим результатам.

У этого флага нет отрицательной формы, так как он задаёт трёхсторонний выбор.

-fcall-saved-reg

Обрабатывать регистр с именем reg как регистр, который может быть выделен и сохраняется функциями. Он может быть выделен даже для временных переменных или переменных, которые существуют между вызовами. Функции, скомпилированные таким образом, сохраняют и восстанавливают регистр reg, если они его используют.

Использование этого флага с указателем кадра или указателем стека является ошибкой. Использование этого флага для других регистров, которые играют фиксированные роли в модели выполнения машины, приводит к катастрофическим результатам.

Другой тип катастрофы возникает при использовании этого флага для регистра, в котором могут возвращаться значения функций.

У этого флага нет отрицательной формы, так как он задаёт трёхсторонний выбор.

-fpack-struct[=n]

Без указанного значения упаковывать все члены структуры вместе без пропусков. При указании значения (которое должно быть небольшой степенью двойки), упаковывать члены структуры в соответствии с этим значением, представляющим максимальное выравнивание (т. е. объекты с требованиями к выравниванию по умолчанию, превышающими это значение, выводятся, возможно, невыровненными в следующем подходящем месте).

Предупреждение: переключатель -fpack-struct заставляет GCC генерировать код, несовместимый с двоичным кодом, сгенерированным без этого переключателя. Кроме того, это делает код не оптимальным. Используйте его для соответствия нестандартному интерфейсу приложений.

-fleading-underscore

Этот параметр и его аналог -fno-leading-underscore принудительно изменяют способ представления символов C в объектном файле. Одно из применений — помощь в связывании с устаревшим кодом ассемблера.

Предупреждение: переключатель -fleading-underscore заставляет GCC генерировать код, несовместимый с двоичным кодом, сгенерированным без этого переключателя. Используйте его для соответствия нестандартному интерфейсу приложений. Не все целевые платформы полностью поддерживают этот переключатель.

-ftls-model=model

Изменить модель локального хранения потоков (см. Локальное хранение потоков). Аргумент model должен быть одним из ‘global-dynamic’, ‘local-dynamic’, ‘initial-exec’ или ‘local-exec’. Обратите внимание, что выбор подвержен оптимизации: компилятор может использовать более эффективную модель для символов, не видимых вне трансляционной единицы, или если -fpic не задан в командной строке.

Значение по умолчанию без -fpic — ‘initial-exec’; с -fpic значение по умолчанию — ‘global-dynamic’.

-ftrampolines

Для целевых платформ, которые обычно нуждаются в подпрограммах для вложенных функций, всегда генерировать их вместо использования описателей. В противном случае, для целевых платформ, которые в них не нуждаются, например, HP-PA или IA-64, ничего не делать.

Подпрограмма — это небольшой фрагмент кода, который создаётся во время выполнения в стеке, когда берётся адрес вложенной функции, и используется для косвенного вызова вложенной функции. Поэтому для корректной работы программы требуется, чтобы стек был исполняемым.

-fno-trampolines по умолчанию включён на языке за языком, чтобы позволить компилятору избегать их генерации, если он считает это безопасным, и заменить их описателями. Описатели состоят только из данных, но сгенерированный код должен быть готов к работе с ними. На данный момент -fno-trampolines по умолчанию включён только для Ada.

Кроме того, код, скомпилированный с -ftrampolines, и код, скомпилированный с -fno-trampolines, несовместимы с двоичным кодом, если присутствуют вложенные функции. Поэтому этот параметр должен использоваться во всём проекте и обрабатываться с большой осторожностью.

-fvisibility=[default|internal|hidden|protected]

Установите видимость символов изображения ELF по умолчанию на указанный вариант — все символы помечаются этим, если не переопределены в коде. Использование этой функции может значительно улучшить время линковки и загрузки библиотек общих объектов, создать более оптимизированный код, обеспечить почти идеальный экспорт API и предотвратить конфликты символов. Настоятельно рекомендуется использовать ее во всех распространяемых общих объектах.

Несмотря на номенклатуру, «default» всегда означает общедоступный; т. е., доступный для линковки извне общего объекта. «protected» и «internal» практически бесполезны в реальном использовании, поэтому единственный другой часто используемый вариант — «hidden». Значение по умолчанию, если -fvisibility не указано, — «default», т. е. сделать каждый символ общедоступным.

Хорошее объяснение преимуществ, обеспечиваемых гарантированной правильной видимостью символов ELF, дается в статье «Как писать общие библиотеки» Ульриха Дреппера (которую можно найти по адресу 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-9.5.0/gcc/Code-Gen-Options.html

Spec-Zone.ru

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