clang 20.0.0git
Classes | Macros | Enumerations | Functions
ItaniumMangle.cpp File Reference
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprConcepts.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/ABI.h"
#include "clang/Basic/Module.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/Thunk.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/RISCVTargetParser.h"
#include <optional>
#include "clang/AST/TypeNodes.inc"
#include "clang/AST/BuiltinTypes.def"
#include "clang/Basic/OpenCLImageTypes.def"
#include "clang/Basic/OpenCLExtensionTypes.def"
#include "clang/Basic/AArch64SVEACLETypes.def"
#include "clang/Basic/PPCTypes.def"
#include "clang/Basic/RISCVVTypes.def"
#include "clang/Basic/WebAssemblyReferenceTypes.def"
#include "clang/Basic/AMDGPUTypes.def"
#include "clang/Basic/HLSLIntangibleTypes.def"
#include "clang/Basic/TransformTypeTraits.def"
#include "clang/AST/StmtNodes.inc"

Go to the source code of this file.

Classes

struct  CXXNameMangler::TemplateArgManglingInfo
 
struct  CXXNameMangler::TemplateArgManglingInfo::Info
 Information about how to mangle a template argument. More...
 

Macros

#define ABSTRACT_TYPE(CLASS, PARENT)
 
#define NON_CANONICAL_TYPE(CLASS, PARENT)
 
#define TYPE(CLASS, PARENT)   void mangleType(const CLASS##Type *T);
 
#define ABSTRACT_TYPE(CLASS, PARENT)
 
#define NON_CANONICAL_TYPE(CLASS, PARENT)
 
#define TYPE(CLASS, PARENT)
 
#define BUILTIN_TYPE(Id, SingletonId)
 
#define PLACEHOLDER_TYPE(Id, SingletonId)    case BuiltinType::Id:
 
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)
 
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)
 
#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
 
#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId)
 
#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId)
 
#define AARCH64_VECTOR_TYPE(Name, MangledName, Id, SingletonId)
 
#define PPC_VECTOR_TYPE(Name, Id, Size)
 
#define RVV_TYPE(Name, Id, SingletonId)
 
#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS)
 
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)
 
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)
 
#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait)
 
#define ABSTRACT_STMT(Type)
 
#define EXPR(Type, Base)
 
#define STMT(Type, Base)    case Expr::Type##Class:
 

Enumerations

enum class  AAPCSBitmaskSME : unsigned {
  ArmStreamingBit = 1 << 0 , ArmStreamingCompatibleBit = 1 << 1 , ArmAgnosticSMEZAStateBit = 1 << 2 , ZA_Shift = 3 ,
  ZT0_Shift = 6 , NoState = 0b000 , ArmIn = 0b001 , ArmOut = 0b010 ,
  ArmInOut = 0b011 , ArmPreserves = 0b100
}
 

Functions

static const GlobalDecl isTemplate (GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
 
static TemplateName asTemplateName (GlobalDecl GD)
 
static GlobalDecl getParentOfLocalEntity (const DeclContext *DC)
 
static bool isTypeSubstitutable (Qualifiers Quals, const Type *Ty, ASTContext &Ctx)
 
static AAPCSBitmaskSME encodeAAPCSZAState (unsigned SMEAttrs)
 
static StringRef mangleAArch64VectorBase (const BuiltinType *EltType)
 
static bool isParenthesizedADLCallee (const CallExpr *call)
 Look at the callee of the given call expression and determine if it's a parenthesized id-expression which would have triggered ADL otherwise.
 
static bool isZeroInitialized (QualType T, const APValue &V)
 Determine whether a given value is equivalent to zero-initialization for the purpose of discarding a trailing portion of a 'tl' mangling.
 
static QualType getLValueType (ASTContext &Ctx, const APValue &LV)
 
static IdentifierInfogetUnionInitName (SourceLocation UnionLoc, DiagnosticsEngine &Diags, const FieldDecl *FD)
 
static bool hasMangledSubstitutionQualifiers (QualType T)
 Determine whether the given type has any qualifiers that are relevant for substitutions.
 
static void mangleOverrideDiscrimination (CXXNameMangler &Mangler, ASTContext &Context, const ThunkInfo &Thunk)
 Mangles the pointer authentication override attribute for classes that have explicit overrides for the vtable authentication schema.
 

Macro Definition Documentation

◆ AARCH64_VECTOR_TYPE

#define AARCH64_VECTOR_TYPE (   Name,
  MangledName,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
type_name = MangledName; \
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
break;

◆ ABSTRACT_STMT

#define ABSTRACT_STMT (   Type)

◆ ABSTRACT_TYPE [1/2]

#define ABSTRACT_TYPE (   CLASS,
  PARENT 
)

Definition at line 567 of file ItaniumMangle.cpp.

◆ ABSTRACT_TYPE [2/2]

#define ABSTRACT_TYPE (   CLASS,
  PARENT 
)

Definition at line 567 of file ItaniumMangle.cpp.

◆ AMDGPU_TYPE

#define AMDGPU_TYPE (   Name,
  Id,
  SingletonId,
  Width,
  Align 
)
Value:
case BuiltinType::Id: \
mangleVendorType(Name); \
break;

◆ BUILTIN_TYPE

#define BUILTIN_TYPE (   Id,
  SingletonId 
)

◆ EXPR

#define EXPR (   Type,
  Base 
)

◆ EXT_OPAQUE_TYPE

#define EXT_OPAQUE_TYPE (   ExtType,
  Id,
  Ext 
)
Value:
case BuiltinType::Id: \
type_name = "ocl_" #ExtType; \
Out << type_name.size() << type_name; \
break;

◆ HLSL_INTANGIBLE_TYPE

#define HLSL_INTANGIBLE_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
mangleVendorType(#Name); \
break;

◆ IMAGE_TYPE

#define IMAGE_TYPE (   ImgType,
  Id,
  SingletonId,
  Access,
  Suffix 
)
Value:
case BuiltinType::Id: \
type_name = "ocl_" #ImgType "_" #Suffix; \
Out << type_name.size() << type_name; \
break;

◆ NON_CANONICAL_TYPE [1/2]

#define NON_CANONICAL_TYPE (   CLASS,
  PARENT 
)

Definition at line 568 of file ItaniumMangle.cpp.

◆ NON_CANONICAL_TYPE [2/2]

#define NON_CANONICAL_TYPE (   CLASS,
  PARENT 
)
Value:
case Type::CLASS: \
llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
return;

Definition at line 568 of file ItaniumMangle.cpp.

◆ PLACEHOLDER_TYPE

#define PLACEHOLDER_TYPE (   Id,
  SingletonId 
)     case BuiltinType::Id:

◆ PPC_VECTOR_TYPE

#define PPC_VECTOR_TYPE (   Name,
  Id,
  Size 
)
Value:
case BuiltinType::Id: \
mangleVendorType(#Name); \
break;

◆ RVV_TYPE

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
mangleVendorType(Name); \
break;

◆ STMT

#define STMT (   Type,
  Base 
)     case Expr::Type##Class:

◆ SVE_OPAQUE_TYPE

#define SVE_OPAQUE_TYPE (   Name,
  MangledName,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
type_name = MangledName; \
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
break;

◆ SVE_PREDICATE_TYPE

#define SVE_PREDICATE_TYPE (   Name,
  MangledName,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
type_name = MangledName; \
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
break;

◆ SVE_VECTOR_TYPE

#define SVE_VECTOR_TYPE (   Name,
  MangledName,
  Id,
  SingletonId 
)
Value:
case BuiltinType::Id: \
if (T->getKind() == BuiltinType::SveBFloat16 && \
isCompatibleWith(LangOptions::ClangABI::Ver17)) { \
/* Prior to Clang 18.0 we used this incorrect mangled name */ \
mangleVendorType("__SVBFloat16_t"); \
} else { \
type_name = MangledName; \
Out << (type_name == Name ? "u" : "") << type_name.size() << type_name; \
} \
break;
const FunctionProtoType * T

◆ TRANSFORM_TYPE_TRAIT_DEF

#define TRANSFORM_TYPE_TRAIT_DEF (   Enum,
  Trait 
)
Value:
case UnaryTransformType::Enum: \
BuiltinName = "__" #Trait; \
break;

◆ TYPE [1/2]

#define TYPE (   CLASS,
  PARENT 
)    void mangleType(const CLASS##Type *T);

Definition at line 569 of file ItaniumMangle.cpp.

◆ TYPE [2/2]

#define TYPE (   CLASS,
  PARENT 
)
Value:
case Type::CLASS: \
mangleType(static_cast<const CLASS##Type*>(ty)); \
break;
The base class of the type hierarchy.
Definition: Type.h:1828

Definition at line 569 of file ItaniumMangle.cpp.

◆ WASM_REF_TYPE

#define WASM_REF_TYPE (   InternalName,
  MangledName,
  Id,
  SingletonId,
  AS 
)
Value:
case BuiltinType::Id: \
mangleVendorType(MangledName); \
break;

Enumeration Type Documentation

◆ AAPCSBitmaskSME

enum class AAPCSBitmaskSME : unsigned
strong
Enumerator
ArmStreamingBit 
ArmStreamingCompatibleBit 
ArmAgnosticSMEZAStateBit 
ZA_Shift 
ZT0_Shift 
NoState 
ArmIn 
ArmOut 
ArmInOut 
ArmPreserves 

Definition at line 3536 of file ItaniumMangle.cpp.

Function Documentation

◆ asTemplateName()

static TemplateName asTemplateName ( GlobalDecl  GD)
static

Definition at line 1008 of file ItaniumMangle.cpp.

References clang::GlobalDecl::getDecl().

◆ encodeAAPCSZAState()

static AAPCSBitmaskSME encodeAAPCSZAState ( unsigned  SMEAttrs)
static

◆ getLValueType()

static QualType getLValueType ( ASTContext Ctx,
const APValue LV 
)
static

◆ getParentOfLocalEntity()

static GlobalDecl getParentOfLocalEntity ( const DeclContext DC)
static

Definition at line 1854 of file ItaniumMangle.cpp.

References clang::Ctor_Complete, and clang::Dtor_Complete.

◆ getUnionInitName()

static IdentifierInfo * getUnionInitName ( SourceLocation  UnionLoc,
DiagnosticsEngine Diags,
const FieldDecl FD 
)
static

◆ hasMangledSubstitutionQualifiers()

static bool hasMangledSubstitutionQualifiers ( QualType  T)
static

Determine whether the given type has any qualifiers that are relevant for substitutions.

Definition at line 6926 of file ItaniumMangle.cpp.

References clang::Qualifiers::getCVRQualifiers(), clang::Qualifiers::hasAddressSpace(), clang::Qualifiers::hasUnaligned(), and clang::T.

◆ isParenthesizedADLCallee()

static bool isParenthesizedADLCallee ( const CallExpr call)
static

Look at the callee of the given call expression and determine if it's a parenthesized id-expression which would have triggered ADL otherwise.

Definition at line 4676 of file ItaniumMangle.cpp.

References clang::OverloadExpr::decls_begin(), clang::CallExpr::getCallee(), clang::OverloadExpr::getNumDecls(), clang::OverloadExpr::getQualifier(), clang::Expr::IgnoreParens(), and clang::UnresolvedLookupExpr::requiresADL().

◆ isTemplate()

static const GlobalDecl isTemplate ( GlobalDecl  GD,
const TemplateArgumentList *&  TemplateArgs 
)
static

◆ isTypeSubstitutable()

static bool isTypeSubstitutable ( Qualifiers  Quals,
const Type Ty,
ASTContext Ctx 
)
static

◆ isZeroInitialized()

static bool isZeroInitialized ( QualType  T,
const APValue V 
)
static

◆ mangleAArch64VectorBase()

static StringRef mangleAArch64VectorBase ( const BuiltinType EltType)
static

Definition at line 3945 of file ItaniumMangle.cpp.

References clang::BuiltinType::getKind().

◆ mangleOverrideDiscrimination()

static void mangleOverrideDiscrimination ( CXXNameMangler &  Mangler,
ASTContext Context,
const ThunkInfo Thunk 
)
static

Mangles the pointer authentication override attribute for classes that have explicit overrides for the vtable authentication schema.

The override is mangled as a parameterized vendor extension as follows

<type> ::= U "__vtptrauth" I <key> <addressDiscriminated> <extraDiscriminator> E

The extra discriminator encodes the explicit value derived from the override schema, e.g. if the override has specified type based discrimination the encoded value will be the discriminator derived from the type name.

Definition at line 7242 of file ItaniumMangle.cpp.

References clang::ASTContext::baseForVTableAuthentication(), clang::Decl::getAttr(), clang::ASTContext::getLangOpts(), clang::Type::getPointeeCXXRecordDecl(), clang::ASTContext::getPointerAuthVTablePointerDiscriminator(), and clang::ThunkInfo::ThisType.