//===--- TargetCXXABI.def - Target C++ ABI 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 defines the various C++ ABI kinds used on different platforms. // Users of this file must define the CXXABI macro to make use of this // information. // //===----------------------------------------------------------------------===// #ifndef CXXABI #error Define the CXXABI macro to handle C++ ABI kinds. #endif #ifndef ITANIUM_CXXABI #define ITANIUM_CXXABI(Name, Str) CXXABI(Name, Str) #endif #ifndef MICROSOFT_CXXABI #define MICROSOFT_CXXABI(Name, Str) CXXABI(Name, Str) #endif /// The generic Itanium ABI is the standard ABI of most open-source /// and Unix-like platforms. It is the primary ABI targeted by /// many compilers, including Clang and GCC. /// /// It is documented here: /// http://itanium-cxx-abi.github.io/cxx-abi/ ITANIUM_CXXABI(GenericItanium, "itanium") /// The generic ARM ABI is a modified version of the Itanium ABI /// proposed by ARM for use on ARM-based platforms. /// /// These changes include: /// - the representation of member function pointers is adjusted /// to not conflict with the 'thumb' bit of ARM function pointers; /// - constructors and destructors return 'this'; /// - guard variables are smaller; /// - inline functions are never key functions; /// - array cookies have a slightly different layout; /// - additional convenience functions are specified; /// - and more! /// /// It is documented here: /// https://github.com/ARM-software/abi-aa/blob/main/cppabi32/cppabi32.rst ITANIUM_CXXABI(GenericARM, "arm") /// The iOS ABI is a partial implementation of the ARM ABI. /// Several of the features of the ARM ABI were not fully implemented /// in the compilers that iOS was launched with. /// /// Essentially, the iOS ABI includes the ARM changes to: /// - member function pointers, /// - guard variables, /// - array cookies, and /// - constructor/destructor signatures. ITANIUM_CXXABI(iOS, "ios") /// The iOS 64-bit and macOS 64-bit ARM ABI follows ARM's published 64-bit /// ABI more closely, but we don't guarantee to follow it perfectly. ITANIUM_CXXABI(AppleARM64, "applearm64") /// WatchOS is a modernisation of the iOS ABI, which roughly means it's /// the iOS64 ABI ported to 32-bits. The primary difference from iOS64 is /// that RTTI objects must still be unique at the moment. ITANIUM_CXXABI(WatchOS, "watchos") /// The generic AArch64 ABI is also a modified version of the Itanium ABI, /// but it has fewer divergences than the 32-bit ARM ABI. /// /// The relevant changes from the generic ABI in this case are: /// - representation of member function pointers adjusted as in ARM. /// - guard variables are smaller. /// /// It is documented here: /// https://github.com/ARM-software/abi-aa/blob/main/cppabi64/cppabi64.rst ITANIUM_CXXABI(GenericAArch64, "aarch64") /// The generic Mips ABI is a modified version of the Itanium ABI. /// /// At the moment, only change from the generic ABI in this case is: /// - representation of member function pointers adjusted as in ARM. ITANIUM_CXXABI(GenericMIPS, "mips") /// The WebAssembly ABI is a modified version of the Itanium ABI. /// /// The changes from the Itanium ABI are: /// - representation of member function pointers is adjusted, as in ARM; /// - member functions are not specially aligned; /// - constructors and destructors return 'this', as in ARM; /// - guard variables are 32-bit on wasm32, as in ARM; /// - unused bits of guard variables are reserved, as in ARM; /// - inline functions are never key functions, as in ARM; /// - C++11 POD rules are used for tail padding, as in iOS64. /// /// TODO: At present the WebAssembly ABI is not considered stable, so none /// of these details is necessarily final yet. ITANIUM_CXXABI(WebAssembly, "webassembly") /// The Fuchsia ABI is a modified version of the Itanium ABI. /// /// The relevant changes from the Itanium ABI are: /// - constructors and destructors return 'this', as in ARM. ITANIUM_CXXABI(Fuchsia, "fuchsia") /// The XL ABI is the ABI used by IBM xlclang compiler and is a modified /// version of the Itanium ABI. /// /// The relevant changes from the Itanium ABI are: /// - static initialization is adjusted to use sinit and sterm functions; ITANIUM_CXXABI(XL, "xl") /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and /// compatible compilers). /// /// FIXME: should this be split into Win32 and Win64 variants? /// /// Only scattered and incomplete official documentation exists. MICROSOFT_CXXABI(Microsoft, "microsoft") #undef CXXABI #undef ITANIUM_CXXABI #undef MICROSOFT_CXXABI