From: Mike Stump Date: Fri, 20 Nov 2009 00:31:50 +0000 (+0000) Subject: Simplify rtti building code a little. Prep for reuse for throw rtti X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7e1365a163cde50b1972f05db7884fb124e6b2d7;p=clang Simplify rtti building code a little. Prep for reuse for throw rtti generation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89416 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCXXExpr.cpp b/lib/CodeGen/CGCXXExpr.cpp index cd7d21b3b9..409296f716 100644 --- a/lib/CodeGen/CGCXXExpr.cpp +++ b/lib/CodeGen/CGCXXExpr.cpp @@ -359,7 +359,7 @@ llvm::Value * CodeGenFunction::EmitCXXTypeidExpr(const CXXTypeidExpr *E) { return Builder.CreateBitCast(CGM.GenerateRttiRef(RD), LTy); return Builder.CreateBitCast(CGM.GenerateRtti(RD), LTy); } - return Builder.CreateBitCast(CGM.GenerateRttiNonClass(Ty), LTy); + return Builder.CreateBitCast(CGM.GenerateRtti(Ty), LTy); } Expr *subE = E->getExprOperand(); Ty = subE->getType(); @@ -403,7 +403,7 @@ llvm::Value * CodeGenFunction::EmitCXXTypeidExpr(const CXXTypeidExpr *E) { } return Builder.CreateBitCast(CGM.GenerateRtti(RD), LTy); } - return Builder.CreateBitCast(CGM.GenerateRttiNonClass(Ty), LTy); + return Builder.CreateBitCast(CGM.GenerateRtti(Ty), LTy); } llvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *V, diff --git a/lib/CodeGen/CGRtti.cpp b/lib/CodeGen/CGRtti.cpp index 79d866427f..38a17b3c39 100644 --- a/lib/CodeGen/CGRtti.cpp +++ b/lib/CodeGen/CGRtti.cpp @@ -260,13 +260,6 @@ public: return llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), f); } - llvm::Constant *BuildType2(QualType Ty) { - if (const RecordType *RT = Ty.getTypePtr()->getAs()) - if (const CXXRecordDecl *RD = cast(RT->getDecl())) - return Buildclass_type_info(RD); - return BuildType(Ty); - } - bool DecideExtern(QualType Ty) { // For this type, see if all components are never in an anonymous namespace. if (const MemberPointerType *MPT = Ty->getAs()) @@ -338,10 +331,10 @@ public: info.push_back(BuildInt(flags)); info.push_back(BuildInt(0)); - info.push_back(BuildType2(PTy)); + info.push_back(BuildType(PTy)); if (PtrMem) - info.push_back(BuildType2(BTy)); + info.push_back(BuildType(BTy)); // We always generate these as hidden, only the name isn't hidden. return finish(info, GV, Name, true, Extern); @@ -376,6 +369,11 @@ public: llvm::Constant *BuildType(QualType Ty) { const clang::Type &Type = *CGM.getContext().getCanonicalType(Ty).getTypePtr(); + + if (const RecordType *RT = Ty.getTypePtr()->getAs()) + if (const CXXRecordDecl *RD = cast(RT->getDecl())) + return Buildclass_type_info(RD); + switch (Type.getTypeClass()) { default: { assert(0 && "typeid expression"); @@ -426,7 +424,7 @@ llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) { return b.Buildclass_type_info(RD); } -llvm::Constant *CodeGenModule::GenerateRttiNonClass(QualType Ty) { +llvm::Constant *CodeGenModule::GenerateRtti(QualType Ty) { RttiBuilder b(*this); return b.BuildType(Ty); diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index c8562d6745..64314d3fbe 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -231,7 +231,7 @@ public: llvm::Constant *GenerateRttiRef(const CXXRecordDecl *RD); /// GenerateRttiNonClass - Generate the rtti information for the given /// non-class type. - llvm::Constant *GenerateRttiNonClass(QualType Ty); + llvm::Constant *GenerateRtti(QualType Ty); /// BuildThunk - Build a thunk for the given method llvm::Constant *BuildThunk(const CXXMethodDecl *MD, bool Extern, int64_t nv,