From 2aa2888faea301afbc0ea6ff8b60ce44cfc27534 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 21 May 2019 22:07:53 +0000 Subject: [PATCH] [ORC] Guarantee unique JITDylib names in lli, add usage notes to createJITDylib. JITDylibs should have unique names. This patch adds code to lli to respect this invariant (by refering to the exist JITDylib if a -jd option is specified more than once). It also adds usage notes to the doxygen comment for createJITDylib method in ExecutionSession and LLJIT. http://llvm.org/PR41937 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361322 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ExecutionEngine/Orc/Core.h | 8 ++++++++ include/llvm/ExecutionEngine/Orc/LLJIT.h | 11 +++++++++++ tools/lli/lli.cpp | 6 ++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/include/llvm/ExecutionEngine/Orc/Core.h b/include/llvm/ExecutionEngine/Orc/Core.h index 58bd957500c..d39271ada00 100644 --- a/include/llvm/ExecutionEngine/Orc/Core.h +++ b/include/llvm/ExecutionEngine/Orc/Core.h @@ -681,6 +681,10 @@ private: void emit(const SymbolFlagsMap &Emitted); + // Removes the given symbols from the symbol table, returning the set of + // pending queries. + AsynchronousSymbolQuery removeSymbols(const SymbolNameSet &Symbols); + void notifyFailed(const SymbolNameSet &FailedSymbols); ExecutionSession &ES; @@ -731,6 +735,10 @@ public: JITDylib *getJITDylibByName(StringRef Name); /// Add a new JITDylib to this ExecutionSession. + /// + /// The JITDylib Name is required to be unique. Clients should verify that + /// names are not being re-used (e.g. by calling getJITDylibByName) if names + /// are based on user input. JITDylib &createJITDylib(std::string Name, bool AddToMainDylibSearchOrder = true); diff --git a/include/llvm/ExecutionEngine/Orc/LLJIT.h b/include/llvm/ExecutionEngine/Orc/LLJIT.h index 3104de5e463..b54c7d882e2 100644 --- a/include/llvm/ExecutionEngine/Orc/LLJIT.h +++ b/include/llvm/ExecutionEngine/Orc/LLJIT.h @@ -51,7 +51,18 @@ public: /// Returns a reference to the JITDylib representing the JIT'd main program. JITDylib &getMainJITDylib() { return Main; } + /// Returns the JITDylib with the given name, or nullptr if no JITDylib with + /// that name exists. + JITDylib *getJITDylibByName(StringRef Name) { + return ES->getJITDylibByName(Name); + } + /// Create a new JITDylib with the given name and return a reference to it. + /// + /// JITDylib names must be unique. If the given name is derived from user + /// input or elsewhere in the environment then the client should check + /// (e.g. by calling getJITDylibByName) that the given name is not already in + /// use. JITDylib &createJITDylib(std::string Name) { return ES->createJITDylib(std::move(Name)); } diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index a44b7437f70..fb6cf6ff915 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -821,8 +821,10 @@ int runOrcLazyJIT(const char *ProgName) { IdxToDylib[0] = &J->getMainJITDylib(); for (auto JDItr = JITDylibs.begin(), JDEnd = JITDylibs.end(); JDItr != JDEnd; ++JDItr) { - IdxToDylib[JITDylibs.getPosition(JDItr - JITDylibs.begin())] = - &J->createJITDylib(*JDItr); + orc::JITDylib *JD = J->getJITDylibByName(*JDItr); + if (!JD) + JD = &J->createJITDylib(*JDItr); + IdxToDylib[JITDylibs.getPosition(JDItr - JITDylibs.begin())] = JD; } for (auto EMItr = ExtraModules.begin(), EMEnd = ExtraModules.end(); -- 2.50.1