From b77659f4ae4cce1885766960c07885d97b539689 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 28 Jul 2009 18:09:28 +0000 Subject: [PATCH] Some code cleanup. llvm-svn: 77339 --- clang/lib/CodeGen/CGCXX.cpp | 33 ++++++++--------------------- clang/lib/CodeGen/CodeGenFunction.h | 4 ++-- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index a0aaa82b4b16..d82b97695196 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -156,8 +156,8 @@ llvm::Value *CodeGenFunction::LoadCXXThis() { } llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue, - CXXRecordDecl *ClassDecl, - CXXRecordDecl *BaseClassDecl) { + const CXXRecordDecl *ClassDecl, + const CXXRecordDecl *BaseClassDecl) { if (ClassDecl == BaseClassDecl) return BaseValue; @@ -184,7 +184,7 @@ llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue, BaseValue = Builder.CreateGEP(BaseValue, OffsetVal, "add.ptr"); QualType BTy = getContext().getCanonicalType( - getContext().getTypeDeclType(BaseClassDecl)); + getContext().getTypeDeclType(const_cast(BaseClassDecl))); const llvm::Type *BasePtr = ConvertType(BTy); BasePtr = VMContext.getPointerTypeUnqual(BasePtr); BaseValue = Builder.CreateBitCast(BaseValue, BasePtr); @@ -458,33 +458,18 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) { const CXXRecordDecl *ClassDecl = cast(CD->getDeclContext()); assert(ClassDecl->vbases_begin() == ClassDecl->vbases_end() && "FIXME. virtual base initialization unsupported"); - const ASTRecordLayout &Layout = getContext().getASTRecordLayout(ClassDecl); - llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty); - unsigned FieldNo = 0; + for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(), E = CD->init_end(); B != E; ++B) { CXXBaseOrMemberInitializer *Member = (*B); if (Member->isBaseInitializer()) { - uint64_t Offset = Layout.getFieldOffset(FieldNo++) / 8; - assert(Member->getConstructor() && - "EmitCtorPrologue - no constructor to initialize base class"); llvm::Value *LoadOfThis = LoadCXXThis(); - llvm::LLVMContext &VMContext = getLLVMContext(); - llvm::Value *V; - if (Offset > 0) { - llvm::Value *OffsetVal = llvm::ConstantInt::get(llvm::Type::Int32Ty, - Offset); - V = Builder.CreateBitCast(LoadOfThis, I8Ptr); - V = Builder.CreateGEP(V, OffsetVal, "add.ptr"); - } - else - V = Builder.CreateBitCast(LoadOfThis, I8Ptr); - - const llvm::Type *BasePtr = - ConvertType(QualType(Member->getBaseClass(), 0)); - BasePtr = VMContext.getPointerTypeUnqual(BasePtr); - V = Builder.CreateBitCast(V, BasePtr); + Type *BaseType = Member->getBaseClass(); + CXXRecordDecl *BaseClassDecl = + cast(BaseType->getAsRecordType()->getDecl()); + llvm::Value *V = AddressCXXOfBaseClass(LoadOfThis, ClassDecl, + BaseClassDecl); EmitCXXConstructorCall(Member->getConstructor(), Ctor_Complete, V, Member->const_arg_begin(), diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 06265196f949..a3e37963104f 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -533,8 +533,8 @@ public: // FIXME. This currently only does a derived to non-virtual base conversion. // Other kinds of conversions will come later. llvm::Value *AddressCXXOfBaseClass(llvm::Value *ThisValue, - CXXRecordDecl *ClassDecl, - CXXRecordDecl *BaseClassDecl); + const CXXRecordDecl *ClassDecl, + const CXXRecordDecl *BaseClassDecl); void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, llvm::Value *This, -- GitLab