Commit 1217ab96 by Nicolas Capens Committed by Nicolas Capens

Support JIT on a separate thread

On platforms where the calling thread has a very small stack, LLVM can overflow the stack. Work around it by creating a temporary thread for performing LLVM optimizations and codegen. Bug: b/149829034 Change-Id: I59edd0f7d02b4724ea30f9413ea3efbb4d200290 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/41389Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com>
parent 3cfba7f0
...@@ -632,6 +632,9 @@ Config Nucleus::getDefaultConfig() ...@@ -632,6 +632,9 @@ Config Nucleus::getDefaultConfig()
std::shared_ptr<Routine> Nucleus::acquireRoutine(const char *name, const Config::Edit &cfgEdit /* = Config::Edit::None */) std::shared_ptr<Routine> Nucleus::acquireRoutine(const char *name, const Config::Edit &cfgEdit /* = Config::Edit::None */)
{ {
std::shared_ptr<Routine> routine;
auto acquire = [&]() {
auto cfg = cfgEdit.apply(jit->config); auto cfg = cfgEdit.apply(jit->config);
if(jit->builder->GetInsertBlock()->empty() || !jit->builder->GetInsertBlock()->back().isTerminator()) if(jit->builder->GetInsertBlock()->empty() || !jit->builder->GetInsertBlock()->back().isTerminator())
...@@ -679,8 +682,20 @@ std::shared_ptr<Routine> Nucleus::acquireRoutine(const char *name, const Config: ...@@ -679,8 +682,20 @@ std::shared_ptr<Routine> Nucleus::acquireRoutine(const char *name, const Config:
jit->module->print(file, 0); jit->module->print(file, 0);
} }
auto routine = jit->acquireRoutine(&jit->function, 1, cfg); routine = jit->acquireRoutine(&jit->function, 1, cfg);
jit.reset(); jit.reset();
};
#ifdef JIT_IN_SEPARATE_THREAD
// Perform optimizations and codegen in a separate thread to avoid stack overflow.
// FIXME(b/149829034): This is not a long-term solution. Reactor has no control
// over the threading and stack sizes of its users, so this should be addressed
// at a higher level instead.
std::thread thread(acquire);
thread.join();
#else
acquire();
#endif
return routine; return routine;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment