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>
@@ -50,6 +51,7 @@ using namespace llvm;
50
51
#include " jitlayers.h"
51
52
#include " julia_assert.h"
52
53
#include " processor.h"
54
+ #include " llvm-julia-task-dispatcher.h"
53
55
54
56
#if JL_LLVM_VERSION >= 180000
55
57
# include < llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h>
@@ -723,17 +725,8 @@ static void jl_compile_codeinst_now(jl_code_instance_t *codeinst)
723
725
if (!decls.specFunctionObject .empty ())
724
726
NewDefs.push_back (decls.specFunctionObject );
725
727
}
726
- // Split batches to avoid stack overflow in the JIT linker.
727
- // FIXME: Patch ORCJITs InPlaceTaskDispatcher to not recurse on task dispatches but
728
- // push the tasks to a queue to be drained later. This avoids the stackoverflow caused by recursion
729
- // in the linker when compiling a large number of functions at once.
730
- SmallVector<uint64_t , 0 > Addrs;
731
- for (size_t i = 0 ; i < NewDefs.size (); i += 1000 ) {
732
- auto end = std::min (i + 1000 , NewDefs.size ());
733
- SmallVector<StringRef> batch (NewDefs.begin () + i, NewDefs.begin () + end);
734
- auto AddrsBatch = jl_ExecutionEngine->findSymbols (batch);
735
- Addrs.append (AddrsBatch);
736
- }
728
+ auto Addrs = jl_ExecutionEngine->findSymbols (NewDefs);
729
+
737
730
size_t nextaddr = 0 ;
738
731
for (auto &this_code : linkready) {
739
732
auto it = invokenames.find (this_code);
@@ -1901,7 +1894,7 @@ llvm::DataLayout jl_create_datalayout(TargetMachine &TM) {
1901
1894
JuliaOJIT::JuliaOJIT ()
1902
1895
: TM(createTargetMachine()),
1903
1896
DL(jl_create_datalayout(*TM)),
1904
- ES(cantFail(orc::SelfExecutorProcessControl::Create())),
1897
+ ES(cantFail(orc::SelfExecutorProcessControl::Create(nullptr , std::make_unique<::JuliaTaskDispatcher>() ))),
1905
1898
GlobalJD(ES.createBareJITDylib(" JuliaGlobals" )),
1906
1899
JD(ES.createBareJITDylib(" JuliaOJIT" )),
1907
1900
ExternalJD(ES.createBareJITDylib(" JuliaExternal" )),
@@ -2159,7 +2152,7 @@ SmallVector<uint64_t> JuliaOJIT::findSymbols(ArrayRef<StringRef> Names)
2159
2152
Unmangled[NonOwningSymbolStringPtr (Mangled)] = Unmangled.size ();
2160
2153
Exports.add (std::move (Mangled));
2161
2154
}
2162
- SymbolMap Syms = cantFail (ES. lookup ( orc::makeJITDylibSearchOrder (ArrayRef (&JD)), std::move (Exports)));
2155
+ SymbolMap Syms = cantFail (:: safelookup (ES, orc::makeJITDylibSearchOrder (ArrayRef (&JD)), std::move (Exports)));
2163
2156
SmallVector<uint64_t > Addrs (Names.size ());
2164
2157
for (auto it : Syms) {
2165
2158
Addrs[Unmangled.at (orc::NonOwningSymbolStringPtr (it.first ))] = it.second .getAddress ().getValue ();
@@ -2171,7 +2164,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findSymbol(StringRef Name, bool ExportedS
2171
2164
{
2172
2165
orc::JITDylib* SearchOrders[3 ] = {&JD, &GlobalJD, &ExternalJD};
2173
2166
ArrayRef<orc::JITDylib*> SearchOrder = ArrayRef<orc::JITDylib*>(&SearchOrders[0 ], ExportedSymbolsOnly ? 3 : 1 );
2174
- auto Sym = ES. lookup ( SearchOrder, Name);
2167
+ auto Sym = :: safelookup (ES, SearchOrder, Name);
2175
2168
return Sym;
2176
2169
}
2177
2170
@@ -2184,7 +2177,7 @@ Expected<ExecutorSymbolDef> JuliaOJIT::findExternalJDSymbol(StringRef Name, bool
2184
2177
{
2185
2178
orc::JITDylib* SearchOrders[3 ] = {&ExternalJD, &GlobalJD, &JD};
2186
2179
ArrayRef<orc::JITDylib*> SearchOrder = ArrayRef<orc::JITDylib*>(&SearchOrders[0 ], ExternalJDOnly ? 1 : 3 );
2187
- auto Sym = ES. lookup ( SearchOrder, getMangledName (Name));
2180
+ auto Sym = :: safelookup (ES, SearchOrder, getMangledName (Name));
2188
2181
return Sym;
2189
2182
}
2190
2183
0 commit comments