clang 20.0.0git
|
The basic abstraction for the target C++ ABI. More...
#include "clang/Basic/TargetCXXABI.h"
Public Types | |
enum | Kind |
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. | |
TargetCXXABI (Kind kind) | |
void | set (Kind kind) |
Kind | getKind () const |
bool | isItaniumFamily () const |
Does this ABI generally fall into the Itanium family of ABIs? | |
bool | isMicrosoft () const |
Is this ABI an MSVC-compatible ABI? | |
bool | areMemberFunctionsAligned () const |
Are member functions differently aligned? | |
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. | |
bool | hasConstructorVariants () const |
Does this ABI have different entrypoints for complete-object and base-subobject constructors? | |
bool | hasPrimaryVBases () const |
Does this ABI allow virtual bases to be primary base classes? | |
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. | |
bool | canKeyFunctionBeInline () const |
Can an out-of-line inline function serve as a key function? | |
TailPaddingUseRules | getTailPaddingUseRules () const |
Static Public Member Functions | |
static Kind | getKind (StringRef Name) |
static const auto & | getSpelling (Kind ABIKind) |
static bool | isABI (StringRef Name) |
static bool | usesRelativeVTables (const llvm::Triple &T) |
static bool | isSupportedCXXABI (const llvm::Triple &T, Kind Kind) |
Friends | |
bool | operator== (const TargetCXXABI &left, const TargetCXXABI &right) |
bool | operator!= (const TargetCXXABI &left, const TargetCXXABI &right) |
The basic abstraction for the target C++ ABI.
Definition at line 28 of file TargetCXXABI.h.
The basic C++ ABI kind.
Definition at line 31 of file TargetCXXABI.h.
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. In ISO C++98, tail padding reuse was only permitted for non-POD base classes, but that restriction was removed retroactively by DR 43, and tail padding reuse is always permitted in all de facto C++ language modes. However, many platforms use a variant of the old C++98 rule for compatibility.
Definition at line 267 of file TargetCXXABI.h.
|
inline |
A bogus initialization of the platform ABI.
Definition at line 72 of file TargetCXXABI.h.
|
inline |
Definition at line 74 of file TargetCXXABI.h.
|
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 188 of file TargetCXXABI.h.
References isMicrosoft().
Referenced by canEmitDelegateCallArgs(), and clang::Sema::CheckCompletedCXXClass().
|
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 158 of file TargetCXXABI.h.
References getKind().
|
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 238 of file TargetCXXABI.h.
References getKind().
Referenced by clang::Sema::ActOnFinishFunctionBody(), and computeKeyFunction().
|
inline |
Definition at line 80 of file TargetCXXABI.h.
Referenced by areMemberFunctionsAligned(), canKeyFunctionBeInline(), getTailPaddingUseRules(), isItaniumFamily(), and isMicrosoft().
|
inlinestatic |
Definition at line 59 of file TargetCXXABI.h.
Referenced by clang::ASTContext::getCXXABIKind().
|
inlinestatic |
Definition at line 60 of file TargetCXXABI.h.
|
inline |
Definition at line 280 of file TargetCXXABI.h.
References AlwaysUseTailPadding, getKind(), UseTailPaddingUnlessPOD03, and UseTailPaddingUnlessPOD11.
Referenced by mustSkipTailPadding().
|
inline |
Does this ABI have different entrypoints for complete-object and base-subobject constructors?
Definition at line 194 of file TargetCXXABI.h.
References isItaniumFamily().
Referenced by clang::CodeGen::CodeGenPGO::assignRegionCounters(), and clang::CodeGen::CGCXXABI::EmitCtorCompleteObjectHandler().
|
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 206 of file TargetCXXABI.h.
References isItaniumFamily().
Referenced by clang::Sema::DefineUsedVTables().
|
inline |
Does this ABI allow virtual bases to be primary base classes?
Definition at line 199 of file TargetCXXABI.h.
References isItaniumFamily().
|
inlinestatic |
Definition at line 63 of file TargetCXXABI.h.
|
inline |
Does this ABI generally fall into the Itanium family of ABIs?
Definition at line 122 of file TargetCXXABI.h.
References getKind().
Referenced by ApplyNonVirtualAndVirtualOffset(), clang::Sema::CheckCXXThrowOperand(), clang::ASTNameGenerator::Implementation::getAllManglings(), hasConstructorVariants(), hasKeyFunctions(), hasPrimaryVBases(), InitDeviceMC(), and UseRelativeLayout().
|
inline |
Is this ABI an MSVC-compatible ABI?
Definition at line 136 of file TargetCXXABI.h.
References getKind().
Referenced by clang::Sema::ActOnExplicitInstantiation(), clang::Sema::ActOnPragmaMSSeg(), clang::Sema::ActOnStartOfFunctionDef(), clang::Sema::ActOnUninitializedDecl(), clang::Sema::ActOnVariableDeclarator(), clang::Sema::AddImplicitlyDeclaredMembersToClass(), clang::Sema::AddInitializerToDecl(), clang::Sema::adjustMemberFunctionCC(), areArgsDestroyedLeftToRightInCallee(), basicGVALinkageForFunction(), basicGVALinkageForVariable(), BuildAppleKextVirtualCall(), clang::Sema::BuildArrayType(), clang::Sema::CheckAddressOfOperand(), checkAttributesAfterMerging(), clang::Sema::CheckBaseSpecifier(), clang::Sema::checkClassLevelDLLAttribute(), clang::Sema::CheckCompleteDestructorVariant(), clang::Sema::CheckCXXThrowOperand(), checkForMultipleExportedDefaultConstructors(), clang::Sema::DefaultLvalueConversion(), clang::Sema::FixOverloadedFunctionReference(), clang::ASTNameGenerator::Implementation::getAllManglings(), getConstantArrayInfoInChars(), clang::CodeGen::CodeGenModule::getVTableLinkage(), hasInAllocaArgs(), InitDeviceMC(), clang::Sema::InstantiateDefaultCtorDefaultArgs(), clang::Sema::InstantiateFunctionDefinition(), clang::Type::isIncompleteType(), clang::FunctionDecl::isMSExternInline(), isMsLayout(), clang::ASTContext::isMSStaticDataMemberInlineDefinition(), isStdBuiltin(), isVarDeclStrongDefinition(), clang::CodeGen::CodeGenVTables::isVTableExternal(), clang::FieldDecl::isZeroSize(), clang::Sema::MarkBaseAndMemberDestructorsReferenced(), clang::Sema::MarkFunctionReferenced(), clang::Sema::MarkVTableUsed(), clang::Sema::PerformImplicitConversion(), ReferenceDllExportedMembers(), shouldEmitVTableThunk(), and clang::Sema::VerifyBitField().
|
inlinestatic |
Definition at line 87 of file TargetCXXABI.h.
References clang::T.
|
inline |
Definition at line 76 of file TargetCXXABI.h.
Referenced by clang::targets::AArch64TargetInfo::AArch64TargetInfo(), clang::targets::ARMTargetInfo::ARMTargetInfo(), and clang::TargetInfo::TargetInfo().
|
inlinestatic |
Definition at line 67 of file TargetCXXABI.h.
References clang::T.
|
friend |
Definition at line 313 of file TargetCXXABI.h.
|
friend |
Definition at line 309 of file TargetCXXABI.h.