summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/MicrosoftMangle.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-03-10 19:01:51 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-03-10 19:01:51 +0000
commit999cbf9d210c23e0311c1d31a89afb2018bc73fe (patch)
tree2bebc76cc48dbea956aeadb746fdcb91dc7be501 /clang/lib/AST/MicrosoftMangle.cpp
parentec1e2bb6a495e87fc59226b5c00fcf8d1b139919 (diff)
downloadbcm5719-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.cpp19
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(
OpenPOWER on IntegriCloud