r239499 - [MS ABI] Allow memfn pointers with unconvertible types to be formed

Manuel Klimek klimek at google.com
Thu Jun 11 00:49:45 PDT 2015


This change breaks a test:
http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/4473/testReport/Clang/CodeGenCXX/microsoft_abi_virtual_member_pointers_cpp/

On Thu, Jun 11, 2015 at 2:29 AM David Majnemer <david.majnemer at gmail.com>
wrote:

> Author: majnemer
> Date: Wed Jun 10 19:20:57 2015
> New Revision: 239499
>
> URL: http://llvm.org/viewvc/llvm-project?rev=239499&view=rev
> Log:
> [MS ABI] Allow memfn pointers with unconvertible types to be formed
>
> Remove the restriction which forbade forming pointers to member
> functions which had parameter types or return types which were not
> convertible.
>
> Modified:
>     cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
>     cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp
>
> Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=239499&r1=239498&r2=239499&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Jun 10 19:20:57 2015
> @@ -2423,12 +2423,7 @@ MicrosoftCXXABI::BuildMemberPointer(cons
>      FirstField = CGM.GetAddrOfFunction(MD, Ty);
>      FirstField = llvm::ConstantExpr::getBitCast(FirstField,
> CGM.VoidPtrTy);
>    } else {
> -    if (!CGM.getTypes().isFuncTypeConvertible(
> -            MD->getType()->castAs<FunctionType>())) {
> -      CGM.ErrorUnsupported(MD, "pointer to virtual member function with "
> -                               "incomplete return or parameter type");
> -      FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
> -    } else if (FPT->getCallConv() == CC_X86FastCall) {
> +    if (FPT->getCallConv() == CC_X86FastCall) {
>        CGM.ErrorUnsupported(MD, "pointer to fastcall virtual member
> function");
>        FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
>      } else {
>
> Modified:
> cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp?rev=239499&r1=239498&r2=239499&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp
> (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-member-pointers.cpp
> Wed Jun 10 19:20:57 2015
> @@ -1,5 +1,5 @@
> -// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=i386-pc-win32 %s -o - |
> FileCheck %s --check-prefix=CHECK32
> -// RUN: %clang_cc1 -fno-rtti -emit-llvm -triple=x86_64-pc-win32 %s -o - |
> FileCheck %s --check-prefix=CHECK64
> +// RUN: %clang_cc1 -std=c++11 -fno-rtti -emit-llvm -triple=i386-pc-win32
> %s -o - | FileCheck %s --check-prefix=CHECK32
> +// RUN: %clang_cc1 -std=c++11 -fno-rtti -emit-llvm
> -triple=x86_64-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK64
>
>  struct S {
>    int x, y, z;
> @@ -13,12 +13,15 @@ struct U {
>    U(const U &);
>  };
>
> +struct B;
> +
>  struct C {
>    virtual void foo();
>    virtual int bar(int, double);
>    virtual S baz(int);
>    virtual S qux(U);
>    virtual void thud(...);
> +  virtual void (B::*plugh())();
>  };
>
>  namespace {
> @@ -47,6 +50,8 @@ void f() {
>    void (C::*ptr6)(...);
>    ptr6 = &C::thud;
>
> +  auto ptr7 = &C::plugh;
> +
>
>  // CHECK32-LABEL: define void @"\01?f@@YAXXZ"()
>  // CHECK32: store i8* bitcast (void (%struct.C*, ...)* @"\01??_9C@@$BA at AE"
> to i8*), i8** %ptr
> @@ -165,6 +170,20 @@ void f() {
>  // CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void
> (%struct.C*, ...)** [[VPTR]]
>  // CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C*
> %{{.*}}, ...)
>  // CHECK64: ret void
> +// CHECK64: }
> +
> +// CHECK32: define linkonce_odr x86_thiscallcc void @"\01??_9C@@$BBE at AE"(%struct.C*
> %this, ...) {{.*}} comdat align 2 {
> +// CHECK32: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*,
> ...)*, void (%struct.C*, ...)** %vtable, i64 5
> +// CHECK32: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void
> (%struct.C*, ...)** [[VPTR]]
> +// CHECK32: musttail call x86_thiscallcc void (%struct.C*, ...)
> [[CALLEE]](%struct.C* %{{.*}}, ...)
> +// CHECK32: ret void
> +// CHECK32: }
> +
> +// CHECK64: define linkonce_odr void @"\01??_9C@@$BCI at AA"(%struct.C*
> %this, ...) {{.*}} comdat align 2 {
> +// CHECK64: [[VPTR:%.*]] = getelementptr inbounds void (%struct.C*,
> ...)*, void (%struct.C*, ...)** %vtable, i64 5
> +// CHECK64: [[CALLEE:%.*]] = load void (%struct.C*, ...)*, void
> (%struct.C*, ...)** [[VPTR]]
> +// CHECK64: musttail call void (%struct.C*, ...) [[CALLEE]](%struct.C*
> %{{.*}}, ...)
> +// CHECK64: ret void
>  // CHECK64: }
>
>  // CHECK32: #[[ATTR]] = {{{.*}}"thunk"{{.*}}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150611/c6b9b492/attachment.html>


More information about the cfe-commits mailing list