diff options
-rw-r--r-- | clang/include/clang/AST/Mangle.h | 17 | ||||
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 83 |
2 files changed, 86 insertions, 14 deletions
diff --git a/clang/include/clang/AST/Mangle.h b/clang/include/clang/AST/Mangle.h index 483c1e67bd0..8eef0af8d5d 100644 --- a/clang/include/clang/AST/Mangle.h +++ b/clang/include/clang/AST/Mangle.h @@ -213,6 +213,23 @@ public: virtual void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD, raw_ostream &) = 0; + virtual void mangleCXXRTTIBaseClassDescriptor( + const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath, + uint32_t NVOffset, uint32_t VBPtrOffset, uint32_t VBTableOffset, + uint32_t Flags, raw_ostream &Out) = 0; + + virtual void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived, + raw_ostream &Out) = 0; + virtual void + mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl *Derived, + raw_ostream &Out) = 0; + + virtual void mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl *Derived, + uint32_t OffsetFromTop, + uint32_t VFPtrToVtordispDelta, + uint32_t Flags, + raw_ostream &Out) = 0; + static bool classof(const MangleContext *C) { return C->getKind() == MK_Microsoft; } diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 618a5379e89..e38bdf9b1a4 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -110,8 +110,21 @@ public: void mangleCXXVBTable(const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath, raw_ostream &Out) override; - void mangleCXXRTTI(QualType T, raw_ostream &) override; - void mangleCXXRTTIName(QualType T, raw_ostream &) override; + void mangleCXXRTTI(QualType T, raw_ostream &Out) override; + void mangleCXXRTTIName(QualType T, raw_ostream &Out) override; + void mangleCXXRTTIBaseClassDescriptor( + const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath, + uint32_t NVOffset, uint32_t VBPtrOffset, uint32_t VBTableOffset, + uint32_t Flags, raw_ostream &Out) override; + void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived, + raw_ostream &Out) override; + void mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl *Derived, + raw_ostream &Out) override; + void mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl *Derived, + uint32_t OffsetFromTop, + uint32_t VFPtrToVtordispDelta, + uint32_t Flags, + raw_ostream &Out) override; void mangleTypeName(QualType T, raw_ostream &) override; void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, raw_ostream &) override; @@ -2231,20 +2244,62 @@ void MicrosoftMangleContextImpl::mangleCXXVBTable( Mangler.getStream() << '@'; } -void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType T, raw_ostream &) { - // FIXME: Give a location... - unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, - "cannot mangle RTTI descriptors for type %0 yet"); - getDiags().Report(DiagID) - << T.getBaseTypeIdentifier(); +void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType T, raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << "\01??_R0"; + Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result); + Mangler.getStream() << "@8"; } -void MicrosoftMangleContextImpl::mangleCXXRTTIName(QualType T, raw_ostream &) { - // FIXME: Give a location... - unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error, - "cannot mangle the name of type %0 into RTTI descriptors yet"); - getDiags().Report(DiagID) - << T.getBaseTypeIdentifier(); +void MicrosoftMangleContextImpl::mangleCXXRTTIName(QualType T, + raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << '.'; + Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result); +} + +void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor( + const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath, + uint32_t NVOffset, uint32_t VBPtrOffset, uint32_t VBTableOffset, + uint32_t Flags, raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << "\01??_R1"; + Mangler.mangleName(Derived); + for (const CXXRecordDecl *RD : BasePath) + Mangler.mangleName(RD); + Mangler.mangleNumber(NVOffset); + Mangler.mangleNumber(VBPtrOffset); + Mangler.mangleNumber(VBTableOffset); + Mangler.mangleNumber(Flags); + Mangler.getStream() << "@8"; +} + +void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassArray( + const CXXRecordDecl *Derived, raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << "\01??_R2"; + Mangler.mangleName(Derived); + Mangler.getStream() << "@8"; +} + +void MicrosoftMangleContextImpl::mangleCXXRTTIClassHierarchyDescriptor( + const CXXRecordDecl *Derived, raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << "\01??_R3"; + Mangler.mangleName(Derived); + Mangler.getStream() << "@8"; +} + +void MicrosoftMangleContextImpl::mangleCXXRTTICompleteObjectLocator( + const CXXRecordDecl *Derived, uint32_t OffsetFromTop, + uint32_t VFPtrToVtordispDelta, uint32_t Flags, raw_ostream &Out) { + MicrosoftCXXNameMangler Mangler(*this, Out); + Mangler.getStream() << "\01??_R4"; + Mangler.mangleName(Derived); + Mangler.mangleNumber(Flags); + Mangler.mangleNumber(OffsetFromTop); + Mangler.mangleNumber(VFPtrToVtordispDelta); + Mangler.getStream() << "@8"; } void MicrosoftMangleContextImpl::mangleTypeName(QualType T, raw_ostream &Out) { |