66#include < string>
77
88#include " llvm/IR/Mangler.h"
9+ #include < llvm/ADT/BitmaskEnum.h>
910#include < llvm/ADT/Statistic.h>
1011#include < llvm/ADT/StringMap.h>
1112#include < llvm/Analysis/TargetLibraryInfo.h>
@@ -46,6 +47,7 @@ using namespace llvm;
4647#include " jitlayers.h"
4748#include " julia_assert.h"
4849#include " processor.h"
50+ #include " llvm-julia-task-dispatcher.h"
4951
5052#if JL_LLVM_VERSION >= 180000
5153# include < llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h>
@@ -666,17 +668,8 @@ static void jl_compile_codeinst_now(jl_code_instance_t *codeinst)
666668 if (!decls.specFunctionObject .empty ())
667669 NewDefs.push_back (decls.specFunctionObject );
668670 }
669- // Split batches to avoid stack overflow in the JIT linker.
670- // FIXME: Patch ORCJITs InPlaceTaskDispatcher to not recurse on task dispatches but
671- // push the tasks to a queue to be drained later. This avoids the stackoverflow caused by recursion
672- // in the linker when compiling a large number of functions at once.
673- SmallVector<uint64_t , 0 > Addrs;
674- for (size_t i = 0 ; i < NewDefs.size (); i += 1000 ) {
675- auto end = std::min (i + 1000 , NewDefs.size ());
676- SmallVector<StringRef> batch (NewDefs.begin () + i, NewDefs.begin () + end);
677- auto AddrsBatch = jl_ExecutionEngine->findSymbols (batch);
678- Addrs.append (AddrsBatch);
679- }
671+ auto Addrs = jl_ExecutionEngine->findSymbols (NewDefs);
672+
680673 size_t nextaddr = 0 ;
681674 for (auto &this_code : linkready) {
682675 auto it = invokenames.find (this_code);
@@ -1841,7 +1834,7 @@ llvm::DataLayout jl_create_datalayout(TargetMachine &TM) {
18411834JuliaOJIT::JuliaOJIT ()
18421835 : TM(createTargetMachine()),
18431836 DL(jl_create_datalayout(*TM)),
1844- ES(cantFail(orc::SelfExecutorProcessControl::Create())),
1837+ ES(cantFail(orc::SelfExecutorProcessControl::Create(nullptr , std::make_unique<::JuliaTaskDispatcher>() ))),
18451838 GlobalJD(ES.createBareJITDylib(" JuliaGlobals" )),
18461839 JD(ES.createBareJITDylib(" JuliaOJIT" )),
18471840 ExternalJD(ES.createBareJITDylib(" JuliaExternal" )),
@@ -2098,7 +2091,7 @@ SmallVector<uint64_t> JuliaOJIT::findSymbols(ArrayRef<StringRef> Names)
20982091 Unmangled[NonOwningSymbolStringPtr (Mangled)] = Unmangled.size ();
20992092 Exports.add (std::move (Mangled));
21002093 }
2101- SymbolMap Syms = cantFail (ES. lookup ( orc::makeJITDylibSearchOrder (ArrayRef (&JD)), std::move (Exports)));
2094+ SymbolMap Syms = cantFail (:: safelookup (ES, orc::makeJITDylibSearchOrder (ArrayRef (&JD)), std::move (Exports)));
21022095 SmallVector<uint64_t > Addrs (Names.size ());
21032096 for (auto it : Syms) {
21042097 Addrs[Unmangled.at (orc::NonOwningSymbolStringPtr (it.first ))] = it.second .getAddress ().getValue ();
@@ -2110,7 +2103,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findSymbol(StringRef Name, bool ExportedS
21102103{
21112104 orc::JITDylib* SearchOrders[3 ] = {&JD, &GlobalJD, &ExternalJD};
21122105 ArrayRef<orc::JITDylib*> SearchOrder = ArrayRef<orc::JITDylib*>(&SearchOrders[0 ], ExportedSymbolsOnly ? 3 : 1 );
2113- auto Sym = ES. lookup ( SearchOrder, Name);
2106+ auto Sym = :: safelookup (ES, SearchOrder, Name);
21142107 return Sym;
21152108}
21162109
@@ -2123,7 +2116,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findExternalJDSymbol(StringRef Name, bool
21232116{
21242117 orc::JITDylib* SearchOrders[3 ] = {&ExternalJD, &GlobalJD, &JD};
21252118 ArrayRef<orc::JITDylib*> SearchOrder = ArrayRef<orc::JITDylib*>(&SearchOrders[0 ], ExternalJDOnly ? 1 : 3 );
2126- auto Sym = ES. lookup ( SearchOrder, getMangledName (Name));
2119+ auto Sym = :: safelookup (ES, SearchOrder, getMangledName (Name));
21272120 return Sym;
21282121}
21292122
0 commit comments