MS ABI: Mangle the location of the catchable type into it's name
Because the catchable type has a reference to its name, mangle the location to ensure that two catchable types with different locations are distinct. llvm-svn: 231819
This commit is contained in:
parent
ec1e2bb6a4
commit
999cbf9d21
|
@ -204,7 +204,9 @@ public:
|
|||
raw_ostream &Out) = 0;
|
||||
|
||||
virtual void mangleCXXCatchableType(QualType T, const CXXConstructorDecl *CD,
|
||||
uint32_t Size, raw_ostream &Out) = 0;
|
||||
uint32_t Size, uint32_t NVOffset,
|
||||
int32_t VBPtrOffset, uint32_t VBIndex,
|
||||
raw_ostream &Out) = 0;
|
||||
|
||||
virtual void mangleCXXRTTIBaseClassDescriptor(
|
||||
const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset,
|
||||
|
|
|
@ -115,7 +115,9 @@ public:
|
|||
void mangleCXXCatchableTypeArray(QualType T, uint32_t NumEntries,
|
||||
raw_ostream &Out) override;
|
||||
void mangleCXXCatchableType(QualType T, const CXXConstructorDecl *CD,
|
||||
uint32_t Size, raw_ostream &Out) override;
|
||||
uint32_t Size, uint32_t NVOffset,
|
||||
int32_t VBPtrOffset, uint32_t VBIndex,
|
||||
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,
|
||||
|
@ -2308,7 +2310,8 @@ void MicrosoftMangleContextImpl::mangleCXXCatchableTypeArray(
|
|||
}
|
||||
|
||||
void MicrosoftMangleContextImpl::mangleCXXCatchableType(
|
||||
QualType T, const CXXConstructorDecl *CD, uint32_t Size, raw_ostream &Out) {
|
||||
QualType T, const CXXConstructorDecl *CD, uint32_t Size, uint32_t NVOffset,
|
||||
int32_t VBPtrOffset, uint32_t VBIndex, raw_ostream &Out) {
|
||||
MicrosoftCXXNameMangler Mangler(*this, Out);
|
||||
Mangler.getStream() << "_CT";
|
||||
|
||||
|
@ -2319,6 +2322,9 @@ void MicrosoftMangleContextImpl::mangleCXXCatchableType(
|
|||
}
|
||||
Mangler.getStream() << RTTIMangling.substr(1);
|
||||
|
||||
// VS2015 CTP6 omits the copy-constructor in the mangled name. This name is,
|
||||
// in fact, superfluous but I'm not sure the change was made consciously.
|
||||
// TODO: Revisit this when VS2015 gets released.
|
||||
llvm::SmallString<64> CopyCtorMangling;
|
||||
if (CD) {
|
||||
llvm::raw_svector_ostream Stream(CopyCtorMangling);
|
||||
|
@ -2327,6 +2333,15 @@ void MicrosoftMangleContextImpl::mangleCXXCatchableType(
|
|||
Mangler.getStream() << CopyCtorMangling.substr(1);
|
||||
|
||||
Mangler.getStream() << Size;
|
||||
if (VBPtrOffset == -1) {
|
||||
if (NVOffset) {
|
||||
Mangler.getStream() << NVOffset;
|
||||
}
|
||||
} else {
|
||||
Mangler.getStream() << NVOffset;
|
||||
Mangler.getStream() << VBPtrOffset;
|
||||
Mangler.getStream() << VBIndex;
|
||||
}
|
||||
}
|
||||
|
||||
void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor(
|
||||
|
|
|
@ -3233,7 +3233,8 @@ llvm::Constant *MicrosoftCXXABI::getCatchableType(QualType T,
|
|||
SmallString<256> MangledName;
|
||||
{
|
||||
llvm::raw_svector_ostream Out(MangledName);
|
||||
getMangleContext().mangleCXXCatchableType(T, CD, Size, Out);
|
||||
getMangleContext().mangleCXXCatchableType(T, CD, Size, NVOffset,
|
||||
VBPtrOffset, VBIndex, Out);
|
||||
}
|
||||
if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
|
||||
return getImageRelativeConstant(GV);
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// CHECK-DAG: @"\01??_R0?AUZ@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUZ@@\00" }, comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUZ@@@81" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUZ@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"\01??_R0?AUW@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUW@@\00" }, comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z4" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 4, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUW@@@8" to i8*), i32 4, i32 -1, i32 0, i32 4, i8* bitcast (%struct.W* (%struct.W*, %struct.W*, i32)* @"\01??0W@@QAE@ABU0@@Z" to i8*) }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z44" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 4, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUW@@@8" to i8*), i32 4, i32 -1, i32 0, i32 4, i8* bitcast (%struct.W* (%struct.W*, %struct.W*, i32)* @"\01??0W@@QAE@ABU0@@Z" to i8*) }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"\01??_R0?AUM@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUM@@\00" }, comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUM@@@81" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUM@@@8" to i8*), i32 8, i32 -1, i32 0, i32 1, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUM@@@818" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUM@@@8" to i8*), i32 8, i32 -1, i32 0, i32 1, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"\01??_R0?AUV@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUV@@\00" }, comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUV@@@81" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUV@@@8" to i8*), i32 0, i32 4, i32 4, i32 1, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CTA5?AUY@@" = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.5 { i32 5, [5 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0?AUY@@@8??0Y@@QAE@ABU0@@Z8", %eh.CatchableType* @"_CT??_R0?AUZ@@@81", %eh.CatchableType* @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z4", %eh.CatchableType* @"_CT??_R0?AUM@@@81", %eh.CatchableType* @"_CT??_R0?AUV@@@81"] }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUV@@@81044" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUV@@@8" to i8*), i32 0, i32 4, i32 4, i32 1, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CTA5?AUY@@" = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.5 { i32 5, [5 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0?AUY@@@8??0Y@@QAE@ABU0@@Z8", %eh.CatchableType* @"_CT??_R0?AUZ@@@81", %eh.CatchableType* @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z44", %eh.CatchableType* @"_CT??_R0?AUM@@@818", %eh.CatchableType* @"_CT??_R0?AUV@@@81044"] }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_TI5?AUY@@" = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, i8* bitcast (void (%struct.Y*)* @"\01??_DY@@QAE@XZ" to i8*), i8* null, i8* bitcast (%eh.CatchableTypeArray.5* @"_CTA5?AUY@@" to i8*) }, section ".xdata", comdat
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue