diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-03-29 21:55:10 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-03-29 21:55:10 +0000 |
commit | 37b417f1edccd05248a0e235a58987daa15e88c5 (patch) | |
tree | c4d614a8b29f0aa44bd6bb74be3d0da6583570aa /clang/lib/CodeGen | |
parent | 273957116887aa34b0a517cb90151458023c4ec3 (diff) | |
download | bcm5719-llvm-37b417f1edccd05248a0e235a58987daa15e88c5.tar.gz bcm5719-llvm-37b417f1edccd05248a0e235a58987daa15e88c5.zip |
[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'
llvm-svn: 233503
Diffstat (limited to 'clang/lib/CodeGen')
-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 |
6 files changed, 35 insertions, 35 deletions
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"); |