Author: compnerd Date: Tue Jan 23 11:17:25 2018 New Revision: 323241 URL: http://llvm.org/viewvc/llvm-project?rev=323241&view=rev Log: AST: adjust ObjC MS mangling to work with typedefs
Rather than hardcode the pointerness of the `id` and `class` types, handle them generically. This allows for the template type specialization of `remove_pointer<id>` which would look through the `id` type and deal with the `objc_object` structure without the pointer. Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=323241&r1=323240&r2=323241&view=diff ============================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Tue Jan 23 11:17:25 2018 @@ -1833,11 +1833,9 @@ void MicrosoftCXXNameMangler::mangleType llvm_unreachable("placeholder types shouldn't get to name mangling"); case BuiltinType::ObjCId: - Out << "PA"; mangleArtificalTagType(TTK_Struct, "objc_object"); break; case BuiltinType::ObjCClass: - Out << "PA"; mangleArtificalTagType(TTK_Struct, "objc_class"); break; case BuiltinType::ObjCSel: @@ -2337,9 +2335,6 @@ void MicrosoftCXXNameMangler::mangleType void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T, Qualifiers Quals, SourceRange Range) { - if (T->isObjCIdType() || T->isObjCClassType()) - return mangleType(T->getPointeeType(), Range, QMM_Drop); - QualType PointeeType = T->getPointeeType(); manglePointerCVQualifiers(Quals); manglePointerExtQualifiers(Quals, PointeeType); Modified: cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm?rev=323241&r1=323240&r2=323241&view=diff ============================================================================== --- cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm (original) +++ cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm Tue Jan 23 11:17:25 2018 @@ -33,7 +33,7 @@ void g(id &) {} // CHECK-LABEL: "\01?g@@YAXAAPAUobjc_object@@@Z" void g(const id &) {} -// CHECK-LABEL: "\01?g@@YAXABPAUobjc_object@@@Z" +// CHECK-LABEL: "\01?g@@YAXABQAUobjc_object@@@Z" void g(id &&) {} // CHECK-LABEL: "\01?g@@YAX$$QAPAUobjc_object@@@Z" @@ -45,7 +45,7 @@ void h(Class &) {} // CHECK-LABEL: "\01?h@@YAXAAPAUobjc_class@@@Z" void h(const Class &) {} -// CHECK-LABEL: "\01?h@@YAXABPAUobjc_class@@@Z" +// CHECK-LABEL: "\01?h@@YAXABQAUobjc_class@@@Z" void h(Class &&) {} // CHECK-LABEL: "\01?h@@YAX$$QAPAUobjc_class@@@Z" @@ -62,6 +62,12 @@ I &k() { return *kI; } const I &l() { return *kI; } // CHECK-LABEL: "\01?l@@YAABUI@@XZ" +void m(const id) {} +// CHECK-LABEL: "\01?m@@YAXQAUobjc_object@@@Z" + +void m(const I *) {} +// CHECK-LABEL: "\01?m@@YAXPBUI@@@Z" + struct __declspec(dllexport) s { struct s &operator=(const struct s &) = delete; @@ -93,16 +99,16 @@ struct __declspec(dllexport) s { // CHECK-LABEL: "\01?m@s@@QAAX$$QAPAUobjc_object@@@Z" void m(const id &) {} - // CHECK-LABEL: "\01?m@s@@QAAXABPAUobjc_object@@@Z" + // CHECK-LABEL: "\01?m@s@@QAAXABQAUobjc_object@@@Z" void m(const id &&) {} - // CHECK-LABEL: "\01?m@s@@QAAX$$QBPAUobjc_object@@@Z" + // CHECK-LABEL: "\01?m@s@@QAAX$$QBQAUobjc_object@@@Z" void m(Class *) {} // CHECK-LABEL: "\01?m@s@@QAAXPAPAUobjc_class@@@Z" void m(const Class *) {} - // CHECK-LABEL: "\01?m@s@@QAAXPBPAUobjc_class@@@Z" + // CHECK-LABEL: "\01?m@s@@QAAXPBQAUobjc_class@@@Z" void m(Class) {} // CHECK-LABEL: "\01?m@s@@QAAXPAUobjc_class@@@Z" @@ -111,12 +117,31 @@ struct __declspec(dllexport) s { // CHECK-LABEL: "\01?m@s@@QAAXAAPAUobjc_class@@@Z" void m(const Class &) {} - // CHECK-LABEL: "\01?m@s@@QAAXABPAUobjc_class@@@Z" + // CHECK-LABEL: "\01?m@s@@QAAXABQAUobjc_class@@@Z" void m(Class &&) {} // CHECK-LABEL: "\01?m@s@@QAAX$$QAPAUobjc_class@@@Z" void m(const Class &&) {} - // CHECK-LABEL: "\01?m@s@@QAAX$$QBPAUobjc_class@@@Z" + // CHECK-LABEL: "\01?m@s@@QAAX$$QBQAUobjc_class@@@Z" +}; + +template <typename T> +struct remove_pointer { typedef T type; }; + +template <typename T> +struct remove_pointer<T *> { + typedef T type; }; +template <typename T> +struct t { + t() {} +}; + +template struct t<id>; +// CHECK-LABEL: "\01??0?$t@PAUobjc_object@@@@QAA@XZ" + +template struct t<remove_pointer<id>::type>; +// CHECK-LABEL: "\01??0?$t@Uobjc_object@@@@QAA@XZ" + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits