Как символы метаданных используются в стандартной библиотеке Swift? - PullRequest
0 голосов
/ 09 ноября 2018

Когда в компилятор Swift передается пустой файл, он генерирует только пару довольно очевидных символов:

echo '' > test.swift
swiftc -c -parse-as-library -o test.o ./test.swift
nm test.o

печатает это:

0000000000000000 S ___swift_reflection_version
0000000000000002 s l_llvm.swift_module_hash

Но когда мы пытаемся скомпилировать этот пустой файл как стандартную библиотеку Swift, автоматически добавляется больше символов с непостижимыми именами:

swiftc -c -parse-as-library -parse-stdlib -module-name Swift -o test.o ./test.swift
nm test.o

печатает это:

000000000000006c s _$SBBMB
0000000000000030 s _$SBOMB
0000000000000044 s _$SBbMB
000000000000001c s _$SBoMB
0000000000000058 s _$SBpMB
0000000000000094 s _$SypXpMB
0000000000000080 s _$SyyXfMB
00000000000000a8 S ___swift_reflection_version
000000000000000c S _symbolic BB
0000000000000003 S _symbolic BO
0000000000000006 S _symbolic Bb
0000000000000000 S _symbolic Bo
0000000000000009 S _symbolic Bp
0000000000000014 S _symbolic ypXp
000000000000000f S _symbolic yyXf
00000000000000aa s l_llvm.swift_module_hash

Дальнейший поиск приводит к Документация Swift Runtime , в которой перечислены очень похожие символы в заголовке "Стандартные метаданные":

Среда выполнения Swift экспортирует стандартные объекты метаданных для типов Builtin, а также таблицы-свидетели стандартных значений, которые могут свободно использоваться типами с общими атрибутами макета. Обратите внимание, что, в отличие от общедоступных типов, среда выполнения не гарантирует отображение типов 1: 1 типов Builtin на объекты метаданных и будет повторно использовать объекты метаданных для представления встроенных объектов с такими же характеристиками макета.

Под этим объяснением следует более длинный список символов:

000000000004faa8 S __TMBB
000000000004fab8 S __TMBO
000000000004f9f8 S __TMBb
000000000004f9c8 S __TMBi128_
000000000004f998 S __TMBi16_
000000000004f9d8 S __TMBi256_
000000000004f9a8 S __TMBi32_
000000000004f9b8 S __TMBi64_
000000000004f988 S __TMBi8_
000000000004f9e8 S __TMBo
000000000004fac8 S __TMT_
000000000004f568 S __TWVBO
000000000004f4b0 S __TWVBb
000000000004f0a8 S __TWVBi128_
000000000004eec8 S __TWVBi16_
000000000004f148 S __TWVBi256_
000000000004ef68 S __TWVBi32_
000000000004f008 S __TWVBi64_
000000000004ee28 S __TWVBi8_
000000000004f1e8 S __TWVBo
000000000004f778 S __TWVFT_T_
000000000004f3f8 S __TWVMBo
000000000004f8e8 S __TWVT_
000000000004f830 S __TWVXfT_T_
000000000004f620 S __TWVXoBO
000000000004f2a0 S __TWVXoBo
000000000004f6d8 S __TWVXwGSqBO_
000000000004f358 S __TWVXwGSqBo_

Это все еще не объясняет, что означает каждый из этих символов, как они используются и почему у них есть эти короткие имена? Кто-нибудь смог найти больше публичной документации по этим символам? Почему при компиляции пустого файла в качестве стандартной библиотеки Swift включаются только некоторые из этих символов?

...