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

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

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


person lasote    schedule 02.04.2018    source источник
comment
gist.github.com/yamaya/2924292   -  person Sumit Jha    schedule 04.04.2018
comment
Я не ищу отношения между xcode и clang, но что это означает версию clang, схему управления версиями, которой они следуют.   -  person lasote    schedule 04.04.2018


Ответы (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 удаляет второстепенную версию apple-clang всякий раз, когда они интегрируют изменения из mainline clang между основными выпусками Xcode.

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

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

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

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

person Tobi    schedule 05.04.2018
comment
Итак, вы имеете в виду, что нет никакой корреляции между clang ABI и его версией, верно? - person lasote; 05.04.2018
comment
да, как для официального clang, так и для компилятора Apple llvm c ++ управление версиями основано на времени, а не на основе ABI - person Tobi; 05.04.2018
comment
Но они не всегда сталкиваются с версией clang при выпуске xcode, поэтому это должны быть дополнительные критерии? Между xcode 9.1 и xcode 9.2 лязг держится на уровне 9,0 # Xcode 9.1 (9B55) Apple LLVM version 9.0.0 (clang-900.0.38) # Xcode 9.2 (9C40b) Apple LLVM version 9.0.0 (clang-900.0.39.2) # Xcode 9.3 (9E145) Apple LLVM version 9.1.0 (clang-902.0.39.1) - person lasote; 06.04.2018
comment
Я отредактировал ответ, это то, что вы искали? - person Tobi; 10.04.2018
comment
Я ожидал чего-то, не основанного на наблюдении и предположении, но я предполагаю, что ни у кого нет ответа, кроме Apple, и, вероятно, ответ таков: нет, нет корреляции между управлением версиями и ABI. - person lasote; 10.04.2018
comment
Это так же официально, как и получается: последняя ссылка дает вам гарантию того, что вы не измените ABI основного языка для GCC и в настоящее время команду gcc в терминальных ссылках на apple-clang - person Tobi; 11.04.2018
comment
Но в нем ничего не говорится о версиях. И также они скажут позже: If you are designing a dynamic shared library for distribution, it is still your responsibility to ensure that you do not create binary compatibility problems. поэтому совместимость на самом деле не сохраняется, конечно, если я напишу C API, он совместим с ABI, но это не то же самое, что гарантии GCC или CLANG, которые могут быть переведены на: Если компилятор не увеличивает основную версию, ваши библиотеки совместимы независимо от того, как вы их запрограммировали. Это большая разница. - person lasote; 17.04.2018
comment
Просто прочтите следующее предложение, они объясняют, что они подразумевают под вашей ответственностью: For example, you should not introduce member variables or virtual methods to a base class. Таким образом, цитируемое вами предупреждение не зависит от ABI базового языка. - person Tobi; 17.04.2018
comment
Может можно выложить источник гарантий для GCC и clang. Ссылки в вашем вопросе их не содержат ... - person Tobi; 17.04.2018