From f4da2cf20a8bea52a6acf82dd47c86b24c3e7260 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 3 May 2010 00:32:27 +0000 Subject: [PATCH] Remove OldGetAddressOfBaseClass - bye bye ambiguities. llvm-svn: 102889 --- clang/lib/CodeGen/CGClass.cpp | 91 ----------------------------- clang/lib/CodeGen/CodeGenFunction.h | 4 -- 2 files changed, 95 deletions(-) diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index a070b7f55e99..6e7208bdcbd1 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -47,31 +47,6 @@ ComputeNonVirtualBaseClassOffset(ASTContext &Context, // FIXME: We should not use / 8 here. return Offset / 8; } - -static uint64_t -ComputeNonVirtualBaseClassOffset(ASTContext &Context, - const CXXBasePath &Path, - unsigned Start) { - uint64_t Offset = 0; - - for (unsigned i = Start, e = Path.size(); i != e; ++i) { - const CXXBasePathElement& Element = Path[i]; - - // Get the layout. - const ASTRecordLayout &Layout = Context.getASTRecordLayout(Element.Class); - - const CXXBaseSpecifier *BS = Element.Base; - assert(!BS->isVirtual() && "Should not see virtual bases here!"); - - const CXXRecordDecl *Base = - cast(BS->getType()->getAs()->getDecl()); - - // Add the offset. - Offset += Layout.getBaseClassOffset(Base) / 8; - } - - return Offset; -} llvm::Constant * CodeGenModule::GetNonVirtualBaseClassOffset(const CXXRecordDecl *ClassDecl, @@ -228,72 +203,6 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, return Value; } -llvm::Value * -CodeGenFunction::OldGetAddressOfBaseClass(llvm::Value *Value, - const CXXRecordDecl *Class, - const CXXRecordDecl *BaseClass) { - QualType BTy = - getContext().getCanonicalType( - getContext().getTypeDeclType(BaseClass)); - const llvm::Type *BasePtrTy = llvm::PointerType::getUnqual(ConvertType(BTy)); - - if (Class == BaseClass) { - // Just cast back. - return Builder.CreateBitCast(Value, BasePtrTy); - } - -#ifndef NDEBUG - CXXBasePaths Paths(/*FindAmbiguities=*/true, - /*RecordPaths=*/true, /*DetectVirtual=*/false); -#else - CXXBasePaths Paths(/*FindAmbiguities=*/false, - /*RecordPaths=*/true, /*DetectVirtual=*/false); -#endif - if (!const_cast(Class)-> - isDerivedFrom(const_cast(BaseClass), Paths)) { - assert(false && "Class must be derived from the passed in base class!"); - return 0; - } - -#if 0 - // FIXME: Re-enable this assert when the underlying bugs have been fixed. - assert(!Paths.isAmbiguous(BTy) && "Path is ambiguous"); -#endif - - unsigned Start = 0; - - const CXXBasePath &Path = Paths.front(); - const CXXRecordDecl *VBase = 0; - for (unsigned i = 0, e = Path.size(); i != e; ++i) { - const CXXBasePathElement& Element = Path[i]; - if (Element.Base->isVirtual()) { - Start = i+1; - QualType VBaseType = Element.Base->getType(); - VBase = cast(VBaseType->getAs()->getDecl()); - } - } - - uint64_t Offset = - ComputeNonVirtualBaseClassOffset(getContext(), Paths.front(), Start); - - if (!Offset && !VBase) { - // Just cast back. - return Builder.CreateBitCast(Value, BasePtrTy); - } - - llvm::Value *VirtualOffset = 0; - - if (VBase) - VirtualOffset = GetVirtualBaseClassOffset(Value, Class, VBase); - - // Apply the offsets. - Value = ApplyNonVirtualAndVirtualOffset(*this, Value, Offset, VirtualOffset); - - // Cast back. - Value = Builder.CreateBitCast(Value, BasePtrTy); - return Value; -} - llvm::Value * CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value, const CXXRecordDecl *Derived, diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 77d4a97d0c13..90a3ec4a4b10 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -786,10 +786,6 @@ public: const CXXRecordDecl *Base, bool BaseIsVirtual); - llvm::Value *OldGetAddressOfBaseClass(llvm::Value *Value, - const CXXRecordDecl *ClassDecl, - const CXXRecordDecl *BaseClassDecl); - /// GetAddressOfBaseClass - This function will add the necessary delta to the /// load of 'this' and returns address of the base class. llvm::Value *GetAddressOfBaseClass(llvm::Value *Value,