summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/MicrosoftCXXABI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/MicrosoftCXXABI.cpp')
-rw-r--r--clang/lib/CodeGen/MicrosoftCXXABI.cpp53
1 files changed, 26 insertions, 27 deletions
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");
OpenPOWER on IntegriCloud