From 9a07730b8e9e389c788282c17f8f28f81860ecee Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 13 May 2014 00:44:44 +0000 Subject: [PATCH] MS ABI: Preliminary RTTI mangling Implement what we currently believe is the mangling scheme for RTTI data. Tests will be added in a later commit which actually generate RTTI data. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208661 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Mangle.h | 17 ++++++++ lib/AST/MicrosoftMangle.cpp | 83 ++++++++++++++++++++++++++++++------- 2 files changed, 86 insertions(+), 14 deletions(-) diff --git a/include/clang/AST/Mangle.h b/include/clang/AST/Mangle.h index 483c1e67bd..8eef0af8d5 100644 --- a/include/clang/AST/Mangle.h +++ b/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 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/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 618a5379e8..e38bdf9b1a 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -110,8 +110,21 @@ public: void mangleCXXVBTable(const CXXRecordDecl *Derived, ArrayRef 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 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 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) { -- 2.40.0