From: David Majnemer Date: Sun, 29 Mar 2015 21:55:10 +0000 (+0000) Subject: [MS ABI] Rework .xdata HandlerType emission X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=17e717d907548cdc150c2229b1dc00f1f8af775f;p=clang [MS ABI] Rework .xdata HandlerType emission Utilizing IMAGEREL relocations for synthetic IR constructs isn't valuable, just clutter. While we are here, simplify HandlerType names by making the numeric value for the 'adjective' part of the mangled name instead of appending '.const', etc. The old scheme made for very long global names and leads to wordy things like '.std_bad_alloc' git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233503 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Mangle.h b/include/clang/AST/Mangle.h index 23dde6b3f9..e4bccedff9 100644 --- a/include/clang/AST/Mangle.h +++ b/include/clang/AST/Mangle.h @@ -208,9 +208,8 @@ public: uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBIndex, raw_ostream &Out) = 0; - virtual void mangleCXXHandlerMapEntry(QualType T, bool IsConst, - bool IsVolatile, bool IsReference, - raw_ostream &Out) = 0; + virtual void mangleCXXCatchHandlerType(QualType T, uint32_t Flags, + raw_ostream &Out) = 0; virtual void mangleCXXRTTIBaseClassDescriptor( const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset, diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 563ea7ffc8..bf9d7a0118 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/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/lib/CodeGen/CGCXXABI.h b/lib/CodeGen/CGCXXABI.h index b6a94f9082..2c7392188f 100644 --- a/lib/CodeGen/CGCXXABI.h +++ b/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/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 223b8f76d0..1925c57d1b 100644 --- a/lib/CodeGen/CGException.cpp +++ b/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/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index f4ae684179..ae511ae4fe 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/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/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index ce540e91dc..398aa5c9e1 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/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/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index f23cd9f948..62f1293ff6 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/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/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index f8f784567a..b8089edd70 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/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 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"); diff --git a/test/CodeGenCXX/microsoft-abi-try-throw.cpp b/test/CodeGenCXX/microsoft-abi-try-throw.cpp index c7bbcf2888..a3a45a5468 100644 --- a/test/CodeGenCXX/microsoft-abi-try-throw.cpp +++ b/test/CodeGenCXX/microsoft-abi-try-throw.cpp @@ -6,7 +6,7 @@ // THROW-DAG: @_CTA1H = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.1 { i32 1, [1 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0H@84"] }, section ".xdata", comdat // THROW-DAG: @_TI1H = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, i8* null, i8* null, i8* bitcast (%eh.CatchableTypeArray.1* @_CTA1H to i8*) }, section ".xdata", comdat -// TRY-DAG: @llvm.eh.handlermapentry.const.PAH = private unnamed_addr constant %eh.HandlerMapEntry { i32 1, i8* bitcast (%rtti.TypeDescriptor4* @"\01??_R0PAH@8" to i8*) }, section "llvm.metadata" +// TRY-DAG: @llvm.eh.handlertype.PAH.1 = private unnamed_addr constant %eh.CatchHandlerType { i32 1, i8* bitcast (%rtti.TypeDescriptor4* @"\01??_R0PAH@8" to i8*) }, section "llvm.metadata" void external(); @@ -41,7 +41,7 @@ void qual_catch() { external(); } catch (const int *) { } - // TRY: catch %eh.HandlerMapEntry* @llvm.eh.handlermapentry.const.PAH - // TRY: call i32 @llvm.eh.typeid.for(i8* bitcast (%eh.HandlerMapEntry* @llvm.eh.handlermapentry.const.PAH to i8*)) + // TRY: catch %eh.CatchHandlerType* @llvm.eh.handlertype.PAH.1 + // TRY: call i32 @llvm.eh.typeid.for(i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.PAH.1 to i8*)) } #endif