[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 <name> 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

llvm-svn: 361322
This commit is contained in:
Lang Hames 2019-05-21 22:07:53 +00:00
parent feb9953081
commit a2ee80b084
3 changed files with 23 additions and 2 deletions

View File

@ -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);

View File

@ -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));
}

View File

@ -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();