[cfe-commits] r80064 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp lib/CodeGen/CodeGenFunction.h test/CodeGenCXX/virt.cpp

Douglas Gregor dgregor at apple.com
Tue Aug 25 19:58:41 PDT 2009


On Aug 25, 2009, at 6:54 PM, Mike Stump wrote:

> Author: mrs
> Date: Tue Aug 25 20:54:35 2009
> New Revision: 80064
>
> URL: http://llvm.org/viewvc/llvm-project?rev=80064&view=rev
> Log:
> Implement virtual dispatch.  :-)  This is self-consistent with  
> clang, but not yet
> necessarily perfectly consistent with gcc.

Sweet.

> Modified:
>    cfe/trunk/lib/CodeGen/CGCXX.cpp
>    cfe/trunk/lib/CodeGen/CodeGenFunction.h
>    cfe/trunk/test/CodeGenCXX/virt.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=80064&r1=80063&r2=80064&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Tue Aug 25 20:54:35 2009
> @@ -200,15 +200,9 @@
>
>   const FunctionProtoType *FPT = MD->getType()- 
> >getAsFunctionProtoType();
>
> -  if (MD->isVirtual()) {
> -    ErrorUnsupported(CE, "virtual dispatch");
> -  }
> -
>   const llvm::Type *Ty =
>     CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
>                                    FPT->isVariadic());
> -  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
> -
>   llvm::Value *This;
>
>   if (ME->isArrow())
> @@ -217,6 +211,12 @@
>     LValue BaseLV = EmitLValue(ME->getBase());
>     This = BaseLV.getAddress();
>   }
> +
> +  llvm::Value *Callee;
> +  if (MD->isVirtual())
> +    Callee = BuildVirtualCall(MD, This, Ty);

Checking that this is a reference to a virtual method is necessary,  
but not sufficient. We also need to check that the name was not  
qualified, e.g.,

   Base::foo(my);

is a static dispatch rather than a virtual dispatch. This will  
probably require some more AST support, to keep track of the nested- 
name-specifier in a MemberExpr.

	- Doug



More information about the cfe-commits mailing list