diff options
author | Mike Stump <mrs@apple.com> | 2009-08-12 23:14:12 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-12 23:14:12 +0000 |
commit | 4c3aedd3f1fff57d1906b0cdfa7a9ec81a361b2d (patch) | |
tree | c901508beb2fcf55db30316f869691cb15e103ef /lib/CodeGen/CGCXX.cpp | |
parent | 09d8b814321cf62915a2f43a20fd4822e1c2a879 (diff) |
Refactor. WIP. Eventually, this will all go into a vtable builder class.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78857 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 31b406aed2..1c95fc313e 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -621,6 +621,21 @@ llvm::Constant *CodeGenFunction::GenerateRtti(const CXXRecordDecl *RD) { return Rtti; } +void CodeGenFunction::GenerateVcalls(std::vector<llvm::Constant *> &methods, + const CXXRecordDecl *RD, + llvm::Type *Ptr8Ty) { + typedef CXXRecordDecl::method_iterator meth_iter; + llvm::Constant *m; + for (meth_iter mi = RD->method_begin(), + me = RD->method_end(); mi != me; ++mi) { + if (mi->isVirtual()) { + // FIXME: vcall: offset for virtual base for this function + m = llvm::Constant::getNullValue(Ptr8Ty); + methods.push_back(m); + } + } +} + void CodeGenFunction::GenerateMethods(std::vector<llvm::Constant *> &methods, const CXXRecordDecl *RD, llvm::Type *Ptr8Ty) { @@ -673,14 +688,8 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, // then comes the the vcall offsets for all our functions... if (isPrimary && ForVirtualBase) - for (meth_iter mi = Class->method_begin(), - me = Class->method_end(); mi != me; ++mi) { - if (mi->isVirtual()) { - // FIXME: vcall: offset for virtual base for this function - m = llvm::Constant::getNullValue(Ptr8Ty); - methods.push_back(m); - } - } + GenerateVcalls(methods, Class, Ptr8Ty); + bool TopPrimary = true; // Primary tables are composed from the chain of primaries. if (isPrimary) { @@ -696,14 +705,7 @@ void CodeGenFunction::GenerateVtableForBase(const CXXRecordDecl *RD, } // then come the vcall offsets for all our virtual bases. if (!isPrimary && RD && ForVirtualBase) - for (meth_iter mi = RD->method_begin(), me = RD->method_end(); mi != me; - ++mi) { - if (mi->isVirtual()) { - // FIXME: vcall: offset for virtual base for this function - m = llvm::Constant::getNullValue(Ptr8Ty); - methods.push_back(m); - } - } + GenerateVcalls(methods, RD, Ptr8Ty); if (TopPrimary) { if (RD) { |