clang 8.0.0

Public Types | Public Member Functions | Friends | List of all members
clang::TargetCXXABI Class Reference

The basic abstraction for the target C++ ABI. More...

`#include "clang/Basic/TargetCXXABI.h"`

## Public Types
enum | Kind { GenericItanium, GenericARM, iOS, iOS64, WatchOS, GenericAArch64, GenericMIPS, WebAssembly, Microsoft }
| The basic C++ ABI kind. More...
enum | TailPaddingUseRules { AlwaysUseTailPadding, UseTailPaddingUnlessPOD03, UseTailPaddingUnlessPOD11 }
| When is record layout allowed to allocate objects in the tail padding of a base class? More...

## Public Member Functions
| TargetCXXABI ()
| A bogus initialization of the platform ABI. More...
| TargetCXXABI (Kind kind)
void | set (Kind kind)
Kind | getKind () const
bool | isItaniumFamily () const
| Does this ABI generally fall into the Itanium family of ABIs? More...
bool | isMicrosoft () const
| Is this ABI an MSVC-compatible ABI? More...
bool | areMemberFunctionsAligned () const
| Are member functions differently aligned? More...
bool | areArgsDestroyedLeftToRightInCallee () const
| Are arguments to a call destroyed left to right in the callee? This is a fundamental language change, since it implies that objects passed by value do not live to the end of the full expression. More...
bool | hasConstructorVariants () const
| Does this ABI have different entrypoints for complete-object and base-subobject constructors? More...
bool | hasPrimaryVBases () const
| Does this ABI allow virtual bases to be primary base classes? More...
bool | hasKeyFunctions () const
| Does this ABI use key functions? If so, class data such as the vtable is emitted with strong linkage by the TU containing the key function. More...
bool | canKeyFunctionBeInline () const
| Can an out-of-line inline function serve as a key function? More...
TailPaddingUseRules | getTailPaddingUseRules () const

## Friends
bool | operator== (const TargetCXXABI &left, const TargetCXXABI &right)
bool | operator!= (const TargetCXXABI &left, const TargetCXXABI &right)

## Detailed Description

The basic abstraction for the target C++ ABI.

Definition at line 24 of file TargetCXXABI.h.

## Member Enumeration Documentation

## ◆ Kind

enum clang::TargetCXXABI::Kind

The basic C++ ABI kind.

Enumerator
GenericItanium | 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://www.codesourcery.com/public/cxx-abi/
GenericARM | 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: http://infocenter.arm.com /help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf
iOS | 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.
iOS64 | The iOS 64-bit ABI is follows ARM's published 64-bit ABI more closely, but we don't guarantee to follow it perfectly. It is documented here: http://infocenter.arm.com /help/topic/com.arm.doc.ihi0059a/IHI0059A_cppabi64.pdf
WatchOS | 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.
GenericAArch64 | 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.
GenericMIPS | 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.
WebAssembly | 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.
Microsoft | 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.

Definition at line 27 of file TargetCXXABI.h.

## ◆ TailPaddingUseRules

enum clang::TargetCXXABI::TailPaddingUseRules

When is record layout allowed to allocate objects in the tail padding of a base class?

This decision cannot be changed without breaking platform ABI compatibility, and yet it is tied to language guarantees which the committee has so far seen fit to strengthen no less than three separate times:

- originally, there were no restrictions at all;
- C++98 declared that objects could not be allocated in the tail padding of a POD type;
- C++03 extended the definition of POD to include classes containing member pointers; and
- C++11 greatly broadened the definition of POD to include all trivial standard-layout classes. Each of these changes technically took several existing platforms and made them permanently non-conformant.

Enumerator
AlwaysUseTailPadding | The tail-padding of a base class is always theoretically available, even if it's POD. This is not strictly conforming in any language mode.
UseTailPaddingUnlessPOD03 | Only allocate objects in the tail padding of a base class if the base class is not POD according to the rules of C++ TR1. This is non-strictly conforming in C++11 mode.
UseTailPaddingUnlessPOD11 | Only allocate objects in the tail padding of a base class if the base class is not POD according to the rules of C++11.

Definition at line 293 of file TargetCXXABI.h.

## Constructor & Destructor Documentation

## ◆ TargetCXXABI() [1/2]

clang::TargetCXXABI::TargetCXXABI | ( |  | ) |
| inline

A bogus initialization of the platform ABI.

Definition at line 124 of file TargetCXXABI.h.

## ◆ TargetCXXABI() [2/2]

clang::TargetCXXABI::TargetCXXABI | ( | Kind | kind | ) |
| inline

Definition at line 126 of file TargetCXXABI.h.

## Member Function Documentation

## ◆ areArgsDestroyedLeftToRightInCallee()

bool clang::TargetCXXABI::areArgsDestroyedLeftToRightInCallee | ( |  | ) | const
| inline

Are arguments to a call destroyed left to right in the callee? This is a fundamental language change, since it implies that objects passed by value do not live to the end of the full expression.

Temporaries passed to a function taking a const reference live to the end of the full expression as usual. Both the caller and the callee must have access to the destructor, while only the caller needs the destructor if this is false.

Definition at line 209 of file TargetCXXABI.h.

References isMicrosoft().

Referenced by canEmitDelegateCallArgs().

## ◆ areMemberFunctionsAligned()

bool clang::TargetCXXABI::areMemberFunctionsAligned | ( |  | ) | const
| inline

Are member functions differently aligned?

Many Itanium-style C++ ABIs require member functions to be aligned, so that a pointer to such a function is guaranteed to have a zero in the least significant bit, so that pointers to member functions can use that bit to distinguish between virtual and non-virtual functions. However, some Itanium-style C++ ABIs differentiate between virtual and non-virtual functions via other means, and consequently don't require that member functions be aligned.

Definition at line 181 of file TargetCXXABI.h.

References GenericAArch64, GenericARM, GenericItanium, GenericMIPS, getKind(), iOS, iOS64, Microsoft, WatchOS, and WebAssembly.

## ◆ canKeyFunctionBeInline()

bool clang::TargetCXXABI::canKeyFunctionBeInline | ( |  | ) | const
| inline

Can an out-of-line inline function serve as a key function?

This flag is only useful in ABIs where type data (for example, vtables and type_info objects) are emitted only after processing the definition of a special "key" virtual function. (This is safe because the ODR requires that every virtual function be defined somewhere in a program.) This usually permits such data to be emitted in only a single object file, as opposed to redundantly in every object file that requires it.

One simple and common definition of "key function" is the first virtual function in the class definition which is not defined there. This rule works very well when that function has a non-inline definition in some non-header file. Unfortunately, when that function is defined inline, this rule requires the type data to be emitted weakly, as if there were no key function.

The ARM ABI observes that the ODR provides an additional guarantee: a virtual function is always ODR-used, so if it is defined inline, that definition must appear in every translation unit that defines the class. Therefore, there is no reason to allow such functions to serve as key functions.

Because this changes the rules for emitting type data, it can cause type data to be emitted with both weak and strong linkage, which is not allowed on all platforms. Therefore, exploiting this observation requires an ABI break and cannot be done on a generic Itanium platform.

Definition at line 259 of file TargetCXXABI.h.

References GenericAArch64, GenericARM, GenericItanium, GenericMIPS, getKind(), iOS, iOS64, Microsoft, WatchOS, and WebAssembly.

Referenced by computeKeyFunction().

## ◆ getKind()

Kind clang::TargetCXXABI::getKind | ( |  | ) | const
| inline

Definition at line 132 of file TargetCXXABI.h.

Referenced by areMemberFunctionsAligned(), canKeyFunctionBeInline(), createCXXABI(), clang::CodeGen::CreateItaniumCXXABI(), clang::ASTContext::getCommentForDecl(), getTailPaddingUseRules(), isItaniumFamily(), and isMicrosoft().

## ◆ getTailPaddingUseRules()

TailPaddingUseRules clang::TargetCXXABI::getTailPaddingUseRules | ( |  | ) | const
| inline

Definition at line 308 of file TargetCXXABI.h.

References AlwaysUseTailPadding, GenericAArch64, GenericARM, GenericItanium, GenericMIPS, getKind(), iOS, iOS64, Microsoft, UseTailPaddingUnlessPOD03, UseTailPaddingUnlessPOD11, WatchOS, and WebAssembly.

Referenced by mustSkipTailPadding().

## ◆ hasConstructorVariants()

bool clang::TargetCXXABI::hasConstructorVariants | ( |  | ) | const
| inline

Does this ABI have different entrypoints for complete-object and base-subobject constructors?

Definition at line 215 of file TargetCXXABI.h.

References isItaniumFamily().

Referenced by clang::CodeGen::CGCXXABI::EmitCtorCompleteObjectHandler(), clang::CodeGen::CodeGenModule::getMangledName(), and clang::CodeGen::CodeGenTypes::inheritingCtorHasParams().

## ◆ hasKeyFunctions()

bool clang::TargetCXXABI::hasKeyFunctions | ( |  | ) | const
| inline

Does this ABI use key functions? If so, class data such as the vtable is emitted with strong linkage by the TU containing the key function.

Definition at line 227 of file TargetCXXABI.h.

References isItaniumFamily().

## ◆ hasPrimaryVBases()

bool clang::TargetCXXABI::hasPrimaryVBases | ( |  | ) | const
| inline

Does this ABI allow virtual bases to be primary base classes?

Definition at line 220 of file TargetCXXABI.h.

References isItaniumFamily().

## ◆ isItaniumFamily()

bool clang::TargetCXXABI::isItaniumFamily | ( |  | ) | const
| inline

Does this ABI generally fall into the Itanium family of ABIs?

Definition at line 135 of file TargetCXXABI.h.

References GenericAArch64, GenericARM, GenericItanium, GenericMIPS, getKind(), iOS, iOS64, Microsoft, WatchOS, and WebAssembly.

Referenced by hasConstructorVariants(), hasKeyFunctions(), and hasPrimaryVBases().

## ◆ isMicrosoft()

bool clang::TargetCXXABI::isMicrosoft | ( |  | ) | const
| inline

Is this ABI an MSVC-compatible ABI?

Definition at line 154 of file TargetCXXABI.h.

References GenericAArch64, GenericARM, GenericItanium, GenericMIPS, getKind(), iOS, iOS64, Microsoft, WatchOS, and WebAssembly.

Referenced by areArgsDestroyedLeftToRightInCallee(), BuildAppleKextVirtualCall(), checkForMultipleExportedDefaultConstructors(), clang::CodeGen::CodeGenFunction::EmitAutoVarAlloca(), clang::CodeGen::CodeGenModule::GetAddrOfFunction(), clang::CodeGen::CodeGenModule::getFunctionLinkage(), clang::Sema::InstantiateClassMembers(), clang::Type::isIncompleteType(), isMsLayout(), clang::ASTContext::isMSStaticDataMemberInlineDefinition(), isVarDeclStrongDefinition(), clang::CodeGen::CodeGenVTables::isVTableExternal(), clang::Sema::PerformImplicitConversion(), shouldEmitVTableThunk(), TryReinterpretCast(), and TryStaticMemberPointerUpcast().

## ◆ set()

void clang::TargetCXXABI::set | ( | Kind | kind | ) |
| inline

Definition at line 128 of file TargetCXXABI.h.

Referenced by clang::targets::AArch64TargetInfo::AArch64TargetInfo(), clang::targets::ARMTargetInfo::ARMTargetInfo(), clang::targets::DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(), clang::targets::DarwinARMTargetInfo::DarwinARMTargetInfo(), clang::targets::ItaniumWindowsARMleTargetInfo::ItaniumWindowsARMleTargetInfo(), clang::targets::MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(), clang::targets::MicrosoftARMleTargetInfo::MicrosoftARMleTargetInfo(), clang::targets::MinGWARM64TargetInfo::MinGWARM64TargetInfo(), clang::targets::MinGWARMTargetInfo::MinGWARMTargetInfo(), and clang::TargetInfo::TargetInfo().

## Friends And Related Function Documentation

## ◆ operator!=

bool operator!= | ( | const TargetCXXABI & | left,
|  | const TargetCXXABI & | right
| ) |  |
| friend

Definition at line 339 of file TargetCXXABI.h.

## ◆ operator==

bool operator== | ( | const TargetCXXABI & | left,
|  | const TargetCXXABI & | right
| ) |  |
| friend

Definition at line 335 of file TargetCXXABI.h.

The documentation for this class was generated from the following file:

- include/clang/Basic/TargetCXXABI.h