#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/CharUnits.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/GlobalDecl.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/VTableBuilder.h"
#include "clang/Basic/ABI.h"
#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/CRC.h"
#include "llvm/Support/MD5.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/StringSaver.h"
#include "llvm/Support/xxhash.h"
#include <functional>
#include <optional>
usingnamespaceclang;
namespace {
static GlobalDecl getGlobalDeclAsDeclContext(const DeclContext *DC) { … }
struct msvc_hashing_ostream : public llvm::raw_svector_ostream { … };
static const DeclContext *
getLambdaDefaultArgumentDeclContext(const Decl *D) { … }
static const DeclContext *getEffectiveDeclContext(const Decl *D) { … }
static const DeclContext *getEffectiveParentContext(const DeclContext *DC) { … }
static const FunctionDecl *getStructor(const NamedDecl *ND) { … }
class MicrosoftMangleContextImpl : public MicrosoftMangleContext { … };
class MicrosoftCXXNameMangler { … };
}
MicrosoftMangleContextImpl::MicrosoftMangleContextImpl(ASTContext &Context,
DiagnosticsEngine &Diags,
bool IsAux)
: … { … }
bool MicrosoftMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { … }
bool
MicrosoftMangleContextImpl::shouldMangleStringLiteral(const StringLiteral *SL) { … }
DiagnosticBuilder MicrosoftCXXNameMangler::Error(SourceLocation loc,
StringRef thing1,
StringRef thing2) { … }
DiagnosticBuilder MicrosoftCXXNameMangler::Error(SourceLocation loc,
StringRef thingy) { … }
DiagnosticBuilder MicrosoftCXXNameMangler::Error(StringRef thingy) { … }
void MicrosoftCXXNameMangler::mangle(GlobalDecl GD, StringRef Prefix) { … }
void MicrosoftCXXNameMangler::mangleFunctionEncoding(GlobalDecl GD,
bool ShouldMangle) { … }
void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) { … }
void MicrosoftCXXNameMangler::mangleMemberDataPointer(
const CXXRecordDecl *RD, const ValueDecl *VD,
const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
StringRef Prefix) { … }
void MicrosoftCXXNameMangler::mangleMemberDataPointerInClassNTTP(
const CXXRecordDecl *RD, const ValueDecl *VD) { … }
void MicrosoftCXXNameMangler::mangleMemberFunctionPointer(
const CXXRecordDecl *RD, const CXXMethodDecl *MD,
const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
StringRef Prefix) { … }
void MicrosoftCXXNameMangler::mangleFunctionPointer(
const FunctionDecl *FD, const NonTypeTemplateParmDecl *PD,
QualType TemplateArgType) { … }
void MicrosoftCXXNameMangler::mangleVarDecl(const VarDecl *VD,
const NonTypeTemplateParmDecl *PD,
QualType TemplateArgType) { … }
void MicrosoftCXXNameMangler::mangleMemberFunctionPointerInClassNTTP(
const CXXRecordDecl *RD, const CXXMethodDecl *MD) { … }
void MicrosoftCXXNameMangler::mangleVirtualMemPtrThunk(
const CXXMethodDecl *MD, const MethodVFTableLocation &ML) { … }
void MicrosoftCXXNameMangler::mangleName(GlobalDecl GD) { … }
void MicrosoftCXXNameMangler::mangleNumber(int64_t Number) { … }
void MicrosoftCXXNameMangler::mangleNumber(llvm::APSInt Number) { … }
void MicrosoftCXXNameMangler::mangleFloat(llvm::APFloat Number) { … }
void MicrosoftCXXNameMangler::mangleBits(llvm::APInt Value) { … }
static GlobalDecl isTemplate(GlobalDecl GD,
const TemplateArgumentList *&TemplateArgs) { … }
void MicrosoftCXXNameMangler::mangleUnqualifiedName(GlobalDecl GD,
DeclarationName Name) { … }
void MicrosoftCXXNameMangler::mangleNestedName(GlobalDecl GD) { … }
void MicrosoftCXXNameMangler::mangleCXXDtorType(CXXDtorType T) { … }
void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
SourceLocation Loc) { … }
void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) { … }
void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { … }
void MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
GlobalDecl GD, const TemplateArgumentList &TemplateArgs) { … }
void MicrosoftCXXNameMangler::mangleUnscopedTemplateName(GlobalDecl GD) { … }
void MicrosoftCXXNameMangler::mangleIntegerLiteral(
const llvm::APSInt &Value, const NonTypeTemplateParmDecl *PD,
QualType TemplateArgType) { … }
void MicrosoftCXXNameMangler::mangleExpression(
const Expr *E, const NonTypeTemplateParmDecl *PD) { … }
void MicrosoftCXXNameMangler::mangleTemplateArgs(
const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) { … }
static ValueDecl *getAsArrayToPointerDecayedDecl(QualType T, const APValue &V) { … }
void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
const TemplateArgument &TA,
const NamedDecl *Parm) { … }
void MicrosoftCXXNameMangler::mangleTemplateArgValue(QualType T,
const APValue &V,
TplArgKind TAK,
bool WithScalarType) { … }
void MicrosoftCXXNameMangler::mangleObjCProtocol(const ObjCProtocolDecl *PD) { … }
void MicrosoftCXXNameMangler::mangleObjCLifetime(const QualType Type,
Qualifiers Quals,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleObjCKindOfType(const ObjCObjectType *T,
Qualifiers Quals,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
bool IsMember) { … }
void
MicrosoftCXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { … }
void MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals,
QualType PointeeType) { … }
void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) { … }
void MicrosoftCXXNameMangler::mangleFunctionArgumentType(QualType T,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::manglePassObjectSizeArg(
const PassObjectSizeAttr *POSA) { … }
void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType T,
Qualifiers Quals,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleAutoReturnType(QualType T,
QualifierMangleMode QMM) { … }
void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range,
QualifierMangleMode QMM) { … }
void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T,
Qualifiers, SourceRange) { … }
void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
const FunctionDecl *D,
bool ForceThisQuals,
bool MangleExceptionSpec) { … }
void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) { … }
void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleThrowSpecification(
const FunctionProtoType *FT) { … }
void MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleTagTypeKind(TagTypeKind TTK) { … }
void MicrosoftCXXNameMangler::mangleType(const EnumType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const RecordType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) { … }
void MicrosoftCXXNameMangler::mangleArtificialTagType(
TagTypeKind TK, StringRef UnqualifiedName,
ArrayRef<StringRef> NestedNames) { … }
void MicrosoftCXXNameMangler::mangleDecayedArrayType(const ArrayType *T) { … }
void MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const VariableArrayType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentSizedArrayType *T,
Qualifiers, SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const IncompleteArrayType *T,
Qualifiers, SourceRange) { … }
void MicrosoftCXXNameMangler::mangleArrayType(const ArrayType *T) { … }
void MicrosoftCXXNameMangler::mangleType(const ArrayParameterType *T,
Qualifiers, SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const PointerType *T, Qualifiers Quals,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const ComplexType *T, Qualifiers,
SourceRange Range) { … }
bool MicrosoftCXXNameMangler::isArtificialTagType(QualType T) const { … }
void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentVectorType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const ConstantMatrixType *T,
Qualifiers quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentSizedMatrixType *T,
Qualifiers quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentAddressSpaceType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T, Qualifiers,
SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *,
Qualifiers, SourceRange) { … }
void MicrosoftCXXNameMangler::mangleType(const TemplateSpecializationType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentNameType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(
const DependentTemplateSpecializationType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const PackIndexingType *T,
Qualifiers Quals, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const TypeOfType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const TypeOfExprType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DecltypeType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const UnaryTransformType *T,
Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const AutoType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(
const DeducedTemplateSpecializationType *T, Qualifiers, SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const AtomicType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const PipeType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftMangleContextImpl::mangleCXXName(GlobalDecl GD,
raw_ostream &Out) { … }
void MicrosoftCXXNameMangler::mangleType(const BitIntType *T, Qualifiers,
SourceRange Range) { … }
void MicrosoftCXXNameMangler::mangleType(const DependentBitIntType *T,
Qualifiers, SourceRange Range) { … }
static void mangleThunkThisAdjustment(AccessSpecifier AS,
const ThisAdjustment &Adjustment,
MicrosoftCXXNameMangler &Mangler,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleVirtualMemPtrThunk(
const CXXMethodDecl *MD, const MethodVFTableLocation &ML,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleThunk(const CXXMethodDecl *MD,
const ThunkInfo &Thunk,
bool ,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
CXXDtorType Type,
const ThunkInfo &Thunk,
bool ,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXVFTable(
const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *Derived,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXVBTable(
const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType T, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTIName(
QualType T, raw_ostream &Out, bool NormalizeIntegers = false) { … }
void MicrosoftMangleContextImpl::mangleCXXVirtualDisplacementMap(
const CXXRecordDecl *SrcRD, const CXXRecordDecl *DstRD, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXThrowInfo(QualType T, bool IsConst,
bool IsVolatile,
bool IsUnaligned,
uint32_t NumEntries,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXCatchableTypeArray(
QualType T, uint32_t NumEntries, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXCatchableType(
QualType T, const CXXConstructorDecl *CD, CXXCtorType CT, uint32_t Size,
uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBIndex,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor(
const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset,
uint32_t VBTableOffset, uint32_t Flags, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassArray(
const CXXRecordDecl *Derived, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTIClassHierarchyDescriptor(
const CXXRecordDecl *Derived, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCXXRTTICompleteObjectLocator(
const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleSEHFilterExpression(
GlobalDecl EnclosingDecl, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleSEHFinallyBlock(
GlobalDecl EnclosingDecl, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleCanonicalTypeName(
QualType T, raw_ostream &Out, bool NormalizeIntegers = false) { … }
void MicrosoftMangleContextImpl::mangleReferenceTemporary(
const VarDecl *VD, unsigned ManglingNumber, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleThreadSafeStaticGuardVariable(
const VarDecl *VD, unsigned GuardNum, raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleStaticGuardVariable(const VarDecl *VD,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleInitFiniStub(const VarDecl *D,
char CharCode,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleDynamicInitializer(const VarDecl *D,
raw_ostream &Out) { … }
void
MicrosoftMangleContextImpl::mangleDynamicAtExitDestructor(const VarDecl *D,
raw_ostream &Out) { … }
void MicrosoftMangleContextImpl::mangleStringLiteral(const StringLiteral *SL,
raw_ostream &Out) { … }
void MicrosoftCXXNameMangler::mangleAutoReturnType(const MemberPointerType *T,
Qualifiers Quals) { … }
void MicrosoftCXXNameMangler::mangleAutoReturnType(const PointerType *T,
Qualifiers Quals) { … }
void MicrosoftCXXNameMangler::mangleAutoReturnType(const LValueReferenceType *T,
Qualifiers Quals) { … }
void MicrosoftCXXNameMangler::mangleAutoReturnType(const RValueReferenceType *T,
Qualifiers Quals) { … }
MicrosoftMangleContext *MicrosoftMangleContext::create(ASTContext &Context,
DiagnosticsEngine &Diags,
bool IsAux) { … }