compnerd updated this revision to Diff 131379. compnerd marked an inline comment as done. compnerd added a comment.
scope the template back references and add a comment. https://reviews.llvm.org/D42508 Files: lib/AST/MicrosoftMangle.cpp test/CodeGenObjCXX/msabi-protocol-conformance.mm Index: test/CodeGenObjCXX/msabi-protocol-conformance.mm =================================================================== --- /dev/null +++ test/CodeGenObjCXX/msabi-protocol-conformance.mm @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s + +@protocol P; +@protocol Q; + +@class I; + +void f(id<P>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@@@@Z" + +void f(id<P, Q>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@YQ@@@@@Z" + +void f(Class<P>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@@@@Z" + +void f(Class<P, Q>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@YQ@@@@@Z" + +void f(I<P> *) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@@@@Z" + +void f(I<P, Q> *) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@YQ@@@@@Z" + Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -2451,9 +2451,36 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, Qualifiers, SourceRange Range) { - // We don't allow overloading by different protocol qualification, - // so mangling them isn't necessary. - mangleType(T->getBaseType(), Range, QMM_Drop); + if (T->qual_empty()) + return mangleType(T->getBaseType(), Range, QMM_Drop); + + ArgBackRefMap OuterArgsContext; + BackRefVec OuterTemplateContext; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); + + mangleTagTypeKind(TTK_Struct); + + Out << "?$"; + if (T->isObjCId()) + mangleSourceName("objc_object"); + else if (T->isObjCClass()) + mangleSourceName("objc_class"); + else + mangleSourceName(T->getInterface()->getName()); + + for (const auto &Q : T->quals()) { + Out << 'Y'; // cointerface + mangleSourceName(Q->getName()); + Out << '@'; + } + Out << '@'; + + Out << '@'; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); } void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
Index: test/CodeGenObjCXX/msabi-protocol-conformance.mm =================================================================== --- /dev/null +++ test/CodeGenObjCXX/msabi-protocol-conformance.mm @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -triple thumbv7-windows-msvc -fobjc-runtime=ios-6.0 -o - -emit-llvm %s | FileCheck %s + +@protocol P; +@protocol Q; + +@class I; + +void f(id<P>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@@@@Z" + +void f(id<P, Q>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_object@YP@@YQ@@@@@Z" + +void f(Class<P>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@@@@Z" + +void f(Class<P, Q>) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$objc_class@YP@@YQ@@@@@Z" + +void f(I<P> *) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@@@@Z" + +void f(I<P, Q> *) {} +// CHECK-LABEL: "\01?f@@YAXPAU?$I@YP@@YQ@@@@@Z" + Index: lib/AST/MicrosoftMangle.cpp =================================================================== --- lib/AST/MicrosoftMangle.cpp +++ lib/AST/MicrosoftMangle.cpp @@ -2451,9 +2451,36 @@ void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T, Qualifiers, SourceRange Range) { - // We don't allow overloading by different protocol qualification, - // so mangling them isn't necessary. - mangleType(T->getBaseType(), Range, QMM_Drop); + if (T->qual_empty()) + return mangleType(T->getBaseType(), Range, QMM_Drop); + + ArgBackRefMap OuterArgsContext; + BackRefVec OuterTemplateContext; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); + + mangleTagTypeKind(TTK_Struct); + + Out << "?$"; + if (T->isObjCId()) + mangleSourceName("objc_object"); + else if (T->isObjCClass()) + mangleSourceName("objc_class"); + else + mangleSourceName(T->getInterface()->getName()); + + for (const auto &Q : T->quals()) { + Out << 'Y'; // cointerface + mangleSourceName(Q->getName()); + Out << '@'; + } + Out << '@'; + + Out << '@'; + + TypeBackReferences.swap(OuterArgsContext); + NameBackReferences.swap(OuterTemplateContext); } void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits