diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 21 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGCXXABI.h | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGException.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 6 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 53 |
7 files changed, 42 insertions, 49 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 563ea7ffc86..bf9d7a0118c 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -122,8 +122,8 @@ public: CXXCtorType CT, uint32_t Size, uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBIndex, raw_ostream &Out) override; - void mangleCXXHandlerMapEntry(QualType T, bool IsConst, bool IsVolatile, - bool IsReference, raw_ostream &Out) override; + void mangleCXXCatchHandlerType(QualType T, uint32_t Flags, + raw_ostream &Out) override; void mangleCXXRTTI(QualType T, raw_ostream &Out) override; void mangleCXXRTTIName(QualType T, raw_ostream &Out) override; void mangleCXXRTTIBaseClassDescriptor(const CXXRecordDecl *Derived, @@ -2345,20 +2345,13 @@ void MicrosoftMangleContextImpl::mangleCXXRTTIName(QualType T, Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result); } -void MicrosoftMangleContextImpl::mangleCXXHandlerMapEntry(QualType T, - bool IsConst, - bool IsVolatile, - bool IsReference, - raw_ostream &Out) { +void MicrosoftMangleContextImpl::mangleCXXCatchHandlerType(QualType T, + uint32_t Flags, + raw_ostream &Out) { MicrosoftCXXNameMangler Mangler(*this, Out); - Mangler.getStream() << "llvm.eh.handlermapentry."; - if (IsConst) - Mangler.getStream() << "const."; - if (IsVolatile) - Mangler.getStream() << "volatile."; - if (IsReference) - Mangler.getStream() << "reference."; + Mangler.getStream() << "llvm.eh.handlertype."; Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result); + Mangler.getStream() << '.' << Flags; } void MicrosoftMangleContextImpl::mangleCXXThrowInfo(QualType T, diff --git a/clang/lib/CodeGen/CGCXXABI.h b/clang/lib/CodeGen/CGCXXABI.h index b6a94f9082d..2c7392188f7 100644 --- a/clang/lib/CodeGen/CGCXXABI.h +++ b/clang/lib/CodeGen/CGCXXABI.h @@ -226,7 +226,7 @@ public: virtual llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) = 0; virtual llvm::Constant * - getAddrOfCXXHandlerMapEntry(QualType Ty, QualType CatchHandlerType) = 0; + getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType) = 0; virtual bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) = 0; diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 223b8f76d0d..1925c57d1bd 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -568,7 +568,7 @@ void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) { TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType); else TypeInfo = - CGM.getAddrOfCXXHandlerMapEntry(CaughtType, C->getCaughtType()); + CGM.getAddrOfCXXCatchHandlerType(CaughtType, C->getCaughtType()); CatchScope->setHandler(I, TypeInfo, Handler); } else { // No exception decl indicates '...', a catch-all. diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index f4ae684179a..ae511ae4fe4 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3638,9 +3638,9 @@ llvm::Constant *CodeGenModule::EmitUuidofInitializer(StringRef Uuid) { } llvm::Constant * -CodeGenModule::getAddrOfCXXHandlerMapEntry(QualType Ty, - QualType CatchHandlerType) { - return getCXXABI().getAddrOfCXXHandlerMapEntry(Ty, CatchHandlerType); +CodeGenModule::getAddrOfCXXCatchHandlerType(QualType Ty, + QualType CatchHandlerType) { + return getCXXABI().getAddrOfCXXCatchHandlerType(Ty, CatchHandlerType); } llvm::Constant *CodeGenModule::GetAddrOfRTTIDescriptor(QualType Ty, diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index ce540e91dcb..398aa5c9e17 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -719,8 +719,8 @@ public: /// Get the address of the RTTI descriptor for the given type. llvm::Constant *GetAddrOfRTTIDescriptor(QualType Ty, bool ForEH = false); - llvm::Constant *getAddrOfCXXHandlerMapEntry(QualType Ty, - QualType CatchHandlerType); + llvm::Constant *getAddrOfCXXCatchHandlerType(QualType Ty, + QualType CatchHandlerType); /// Get the address of a uuid descriptor . llvm::Constant *GetAddrOfUuidDescriptor(const CXXUuidofExpr* E); diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index f23cd9f9481..62f1293ff66 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -127,7 +127,8 @@ public: void EmitFundamentalRTTIDescriptors(); llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override; llvm::Constant * - getAddrOfCXXHandlerMapEntry(QualType Ty, QualType CatchHandlerType) override { + getAddrOfCXXCatchHandlerType(QualType Ty, + QualType CatchHandlerType) override { return getAddrOfRTTIDescriptor(Ty); } diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index f8f784567a3..b8089edd704 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -45,7 +45,7 @@ public: : CGCXXABI(CGM), BaseClassDescriptorType(nullptr), ClassHierarchyDescriptorType(nullptr), CompleteObjectLocatorType(nullptr), CatchableTypeType(nullptr), - ThrowInfoType(nullptr), HandlerMapEntryType(nullptr) {} + ThrowInfoType(nullptr), CatchHandlerTypeType(nullptr) {} bool HasThisReturn(GlobalDecl GD) const override; bool hasMostDerivedReturn(GlobalDecl GD) const override; @@ -85,7 +85,7 @@ public: llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override; llvm::Constant * - getAddrOfCXXHandlerMapEntry(QualType Ty, QualType CatchHandlerType) override; + getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType) override; bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override; void EmitBadTypeidCall(CodeGenFunction &CGF) override; @@ -573,16 +573,16 @@ public: void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type) override; - llvm::StructType *getHandlerMapEntryType() { - if (!HandlerMapEntryType) { + llvm::StructType *getCatchHandlerTypeType() { + if (!CatchHandlerTypeType) { llvm::Type *FieldTypes[] = { - CGM.IntTy, // Flags - getImageRelativeType(CGM.Int8PtrTy), // TypeDescriptor + CGM.IntTy, // Flags + CGM.Int8PtrTy, // TypeDescriptor }; - HandlerMapEntryType = llvm::StructType::create( - CGM.getLLVMContext(), FieldTypes, "eh.HandlerMapEntry"); + CatchHandlerTypeType = llvm::StructType::create( + CGM.getLLVMContext(), FieldTypes, "eh.CatchHandlerType"); } - return HandlerMapEntryType; + return CatchHandlerTypeType; } llvm::StructType *getCatchableTypeType() { @@ -698,7 +698,7 @@ private: llvm::StructType *CatchableTypeType; llvm::DenseMap<uint32_t, llvm::StructType *> CatchableTypeArrayTypeMap; llvm::StructType *ThrowInfoType; - llvm::StructType *HandlerMapEntryType; + llvm::StructType *CatchHandlerTypeType; }; } @@ -3193,8 +3193,8 @@ static QualType decomposeTypeForEH(ASTContext &Context, QualType T, } llvm::Constant * -MicrosoftCXXABI::getAddrOfCXXHandlerMapEntry(QualType Type, - QualType CatchHandlerType) { +MicrosoftCXXABI::getAddrOfCXXCatchHandlerType(QualType Type, + QualType CatchHandlerType) { // TypeDescriptors for exceptions never have qualified pointer types, // qualifiers are stored seperately in order to support qualification // conversions. @@ -3203,16 +3203,6 @@ MicrosoftCXXABI::getAddrOfCXXHandlerMapEntry(QualType Type, bool IsReference = CatchHandlerType->isReferenceType(); - SmallString<256> MangledName; - { - llvm::raw_svector_ostream Out(MangledName); - getMangleContext().mangleCXXHandlerMapEntry(Type, IsConst, IsVolatile, - IsReference, Out); - } - - if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) - return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); - uint32_t Flags = 0; if (IsConst) Flags |= 1; @@ -3221,15 +3211,24 @@ MicrosoftCXXABI::getAddrOfCXXHandlerMapEntry(QualType Type, if (IsReference) Flags |= 8; + SmallString<256> MangledName; + { + llvm::raw_svector_ostream Out(MangledName); + getMangleContext().mangleCXXCatchHandlerType(Type, Flags, Out); + } + + if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName)) + return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); + llvm::Constant *Fields[] = { - llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags - getImageRelativeConstant(getAddrOfRTTIDescriptor(Type)), // TypeDescriptor + llvm::ConstantInt::get(CGM.IntTy, Flags), // Flags + getAddrOfRTTIDescriptor(Type), // TypeDescriptor }; - llvm::StructType *HandlerMapEntryType = getHandlerMapEntryType(); + llvm::StructType *CatchHandlerTypeType = getCatchHandlerTypeType(); auto *Var = new llvm::GlobalVariable( - CGM.getModule(), HandlerMapEntryType, /*Constant=*/true, + CGM.getModule(), CatchHandlerTypeType, /*Constant=*/true, llvm::GlobalValue::PrivateLinkage, - llvm::ConstantStruct::get(HandlerMapEntryType, Fields), + llvm::ConstantStruct::get(CatchHandlerTypeType, Fields), StringRef(MangledName)); Var->setUnnamedAddr(true); Var->setSection("llvm.metadata"); |