Replace rr::Config with an integer optimization level pragma

Extensive run-time control over the LLVM optimization passes we run
used to be part of SwiftConfig, but it hasn't been used in many years.
They're not relevant to Subzero at all, and passing around the config
adds unnecessary complexity.

We only need control over the optimization level for the LargeStack
Reactor unit test. It is also likely of value to keep a rudimentary
optimization level selection for future tiered compilation approaches.

This change eliminates rr::Config and replaces it with the simple
`OptimizationLevel` integer that can be set using Pragma(). Note that
while the values have no strict semantics, this is also true for typical
compiler optimization levels such as O0, O1, O2, etc.

Level 0 omits SROA and InstructionCombining passes, just like LLVM's
buildO0DefaultPipeline().

The SwiftConfig 'AsmEmitDir' was removed and instead one can now define
REACTOR_ASM_EMIT_DIR to change the asm output directory at build time.

Bug: b/191050320
Change-Id: I0283eac4520aef84a4b37ab5fd4c08224219a99f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/65250
Reviewed-by: Alexis Hétu <sugoi@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/Coroutine.hpp b/src/Reactor/Coroutine.hpp
index dd2fd92..8c9e15f 100644
--- a/src/Reactor/Coroutine.hpp
+++ b/src/Reactor/Coroutine.hpp
@@ -139,7 +139,7 @@
 	// finalize() *must* be called explicitly on the same thread that
 	// instantiates the Coroutine instance if operator() is to be invoked on
 	// different threads.
-	inline void finalize(const char *name = "coroutine", const Config::Edit *cfg = nullptr);
+	inline void finalize(const char *name = "coroutine");
 
 	// Starts execution of the coroutine and returns a unique_ptr to a
 	// Stream<> that exposes the await() function for obtaining yielded
@@ -169,11 +169,11 @@
 }
 
 template<typename Return, typename... Arguments>
-void Coroutine<Return(Arguments...)>::finalize(const char *name /*= "coroutine"*/, const Config::Edit *cfg /* = nullptr */)
+void Coroutine<Return(Arguments...)>::finalize(const char *name /*= "coroutine"*/)
 {
 	if(core != nullptr)
 	{
-		routine = core->acquireCoroutine(name, cfg);
+		routine = core->acquireCoroutine(name);
 		core.reset(nullptr);
 	}
 }