From: Timur Iskhodzhanov Date: Fri, 4 Oct 2013 11:25:05 +0000 (+0000) Subject: Simplify MicrosoftCXXNameMangler::mangleFunctionType X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8a5fb999c6a9d3011f2c95543bad55021f8a01ca;p=clang Simplify MicrosoftCXXNameMangler::mangleFunctionType git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191950 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index d7237d395f..cd0063c4af 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -124,8 +124,8 @@ public: void mangleNumber(const llvm::APSInt &Value); void mangleType(QualType T, SourceRange Range, QualifierMangleMode QMM = QMM_Mangle); - void mangleFunctionType(const FunctionType *T, const FunctionDecl *D, - bool IsStructor, bool IsInstMethod); + void mangleFunctionType(const FunctionType *T, const FunctionDecl *D = 0, + bool ForceInstMethod = false); void manglePostfix(const DeclContext *DC, bool NoFunction = false); private: @@ -320,15 +320,6 @@ void MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) { QualType T = TSI ? TSI->getType() : FD->getType(); const FunctionProtoType *FT = T->castAs(); - bool InStructor = false, InInstMethod = false; - const CXXMethodDecl *MD = dyn_cast(FD); - if (MD) { - if (MD->isInstance()) - InInstMethod = true; - if (isa(MD) || isa(MD)) - InStructor = true; - } - // extern "C" functions can hold entities that must be mangled. // As it stands, these functions still need to get expressed in the full // external name. They have their class and type omitted, replaced with '9'. @@ -336,7 +327,7 @@ void MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) { // First, the function class. mangleFunctionClass(FD); - mangleFunctionType(FT, FD, InStructor, InInstMethod); + mangleFunctionType(FT, FD); } else Out << '9'; } @@ -1174,7 +1165,7 @@ void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range, case QMM_Mangle: if (const FunctionType *FT = dyn_cast(T)) { Out << '6'; - mangleFunctionType(FT, 0, false, false); + mangleFunctionType(FT); return; } mangleQualifiers(Quals, false); @@ -1307,7 +1298,7 @@ void MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T, // structor type. // FIXME: This may not be lambda-friendly. Out << "$$A6"; - mangleFunctionType(T, NULL, false, false); + mangleFunctionType(T); } void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T, SourceRange) { @@ -1316,8 +1307,7 @@ void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T, void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, const FunctionDecl *D, - bool IsStructor, - bool IsInstMethod) { + bool ForceInstMethod) { // ::= // const FunctionProtoType *Proto = cast(T); @@ -1325,6 +1315,14 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, SourceRange Range; if (D) Range = D->getSourceRange(); + bool IsStructor = false, IsInstMethod = ForceInstMethod; + if (const CXXMethodDecl *MD = dyn_cast_or_null(D)) { + if (MD->isInstance()) + IsInstMethod = true; + if (isa(MD) || isa(MD)) + IsStructor = true; + } + // If this is a C++ instance method, mangle the CVR qualifiers for the // this pointer. if (IsInstMethod) { @@ -1600,7 +1598,7 @@ void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T, if (const FunctionProtoType *FPT = PointeeType->getAs()) { Out << '8'; mangleName(T->getClass()->castAs()->getDecl()); - mangleFunctionType(FPT, NULL, false, true); + mangleFunctionType(FPT, 0, true); } else { if (PointersAre64Bit && !T->getPointeeType()->isFunctionType()) Out << 'E'; @@ -1749,7 +1747,7 @@ void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T, Out << "_E"; QualType pointee = T->getPointeeType(); - mangleFunctionType(pointee->castAs(), NULL, false, false); + mangleFunctionType(pointee->castAs()); } void MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *, @@ -1882,7 +1880,7 @@ void MicrosoftMangleContextImpl::mangleThunk(const CXXMethodDecl *MD, Out << "Q"; } // FIXME: mangle return adjustment? Most likely includes using an overridee FPT? - Mangler.mangleFunctionType(MD->getType()->castAs(), MD, false, true); + Mangler.mangleFunctionType(MD->getType()->castAs(), MD); } void MicrosoftMangleContextImpl::mangleCXXDtorThunk(const CXXDestructorDecl *DD,