On Mon, Nov 23, 2009 at 9:08 PM, Anders Carlsson <[email protected]> wrote: > Author: andersca > Date: Mon Nov 23 23:08:52 2009 > New Revision: 89736 > > URL: http://llvm.org/viewvc/llvm-project?rev=89736&view=rev > Log: > It is common for vtables to contain pointers to functions that have either > incomplete return types or incomplete argument types. > > Handle this by returning the llvm::OpaqueType for those cases, which > CodeGenModule::GetOrCreateLLVMFunction knows about, and treats as being an > "incomplete function". > > Added: > cfe/trunk/test/CodeGenCXX/virtual-functions-incomplete-types.cpp > Modified: > cfe/trunk/lib/CodeGen/CGCall.cpp > cfe/trunk/lib/CodeGen/CGVtable.cpp > cfe/trunk/lib/CodeGen/CodeGenTypes.h > > Modified: cfe/trunk/lib/CodeGen/CGCall.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=89736&r1=89735&r2=89736&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Nov 23 23:08:52 2009 > @@ -418,6 +418,32 @@ > return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic); > } > > +static bool HasIncompleteReturnTypeOrArgumentTypes(const FunctionProtoType > *T) { > + if (const TagType *TT = T->getResultType()->getAs<TagType>()) { > + if (!TT->getDecl()->isDefinition()) > + return true; > + } > + > + for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) { > + if (const TagType *TT = T->getArgType(i)->getAs<TagType>()) { > + if (!TT->getDecl()->isDefinition()) > + return true; > + } > + } > + > + return false; > +} > + > +const llvm::Type * > +CodeGenTypes::GetFunctionTypeForVtable(const CXXMethodDecl *MD) { > + const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); > + > + if (!HasIncompleteReturnTypeOrArgumentTypes(FPT)) > + return GetFunctionType(getFunctionInfo(MD), FPT->isVariadic()); > + > + return llvm::OpaqueType::get(getLLVMContext()); > +}
I'm not sure if this matters other than the cleanliness of the IR, but this isn't quite the same as the normal handling for incomplete function types in CodeGenTypes::ConvertNewType. Specifically, this bypasses the handling to resolve the opaque type to a proper function type. Also, HasIncompleteReturnTypeOrArgumentTypes is roughly equivalent to VerifyFuncTypeComplete in CodeGenTypes.cpp. -Eli _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
