#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/DiagnosticAST.h"
#include "clang/Basic/Module.h"
#include "clang/Basic/SourceManager.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>
usingnamespaceclang;
namespace {
static bool isLocalContainerContext(const DeclContext *DC) { … }
static const FunctionDecl *getStructor(const FunctionDecl *fn) { … }
static const NamedDecl *getStructor(const NamedDecl *decl) { … }
static bool isLambda(const NamedDecl *ND) { … }
static const unsigned UnknownArity = …;
class ItaniumMangleContextImpl : public ItaniumMangleContext { … };
class CXXNameMangler { … };
}
NamespaceDecl *ItaniumMangleContextImpl::getStdNamespace() { … }
const DeclContext *
ItaniumMangleContextImpl::getEffectiveDeclContext(const Decl *D) { … }
bool ItaniumMangleContextImpl::isInternalLinkageDecl(const NamedDecl *ND) { … }
bool ItaniumMangleContextImpl::isUniqueInternalLinkageDecl(
const NamedDecl *ND) { … }
bool ItaniumMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { … }
void CXXNameMangler::writeAbiTags(const NamedDecl *ND,
const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleSourceNameWithAbiTags(
const NamedDecl *ND, const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangle(GlobalDecl GD) { … }
void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) { … }
void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) { … }
bool CXXNameMangler::isStd(const NamespaceDecl *NS) { … }
bool CXXNameMangler::isStdNamespace(const DeclContext *DC) { … }
static const GlobalDecl
isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs) { … }
static TemplateName asTemplateName(GlobalDecl GD) { … }
void CXXNameMangler::mangleName(GlobalDecl GD) { … }
const RecordDecl *CXXNameMangler::GetLocalClassDecl(const Decl *D) { … }
void CXXNameMangler::mangleNameWithAbiTags(GlobalDecl GD,
const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleModuleName(const NamedDecl *ND) { … }
void CXXNameMangler::mangleModuleNamePrefix(StringRef Name, bool IsPartition) { … }
void CXXNameMangler::mangleTemplateName(const TemplateDecl *TD,
ArrayRef<TemplateArgument> Args) { … }
void CXXNameMangler::mangleUnscopedName(GlobalDecl GD, const DeclContext *DC,
const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleUnscopedTemplateName(
GlobalDecl GD, const DeclContext *DC, const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleFloat(const llvm::APFloat &f) { … }
void CXXNameMangler::mangleFloatLiteral(QualType T, const llvm::APFloat &V) { … }
void CXXNameMangler::mangleFixedPointLiteral() { … }
void CXXNameMangler::mangleNullPointer(QualType T) { … }
void CXXNameMangler::mangleNumber(const llvm::APSInt &Value) { … }
void CXXNameMangler::mangleNumber(int64_t Number) { … }
void CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t Virtual) { … }
void CXXNameMangler::manglePrefix(QualType type) { … }
void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,
bool recursive) { … }
void CXXNameMangler::mangleUnresolvedName(
NestedNameSpecifier *qualifier, DeclarationName name,
const TemplateArgumentLoc *TemplateArgs, unsigned NumTemplateArgs,
unsigned knownArity) { … }
void CXXNameMangler::mangleUnqualifiedName(
GlobalDecl GD, DeclarationName Name, const DeclContext *DC,
unsigned KnownArity, const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleRegCallName(const IdentifierInfo *II) { … }
void CXXNameMangler::mangleDeviceStubName(const IdentifierInfo *II) { … }
void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { … }
void CXXNameMangler::mangleNestedName(GlobalDecl GD,
const DeclContext *DC,
const AbiTagList *AdditionalAbiTags,
bool NoFunction) { … }
void CXXNameMangler::mangleNestedName(const TemplateDecl *TD,
ArrayRef<TemplateArgument> Args) { … }
void CXXNameMangler::mangleNestedNameWithClosurePrefix(
GlobalDecl GD, const NamedDecl *PrefixND,
const AbiTagList *AdditionalAbiTags) { … }
static GlobalDecl getParentOfLocalEntity(const DeclContext *DC) { … }
void CXXNameMangler::mangleLocalName(GlobalDecl GD,
const AbiTagList *AdditionalAbiTags) { … }
void CXXNameMangler::mangleBlockForPrefix(const BlockDecl *Block) { … }
void CXXNameMangler::mangleUnqualifiedBlock(const BlockDecl *Block) { … }
void CXXNameMangler::mangleTemplateParamDecl(const NamedDecl *Decl) { … }
void CXXNameMangler::mangleTemplateParameterList(
const TemplateParameterList *Params) { … }
void CXXNameMangler::mangleTypeConstraint(
const ConceptDecl *Concept, ArrayRef<TemplateArgument> Arguments) { … }
void CXXNameMangler::mangleTypeConstraint(const TypeConstraint *Constraint) { … }
void CXXNameMangler::mangleRequiresClause(const Expr *RequiresClause) { … }
void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) { … }
void CXXNameMangler::mangleLambdaSig(const CXXRecordDecl *Lambda) { … }
void CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) { … }
void CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) { … }
void CXXNameMangler::mangleTemplatePrefix(TemplateName Template) { … }
void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
bool NoFunction) { … }
const NamedDecl *CXXNameMangler::getClosurePrefix(const Decl *ND) { … }
void CXXNameMangler::mangleClosurePrefix(const NamedDecl *ND, bool NoFunction) { … }
void CXXNameMangler::mangleType(TemplateName TN) { … }
bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
StringRef Prefix) { … }
void CXXNameMangler::mangleOperatorName(DeclarationName Name, unsigned Arity) { … }
void
CXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) { … }
void CXXNameMangler::mangleQualifiers(Qualifiers Quals, const DependentAddressSpaceType *DAST) { … }
void CXXNameMangler::mangleVendorQualifier(StringRef name) { … }
void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { … }
void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { … }
static bool isTypeSubstitutable(Qualifiers Quals, const Type *Ty,
ASTContext &Ctx) { … }
void CXXNameMangler::mangleType(QualType T) { … }
void CXXNameMangler::mangleNameOrStandardSubstitution(const NamedDecl *ND) { … }
void CXXNameMangler::mangleType(const BuiltinType *T) { … }
StringRef CXXNameMangler::getCallingConvQualifierName(CallingConv CC) { … }
void CXXNameMangler::mangleExtFunctionInfo(const FunctionType *T) { … }
void
CXXNameMangler::mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo PI) { … }
void CXXNameMangler::mangleType(const FunctionProtoType *T) { … }
void CXXNameMangler::mangleType(const FunctionNoProtoType *T) { … }
void CXXNameMangler::mangleBareFunctionType(const FunctionProtoType *Proto,
bool MangleReturnType,
const FunctionDecl *FD) { … }
void CXXNameMangler::mangleType(const UnresolvedUsingType *T) { … }
void CXXNameMangler::mangleType(const EnumType *T) { … }
void CXXNameMangler::mangleType(const RecordType *T) { … }
void CXXNameMangler::mangleType(const TagType *T) { … }
void CXXNameMangler::mangleType(const ConstantArrayType *T) { … }
void CXXNameMangler::mangleType(const VariableArrayType *T) { … }
void CXXNameMangler::mangleType(const DependentSizedArrayType *T) { … }
void CXXNameMangler::mangleType(const IncompleteArrayType *T) { … }
void CXXNameMangler::mangleType(const MemberPointerType *T) { … }
void CXXNameMangler::mangleType(const TemplateTypeParmType *T) { … }
void CXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T) { … }
void CXXNameMangler::mangleType(const PointerType *T) { … }
void CXXNameMangler::mangleType(const ObjCObjectPointerType *T) { … }
void CXXNameMangler::mangleType(const LValueReferenceType *T) { … }
void CXXNameMangler::mangleType(const RValueReferenceType *T) { … }
void CXXNameMangler::mangleType(const ComplexType *T) { … }
void CXXNameMangler::mangleNeonVectorType(const VectorType *T) { … }
void CXXNameMangler::mangleNeonVectorType(const DependentVectorType *T) { … }
static StringRef mangleAArch64VectorBase(const BuiltinType *EltType) { … }
void CXXNameMangler::mangleAArch64NeonVectorType(const VectorType *T) { … }
void CXXNameMangler::mangleAArch64NeonVectorType(const DependentVectorType *T) { … }
void CXXNameMangler::mangleAArch64FixedSveVectorType(const VectorType *T) { … }
void CXXNameMangler::mangleAArch64FixedSveVectorType(
const DependentVectorType *T) { … }
void CXXNameMangler::mangleRISCVFixedRVVVectorType(const VectorType *T) { … }
void CXXNameMangler::mangleRISCVFixedRVVVectorType(
const DependentVectorType *T) { … }
void CXXNameMangler::mangleType(const VectorType *T) { … }
void CXXNameMangler::mangleType(const DependentVectorType *T) { … }
void CXXNameMangler::mangleType(const ExtVectorType *T) { … }
void CXXNameMangler::mangleType(const DependentSizedExtVectorType *T) { … }
void CXXNameMangler::mangleType(const ConstantMatrixType *T) { … }
void CXXNameMangler::mangleType(const DependentSizedMatrixType *T) { … }
void CXXNameMangler::mangleType(const DependentAddressSpaceType *T) { … }
void CXXNameMangler::mangleType(const PackExpansionType *T) { … }
void CXXNameMangler::mangleType(const PackIndexingType *T) { … }
void CXXNameMangler::mangleType(const ObjCInterfaceType *T) { … }
void CXXNameMangler::mangleType(const ObjCObjectType *T) { … }
void CXXNameMangler::mangleType(const BlockPointerType *T) { … }
void CXXNameMangler::mangleType(const InjectedClassNameType *T) { … }
void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { … }
void CXXNameMangler::mangleType(const DependentNameType *T) { … }
void CXXNameMangler::mangleType(const DependentTemplateSpecializationType *T) { … }
void CXXNameMangler::mangleType(const TypeOfType *T) { … }
void CXXNameMangler::mangleType(const TypeOfExprType *T) { … }
void CXXNameMangler::mangleType(const DecltypeType *T) { … }
void CXXNameMangler::mangleType(const UnaryTransformType *T) { … }
void CXXNameMangler::mangleType(const AutoType *T) { … }
void CXXNameMangler::mangleType(const DeducedTemplateSpecializationType *T) { … }
void CXXNameMangler::mangleType(const AtomicType *T) { … }
void CXXNameMangler::mangleType(const PipeType *T) { … }
void CXXNameMangler::mangleType(const BitIntType *T) { … }
void CXXNameMangler::mangleType(const DependentBitIntType *T) { … }
void CXXNameMangler::mangleType(const ArrayParameterType *T) { … }
void CXXNameMangler::mangleIntegerLiteral(QualType T,
const llvm::APSInt &Value) { … }
void CXXNameMangler::mangleMemberExprBase(const Expr *Base, bool IsArrow) { … }
void CXXNameMangler::mangleMemberExpr(const Expr *base,
bool isArrow,
NestedNameSpecifier *qualifier,
NamedDecl *firstQualifierLookup,
DeclarationName member,
const TemplateArgumentLoc *TemplateArgs,
unsigned NumTemplateArgs,
unsigned arity) { … }
static bool isParenthesizedADLCallee(const CallExpr *call) { … }
void CXXNameMangler::mangleCastExpression(const Expr *E, StringRef CastEncoding) { … }
void CXXNameMangler::mangleInitListElements(const InitListExpr *InitList) { … }
void CXXNameMangler::mangleRequirement(SourceLocation RequiresExprLoc,
const concepts::Requirement *Req) { … }
void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
bool AsTemplateArg) { … }
void CXXNameMangler::mangleFunctionParam(const ParmVarDecl *parm) { … }
void CXXNameMangler::mangleCXXCtorType(CXXCtorType T,
const CXXRecordDecl *InheritedFrom) { … }
void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { … }
struct CXXNameMangler::TemplateArgManglingInfo { … };
void CXXNameMangler::mangleTemplateArgs(TemplateName TN,
const TemplateArgumentLoc *TemplateArgs,
unsigned NumTemplateArgs) { … }
void CXXNameMangler::mangleTemplateArgs(TemplateName TN,
const TemplateArgumentList &AL) { … }
void CXXNameMangler::mangleTemplateArgs(TemplateName TN,
ArrayRef<TemplateArgument> Args) { … }
void CXXNameMangler::mangleTemplateArg(TemplateArgManglingInfo &Info,
unsigned Index, TemplateArgument A) { … }
void CXXNameMangler::mangleTemplateArg(TemplateArgument A, bool NeedExactType) { … }
void CXXNameMangler::mangleTemplateArgExpr(const Expr *E) { … }
static bool isZeroInitialized(QualType T, const APValue &V) { … }
static QualType getLValueType(ASTContext &Ctx, const APValue &LV) { … }
static IdentifierInfo *getUnionInitName(SourceLocation UnionLoc,
DiagnosticsEngine &Diags,
const FieldDecl *FD) { … }
void CXXNameMangler::mangleValueInTemplateArg(QualType T, const APValue &V,
bool TopLevel,
bool NeedExactType) { … }
void CXXNameMangler::mangleTemplateParameter(unsigned Depth, unsigned Index) { … }
void CXXNameMangler::mangleSeqID(unsigned SeqID) { … }
void CXXNameMangler::mangleExistingSubstitution(TemplateName tname) { … }
bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { … }
bool CXXNameMangler::mangleSubstitution(NestedNameSpecifier *NNS) { … }
static bool hasMangledSubstitutionQualifiers(QualType T) { … }
bool CXXNameMangler::mangleSubstitution(QualType T) { … }
bool CXXNameMangler::mangleSubstitution(TemplateName Template) { … }
bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { … }
bool CXXNameMangler::isSpecializedAs(QualType S, llvm::StringRef Name,
QualType A) { … }
bool CXXNameMangler::isStdCharSpecialization(
const ClassTemplateSpecializationDecl *SD, llvm::StringRef Name,
bool HasAllocator) { … }
bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { … }
void CXXNameMangler::addSubstitution(QualType T) { … }
void CXXNameMangler::addSubstitution(TemplateName Template) { … }
void CXXNameMangler::addSubstitution(uintptr_t Ptr) { … }
void CXXNameMangler::extendSubstitutions(CXXNameMangler* Other) { … }
CXXNameMangler::AbiTagList
CXXNameMangler::makeFunctionReturnTypeTags(const FunctionDecl *FD) { … }
CXXNameMangler::AbiTagList
CXXNameMangler::makeVariableTypeTags(const VarDecl *VD) { … }
bool CXXNameMangler::shouldHaveAbiTags(ItaniumMangleContextImpl &C,
const VarDecl *VD) { … }
void ItaniumMangleContextImpl::mangleCXXName(GlobalDecl GD,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXCtorComdat(const CXXConstructorDecl *D,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXDtorComdat(const CXXDestructorDecl *D,
raw_ostream &Out) { … }
static void mangleOverrideDiscrimination(CXXNameMangler &Mangler,
ASTContext &Context,
const ThunkInfo &Thunk) { … }
void ItaniumMangleContextImpl::mangleThunk(const CXXMethodDecl *MD,
const ThunkInfo &Thunk,
bool ElideOverrideInfo,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
CXXDtorType Type,
const ThunkInfo &Thunk,
bool ElideOverrideInfo,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleStaticGuardVariable(const VarDecl *D,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleDynamicInitializer(const VarDecl *MD,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleDynamicAtExitDestructor(const VarDecl *D,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleDynamicStermFinalizer(const VarDecl *D,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleSEHFilterExpression(
GlobalDecl EnclosingDecl, raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleSEHFinallyBlock(
GlobalDecl EnclosingDecl, raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleItaniumThreadLocalInit(const VarDecl *D,
raw_ostream &Out) { … }
void
ItaniumMangleContextImpl::mangleItaniumThreadLocalWrapper(const VarDecl *D,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleReferenceTemporary(const VarDecl *D,
unsigned ManglingNumber,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *RD,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXVTT(const CXXRecordDecl *RD,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD,
int64_t Offset,
const CXXRecordDecl *Type,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleCXXRTTIName(
QualType Ty, raw_ostream &Out, bool NormalizeIntegers = false) { … }
void ItaniumMangleContextImpl::mangleCanonicalTypeName(
QualType Ty, raw_ostream &Out, bool NormalizeIntegers = false) { … }
void ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_ostream &) { … }
void ItaniumMangleContextImpl::mangleLambdaSig(const CXXRecordDecl *Lambda,
raw_ostream &Out) { … }
void ItaniumMangleContextImpl::mangleModuleInitializer(const Module *M,
raw_ostream &Out) { … }
ItaniumMangleContext *ItaniumMangleContext::create(ASTContext &Context,
DiagnosticsEngine &Diags,
bool IsAux) { … }
ItaniumMangleContext *
ItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags,
DiscriminatorOverrideTy DiscriminatorOverride,
bool IsAux) { … }