Adding Subzero to Chromium on Windows

Modified the BUILD.gn files in order to be able to easily switch
between Subzero and LLVM back ends. Note that Subzero
compilation should already work on Linux, as soon as the Wheezy
to Jessie update lands. For now, only Windows will build Subzero.

Also removed linux hack from libEGL build file.

Change-Id: Ic584b604496c4b4f745b05d72a752f056495055b
Reviewed-on: https://swiftshader-review.googlesource.com/8630
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/BUILD.gn b/src/Reactor/BUILD.gn
index d98b74c..87b1bd8 100644
--- a/src/Reactor/BUILD.gn
+++ b/src/Reactor/BUILD.gn
@@ -13,6 +13,111 @@
 # limitations under the License.
 
 # Need a separate config to ensure the warnings are added to the end.
+config("swiftshader_subzero_common_private_config") {
+  defines = [
+    "ALLOW_DUMP=0",
+    "ALLOW_TIMERS=0",
+    "ALLOW_LLVM_CL=0",
+    "ALLOW_LLVM_IR=0",
+    "ALLOW_LLVM_IR_AS_INPUT=0",
+    "ALLOW_MINIMAL_BUILD=0",
+    "ALLOW_WASM=0",
+    "ICE_THREAD_LOCAL_HACK=0",
+  ]
+
+  if (target_cpu == "x64") {
+    defines += [
+      "SZTARGET=X8664",
+      "SUBZERO_TARGET=X8664",
+    ]
+  } else {
+    defines += [
+      "SZTARGET=X8632",
+      "SUBZERO_TARGET=X8632",
+    ]
+  }
+
+  include_dirs = [
+    "../../third_party/pnacl-subzero",
+    "../../third_party/pnacl-subzero/pnacl-llvm/include/",
+    "../../third_party/llvm-subzero/include/",
+  ]
+
+  if (is_win) {
+    include_dirs += [ "../../third_party/llvm-subzero/build/Windows/include/" ]
+  } else if (is_linux) {
+    include_dirs += [ "../../third_party/llvm-subzero/build/Linux/include/" ]
+  } else if (is_mac) {
+    include_dirs += [ "../../third_party/llvm-subzero/build/MacOS/include/" ]
+  }
+}
+
+config("swiftshader_subzero_private_config") {
+#  cflags_cc = [ "--sysroot=/" ] #FIXME
+  cflags = []
+
+  if (is_win) {
+    cflags += [
+      "/wd4005",
+      "/wd4018",
+      "/wd4141",
+      "/wd4146",
+      "/wd4245",  # conversion from int to unsigned int (llvm)
+      "/wd4267",
+      "/wd4310",
+      "/wd4334",
+      "/wd4389",
+      "/wd4701",
+      "/wd4702",
+      "/wd4703",
+      "/wd4706",
+      "/wd4800",
+    ]
+
+    if (!is_debug) {
+      cflags += [ "/wd4718" ]
+    }
+
+    if (is_clang) {
+      if (is_debug) {
+        cflags += [ "-Wno-sign-compare" ]
+      }
+    }
+  } else if (is_linux || is_mac) {
+    cflags += [ "-Wno-macro-redefined" ]
+  }
+
+  if (is_clang) {
+    cflags += [ "-Wno-header-hygiene" ]
+  }
+}
+
+config("swiftshader_reactor_with_subzero_private_config") {
+#  cflags_cc = [ "--sysroot=/" ] #FIXME
+  cflags = []
+
+  if (is_win) {
+    cflags += [
+      "/wd4141",
+      "/wd4146",
+      "/wd4245",  # conversion from int to unsigned int (llvm)
+      "/wd4267",
+      "/wd4702",
+      "/wd4800",
+    ]
+
+    if (is_clang) {
+      if (is_debug) {
+        cflags += [ "-Wno-sign-compare" ]
+      }
+    }
+  }
+
+  if (is_clang) {
+    cflags += [ "-Wno-header-hygiene" ]
+  }
+}
+
 config("swiftshader_reactor_private_config") {
   if (is_win) {
     cflags = [
@@ -30,28 +135,142 @@
   }
 }
 
-source_set("swiftshader_reactor") {
-  deps = [
-    "../../third_party/LLVM:swiftshader_llvm",
-    "../OpenGL/common:swiftshader_opengl_common",
-  ]
+source_set("swiftshader_subzero") {
+  subzero_dir = "../../third_party/pnacl-subzero"
+  subzero_llvm_dir = "../../third_party/llvm-subzero"
 
   sources = [
-    "LLVMReactor.cpp",
-    "LLVMRoutine.cpp",
-    "LLVMRoutineManager.cpp",
-    "Routine.cpp",
+    "$subzero_dir/src/IceAssembler.cpp",
+    "$subzero_dir/src/IceCfg.cpp",
+    "$subzero_dir/src/IceCfgNode.cpp",
+    "$subzero_dir/src/IceClFlags.cpp",
+    "$subzero_dir/src/IceELFObjectWriter.cpp",
+    "$subzero_dir/src/IceELFSection.cpp",
+    "$subzero_dir/src/IceFixups.cpp",
+    "$subzero_dir/src/IceGlobalContext.cpp",
+    "$subzero_dir/src/IceGlobalInits.cpp",
+    "$subzero_dir/src/IceInst.cpp",
+    "$subzero_dir/src/IceInstrumentation.cpp",
+    "$subzero_dir/src/IceIntrinsics.cpp",
+    "$subzero_dir/src/IceLiveness.cpp",
+    "$subzero_dir/src/IceLoopAnalyzer.cpp",
+    "$subzero_dir/src/IceMangling.cpp",
+    "$subzero_dir/src/IceMemory.cpp",
+    "$subzero_dir/src/IceOperand.cpp",
+    "$subzero_dir/src/IceRNG.cpp",
+    "$subzero_dir/src/IceRangeSpec.cpp",
+    "$subzero_dir/src/IceRegAlloc.cpp",
+    "$subzero_dir/src/IceRevision.cpp",
+    "$subzero_dir/src/IceSwitchLowering.cpp",
+    "$subzero_dir/src/IceTargetLowering.cpp",
+    "$subzero_dir/src/IceTargetLoweringX86.cpp",
+    "$subzero_dir/src/IceThreading.cpp",
+    "$subzero_dir/src/IceTimerTree.cpp",
+    "$subzero_dir/src/IceTypes.cpp",
+    "$subzero_dir/src/IceVariableSplitting.cpp",
+    "$subzero_llvm_dir/lib/Demangle/ItaniumDemangle.cpp",
+    "$subzero_llvm_dir/lib/Support/APInt.cpp",
+    "$subzero_llvm_dir/lib/Support/Atomic.cpp",
+    "$subzero_llvm_dir/lib/Support/CommandLine.cpp",
+    "$subzero_llvm_dir/lib/Support/ConvertUTF.cpp",
+    "$subzero_llvm_dir/lib/Support/ConvertUTFWrapper.cpp",
+    "$subzero_llvm_dir/lib/Support/Debug.cpp",
+    "$subzero_llvm_dir/lib/Support/Errno.cpp",
+    "$subzero_llvm_dir/lib/Support/ErrorHandling.cpp",
+    "$subzero_llvm_dir/lib/Support/FoldingSet.cpp",
+    "$subzero_llvm_dir/lib/Support/Hashing.cpp",
+    "$subzero_llvm_dir/lib/Support/Host.cpp",
+    "$subzero_llvm_dir/lib/Support/ManagedStatic.cpp",
+    "$subzero_llvm_dir/lib/Support/MemoryBuffer.cpp",
+    "$subzero_llvm_dir/lib/Support/Mutex.cpp",
+    "$subzero_llvm_dir/lib/Support/NativeFormatting.cpp",
+    "$subzero_llvm_dir/lib/Support/Path.cpp",
+    "$subzero_llvm_dir/lib/Support/Process.cpp",
+    "$subzero_llvm_dir/lib/Support/Program.cpp",
+    "$subzero_llvm_dir/lib/Support/Regex.cpp",
+    "$subzero_llvm_dir/lib/Support/Signals.cpp",
+    "$subzero_llvm_dir/lib/Support/SmallPtrSet.cpp",
+    "$subzero_llvm_dir/lib/Support/SmallVector.cpp",
+    "$subzero_llvm_dir/lib/Support/StringExtras.cpp",
+    "$subzero_llvm_dir/lib/Support/StringMap.cpp",
+    "$subzero_llvm_dir/lib/Support/StringRef.cpp",
+    "$subzero_llvm_dir/lib/Support/StringSaver.cpp",
+    "$subzero_llvm_dir/lib/Support/TargetParser.cpp",
+    "$subzero_llvm_dir/lib/Support/Threading.cpp",
+    "$subzero_llvm_dir/lib/Support/Timer.cpp",
+    "$subzero_llvm_dir/lib/Support/Triple.cpp",
+    "$subzero_llvm_dir/lib/Support/Twine.cpp",
+    "$subzero_llvm_dir/lib/Support/circular_raw_ostream.cpp",
+    "$subzero_llvm_dir/lib/Support/raw_os_ostream.cpp",
+    "$subzero_llvm_dir/lib/Support/raw_ostream.cpp",
+    "$subzero_llvm_dir/lib/Support/regcomp.c",
+    "$subzero_llvm_dir/lib/Support/regerror.c",
+    "$subzero_llvm_dir/lib/Support/regexec.c",
+    "$subzero_llvm_dir/lib/Support/regfree.c",
+    "$subzero_llvm_dir/lib/Support/regstrlcpy.c",
   ]
 
+  if (target_cpu == "x64") {
+    sources += [
+      "$subzero_dir/src/IceInstX8664.cpp",
+      "$subzero_dir/src/IceTargetLoweringX8664.cpp",
+    ]
+  } else {
+    sources += [
+      "$subzero_dir/src/IceInstX8632.cpp",
+      "$subzero_dir/src/IceTargetLoweringX8632.cpp",
+    ]
+  }
+
   if (is_win) {
     configs -= [ "//build/config/win:unicode" ]
   }
-
-  configs += [ ":swiftshader_reactor_private_config" ]
-
-  include_dirs = [
-    "..",
-    "../Common",
-    "../../third_party/LLVM/include/",
+  configs += [
+    ":swiftshader_subzero_common_private_config",
+    ":swiftshader_subzero_private_config",
   ]
 }
+
+source_set("swiftshader_reactor") {
+  deps = [ "../OpenGL/common:swiftshader_opengl_common" ]
+
+  sources = [ "Routine.cpp" ]
+
+  # Currently, Subzero will only be used on Windows
+  # LLVM will be used on Linux and MacOS
+  use_subzero = is_win
+
+  if(use_subzero) {
+    deps += [ ":swiftshader_subzero" ]
+
+    sources += [
+      "Optimizer.cpp",
+      "SubzeroReactor.cpp",
+    ]
+
+    configs += [
+      ":swiftshader_subzero_common_private_config",
+      ":swiftshader_reactor_with_subzero_private_config",
+    ]
+  } else {
+    deps += [ "../../third_party/LLVM:swiftshader_llvm" ]
+
+    sources += [
+      "LLVMReactor.cpp",
+      "LLVMRoutine.cpp",
+      "LLVMRoutineManager.cpp",
+    ]
+
+    configs += [ ":swiftshader_reactor_private_config" ]
+
+    include_dirs = [
+      "..",
+      "../Common",
+      "../../third_party/LLVM/include/",
+    ]
+  }
+
+  if (is_win) {
+    configs -= [ "//build/config/win:unicode" ]
+  }
+}