From af0a84892de1fdfcb128c9f6dd9857a0e4741ecb Mon Sep 17 00:00:00 2001
From: Ben Noordhuis <info@bnoordhuis.nl>
Date: Mon, 2 Mar 2015 21:35:29 +0100
Subject: [PATCH] build: add basic arm64 support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This commit adds basic arm64 support to the build.  Building the bundled
openssl is disabled pending an upgrade to openssl 1.2, the currently
bundled version has some hand-rolled assembly that is 32 bits only.

PR-URL: https://github.com/iojs/io.js/pull/1028
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Rod Vagg <rod@vagg.org>
---
 configure                         | 15 ++++++++++++---
 deps/openssl/config/opensslconf.h |  4 ++--
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index d63232626c7d1e..84d1780f5acee4 100755
--- a/configure
+++ b/configure
@@ -38,7 +38,8 @@ parser.add_option('--debug',
 parser.add_option('--dest-cpu',
     action='store',
     dest='dest_cpu',
-    help='CPU architecture to build for. Valid values are: arm, ia32, x32, x64')
+    help='CPU architecture to build for. '
+         'Valid values are: arm, arm64, ia32, x32, x64')
 
 parser.add_option('--dest-os',
     action='store',
@@ -436,10 +437,11 @@ def host_arch_cc():
   k = cc_macros()
 
   matchup = {
-    '__x86_64__'  : 'x64',
-    '__i386__'    : 'ia32',
+    '__aarch64__' : 'arm64',
     '__arm__'     : 'arm',
+    '__i386__'    : 'ia32',
     '__mips__'    : 'mips',
+    '__x86_64__'  : 'x64',
   }
 
   rtn = 'ia32' # default
@@ -510,6 +512,13 @@ def configure_node(o):
 
   if target_arch == 'arm':
     configure_arm(o)
+  elif (target_arch == 'arm64' and
+        not options.shared_openssl and
+        not options.without_ssl)
+    # FIXME(bnoordhuis) It's not possible to build the bundled openssl due to
+    # deps/openssl/asm/arm-elf-gas/modes/ghash-armv4.S, which is 32 bits only.
+    warn('not building openssl, arm64 not yet supported')
+    options.without_ssl = True
 
   if flavor in ('solaris', 'mac', 'linux', 'freebsd'):
     use_dtrace = not options.without_dtrace
diff --git a/deps/openssl/config/opensslconf.h b/deps/openssl/config/opensslconf.h
index 2e7732b926260d..84e5de7c12a811 100644
--- a/deps/openssl/config/opensslconf.h
+++ b/deps/openssl/config/opensslconf.h
@@ -190,7 +190,7 @@
    * boundary. See crypto/rc4/rc4_enc.c for further details.
    */
 # undef RC4_CHUNK
-# if defined(_M_X64) || defined(__x86_64__)
+# if defined(_M_X64) || defined(__aarch64__) || defined(__x86_64__)
 #  define RC4_CHUNK unsigned long long
 # elif defined(__arm__)
 #  define RC4_CHUNK unsigned long
@@ -220,7 +220,7 @@
 # undef THIRTY_TWO_BIT
 # undef SIXTEEN_BIT
 # undef EIGHT_BIT
-# if defined(_M_X64) || defined(__x86_64__)
+# if defined(_M_X64) || defined(__aarch64__) || defined(__x86_64__)
 #  if defined(_LP64)
 #   define SIXTY_FOUR_BIT_LONG
 #  else