Схема управления версиями компилятора Apple clang?

Некоторое время назад компиляторы GCC> = 5 и Clang> = 4 изменили семантику их номеров версий, поэтому основной номер версии будет увеличиваться на любом выпуске без исправления.

Является ли Apple последовательностью любой схемы версий с компилятором clang с точки зрения совместимости с ABI или любой другой области? Я хотел бы знать, apple-clang 9.0 ли apple-clang 9.0 совместимость с ABI с 9.1 и так далее.

Ответ 1

Apple ударяет свой номер версии компилятора с каждой версией Xcode, поэтому подходящим местом для поиска изменений ABI являются заметки о выпуске Xcode. Новейшее изменение ABI, которое я обнаружил, это Xcode 6:

Заголовки libc++ в Xcode 6 включают изменение, чтобы std :: pair имела тривиальный конструктор. Это исправление важно для производительности и соответствия стандарту C++, но оно изменяет ABI для кода C++, используя std :: pair.

Это означает, что с 2014 года никаких изменений ABI не произошло.

Редактирование. Кажется, что отображение между clang и apple-clang (взято отсюда и добавило последнюю строку себя при тестировании функций):

5.1 -> 3.4
6.0 -> 3.5
7.0 -> 3.7
7.3 -> 3.8
8.0 -> 3.9
9.0 -> 4.0
9.1 -> 5.0

Поэтому я думаю, что яблоко ударяет второстепенную версию apple-clang всякий раз, когда они интегрируют изменения из основного clang между крупными версиями Xcode.

Но для оригинального вопроса это не имеет значения: совместимость с ABI языка не изменится, пока они не скажут это, что возможно для стандартной библиотеки (но редко бывает) и почти немыслимо для основного языка. Для GCC яблоко даже гарантировало, что не сделает последнего, но, вероятно, забыл обновить документ, когда переключился на clang:

Поскольку GCC 4.0 соответствует объектам Itanium C++ ABI, C++ являются совместимыми с линками с объектами, созданными другими компиляторами OS X, которые соответствуют этой спецификации. Apple гарантирует, что будущие выпуски GCC для OS X также будут соответствовать ABI Itanium C++. Это означает, что разработчики могут безопасно отправлять динамические разделяемые библиотеки, интерфейсы которых связаны с классами C++, хотя и с некоторыми оговорками:

  • Apple гарантирует стабильность ABI только для основных функций языка. Это не гарантирует стабильность для классов библиотеки, включая std :: string, std :: map и std :: ostream среди других.

Но поскольку команда gcc ссылается на apple-clang с любой недавней установкой Xcode, эта гарантия также должна сохраняться и для последней.