6
6
#include < string>
7
7
8
8
#include " llvm/IR/Mangler.h"
9
+ #include < llvm/ADT/BitmaskEnum.h>
9
10
#include < llvm/ADT/Statistic.h>
10
11
#include < llvm/ADT/StringMap.h>
11
12
#include < llvm/Analysis/TargetLibraryInfo.h>
@@ -46,6 +47,7 @@ using namespace llvm;
46
47
#include " jitlayers.h"
47
48
#include " julia_assert.h"
48
49
#include " processor.h"
50
+ #include " llvm-julia-task-dispatcher.h"
49
51
50
52
#if JL_LLVM_VERSION >= 180000
51
53
# include < llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h>
@@ -666,17 +668,8 @@ static void jl_compile_codeinst_now(jl_code_instance_t *codeinst)
666
668
if (!decls.specFunctionObject .empty ())
667
669
NewDefs.push_back (decls.specFunctionObject );
668
670
}
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
+
680
673
size_t nextaddr = 0 ;
681
674
for (auto &this_code : linkready) {
682
675
auto it = invokenames.find (this_code);
@@ -1841,7 +1834,7 @@ llvm::DataLayout jl_create_datalayout(TargetMachine &TM) {
1841
1834
JuliaOJIT::JuliaOJIT ()
1842
1835
: TM(createTargetMachine()),
1843
1836
DL(jl_create_datalayout(*TM)),
1844
- ES(cantFail(orc::SelfExecutorProcessControl::Create())),
1837
+ ES(cantFail(orc::SelfExecutorProcessControl::Create(nullptr , std::make_unique<::JuliaTaskDispatcher>() ))),
1845
1838
GlobalJD(ES.createBareJITDylib(" JuliaGlobals" )),
1846
1839
JD(ES.createBareJITDylib(" JuliaOJIT" )),
1847
1840
ExternalJD(ES.createBareJITDylib(" JuliaExternal" )),
@@ -2098,7 +2091,7 @@ SmallVector<uint64_t> JuliaOJIT::findSymbols(ArrayRef<StringRef> Names)
2098
2091
Unmangled[NonOwningSymbolStringPtr (Mangled)] = Unmangled.size ();
2099
2092
Exports.add (std::move (Mangled));
2100
2093
}
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)));
2102
2095
SmallVector<uint64_t > Addrs (Names.size ());
2103
2096
for (auto it : Syms) {
2104
2097
Addrs[Unmangled.at (orc::NonOwningSymbolStringPtr (it.first ))] = it.second .getAddress ().getValue ();
@@ -2110,7 +2103,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findSymbol(StringRef Name, bool ExportedS
2110
2103
{
2111
2104
orc::JITDylib* SearchOrders[3 ] = {&JD, &GlobalJD, &ExternalJD};
2112
2105
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);
2114
2107
return Sym;
2115
2108
}
2116
2109
@@ -2123,7 +2116,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findExternalJDSymbol(StringRef Name, bool
2123
2116
{
2124
2117
orc::JITDylib* SearchOrders[3 ] = {&ExternalJD, &GlobalJD, &JD};
2125
2118
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));
2127
2120
return Sym;
2128
2121
}
2129
2122
0 commit comments