From: Mike Stump Date: Tue, 27 Oct 2009 23:46:47 +0000 (+0000) Subject: Prep work for putting ___cxa_pure_virtual in the vtables for pure functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94aff9341e7996f012e937385be18cd19f68a45e;p=clang Prep work for putting ___cxa_pure_virtual in the vtables for pure functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85345 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index bed15132de..0b81c2165e 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -43,6 +43,9 @@ private: llvm::DenseMap VCall; llvm::DenseMap VCallOffset; llvm::DenseMap VBIndex; + + typedef llvm::DenseMap Pures_t; + Pures_t Pures; typedef std::pair CallOffset; typedef llvm::DenseMap Thunks_t; Thunks_t Thunks; @@ -58,6 +61,7 @@ private: Index_t extra; int CurrentVBaseOffset; typedef std::vector > Path_t; + llvm::Constant *cxa_pure; public: VtableBuilder(std::vector &meth, const CXXRecordDecl *c, @@ -68,6 +72,8 @@ public: LLVMPointerWidth(cgm.getContext().Target.getPointerWidth(0)), CurrentVBaseOffset(0) { Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0); + // FIXME: ___cxa_pure_virtual + cxa_pure = wrap((Index_t)0); } llvm::DenseMap &getIndex() { return Index; } @@ -285,6 +291,13 @@ public: v_r); } CovariantThunks.clear(); + for (Pures_t::iterator i = Pures.begin(), e = Pures.end(); + i != e; ++i) { + const CXXMethodDecl *MD = i->first; + Index_t idx = Index[MD]; + submethods[idx] = cxa_pure; + } + Pures.clear(); } llvm::Constant *WrapAddrOf(const CXXMethodDecl *MD) {