Ответ 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, эта гарантия также должна сохраняться и для последней.