From 41fe42e844bc709e0735e22e9ebdf89f17d1a8be Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 17 Mar 2015 20:35:00 +0000 Subject: [PATCH] WIP git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232537 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCXXABI.h | 3 ++- lib/CodeGen/CGException.cpp | 2 +- lib/CodeGen/CodeGenModule.cpp | 6 +++++- lib/CodeGen/CodeGenModule.h | 2 ++ lib/CodeGen/ItaniumCXXABI.cpp | 8 +++++--- lib/CodeGen/MicrosoftCXXABI.cpp | 32 +++++++++++++++----------------- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/lib/CodeGen/CGCXXABI.h b/lib/CodeGen/CGCXXABI.h index 800f337e70..3a92d05e7e 100644 --- a/lib/CodeGen/CGCXXABI.h +++ b/lib/CodeGen/CGCXXABI.h @@ -224,7 +224,8 @@ public: emitTerminateForUnexpectedException(CodeGenFunction &CGF, llvm::Value *Exn); - virtual llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty, bool ForEH) = 0; + virtual llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) = 0; + virtual llvm::Constant *getAddrOfCXXCatchDescriptor(QualType Ty) = 0; virtual bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) = 0; diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 80292d5bd6..1a9ebb395f 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -567,7 +567,7 @@ void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) { if (CaughtType->isObjCObjectPointerType()) TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType); else - TypeInfo = CGM.GetAddrOfRTTIDescriptor(CaughtType, /*ForEH=*/true); + TypeInfo = CGM.getAddrOfCXXCatchDescriptor(CaughtType); CatchScope->setHandler(I, TypeInfo, Handler); } else { // No exception decl indicates '...', a catch-all. diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 29c6872377..03948d68cd 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -3644,6 +3644,10 @@ llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) { return llvm::ConstantStruct::getAnon(Fields); } +llvm::Constant *CodeGenModule::getAddrOfCXXCatchDescriptor(QualType Ty) { + return getCXXABI().getAddrOfCXXCatchDescriptor(Ty); +} + llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH) { // Return a bogus pointer if RTTI is disabled, unless it's for EH. @@ -3656,7 +3660,7 @@ llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, LangOpts.ObjCRuntime.isGNUFamily()) return ObjCRuntime->GetEHType(Ty); - return getCXXABI().getAddrOfRTTIDescriptor(Ty, ForEH); + return getCXXABI().getAddrOfRTTIDescriptor(Ty); } void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) { diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index a82f0734dd..7e5bd7caa5 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -719,6 +719,8 @@ public: /// Get the address of the RTTI descriptor for the given type. llvm::Constant *GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH = false); + llvm::Constant *getAddrOfCXXCatchDescriptor(QualType Ty); + /// Get the address of a uuid descriptor . llvm::Constant *GetAddrOfUuidDescriptor(const CXXUuidofExpr* E); diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 2fb6a5ec41..ca9322840e 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -125,7 +125,10 @@ public: void EmitFundamentalRTTIDescriptor(QualType Type); void EmitFundamentalRTTIDescriptors(); - llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty, bool ForEH) override; + llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override; + llvm::Constant *getAddrOfCXXCatchDescriptor(QualType Ty) { + return getAddrOfRTTIDescriptor(Ty); + } bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override; void EmitBadTypeidCall(CodeGenFunction &CGF) override; @@ -3101,8 +3104,7 @@ ItaniumRTTIBuilder::BuildPointerToMemberTypeInfo(const MemberPointerType *Ty) { ItaniumRTTIBuilder(CXXABI).BuildTypeInfo(QualType(ClassType, 0))); } -llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty, - bool ForEH) { +llvm::Constant *ItaniumCXXABI::getAddrOfRTTIDescriptor(QualType Ty) { return ItaniumRTTIBuilder(*this).BuildTypeInfo(Ty); } diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 6ab57f430f..7539ad8bdf 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -83,7 +83,8 @@ public: llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD, const VPtrInfo *Info); - llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty, bool ForEH) override; + llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override; + llvm::Constant *getAddrOfCXXCatchDescriptor(QualType Ty) override; bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override; void EmitBadTypeidCall(CodeGenFunction &CGF) override; @@ -3094,8 +3095,7 @@ MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) { // Initialize the BaseClassDescriptor. llvm::Constant *Fields[] = { ABI.getImageRelativeConstant( - ABI.getAddrOfRTTIDescriptor(Context.getTypeDeclType(Class.RD), - /*ForEH=*/false)), + ABI.getAddrOfRTTIDescriptor(Context.getTypeDeclType(Class.RD))), llvm::ConstantInt::get(CGM.IntTy, Class.NumBases), llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase), llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset), @@ -3186,22 +3186,21 @@ static QualType decomposeTypeForEH(ASTContext &Context, QualType T, return T; } -/// \brief Gets a TypeDescriptor. Returns a llvm::Constant * rather than a -/// llvm::GlobalVariable * because different type descriptors have different -/// types, and need to be abstracted. They are abstracting by casting the -/// address to an Int8PtrTy. -llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type, - bool ForEH) { +llvm::Constant *MicrosoftCXXABI::getAddrOfCXXCatchDescriptor(QualType Type) { // TypeDescriptors for exceptions never has qualified pointer types, // qualifiers are stored seperately in order to support qualification // conversions. - if (ForEH) { - // FIXME: This is only a 50% solution, we need to actually do something with - // these qualifiers. - bool IsConst, IsVolatile; - Type = decomposeTypeForEH(getContext(), Type, IsConst, IsVolatile); - } + bool IsConst, IsVolatile; + Type = decomposeTypeForEH(getContext(), Type, IsConst, IsVolatile); + return getAddrOfRTTIDescriptor(Type); +} + +/// \brief Gets a TypeDescriptor. Returns a llvm::Constant * rather than a +/// llvm::GlobalVariable * because different type descriptors have different +/// types, and need to be abstracted. They are abstracting by casting the +/// address to an Int8PtrTy. +llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) { SmallString<256> MangledName, TypeInfoString; { llvm::raw_svector_ostream Out(MangledName); @@ -3419,8 +3418,7 @@ llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T, // The TypeDescriptor is used by the runtime to determine if a catch handler // is appropriate for the exception object. - llvm::Constant *TD = - getImageRelativeConstant(getAddrOfRTTIDescriptor(T, /*ForEH=*/true)); + llvm::Constant *TD = getImageRelativeConstant(getAddrOfRTTIDescriptor(T)); // The runtime is responsible for calling the copy constructor if the // exception is caught by value. -- 2.50.1