Index: include/clang/AST/ASTContext.h =================================================================== --- include/clang/AST/ASTContext.h +++ include/clang/AST/ASTContext.h @@ -2157,7 +2157,10 @@ VTableContextBase *getVTableContext(); +private: MangleContext *createMangleContext(); +public: + MangleContext &getMangleContext(); void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl &Ivars) const; @@ -2828,6 +2831,7 @@ std::unique_ptr OtherParents; std::unique_ptr VTContext; + std::unique_ptr MContext; void ReleaseDeclContextMaps(); void ReleaseParentMapEntries(); Index: lib/AST/ASTContext.cpp =================================================================== --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -9570,6 +9570,12 @@ llvm_unreachable("Unsupported ABI"); } +MangleContext &ASTContext::getMangleContext() { + if (!MContext) + MContext.reset(createMangleContext()); + return *MContext.get(); +} + CXXABI::~CXXABI() = default; size_t ASTContext::getSideTableAllocatedMemory() const { Index: lib/AST/Expr.cpp =================================================================== --- lib/AST/Expr.cpp +++ lib/AST/Expr.cpp @@ -497,18 +497,17 @@ if (IT == PredefinedExpr::FuncDName) { if (const NamedDecl *ND = dyn_cast(CurrentDecl)) { - std::unique_ptr MC; - MC.reset(Context.createMangleContext()); + MangleContext& MC = Context.getMangleContext(); - if (MC->shouldMangleDeclName(ND)) { + if (MC.shouldMangleDeclName(ND)) { SmallString<256> Buffer; llvm::raw_svector_ostream Out(Buffer); if (const CXXConstructorDecl *CD = dyn_cast(ND)) - MC->mangleCXXCtor(CD, Ctor_Base, Out); + MC.mangleCXXCtor(CD, Ctor_Base, Out); else if (const CXXDestructorDecl *DD = dyn_cast(ND)) - MC->mangleCXXDtor(DD, Dtor_Base, Out); + MC.mangleCXXDtor(DD, Dtor_Base, Out); else - MC->mangleName(ND, Out); + MC.mangleName(ND, Out); if (!Buffer.empty() && Buffer.front() == '\01') return Buffer.substr(1); Index: lib/CodeGen/CGCXXABI.h =================================================================== --- lib/CodeGen/CGCXXABI.h +++ lib/CodeGen/CGCXXABI.h @@ -44,10 +44,10 @@ class CGCXXABI { protected: CodeGenModule &CGM; - std::unique_ptr MangleCtx; + MangleContext &MangleCtx; CGCXXABI(CodeGenModule &CGM) - : CGM(CGM), MangleCtx(CGM.getContext().createMangleContext()) {} + : CGM(CGM), MangleCtx(CGM.getContext().getMangleContext()) {} protected: ImplicitParamDecl *getThisDecl(CodeGenFunction &CGF) { @@ -95,7 +95,7 @@ /// Gets the mangle context. MangleContext &getMangleContext() { - return *MangleCtx; + return MangleCtx; } /// Returns true if the given constructor or destructor is one of the Index: lib/Index/CodegenNameGenerator.cpp =================================================================== --- lib/Index/CodegenNameGenerator.cpp +++ lib/Index/CodegenNameGenerator.cpp @@ -26,11 +26,11 @@ using namespace clang::index; struct CodegenNameGenerator::Implementation { - std::unique_ptr MC; + MangleContext& MC; llvm::DataLayout DL; Implementation(ASTContext &Ctx) - : MC(Ctx.createMangleContext()), + : MC(Ctx.getMangleContext()), DL(Ctx.getTargetInfo().getDataLayout()) {} bool writeName(const Decl *D, raw_ostream &OS) { @@ -46,7 +46,7 @@ if (writeFuncOrVarName(VD, FrontendBufOS)) return true; } else if (auto *MD = dyn_cast(D)) { - MC->mangleObjCMethodNameWithoutSize(MD, OS); + MC.mangleObjCMethodNameWithoutSize(MD, OS); return false; } else if (auto *ID = dyn_cast(D)) { writeObjCClassName(ID, FrontendBufOS); @@ -106,7 +106,6 @@ const NamedDecl *ND = cast(D); ASTContext &Ctx = ND->getASTContext(); - std::unique_ptr M(Ctx.createMangleContext()); std::vector Manglings; @@ -148,13 +147,13 @@ private: bool writeFuncOrVarName(const NamedDecl *D, raw_ostream &OS) { - if (MC->shouldMangleDeclName(D)) { + if (MC.shouldMangleDeclName(D)) { if (const auto *CtorD = dyn_cast(D)) - MC->mangleCXXCtor(CtorD, Ctor_Complete, OS); + MC.mangleCXXCtor(CtorD, Ctor_Complete, OS); else if (const auto *DtorD = dyn_cast(D)) - MC->mangleCXXDtor(DtorD, Dtor_Complete, OS); + MC.mangleCXXDtor(DtorD, Dtor_Complete, OS); else - MC->mangleName(D, OS); + MC.mangleName(D, OS); return false; } else { IdentifierInfo *II = D->getIdentifier(); @@ -181,9 +180,9 @@ llvm::raw_string_ostream FOS(FrontendBuf); if (const auto *CD = dyn_cast_or_null(ND)) - MC->mangleCXXCtor(CD, static_cast(StructorType), FOS); + MC.mangleCXXCtor(CD, static_cast(StructorType), FOS); else if (const auto *DD = dyn_cast_or_null(ND)) - MC->mangleCXXDtor(DD, static_cast(StructorType), FOS); + MC.mangleCXXDtor(DD, static_cast(StructorType), FOS); std::string BackendBuf; llvm::raw_string_ostream BOS(BackendBuf); @@ -197,7 +196,7 @@ std::string FrontendBuf; llvm::raw_string_ostream FOS(FrontendBuf); - MC->mangleThunk(MD, T, FOS); + MC.mangleThunk(MD, T, FOS); std::string BackendBuf; llvm::raw_string_ostream BOS(BackendBuf);