Spec-Zone.ru › GCC 11

Предыдущее: Предварительная обработка модулей, Вверх: Модули C++ [Содержание][Индекс]

3.23.3 Интерфейс скомпилированного модуля ¶

CMI — это дополнительный артефакт при компиляции интерфейсов именованных модулей, разделов или файлов заголовков. Они считываются при импорте. Содержимое CMI зависит от реализации и, в случае GCC, привязано к версии компилятора. Рассматривайте их как кешируемый артефакт, который можно перестроить, а не как распространяемый объект.

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

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

CMI считываются лениво, если операционная система хоста предоставляет mmap функциональность. В общем случае блоки считываются при поиске имен или подстановке шаблонов. Чтобы запретить это, можно использовать опцию -fno-module-lazy.

Параметр --param lazy-modules=n управляет пределом числа одновременно открытых файлов модулей во время ленивой загрузки. Если импортируется больше модулей, для определения файлов, которые следует закрыть (пока они снова не понадобятся), используется алгоритм LRU. Этот предел может быть превышен при глубоких иерархиях зависимостей модулей. В больших кодовых базах может быть больше импортов, чем предел процесса для дескрипторов файлов. По умолчанию предел на несколько меньше, чем жёсткий предел дескрипторов файлов на процесс, если он определяется.3

CMI GCC используют ELF32 как архитектурно-нейтральный механизм инкапсуляции. Вы можете использовать readelf для их проверки, хотя содержимое секций в значительной степени не расшифровывается. Существует секция с именем .gnu.c++.README, которая содержит текст, читаемый человеком. Помимо первой строки, каждая строка состоит из tag: value кортежей.

> readelf -p.gnu.c++.README gcm.cache/foo.gcm

String dump of section '.gnu.c++.README':
  [     0]  GNU C++ primary module interface
  [    21]  compiler: 11.0.0 20201116 (experimental) [c++-modules revision 20201116-0454]
  [    6f]  version: 2020/11/16-04:54
  [    89]  module: foo
  [    95]  source: c_b.ii
  [    a4]  dialect: C++20/coroutines
  [    be]  cwd: /data/users/nathans/modules/obj/x86_64/gcc
  [    ee]  repository: gcm.cache
  [   104]  buildtime: 2020/11/16 15:03:21 UTC
  [   127]  localtime: 2020/11/16 07:03:21 PST
  [   14a]  export: foo:part1 foo-part1.gcm

Среди прочего, здесь перечислены исходный код, используемый диалект C++ и импорты модуля.4 Отметка времени совпадает со значением, предоставленным макросами __DATE__ и __TIME__, и может быть явно задана переменной среды SOURCE_DATE_EPOCH. Для получения дополнительной информации см. Переменные среды, влияющие на GCC.

Набор связанных CMI может быть скопирован, при условии, что относительные имена путей сохранены.

Содержимое .gnu.c++.README не влияет на целостность CMI, и его можно удалить или изменить. Номера разделов разделов, имена которых не начинаются с .gnu.c++., или не являются строковым разделом, имеют значение и не должны изменяться.

Примечания

(3)

В случае необходимости мягкий предел увеличивается по мере необходимости до достижения жёсткого предела.

(4)

Точное содержимое этого вывода может меняться.

Предыдущее: Предварительная обработка модулей, Вверх: Модули C++ [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/C_002b_002b-Compiled-Module-Interface.html

Spec-Zone.ru

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