diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-03-10 19:01:51 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-03-10 19:01:51 +0000 |
commit | 999cbf9d210c23e0311c1d31a89afb2018bc73fe (patch) | |
tree | 2bebc76cc48dbea956aeadb746fdcb91dc7be501 /clang/lib/AST/MicrosoftMangle.cpp | |
parent | ec1e2bb6a495e87fc59226b5c00fcf8d1b139919 (diff) | |
download | bcm5719-llvm-999cbf9d210c23e0311c1d31a89afb2018bc73fe.tar.gz bcm5719-llvm-999cbf9d210c23e0311c1d31a89afb2018bc73fe.zip |
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
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 3f660c9f69e..073e798d11f 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -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( |