Added Fuchsia support to LLVM 10 update script and updated configs

When calling 'update.py fuchsia', will now build and generate for x64
and arm64. Note that David Turner (digit@) had already manually created
the configs by copying and modifying the Linux ones as part of this
change:
https://swiftshader-review.googlesource.com/c/SwiftShader/+/43851

After running update.py, I kept the Fuchsia-specific changes that were
made mainly to config.h. The diffs mainly remove unsupported targets,
and also add arm64, which was missing. Note that arm64 configs were
present in the LLVM 7 Fuchsia configs, so likely it was just an
oversight or temporary thing.

Tested by succesfully building Chromium for Fuchsia, both targeting x64
and arm64.

Bug: b/152339534
Change-Id: I15258f2a134808d3c394fad028e1a18acbd081f7
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/46489
Tested-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmParsers.def b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmParsers.def
index 57dca87..95b3af0 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmParsers.def
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmParsers.def
@@ -24,20 +24,12 @@
 #  error Please define the macro LLVM_ASM_PARSER(TargetName)
 #endif
 
+#if defined(__aarch64__)
 LLVM_ASM_PARSER(AArch64)
-LLVM_ASM_PARSER(AMDGPU)
-LLVM_ASM_PARSER(ARM)
-LLVM_ASM_PARSER(BPF)
-LLVM_ASM_PARSER(Hexagon)
-LLVM_ASM_PARSER(Lanai)
-LLVM_ASM_PARSER(Mips)
-LLVM_ASM_PARSER(MSP430)
-LLVM_ASM_PARSER(PowerPC)
-LLVM_ASM_PARSER(RISCV)
-LLVM_ASM_PARSER(Sparc)
-LLVM_ASM_PARSER(SystemZ)
-LLVM_ASM_PARSER(WebAssembly)
+#endif
+#if defined(__i386__) || defined(__x86_64__)
 LLVM_ASM_PARSER(X86)
+#endif
 
 
 #undef LLVM_ASM_PARSER
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmPrinters.def b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmPrinters.def
index 3848f97..5d8e1e7 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmPrinters.def
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/AsmPrinters.def
@@ -24,22 +24,12 @@
 #  error Please define the macro LLVM_ASM_PRINTER(TargetName)
 #endif
 
+#if defined(__aarch64__)
 LLVM_ASM_PRINTER(AArch64)
-LLVM_ASM_PRINTER(AMDGPU)
-LLVM_ASM_PRINTER(ARM)
-LLVM_ASM_PRINTER(BPF)
-LLVM_ASM_PRINTER(Hexagon)
-LLVM_ASM_PRINTER(Lanai)
-LLVM_ASM_PRINTER(Mips)
-LLVM_ASM_PRINTER(MSP430)
-LLVM_ASM_PRINTER(NVPTX)
-LLVM_ASM_PRINTER(PowerPC)
-LLVM_ASM_PRINTER(RISCV)
-LLVM_ASM_PRINTER(Sparc)
-LLVM_ASM_PRINTER(SystemZ)
-LLVM_ASM_PRINTER(WebAssembly)
+#endif
+#if defined(__i386__) || defined(__x86_64__)
 LLVM_ASM_PRINTER(X86)
-LLVM_ASM_PRINTER(XCore)
+#endif
 
 
 #undef LLVM_ASM_PRINTER
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Disassemblers.def b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Disassemblers.def
index cf5100d..ab8239b 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Disassemblers.def
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Disassemblers.def
@@ -24,21 +24,12 @@
 #  error Please define the macro LLVM_DISASSEMBLER(TargetName)
 #endif
 
+#if defined(__aarch64__)
 LLVM_DISASSEMBLER(AArch64)
-LLVM_DISASSEMBLER(AMDGPU)
-LLVM_DISASSEMBLER(ARM)
-LLVM_DISASSEMBLER(BPF)
-LLVM_DISASSEMBLER(Hexagon)
-LLVM_DISASSEMBLER(Lanai)
-LLVM_DISASSEMBLER(Mips)
-LLVM_DISASSEMBLER(MSP430)
-LLVM_DISASSEMBLER(PowerPC)
-LLVM_DISASSEMBLER(RISCV)
-LLVM_DISASSEMBLER(Sparc)
-LLVM_DISASSEMBLER(SystemZ)
-LLVM_DISASSEMBLER(WebAssembly)
+#endif
+#if defined(__i386__) || defined(__x86_64__)
 LLVM_DISASSEMBLER(X86)
-LLVM_DISASSEMBLER(XCore)
+#endif
 
 
 #undef LLVM_DISASSEMBLER
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Targets.def b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Targets.def
index 3594932..08742fd 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Targets.def
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/Targets.def
@@ -23,22 +23,12 @@
 #  error Please define the macro LLVM_TARGET(TargetName)
 #endif
 
+#if defined(__aarch64__)
 LLVM_TARGET(AArch64)
-LLVM_TARGET(AMDGPU)
-LLVM_TARGET(ARM)
-LLVM_TARGET(BPF)
-LLVM_TARGET(Hexagon)
-LLVM_TARGET(Lanai)
-LLVM_TARGET(Mips)
-LLVM_TARGET(MSP430)
-LLVM_TARGET(NVPTX)
-LLVM_TARGET(PowerPC)
-LLVM_TARGET(RISCV)
-LLVM_TARGET(Sparc)
-LLVM_TARGET(SystemZ)
-LLVM_TARGET(WebAssembly)
+#endif
+#if defined(__i386__) || defined(__x86_64__)
 LLVM_TARGET(X86)
-LLVM_TARGET(XCore)
+#endif
 
 
 #undef LLVM_TARGET
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/config.h b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/config.h
index e27fb2c..a60dcda 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/config.h
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/config.h
@@ -294,7 +294,13 @@
 
 /* Target triple LLVM will generate code for by default */
 /* Doesn't use `cmakedefine` because it is allowed to be empty. */
-#define LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-linux-gnu"
+#if defined(__x86_64__)
+#define LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-fuchsia"
+#elif defined(__aarch64__)
+#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-unknown-fuchsia"
+#else
+#error "unknown architecture"
+#endif
 
 /* Define if zlib compression is available */
 #define LLVM_ENABLE_ZLIB 0
@@ -321,10 +327,10 @@
 #define PACKAGE_NAME "LLVM"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "LLVM 10.0.1"
+#define PACKAGE_STRING "LLVM 10.0.0"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "10.0.1"
+#define PACKAGE_VERSION "10.0.0"
 
 /* Define to the vendor of this package. */
 /* #undef PACKAGE_VENDOR */
diff --git a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/llvm-config.h b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/llvm-config.h
index 00f86a0..8e8a618 100644
--- a/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/llvm-config.h
+++ b/third_party/llvm-10.0/configs/fuchsia/include/llvm/Config/llvm-config.h
@@ -14,11 +14,27 @@
 #ifndef LLVM_CONFIG_H
 #define LLVM_CONFIG_H
 
+#if !defined(__i386__) && defined(_M_IX86)
+#define __i386__ 1
+#endif
+
+#if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64))
+#define __x86_64__ 1
+#endif
+
+#define LLVM_CONFIG_H
+
 /* Define if LLVM_ENABLE_DUMP is enabled */
 /* #undef LLVM_ENABLE_DUMP */
 
 /* Target triple LLVM will generate code for by default */
-#define LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-linux-gnu"
+#if defined(__x86_64__)
+#define LLVM_DEFAULT_TARGET_TRIPLE "x86_64-unknown-fuchsia"
+#elif defined(__aarch64__)
+#define LLVM_DEFAULT_TARGET_TRIPLE "aarch64-unknown-fuchsia"
+#else
+#error "unknown architecture"
+#endif
 
 /* Define if threads enabled */
 #define LLVM_ENABLE_THREADS 1
@@ -27,28 +43,118 @@
 #define LLVM_HAS_ATOMICS 1
 
 /* Host triple LLVM will be executed on */
-#define LLVM_HOST_TRIPLE "x86_64-unknown-linux-gnu"
+#if defined(__x86_64__)
+#define LLVM_HOST_TRIPLE "x86_64-unknown-fuchsia"
+#elif defined(__aarch64__)
+#define LLVM_HOST_TRIPLE "aarch64-unknown-fuchsia"
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM architecture name for the native architecture, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_ARCH AArch64
+#elif defined(__arm__)
+#define LLVM_NATIVE_ARCH ARM
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_ARCH X86
+#elif defined(__mips__)
+#define LLVM_NATIVE_ARCH Mips
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_ARCH PowerPC
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native AsmParser init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeAArch64AsmParser
+#elif defined(__arm__)
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeARMAsmParser
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_ASMPARSER LLVMInitializeX86AsmParser
+#elif defined(__mips__)
+#define LLVM_NATIVE_ASMPARSER LLVMInitializeMipsAsmParser
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_ASMPARSER LLVMInitializePowerPCAsmParser
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native AsmPrinter init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeAArch64AsmPrinter
+#elif defined(__arm__)
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeARMAsmPrinter
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_ASMPRINTER LLVMInitializeX86AsmPrinter
+#elif defined(__mips__)
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializeMipsAsmPrinter
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_ASMPRINTER LLVMInitializePowerPCAsmPrinter
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native Disassembler init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeAArch64Disassembler
+#elif defined(__arm__)
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeARMDisassembler
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_DISASSEMBLER LLVMInitializeX86Disassembler
+#elif defined(__mips__)
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializeMipsDisassembler
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_DISASSEMBLER LLVMInitializePowerPCDisassembler
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native Target init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_TARGET LLVMInitializeAArch64Target
+#elif defined(__arm__)
+#define LLVM_NATIVE_TARGET LLVMInitializeARMTarget
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_TARGET LLVMInitializeX86Target
+#elif defined(__mips__)
+#define LLVM_NATIVE_TARGET LLVMInitializeMipsTarget
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_TARGET LLVMInitializePowerPCTarget
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native TargetInfo init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeAArch64TargetInfo
+#elif defined(__arm__)
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeARMTargetInfo
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_TARGETINFO LLVMInitializeX86TargetInfo
+#elif defined(__mips__)
+#define LLVM_NATIVE_TARGETINFO LLVMInitializeMipsTargetInfo
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_TARGETINFO LLVMInitializePowerPCTargetInfo
+#else
+#error "unknown architecture"
+#endif
 
 /* LLVM name for the native target MC init function, if available */
+#if defined(__aarch64__)
+#define LLVM_NATIVE_TARGETMC LLVMInitializeAArch64TargetMC
+#elif defined(__arm__)
+#define LLVM_NATIVE_TARGETMC LLVMInitializeARMTargetMC
+#elif defined(__i386__) || defined(__x86_64__)
 #define LLVM_NATIVE_TARGETMC LLVMInitializeX86TargetMC
+#elif defined(__mips__)
+#define LLVM_NATIVE_TARGETMC LLVMInitializeMipsTargetMC
+#elif defined(__powerpc64__)
+#define LLVM_NATIVE_TARGETMC LLVMInitializePowerPCTargetMC
+#else
+#error "unknown architecture"
+#endif
 
 /* Define if this is Unixish platform */
 #define LLVM_ON_UNIX 1
diff --git a/third_party/llvm-10.0/scripts/update.py b/third_party/llvm-10.0/scripts/update.py
index 7e11c43..a4c2ab1 100644
--- a/third_party/llvm-10.0/scripts/update.py
+++ b/third_party/llvm-10.0/scripts/update.py
@@ -77,6 +77,10 @@
         ('__mips__', 'mipsel-pc-win32'),
         ('__mips64', 'mips64el-pc-win32'),
     ],
+    'fuchsia': [
+        ('__x86_64__', 'x86_64-unknown-fuchsia'),
+        ('__aarch64__', 'aarch64-unknown-fuchsia'),
+    ]
 }
 
 # Mapping of target platform to the host it must be built on
@@ -85,6 +89,7 @@
     'darwin': 'Darwin',
     'linux': 'Linux',
     'windows': 'Windows',
+    'fuchsia': 'Linux'
 }
 
 # LLVM configurations to be undefined.
@@ -141,7 +146,7 @@
 def _parse_args():
     parser = argparse.ArgumentParser()
     parser.add_argument('name', help='destination name',
-                        choices=['android', 'linux', 'darwin', 'windows'])
+                        choices=['android', 'linux', 'darwin', 'windows', 'fuchsia'])
     parser.add_argument('-j', '--jobs', help='parallel compilation', type=int)
     return parser.parse_args()