Subzero: Set the correct target arch in the browser hookup.

The original implementation hard-coded the target to x86-32.

The new implementation mirrors pnacl-llc by probing the architecture it is running on.

Continues the plumbing work in https://codereview.chromium.org/1698523003/ , toward the goal of enabling sandboxed translator tests for x86-64, particularly on the spec bots.

BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4077
R=jpp@chromium.org

Review URL: https://codereview.chromium.org/1696123003 .
diff --git a/src/IceBrowserCompileServer.cpp b/src/IceBrowserCompileServer.cpp
index 469e56d..b9903bf 100644
--- a/src/IceBrowserCompileServer.cpp
+++ b/src/IceBrowserCompileServer.cpp
@@ -17,6 +17,13 @@
 #if PNACL_BROWSER_TRANSLATOR
 
 #include "IceBrowserCompileServer.h"
+
+// Headers which are not properly part of the SDK are included by their path in
+// the NaCl tree.
+#ifdef __pnacl__
+#include "native_client/src/untrusted/nacl/pnacl.h"
+#endif // __pnacl__
+
 #include "llvm/Support/QueueStreamer.h"
 
 #include <cstring>
@@ -116,6 +123,35 @@
   pthread_exit(0);
 }
 
+/// Adapted from pnacl-llc's AddDefaultCPU() in srpc_main.cpp.
+TargetArch getTargetArch() {
+#if defined(__pnacl__)
+  switch (__builtin_nacl_target_arch()) {
+  case PnaclTargetArchitectureX86_32:
+  case PnaclTargetArchitectureX86_32_NonSFI:
+    return Target_X8632;
+  case PnaclTargetArchitectureX86_64:
+    return Target_X8664;
+  case PnaclTargetArchitectureARM_32:
+  case PnaclTargetArchitectureARM_32_NonSFI:
+    return Target_ARM32;
+  case PnaclTargetArchitectureMips_32:
+    return Target_MIPS32;
+  default:
+    llvm::report_fatal_error("no target architecture match.");
+  }
+#elif defined(__i386__)
+  return Target_X8632;
+#elif defined(__x86_64__)
+  return Target_X8664;
+#elif defined(__arm__)
+  return Target_ARM32;
+#else
+// TODO(stichnot): Add mips.
+#error "Unknown architecture"
+#endif
+}
+
 } // end of anonymous namespace
 
 BrowserCompileServer::~BrowserCompileServer() = default;
@@ -135,8 +171,7 @@
   Flags.setNumTranslationThreads(NumThreads);
   Flags.setUseSandboxing(true);
   Flags.setOutFileType(FT_Elf);
-  // TODO(jvoung): allow setting different target arches.
-  Flags.setTargetArch(Target_X8632);
+  Flags.setTargetArch(getTargetArch());
   ExtraFlags.setBuildOnRead(true);
   ExtraFlags.setInputFileFormat(llvm::PNaClFormat);
 }
diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp
index 9f05017..c696ba6 100644
--- a/src/IceTargetLowering.cpp
+++ b/src/IceTargetLowering.cpp
@@ -154,6 +154,11 @@
   }
 }
 
+LLVM_ATTRIBUTE_NORETURN void badTargetFatalError(TargetArch Target) {
+  llvm::report_fatal_error("Unsupported target: " +
+                           std::string(targetArchString(Target)));
+}
+
 } // end of anonymous namespace
 
 void TargetLowering::filterTypeToRegisterSet(
@@ -243,7 +248,7 @@
 TargetLowering::createLowering(TargetArch Target, Cfg *Func) {
   switch (Target) {
   default:
-    llvm::report_fatal_error("Unsupported target");
+    badTargetFatalError(Target);
 #define SUBZERO_TARGET(X)                                                      \
   case Target_##X:                                                             \
     return ::X::createTargetLowering(Func);
@@ -257,7 +262,7 @@
   // Call the specified target's static initializer.
   switch (Target) {
   default:
-    llvm::report_fatal_error("Unsupported target");
+    badTargetFatalError(Target);
 #define SUBZERO_TARGET(X)                                                      \
   case Target_##X: {                                                           \
     static bool InitGuard##X = false;                                          \
@@ -742,7 +747,7 @@
   TargetArch Target = Ctx->getFlags().getTargetArch();
   switch (Target) {
   default:
-    llvm::report_fatal_error("Unsupported target");
+    badTargetFatalError(Target);
 #define SUBZERO_TARGET(X)                                                      \
   case Target_##X:                                                             \
     return ::X::createTargetDataLowering(Ctx);
@@ -874,7 +879,7 @@
   TargetArch Target = Ctx->getFlags().getTargetArch();
   switch (Target) {
   default:
-    llvm::report_fatal_error("Unsupported target");
+    badTargetFatalError(Target);
 #define SUBZERO_TARGET(X)                                                      \
   case Target_##X:                                                             \
     return ::X::createTargetHeaderLowering(Ctx);