//===--- ABIVersions.def - Clang ABI Versions Database ----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file enumerates Clang ABI versions. // //===----------------------------------------------------------------------===// // /// @file ABIVersions.def /// /// In this file, each of the Clang ABI Versions is enumerated /// ABI_VER_MAJOR_MINOR, ABI_VER_MAJOR, or ABI_VER_LATEST macro. /// /// ABI_VER_MAJOR is used when the minor version is 0 or can be omitted. /// /// The first argument of ABI_VER_MAJOR_MINOR and ABI_VER_MAJOR is the major /// version. /// /// The second argument of ABI_VER_MAJOR_MINOR is the minor version. /// /// The first argument of ABI_VER_LATEST is an identifier `Latest`. #if defined(ABI_VER_MAJOR_MINOR) != defined(ABI_VER_MAJOR) || \ defined(ABI_VER_MAJOR) != defined(ABI_VER_LATEST) # error ABI_VER_MAJOR_MINOR, ABI_VER_MAJOR and ABI_VER_LATEST should be defined simultaneously #endif #ifndef ABI_VER_MAJOR_MINOR # define ABI_VER_MAJOR_MINOR(Major, Minor) #endif #ifndef ABI_VER_MAJOR # define ABI_VER_MAJOR(Major) #endif #ifndef ABI_VER_LATEST # define ABI_VER_LATEST(Latest) #endif /// Attempt to be ABI-compatible with code generated by Clang 3.8.x /// (SVN r257626). This causes <1 x long long> to be passed in an integer /// register instead of an SSE register on x64_64. ABI_VER_MAJOR_MINOR(3, 8) /// Attempt to be ABI-compatible with code generated by Clang 4.0.x /// (SVN r291814). This causes move operations to be ignored when determining /// whether a class type can be passed or returned directly. ABI_VER_MAJOR(4) /// Attempt to be ABI-compatible with code generated by Clang 6.0.x /// (SVN r321711). This causes determination of whether a type is /// standard-layout to ignore collisions between empty base classes and between /// base classes and member subobjects, which affects whether we reuse base /// class tail padding in some ABIs. ABI_VER_MAJOR(6) /// Attempt to be ABI-compatible with code generated by Clang 7.0.x /// (SVN r338536). This causes alignof (C++) and _Alignof (C11) to be compatible /// with __alignof (i.e., return the preferred alignment) rather than returning /// the required alignment. ABI_VER_MAJOR(7) /// Attempt to be ABI-compatible with code generated by Clang 9.0.x /// (SVN r351319). This causes vectors of __int128 to be passed in memory /// instead of passing in multiple scalar registers on x86_64 on Linux and /// NetBSD. ABI_VER_MAJOR(9) /// Attempt to be ABI-compatible with code generated by Clang 11.0.x /// (git 2e10b7a39b93). This causes clang to pass unions with a 256-bit vector /// member on the stack instead of using registers, to not properly mangle /// substitutions for template names in some cases, and to mangle declaration /// template arguments without a cast to the parameter type even when that can /// lead to mangling collisions. ABI_VER_MAJOR(11) /// Attempt to be ABI-compatible with code generated by Clang 12.0.x /// (git 8e464dd76bef). This causes clang to mangle lambdas within global-scope /// inline variables incorrectly. ABI_VER_MAJOR(12) /// Attempt to be ABI-compatible with code generated by Clang 14.0.x. /// This causes clang to: /// - mangle dependent nested names incorrectly. /// - make trivial only those defaulted copy constructors with a /// parameter-type-list equivalent to the parameter-type-list of an implicit /// declaration. ABI_VER_MAJOR(14) /// Attempt to be ABI-compatible with code generated by Clang 15.0.x. /// This causes clang to: /// - Reverse the implementation for CWG692, CWG1395 and CWG1432. /// - pack non-POD members of packed structs. /// - consider classes with defaulted special member functions non-pod. ABI_VER_MAJOR(15) /// Attempt to be ABI-compatible with code generated by Clang 17.0.x. /// This causes clang to revert some fixes to its implementation of the Itanium /// name mangling scheme, with the consequence that overloaded function /// templates are mangled the same if they differ only by: /// - constraints /// - whether a non-type template parameter has a deduced type /// - the parameter list of a template template parameter ABI_VER_MAJOR(17) /// Attempt to be ABI-compatible with code generated by Clang 18.0.x. /// This causes clang to revert some fixes to the mangling of lambdas in the /// initializers of members of local classes. ABI_VER_MAJOR(18) /// Attempt to be ABI-compatible with code generated by Clang 19.0.x. /// This causes clang to: /// - Incorrectly mangle the 'base type' substitutions of the CXX construction /// vtable because it hasn't added 'type' as a substitution. /// - Skip mangling enclosing class templates of member-like friend function /// templates. /// - Ignore empty struct arguments in C++ mode for ARM, instead of passing /// them as if they had a size of 1 byte. ABI_VER_MAJOR(19) /// Attempt to be ABI-compatible with code generated by Clang 20.0.x. /// This causes clang to: /// - Incorrectly return C++ records in AVX registers on x86_64. ABI_VER_MAJOR(20) /// Attempt to be ABI-compatible with code generated by Clang 21.0.x. /// This causes clang to: /// - When targeting Windows emit scalar deleting destructors that are not /// compatible with scalar deleting destructors emitted by MSVC for the /// cases when the class whose destructor is being emitted defines /// operator delete. ABI_VER_MAJOR(21) /// Conform to the underlying platform's C and C++ ABIs as closely as we can. ABI_VER_LATEST(Latest) #undef ABI_VER_MAJOR_MINOR #undef ABI_VER_MAJOR #undef ABI_VER_LATEST