Spec-Zone.ru › GCC 5

3.18 Варианты для соглашений о генерации кода

Эти независимые от машины параметры управляют соглашениями интерфейса, используемыми при генерации кода.

Большинство из них имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo — -fno-foo. В таблице ниже указана только одна форма — та, которая не является стандартной. Вы можете определить другую форму, либо удалив «no-», либо добавив её.

-fbounds-check

Для фронтендов, которые это поддерживают, генерируется дополнительный код для проверки того, что индексы, используемые для доступа к массивам, находятся в объявленном диапазоне. В настоящее время это поддерживается только фронтендами Java и Fortran, где этот параметр по умолчанию равен true и false соответственно.

-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

Этот параметр генерирует ловушки для переполнения знакового результата при сложении, вычитании и умножении.

-fwrapv

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

-fexceptions

Включить обработку исключений. Генерирует дополнительный код, необходимый для распространения исключений. Для некоторых целевых платформ это означает, что GCC генерирует информацию о развороте стека для всех функций, что может привести к значительному увеличению размера данных, хотя не влияет на выполнение. Если вы не указываете этот параметр, GCC включает его по умолчанию для языков, таких как C++, которые обычно требуют обработки исключений, и отключает его для языков, таких как C, которые обычно её не требуют. Однако вам может потребоваться включить этот параметр при компиляции кода C, который должен правильно взаимодействовать с обработчиками исключений, написанными на C++. Вы также можете отключить этот параметр, если вы компилируете старые программы C++, которые не используют обработку исключений.

-fnon-call-exceptions

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

-fdelete-dead-exceptions

Учитывать, что инструкции, которые могут вызывать исключения, но не вносят никакого другого вклада в выполнение программы, могут быть оптимизированы. Этот параметр включён по умолчанию для фронтенда Ada, как разрешено спецификацией языка Ada. Оптимизационные проходы, которые приводят к удалению мёртвых исключений, включаются независимо на разных уровнях оптимизации.

-funwind-tables

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

-fasynchronous-unwind-tables

Генерировать таблицу разворота стека в формате DWARF 2, если это поддерживается целевой машиной. Таблица точна на границе каждой инструкции, поэтому её можно использовать для разворота стека при асинхронных событиях (таких как отладчик или сборщик мусора).

-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-double

Использовать тот же размер для double , что и для float.

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

-fshort-wchar

Переопределить базовый тип для wchar_t на short unsigned int вместо значения по умолчанию для целевой платформы. Этот параметр полезен для создания программ, которые будут работать под WINE.

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

-fno-common

В коде C, управляет размещением неинициализированных глобальных переменных. Компиляторы Unix C традиционно разрешали несколько определений таких переменных в разных единицах компиляции, размещая переменные в общем блоке. Это поведение задаётся ключом -fcommon и является значением по умолчанию для GCC на большинстве платформ. С другой стороны, это поведение не требуется стандартом ISO C, и на некоторых платформах может приводить к снижению производительности или увеличению размера кода при обращении к переменным. Параметр -fno-common указывает компилятору размещать неинициализированные глобальные переменные в секции данных файла объекта, а не генерировать их как общие блоки. Это приводит к тому, что если одна и та же переменная объявлена (без extern) в двух разных компиляциях, при их линковке произойдёт ошибка множественного определения. В этом случае нужно использовать -fcommon. Компиляция с -fno-common полезна на платформах, где это обеспечивает лучшую производительность, или если вы хотите проверить, что программа будет работать на других системах, которые всегда обрабатывают объявления неинициализированных переменных таким образом.

-fno-ident

Игнорировать директиву #ident .

-finhibit-size-directive

Не выводить директиву ассемблера .size, или что-либо ещё, что может вызвать проблемы, если функция разделена пополам, и обе части размещаются в разных местах памяти. Этот параметр используется при компиляции crtstuff.c; вам не нужно использовать его для других целей.

-fverbose-asm

Добавить дополнительную информацию в сгенерированный ассемблерный код для повышения его читабельности. Этот параметр полезен только тем, кому действительно нужно прочитать сгенерированный ассемблерный код (например, при отладке самого компилятора).

-fno-verbose-asm, значение по умолчанию, исключает дополнительную информацию, что полезно при сравнении двух ассемблерных файлов.

-frecord-gcc-switches

Этот ключ заставляет запись команды, используемой для вызова компилятора, в создаваемый файл объекта. Этот ключ реализован только на некоторых платформах, и точный формат записи зависит от целевой платформы и формата двоичного файла, но обычно он имеет вид секции, содержащей текстовый ASCII. Этот ключ связан с ключом -fverbose-asm, но этот ключ записывает информацию только в комментарии в выходной файл ассемблера, поэтому она никогда не попадает в файл объекта. Смотрите также -grecord-gcc-switches для другого способа сохранения параметров компилятора в файле объекта.

-fpic

Генерировать позиционно-независимый код (PIC), подходящий для использования в общей библиотеке, если это поддерживается для целевой машины. Такой код обращается ко всем постоянным адресам через глобальную таблицу смещений (GOT). Динамический загрузчик разрешает записи GOT при запуске программы (динамический загрузчик не является частью GCC; он является частью операционной системы). Если размер GOT для связанного исполняемого файла превышает максимальный размер, специфичный для машины, вы получаете сообщение об ошибке от компоновщика, указывающее, что -fpic не работает; в этом случае перекомпилируйте с -fPIC вместо этого. (Эти максимумы составляют 8 КБ на SPARC и 32 КБ на m68k и RS/6000. У x86 нет такого ограничения.)

Позиционно-независимый код требует специальной поддержки и поэтому работает только на определённых машинах. Для x86 GCC поддерживает PIC для System V, но не для Sun 386i. Код, сгенерированный для IBM RS/6000, всегда является позиционно-независимым.

Когда этот флаг установлен, макросы __pic__ и __PIC__ определяются как 1.

-fPIC

Если это поддерживается для целевой машины, выдать позиционно-независимый код, подходящий для динамической компоновки и избегания каких-либо ограничений на размер глобальной таблицы смещений. Этот параметр имеет значение для m68k, PowerPC и SPARC.

Позиционно-независимый код требует специальной поддержки и поэтому работает только на определённых машинах.

Когда этот флаг установлен, макросы __pic__ и __PIC__ определяются как 2.

-fpie
-fPIE

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

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

-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 генерировать код, который не совместим с двоичным кодом, сгенерированным без этого переключателя. Кроме того, это делает код не оптимальным. Используйте его для соответствия нестандартному интерфейсу двоичных приложений.

-finstrument-functions

Генерировать вызовы инструментов для входа и выхода из функций. Сразу после входа в функцию и непосредственно перед выходом из функции вызываются следующие функции профилирования с адресом текущей функции и её места вызова. (На некоторых платформах __builtin_return_address не работает за пределами текущей функции, поэтому информация о месте вызова может быть недоступна функциям профилирования иначе.)

void __cyg_profile_func_enter (void *this_fn,
                               void *call_site);
void __cyg_profile_func_exit  (void *this_fn,
                               void *call_site);

Первый аргумент — адрес начала текущей функции, который можно точно найти в таблице символов.

Эта инструментация также выполняется для функций, встраиваемых в другие функции. Вызовы профилирования указывают, где концептуально встраиваемая функция входит и выходит. Это означает, что должны быть доступны адресованные версии таких функций. Если все ваши использования функции встроены, это может означать дополнительное увеличение размера кода. Если вы используете extern inline в своём коде C, должна быть предоставлена адресованная версия таких функций. (Это обычно так и есть, но если вам повезёт, и оптимизатор всегда встраивает функции, вы могли бы обойтись без предоставления статических копий.)

Функции могут получить атрибут no_instrument_function, в этом случае эта инструментация не выполняется. Это может быть использовано, например, для перечисленных выше функций профилирования, высокоприоритетных прерываний и любых функций, из которых функции профилирования не могут безопасно вызываться (возможно, обработчики сигналов, если функции профилирования генерируют вывод или выделяют память).

-finstrument-functions-exclude-file-list=file,file,…

Установить список функций, которые исключены из инструментации (см. описание -finstrument-functions). Если файл, содержащий определение функции, совпадает с одним из file, то эта функция не подвергается инструментации. Сопоставление выполняется по подстрокам: если параметр file является подстрокой имени файла, он считается совпадением.

Например:

-finstrument-functions-exclude-file-list=/bits/stl,include/sys

исключает любые встраиваемые функции, определённые в файлах, пути к которым содержат /bits/stl или include/sys.

Если по какой-либо причине вы хотите включить букву «,» в одном из sym, запишите «\,». Например, -finstrument-functions-exclude-file-list='\,\,tmp' (обратите внимание на одинарные кавычки, окружающие параметр).

-finstrument-functions-exclude-function-list=sym,sym,…

Это аналогично -finstrument-functions-exclude-file-list, но этот параметр устанавливает список имён функций, которые следует исключить из инструментации. Имя функции для сопоставления — это видимое имя пользователя, такое как vector<int> blah(const vector<int> &), а не внутреннее преобразованное имя (например, _Z4blahRSt6vectorIiSaIiEE). Сопоставление выполняется по подстрокам: если параметр sym является подстрокой имени функции, он считается совпадением. Для идентификаторов C99 и C++ расширенной формы имя функции должно быть указано в UTF-8, а не с помощью универсальных символьных имен.

-fstack-check

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

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

Вы также можете указать строковый параметр: ‘no’ — нет проверки, ‘generic’ — принудительно использовать проверку старого стиля, ‘specific’ — использовать лучший метод проверки и эквивалентен простому -fstack-check.

Проверка старого стиля — это общий механизм, который не требует специфической поддержки целевой платформы в компиляторе, но имеет следующие недостатки:

  1. Изменённая стратегия выделения для больших объектов: они всегда выделяются динамически, если их размер превышает фиксированный порог.
  2. Фиксированное ограничение на размер статического фрейма функций: когда он достигает предела в определённой функции, проверка стека ненадёжна, и компилятор выводит предупреждение.
  3. Неэффективность: из-за как изменённой стратегии выделения, так и общего механизма, снижается производительность кода.

Обратите внимание, что проверка стека старого стиля также является запасным методом для ‘specific’, если в компиляторе не добавлена поддержка целевой платформы.

-fstack-limit-register=reg
-fstack-limit-symbol=sym
-fno-stack-limit

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

Например, если стек начинается по абсолютному адресу ‘0x80000000’ и растёт вниз, вы можете использовать флаги -fstack-limit-symbol=__stack_limit и -Wl,--defsym,__stack_limit=0x7ffe0000 для ограничения стека до 128 КБ. Обратите внимание, что это может работать только с компоновщиком GNU.

-fsplit-stack

Генерировать код для автоматического разделения стека перед переполнением. Полученная программа имеет разрозненный стек, который может переполниться только в том случае, если программа не сможет выделить больше памяти. Это наиболее полезно при работе с многопоточными программами, так как больше нет необходимости рассчитывать подходящий размер стека для каждого потока. В настоящее время это реализовано только для целевых платформ x86, работающих под GNU/Linux.

Когда код, скомпилированный с -fsplit-stack, вызывает код, скомпилированный без -fsplit-stack, для последнего кода может быть недостаточно места в стеке. Если компиляция всего кода, включая библиотечный код, с -fsplit-stack невозможна, компоновщик может исправить эти вызовы таким образом, что код, скомпилированный без -fsplit-stack, всегда имеет большой стек. Поддержка этого реализована в компоновщике gold в выпуске GNU binutils 2.21 и более поздних версиях.

-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’.

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

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

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

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

Spec-Zone.ru

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