diff --git a/core/clingutils/src/TClingUtils.cxx b/core/clingutils/src/TClingUtils.cxx index b4043a4f3d5bb4cdb3ff281bdae8d4f9be81cf81..83990b1cc7e7ff390368d2d69eb44b771205ca63 100644 --- a/core/clingutils/src/TClingUtils.cxx +++ b/core/clingutils/src/TClingUtils.cxx @@ -3383,11 +3383,6 @@ void ROOT::TMetaUtils::GetFullyQualifiedTypeName(std::string &typenamestr, const clang::QualType &qtype, const cling::Interpreter &interpreter) { - // We need this barrior because GetFullyQualifiedTypeName is triggering deserialization - // This calling the same name function GetFullyQualifiedTypeName, but this should stay here because - // callee doesn't have an interpreter pointer - cling::Interpreter::PushTransactionRAII RAII(const_cast<cling::Interpreter*>(&interpreter)); - GetFullyQualifiedTypeName(typenamestr, qtype, interpreter.getCI()->getASTContext()); diff --git a/core/metacling/src/TCling.cxx b/core/metacling/src/TCling.cxx index 27014324c6183044b3009d788d1da82201f753ea..ba5fafe01d9fff8a868303a19a04c448652861e7 100644 --- a/core/metacling/src/TCling.cxx +++ b/core/metacling/src/TCling.cxx @@ -113,6 +113,9 @@ clang/LLVM technology. #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" +#include "llvm/Object/ObjectFile.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Object/SymbolicFile.h" #include <algorithm> #include <iostream> @@ -129,6 +132,7 @@ clang/LLVM technology. #include <unordered_map> #include <utility> #include <vector> +#include <functional> #ifndef R__WIN32 #include <cxxabi.h> @@ -430,10 +434,6 @@ static void TCling__UpdateClassInfo(const NamedDecl* TD) void TCling::UpdateEnumConstants(TEnum* enumObj, TClass* cl) const { const clang::Decl* D = static_cast<const clang::Decl*>(enumObj->GetDeclId()); if(const clang::EnumDecl* ED = dyn_cast<clang::EnumDecl>(D)) { - - // clang::EnumDecl::enumerator_begin can triggering deserialization - cling::Interpreter::PushTransactionRAII deserRAII(fInterpreter); - // Add the constants to the enum type. for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin(), EDE = ED->enumerator_end(); EDI != EDE; ++EDI) { @@ -632,27 +632,6 @@ extern "C" int TCling__AutoLoadCallback(const char* className) return ((TCling*)gCling)->AutoLoad(className); } -extern "C" int TCling__AutoLoadLibraryForModules(const char* StemName) -{ - // FIXME: We're excluding some libraries from autoloading. Adding annotations to - // pcms from LinkDef files would fix this workaround. - static constexpr std::array<const char*, 4> excludelibs = { {"RooStats", - "RooFitCore", "RooFit", "HistFactory"} }; - for (const char* exLibs : excludelibs) - if (strcmp(exLibs, StemName) == 0) - return -1; - - // Add lib prefix - TString LibName("lib" + std::string(StemName)); - // Construct the actual library name from the stem name. - // Eg. FindDynamicLibrary("libCore") returns "/path/to/libCore.so" - const char *Name = gSystem->FindDynamicLibrary(LibName, kTRUE); - - if (!Name || ((TCling*)gCling)->IsLoaded(Name)) return 1; - - return ((TCling*)gCling)->Load(Name); -} - extern "C" int TCling__AutoParseCallback(const char* className) { return ((TCling*)gCling)->AutoParse(className); @@ -1969,10 +1948,7 @@ void TCling::RegisterModule(const char* modulename, } } - // Don't do "PCM" optimization with runtime modules because we are loading libraries - // at decl deserialization time and it triggers infinite deserialization chain. - // In short, this optimization leads to infinite loop. - if (!hasCxxModule && gIgnoredPCMNames.find(modulename) == gIgnoredPCMNames.end()) { + if (gIgnoredPCMNames.find(modulename) == gIgnoredPCMNames.end()) { if (!LoadPCM(pcmFileName, headers, triggerFunc)) { ::Error("TCling::RegisterModule", "cannot find dictionary module %s", ROOT::TMetaUtils::GetModuleFileName(modulename).c_str()); @@ -5891,11 +5867,106 @@ Int_t TCling::AutoParse(const char *cls) return nHheadersParsed > 0 ? 1 : 0; } +static void* LazyFunctionCreatorAutoloadForModule(const std::string& mangled_name, + cling::Interpreter *fInterpreter) { + using namespace llvm::object; + using namespace llvm::sys::path; + using namespace llvm::sys::fs; + + static constexpr std::hash<std::string> hash_fn; + // size_t is a hashed mangled_name and libs[(uint8_t)mname_lib_table.second] = library's + // name in string. + static std::unordered_map<size_t, uint8_t> mname_lib_table; + static std::vector<std::string> libs; + // Initialize library table at first run + static bool fFirstRun = true; + + R__LOCKGUARD(gInterpreterMutex); + + // Initialize the table + if (fFirstRun) { + clang::Preprocessor &PP = fInterpreter->getCI()->getPreprocessor(); + const HeaderSearchOptions &HSOpts = PP.getHeaderSearchInfo().getHeaderSearchOpts(); + auto ModulePaths(HSOpts.PrebuiltModulePaths); + + // sort and eliminate dupicate path + std::sort(ModulePaths.begin(), ModulePaths.end()); + auto last = std::unique(ModulePaths.begin(), ModulePaths.end()); + ModulePaths.erase(last, ModulePaths.end()); + + cling::DynamicLibraryManager* dyLibManager = fInterpreter->getDynamicLibraryManager(); + + int cur_lib = 0; + // Take path here eg. "/home/foo/module-release/lib/" + for (auto Path : ModulePaths) { + StringRef DirPath(Path); + if (DirPath.empty() || !is_directory(DirPath) || Path == ".") + continue; + + // Check this not a random system directory (should contain pcm) + std::error_code EC; + bool is_build = false; + for (llvm::sys::fs::directory_iterator DirIt(DirPath, EC), DirEnd; + DirIt != DirEnd && !EC; DirIt.increment(EC)) { + std::string FileName(DirIt->path()); + if (extension(FileName) == ".pcm") { + is_build = true; + break; + } + } + + if (!is_build) + continue; + + // Iterate over files under this path. We want to get each ".so" files + for (llvm::sys::fs::directory_iterator DirIt(DirPath, EC), DirEnd; + DirIt != DirEnd && !EC; DirIt.increment(EC)) { + std::string LibName(DirIt->path()); + if (llvm::sys::fs::is_directory(LibName) || extension(LibName) != ".so") + continue; + + // TCling::IsLoaded is incredibly slow! + if (dyLibManager->isLibraryLoaded(LibName.c_str())) + continue; + + libs.push_back(LibName); + auto SoFile = ObjectFile::createObjectFile(LibName); + if (SoFile) { + auto RealSoFile = SoFile.get().getBinary(); + auto Symbols = RealSoFile->symbols(); + for (auto S : Symbols) { + // DO NOT insert to table if symbol was weak or undefined + if (S.getFlags() == SymbolRef::SF_Weak || S.getFlags() == SymbolRef::SF_Undefined) continue; + + // Put into map + mname_lib_table.insert(std::make_pair(hash_fn(S.getName().get()), cur_lib)); + } + } + cur_lib++; + } + } + fFirstRun = false; + } + + auto key = mname_lib_table.find(hash_fn(mangled_name)); + if (key != mname_lib_table.end()) { + std::string LoadedLibName = libs[key->second]; + if (!LoadedLibName.empty() && (gSystem->Load(LoadedLibName.c_str(), "", false) < 0)) + Error("LazyFunctionCreatorAutoloadForModule", "Failed to load library %s", LoadedLibName.c_str()); + } + + void* addr = llvm::sys::DynamicLibrary::SearchForAddressOfSymbol(mangled_name.c_str()); + return addr; +} //////////////////////////////////////////////////////////////////////////////// /// Autoload a library based on a missing symbol. void* TCling::LazyFunctionCreatorAutoload(const std::string& mangled_name) { +#ifdef R__USE_CXXMODULES + return LazyFunctionCreatorAutoloadForModule(mangled_name, fInterpreter); +#endif + // First see whether the symbol is in the library that we are currently // loading. It will have access to the symbols of its dependent libraries, // thus checking "back()" is sufficient. diff --git a/core/metacling/src/TClingBaseClassInfo.cxx b/core/metacling/src/TClingBaseClassInfo.cxx index 9991a9682e626474d0e40e4d34aaacf590e011e5..1bba75265638c6ca937c74a15e4470a709179963 100644 --- a/core/metacling/src/TClingBaseClassInfo.cxx +++ b/core/metacling/src/TClingBaseClassInfo.cxx @@ -110,8 +110,6 @@ TClingBaseClassInfo::TClingBaseClassInfo(cling::Interpreter* interp, //CRD->isDerivedFrom(BaseCRD, Paths); // Check that base derives from derived. clang::CXXBasePaths Paths; - // isDerivedFrom can trigger deserialization - cling::Interpreter::PushTransactionRAII RAII(fInterp); if (!CRD->isDerivedFrom(BaseCRD, Paths)) { //Not valid fBaseInfo = 0. return; @@ -260,11 +258,6 @@ int TClingBaseClassInfo::InternalNext(int onlyDirect) (fIter == llvm::dyn_cast<clang::CXXRecordDecl>(fDecl)->bases_end())) { return 0; } - - // getASTRecordLayout() can trigger deserialization, and this should stay here - // instead of inside the while loop - cling::Interpreter::PushTransactionRAII RAII(fInterp); - // Advance to the next valid base. while (1) { // Advance the iterator. @@ -276,6 +269,8 @@ int TClingBaseClassInfo::InternalNext(int onlyDirect) // We previously processed a base class which itself has bases, // now we process the bases of that base class. + // At least getASTRecordLayout() might deserialize. + cling::Interpreter::PushTransactionRAII RAII(fInterp); fDescend = false; const clang::RecordType *Ty = fIter->getType()-> getAs<clang::RecordType>(); @@ -509,10 +504,6 @@ long TClingBaseClassInfo::Property() const clang::CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/true, /*DetectVirtual=*/true); - - // isDerivedFrom can trigger deserialization - cling::Interpreter::PushTransactionRAII RAII(fInterp); - if (!CRD->isDerivedFrom(BaseCRD, Paths)) { // Error really unexpected here, because construction / iteration guarantees //inheritance; diff --git a/core/metacling/src/TClingCallbacks.cxx b/core/metacling/src/TClingCallbacks.cxx index 9b18677c242ee80547ab36ab72548c50974cb40b..5a034cc5bdcac48bac7ff13e92774b4a6b1ef8ba 100644 --- a/core/metacling/src/TClingCallbacks.cxx +++ b/core/metacling/src/TClingCallbacks.cxx @@ -50,7 +50,6 @@ extern "C" { Decl* TCling__GetObjectDecl(TObject *obj); int TCling__AutoLoadCallback(const char* className); int TCling__AutoParseCallback(const char* className); - void TCling__AutoLoadLibraryForModules(const char* StemName); const char* TCling__GetClassSharedLibs(const char* className); // int TCling__IsAutoLoadNamespaceCandidate(const char* name); int TCling__IsAutoLoadNamespaceCandidate(const clang::NamespaceDecl* name); @@ -750,29 +749,6 @@ void TClingCallbacks::TransactionCommitted(const Transaction &T) { TCling__UpdateListsOnCommitted(T, m_Interpreter); } -// Collect modules and put them into fPendingCxxModules at first run. Interpreter is not yet initialized at first run -// but we need to use interpreter services when loading libraries. -void TClingCallbacks::beforeExecuteTransaction(const Transaction &T) { - - const std::vector<clang::Module*> &modules = T.getClangModules(); - - if (fFirstRun) { - for (auto M : modules) - fPendingCxxModules.push_back(M); - return; - } - - if (!fPendingCxxModules.empty()) { - for (auto M : fPendingCxxModules) - TCling__AutoLoadLibraryForModules(M->Name.c_str()); - fPendingCxxModules.clear(); - return; - } - - for (auto M : modules) - TCling__AutoLoadLibraryForModules(M->Name.c_str()); -} - // The callback is used to update the list of globals in ROOT. // void TClingCallbacks::TransactionUnloaded(const Transaction &T) { diff --git a/core/metacling/src/TClingCallbacks.h b/core/metacling/src/TClingCallbacks.h index 55caae110e87fba6a216191154007525d98b4ab9..a4524e4fdd29da6204c60e631e07b1ef73c8178f 100644 --- a/core/metacling/src/TClingCallbacks.h +++ b/core/metacling/src/TClingCallbacks.h @@ -12,7 +12,6 @@ #include "cling/Interpreter/InterpreterCallbacks.h" #include <stack> -#include <vector> namespace clang { class Decl; @@ -28,7 +27,6 @@ namespace clang { namespace cling { class Interpreter; class Transaction; - class Module; } namespace llvm { @@ -47,9 +45,6 @@ private: bool fIsAutoParsingSuspended; bool fPPOldFlag; bool fPPChanged; - // This vector holds a clang cxxmodules where corresponding library should be loaded in Transaction - // afterwards. - std::vector<clang::Module*> fPendingCxxModules; public: TClingCallbacks(cling::Interpreter* interp); @@ -88,8 +83,6 @@ public: // virtual void TransactionCommitted(const cling::Transaction &T); - virtual void beforeExecuteTransaction(const cling::Transaction &T); - // The callback is used to update the list of globals in ROOT. // virtual void TransactionUnloaded(const cling::Transaction &T); diff --git a/core/metacling/src/TClingClassInfo.cxx b/core/metacling/src/TClingClassInfo.cxx index 8d8e3cbac6d226d7b6a1bfdafde5a2699d454c44..35845964922e1fffc58a5c4959a7d12cd25852c2 100644 --- a/core/metacling/src/TClingClassInfo.cxx +++ b/core/metacling/src/TClingClassInfo.cxx @@ -1267,10 +1267,6 @@ const char *TClingClassInfo::Name() const if (const NamedDecl* ND = llvm::dyn_cast<NamedDecl>(fDecl)) { PrintingPolicy Policy(fDecl->getASTContext().getPrintingPolicy()); llvm::raw_string_ostream stream(buf); - - // getNameForDiagnostic can trigger deserialization - cling::Interpreter::PushTransactionRAII RAII(fInterp); - ND->getNameForDiagnostic(stream, Policy, /*Qualified=*/false); } return buf.c_str(); diff --git a/core/metacling/src/TClingDataMemberInfo.cxx b/core/metacling/src/TClingDataMemberInfo.cxx index 21c6a82f670b2db71c47c64d9e9d3a3da5ff7090..9c8fa9980f42f5052b863d97f660ff57a3310cc5 100644 --- a/core/metacling/src/TClingDataMemberInfo.cxx +++ b/core/metacling/src/TClingDataMemberInfo.cxx @@ -308,9 +308,6 @@ long TClingDataMemberInfo::Offset() const Decl *D = GetDecl(); ASTContext& C = D->getASTContext(); if (const FieldDecl *FldD = dyn_cast<FieldDecl>(D)) { - // getASTRecordLayout can trigger deserialization - cling::Interpreter::PushTransactionRAII RAII(fInterp); - // The current member is a non-static data member. const clang::RecordDecl *RD = FldD->getParent(); const clang::ASTRecordLayout &Layout = C.getASTRecordLayout(RD); diff --git a/core/metacling/src/TClingTypeInfo.cxx b/core/metacling/src/TClingTypeInfo.cxx index f718dbd54b2e39d3680e0659857092ed286f1ac8..10e5cc58465dd11b654ad6f8bfc28d5bddc3a272 100644 --- a/core/metacling/src/TClingTypeInfo.cxx +++ b/core/metacling/src/TClingTypeInfo.cxx @@ -168,10 +168,6 @@ long TClingTypeInfo::Property() const // Note: Now we have class, struct, union only. const clang::CXXRecordDecl *CRD = llvm::dyn_cast<clang::CXXRecordDecl>(TD); - - // isAbstract can trigger deserialization - cling::Interpreter::PushTransactionRAII RAII(fInterp); - if (CRD->isClass()) { property |= kIsClass; } diff --git a/interpreter/cling/include/cling/Interpreter/InterpreterCallbacks.h b/interpreter/cling/include/cling/Interpreter/InterpreterCallbacks.h index 2103d5a335b88d780dbccd333275330539c75100..602bd016d657d3e05d33b23f3b2c9331b023bf9f 100644 --- a/interpreter/cling/include/cling/Interpreter/InterpreterCallbacks.h +++ b/interpreter/cling/include/cling/Interpreter/InterpreterCallbacks.h @@ -132,13 +132,6 @@ namespace cling { /// virtual void TransactionCommitted(const Transaction&) {} - ///\brief This callback is invoked before a transaction is executed. - /// This event happens after a transaction was committed and LLVM IR was produced. - /// - ///\param[in] - The transaction to be executed. - /// - virtual void beforeExecuteTransaction(const Transaction&) {} - ///\brief This callback is invoked whenever interpreter has reverted a /// transaction that has been fully committed. /// diff --git a/interpreter/cling/include/cling/Interpreter/Transaction.h b/interpreter/cling/include/cling/Interpreter/Transaction.h index 680543d021991389b8c755e70424507b313e573a..454ec7986e6e869a2e652019e1971e65075cb2cb 100644 --- a/interpreter/cling/include/cling/Interpreter/Transaction.h +++ b/interpreter/cling/include/cling/Interpreter/Transaction.h @@ -31,7 +31,6 @@ namespace clang { class Preprocessor; struct PrintingPolicy; class Sema; - class Module; } namespace llvm { @@ -116,11 +115,6 @@ namespace cling { typedef llvm::SmallVector<DelayCallInfo, 64> DeclQueue; typedef llvm::SmallVector<Transaction*, 2> NestedTransactions; - ///\brief The list of cxxmodules, which is collected by DeserializationListener - /// and will be used to load corresponding libraries. - /// - std::vector<clang::Module*> m_CxxModules; - ///\brief All seen declarations, except the deserialized ones. /// If we collect the declarations by walking the clang::DeclContext we /// will miss the injected onces (eg. template instantiations). @@ -274,17 +268,6 @@ namespace cling { return const_reverse_nested_iterator(0); } - void addClangModule(clang::Module* M) { - assert(M && "addClangModules: passed clang::Module pointer is null"); - - if (std::find(m_CxxModules.rbegin(), m_CxxModules.rend(), M) == m_CxxModules.rend()) - m_CxxModules.push_back(M); - } - - const std::vector<clang::Module*> &getClangModules() const { - return m_CxxModules; - } - /// Macro iteration typedef MacroDirectiveInfoQueue::iterator macros_iterator; typedef MacroDirectiveInfoQueue::const_iterator const_macros_iterator; diff --git a/interpreter/cling/lib/Interpreter/DeclCollector.cpp b/interpreter/cling/lib/Interpreter/DeclCollector.cpp index 5275feb5ce8ab5569d5603cc6113c34fd9c998a8..24f43aa372c42d0e8dac39b01f1ad9d6c6b1c2a0 100644 --- a/interpreter/cling/lib/Interpreter/DeclCollector.cpp +++ b/interpreter/cling/lib/Interpreter/DeclCollector.cpp @@ -321,17 +321,4 @@ namespace cling { m_Consumer->HandleCXXStaticMemberVarInstantiation(D); } - void DeclCollector::DeclRead(clang::serialization::DeclID, const clang::Decl *D) { - assertHasTransaction(m_CurTransaction); - - assert(D && "Decl doesn't exist!"); - if (!D->hasOwningModule()) return; - - clang::Module *M = D->getOwningModule(); - M = M->getTopLevelModule(); - - // Add interesting module to Transaction's m_cxxmodules; Corresponding library will be loaded. - m_CurTransaction->addClangModule(M); - } - } // namespace cling diff --git a/interpreter/cling/lib/Interpreter/DeclCollector.h b/interpreter/cling/lib/Interpreter/DeclCollector.h index c60c11d039b1ecf2c6132b519344669c9e7ccec4..476f49d5fea54efd5723e08345c2e29c89e9e8c8 100644 --- a/interpreter/cling/lib/Interpreter/DeclCollector.h +++ b/interpreter/cling/lib/Interpreter/DeclCollector.h @@ -11,7 +11,6 @@ #define CLING_DECL_COLLECTOR_H #include "clang/AST/ASTConsumer.h" -#include "clang/Serialization/ASTDeserializationListener.h" #include "ASTTransformer.h" @@ -25,7 +24,6 @@ namespace clang { class DeclGroupRef; class Preprocessor; class Token; - class Module; } namespace cling { @@ -42,7 +40,7 @@ namespace cling { /// cling::DeclCollector is responsible for appending all the declarations /// seen by clang. /// - class DeclCollector : public clang::ASTConsumer , public clang::ASTDeserializationListener { + class DeclCollector : public clang::ASTConsumer { /// \brief PPCallbacks overrides/ Macro support class PPAdapter; @@ -118,11 +116,6 @@ namespace cling { // dyn_cast/isa support static bool classof(const clang::ASTConsumer*) { return true; } - static bool classof(const clang::ASTDeserializationListener*) { return true; } - - ///\brief ASTDeserializationListener function which gets callback when a decl is deserialized - void DeclRead(clang::serialization::DeclID, const clang::Decl *D) final; - }; } // namespace cling diff --git a/interpreter/cling/lib/Interpreter/IncrementalParser.cpp b/interpreter/cling/lib/Interpreter/IncrementalParser.cpp index ce322cc2de22fa938bd1176bbddd22af0d3f9004..6353f7b558cb6d06091f8263dff74720a10884ee 100644 --- a/interpreter/cling/lib/Interpreter/IncrementalParser.cpp +++ b/interpreter/cling/lib/Interpreter/IncrementalParser.cpp @@ -44,7 +44,6 @@ #include "clang/Sema/Sema.h" #include "clang/Sema/SemaDiagnostic.h" #include "clang/Serialization/ASTWriter.h" -#include "clang/Serialization/ASTReader.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" @@ -227,13 +226,6 @@ namespace cling { Preprocessor& PP = m_CI->getPreprocessor(); DiagnosticsEngine& Diags = m_CI->getSema().getDiagnostics(); - ASTReader* Reader = m_CI->getModuleManager().get(); - assert(isa<ASTDeserializationListener>(m_Consumer)); - ASTDeserializationListener* Listener = cast<ASTDeserializationListener>(m_Consumer); - // FIXME: We should create a multiplexing deserialization listener if there is one already attached. - if (Reader && Listener && !Reader->getDeserializationListener()) - Reader->setDeserializationListener(Listener); - // Pull in PCH. const std::string& PCHFileName = m_CI->getInvocation().getPreprocessorOpts().ImplicitPCHInclude; diff --git a/interpreter/cling/lib/Interpreter/Interpreter.cpp b/interpreter/cling/lib/Interpreter/Interpreter.cpp index 56c5c3ecf2d1dcb6c0834548f9159ce0702fdf1c..22016dc626067e46de5ef820088d1d460f4d3151 100644 --- a/interpreter/cling/lib/Interpreter/Interpreter.cpp +++ b/interpreter/cling/lib/Interpreter/Interpreter.cpp @@ -1529,9 +1529,6 @@ namespace cling { assert(!isInSyntaxOnlyMode() && "Running on what?"); assert(T.getState() == Transaction::kCommitted && "Must be committed"); - if (InterpreterCallbacks* callbacks = getCallbacks()) - callbacks->beforeExecuteTransaction(T); - const std::shared_ptr<llvm::Module>& M = T.getModule(); if (!M) return Interpreter::kExeNoModule; diff --git a/interpreter/cling/lib/Interpreter/LookupHelper.cpp b/interpreter/cling/lib/Interpreter/LookupHelper.cpp index b8fc0cd3eb3ca6f3e5fc0cf7c26bce1e6f092e30..4df32ba572a0fe6188bb88a3cf4d8594caa01b86 100644 --- a/interpreter/cling/lib/Interpreter/LookupHelper.cpp +++ b/interpreter/cling/lib/Interpreter/LookupHelper.cpp @@ -1452,9 +1452,9 @@ namespace cling { DigestArgsInput inputEval; llvm::SmallVector<Expr*, 4> GivenArgs; - Interpreter::PushTransactionRAII pushedT(Interp); if (!inputEval(GivenArgs,funcArgs,diagOnOff,P,Interp)) return 0; + Interpreter::PushTransactionRAII pushedT(Interp); return findFunction(foundDC, funcName, GivenArgs, objectIsConst, Context, Interp, functionSelector, diff --git a/interpreter/cling/lib/Interpreter/MultiplexInterpreterCallbacks.h b/interpreter/cling/lib/Interpreter/MultiplexInterpreterCallbacks.h index 3d98ae0418985e16404421fb97cecef2c742715d..40f6754e60235b59d6824f4371ed3dd9f068ebfb 100644 --- a/interpreter/cling/lib/Interpreter/MultiplexInterpreterCallbacks.h +++ b/interpreter/cling/lib/Interpreter/MultiplexInterpreterCallbacks.h @@ -77,12 +77,6 @@ namespace cling { } } - void beforeExecuteTransaction(const Transaction& T) override { - for (auto&& cb : m_Callbacks) { - cb->beforeExecuteTransaction(T); - } - } - void TransactionUnloaded(const Transaction& T) override { for (auto&& cb : m_Callbacks) { cb->TransactionUnloaded(T); diff --git a/interpreter/llvm/src/tools/clang/include/clang/Serialization/ASTReader.h b/interpreter/llvm/src/tools/clang/include/clang/Serialization/ASTReader.h index f515756bf29015457c8f17c4c23f8db6d6ebff16..ab6f4f00436c2a28c45f28d6e8ace16ba704528f 100644 --- a/interpreter/llvm/src/tools/clang/include/clang/Serialization/ASTReader.h +++ b/interpreter/llvm/src/tools/clang/include/clang/Serialization/ASTReader.h @@ -1555,10 +1555,6 @@ public: void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership = false); - ASTDeserializationListener *getDeserializationListener() { - return DeserializationListener; - }; - /// \brief Determine whether this AST reader has a global index. bool hasGlobalIndex() const { return (bool)GlobalIndex; }