Enhance target architecture selection rules.

Change-Id: I595f8b6d9acd36bffc0017f06a959e709b9707d5
diff --git a/Config.h b/Config.h
index 63bcc1d..4141491 100644
--- a/Config.h
+++ b/Config.h
@@ -54,45 +54,37 @@
 // Configuration for CodeGen and CompilerRT
 //---------------------------------------------------------------------------
 
-#if defined(__arm__)
-  #define DEFAULT_ARM_CODEGEN
-  #define PROVIDE_ARM_CODEGEN
-#elif defined(__i386__)
-  #define DEFAULT_X86_CODEGEN
-  #define PROVIDE_X86_CODEGEN
-#elif defined(__x86_64__)
-  #define DEFAULT_X64_CODEGEN
-  #define PROVIDE_X64_CODEGEN
-#endif
-
 #if defined(FORCE_ARM_CODEGEN)
-  #define DEFAULT_ARM_CODEGEN
-  #undef DEFAULT_X86_CODEGEN
-  #undef DEFAULT_X64_CODEGEN
   #define PROVIDE_ARM_CODEGEN
-  #undef PROVIDE_X86_CODEGEN
-  #undef PROVIDE_X64_CODEGEN
+  #define DEFAULT_ARM_CODEGEN
+
 #elif defined(FORCE_X86_CODEGEN)
-  #undef DEFAULT_ARM_CODEGEN
-  #define DEFAULT_X86_CODEGEN
-  #undef DEFAULT_X64_CODEGEN
-  #undef PROVIDE_ARM_CODEGEN
   #define PROVIDE_X86_CODEGEN
-  #undef PROVIDE_X64_CODEGEN
-#elif defined(FORCE_X64_CODEGEN)
-  #undef DEFAULT_ARM_CODEGEN
-  #undef DEFAULT_X86_CODEGEN
-  #define DEFAULT_X64_CODEGEN
-  #undef PROVIDE_ARM_CODEGEN
-  #undef PROVIDE_X86_CODEGEN
-  #define PROVIDE_X64_CODEGEN
+
+  #if defined(__i386__)
+    #define DEFAULT_X86_CODEGEN
+  #elif defined(__x86_64__)
+    #define DEFAULT_X86_64_CODEGEN
+  #endif
+
+#else
+  #define PROVIDE_ARM_CODEGEN
+  #define PROVIDE_X86_CODEGEN
+
+  #if defined(__arm__)
+    #define DEFAULT_ARM_CODEGEN
+  #elif defined(__i386__)
+    #define DEFAULT_X86_CODEGEN
+  #elif defined(__x86_64__)
+    #define DEFAULT_X86_64_CODEGEN
+  #endif
 #endif
 
 #if defined(DEFAULT_ARM_CODEGEN)
   #define TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi"
 #elif defined(DEFAULT_X86_CODEGEN)
   #define TARGET_TRIPLE_STRING "i686-unknown-linux"
-#elif defined(DEFAULT_X64_CODEGEN)
+#elif defined(DEFAULT_X86_64_CODEGEN)
   #define TARGET_TRIPLE_STRING "x86_64-unknown-linux"
 #endif
 
diff --git a/helper/Android.mk b/helper/Android.mk
index fd4a873..b19c131 100644
--- a/helper/Android.mk
+++ b/helper/Android.mk
@@ -35,6 +35,7 @@
 LOCAL_SRC_FILES := sha1.c
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_STATIC_LIBRARY)
 
@@ -58,5 +59,6 @@
   sha1.c
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-host-build.mk
 include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/CodeGen/Android.mk b/lib/CodeGen/Android.mk
index 60fc6ca..1e293b2 100644
--- a/lib/CodeGen/Android.mk
+++ b/lib/CodeGen/Android.mk
@@ -43,6 +43,7 @@
 LOCAL_SRC_FILES := $(libbcc_codegen_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_STATIC_LIBRARY)
 
@@ -64,6 +65,7 @@
 LOCAL_SRC_FILES := $(libbcc_codegen_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-host-build.mk
 include $(BUILD_HOST_STATIC_LIBRARY)
 
diff --git a/lib/Disassembler/Android.mk b/lib/Disassembler/Android.mk
index 701f606..1b5ff4d 100644
--- a/lib/Disassembler/Android.mk
+++ b/lib/Disassembler/Android.mk
@@ -42,6 +42,7 @@
 LOCAL_SRC_FILES := $(libbcc_disassembler_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_STATIC_LIBRARY)
 
@@ -63,6 +64,7 @@
 LOCAL_SRC_FILES := $(libbcc_disassembler_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-host-build.mk
 include $(BUILD_HOST_STATIC_LIBRARY)
 
diff --git a/lib/Disassembler/Disassembler.cpp b/lib/Disassembler/Disassembler.cpp
index 8a2cf2c..d0e6000 100644
--- a/lib/Disassembler/Disassembler.cpp
+++ b/lib/Disassembler/Disassembler.cpp
@@ -67,12 +67,11 @@
 namespace bcc {
 
 void InitializeDisassembler() {
-#if defined(DEFAULT_ARM_CODEGEN) || defined(PROVIDE_ARM_CODEGEN)
+#if defined(PROVIDE_ARM_CODEGEN)
   LLVMInitializeARMDisassembler();
 #endif
 
-#if defined(DEFAULT_X86_CODEGEN) || defined(PROVIDE_X86_CODEGEN) || \
-    defined(DEFAULT_X64_CODEGEN) || defined(PROVIDE_X64_CODEGEN)
+#if defined(PROVIDE_X86_CODEGEN)
   LLVMInitializeX86Disassembler();
 #endif
 }
diff --git a/lib/ExecutionEngine/Android.mk b/lib/ExecutionEngine/Android.mk
index e849827..695a975 100644
--- a/lib/ExecutionEngine/Android.mk
+++ b/lib/ExecutionEngine/Android.mk
@@ -72,6 +72,7 @@
 LOCAL_SRC_FILES := $(libbcc_executionengine_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-device-build.mk
 include $(BUILD_STATIC_LIBRARY)
 
@@ -93,5 +94,6 @@
 LOCAL_SRC_FILES := $(libbcc_executionengine_SRC_FILES)
 
 include $(LIBBCC_ROOT_PATH)/libbcc-gen-config-from-mk.mk
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(LLVM_ROOT_PATH)/llvm-host-build.mk
 include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index ebf6912..a26c1c3 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -129,10 +129,8 @@
   // Set Triple, CPU and Features here
   Triple = TARGET_TRIPLE_STRING;
 
-  // NOTE: Currently, we have to turn off the support for NEON explicitly.
-  // Since the ARMCodeEmitter.cpp is not ready for JITing NEON
-  // instructions.
-#if defined(DEFAULT_ARM_CODEGEN) || defined(PROVIDE_ARM_CODEGEN)
+#if defined(DEFAULT_ARM_CODEGEN)
+
 #if defined(ARCH_ARM_HAVE_VFP)
   Features.push_back("+vfp3");
 #if !defined(ARCH_ARM_HAVE_VFP_D32)
@@ -140,15 +138,22 @@
 #endif
 #endif
 
-// FIXME - Temporarily disable NEON
-#if 0 && defined(ARCH_ARM_HAVE_NEON)
+  // NOTE: Currently, we have to turn off the support for NEON explicitly.
+  // Since the ARMCodeEmitter.cpp is not ready for JITing NEON
+  // instructions.
+
+  // FIXME: Re-enable NEON when ARMCodeEmitter supports NEON.
+#define USE_ARM_NEON 0
+#if USE_ARM_NEON
   Features.push_back("+neon");
   Features.push_back("+neonfp");
 #else
   Features.push_back("-neon");
   Features.push_back("-neonfp");
-#endif
+#endif // USE_ARM_NEON
+#endif // DEFAULT_ARM_CODEGEN
 
+#if defined(PROVIDE_ARM_CODEGEN)
   LLVMInitializeARMMCAsmInfo();
   LLVMInitializeARMMCCodeGenInfo();
   LLVMInitializeARMMCSubtargetInfo();
@@ -157,8 +162,7 @@
   LLVMInitializeARMTarget();
 #endif
 
-#if defined(DEFAULT_X86_CODEGEN) || defined(PROVIDE_X86_CODEGEN) || \
-    defined(DEFAULT_X64_CODEGEN) || defined(PROVIDE_X64_CODEGEN)
+#if defined(PROVIDE_X86_CODEGEN)
   LLVMInitializeX86MCAsmInfo();
   LLVMInitializeX86MCCodeGenInfo();
   LLVMInitializeX86MCSubtargetInfo();
@@ -193,7 +197,7 @@
   llvm::FloatABIType = llvm::FloatABI::Soft;
   llvm::UseSoftFloat = false;
 
-#if defined(DEFAULT_X64_CODEGEN)
+#if defined(DEFAULT_X86_64_CODEGEN)
   // Data address in X86_64 architecture may reside in a far-away place
   llvm::TargetMachine::setCodeModel(llvm::CodeModel::Medium);
 #else
diff --git a/libbcc-build-rules.mk b/libbcc-build-rules.mk
new file mode 100644
index 0000000..898002c
--- /dev/null
+++ b/libbcc-build-rules.mk
@@ -0,0 +1,47 @@
+#
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+
+#=====================================================================
+# Architecture Selection
+#=====================================================================
+
+ifeq ($(LOCAL_IS_HOST_MODULE),) # Target Build
+
+  # Note: We should only use -DFORCE_ARCH_CODEGEN on target build.
+  # For the host build, we will include as many architecture as possible,
+  # so that we can test the execution engine easily.
+
+  ifeq ($(TARGET_ARCH),arm)
+    LOCAL_CFLAGS += -DFORCE_ARM_CODEGEN
+    ifeq ($(ARCH_ARM_HAVE_VFP),true)
+      LOCAL_CFLAGS += -DARCH_ARM_HAVE_VFP
+      ifeq ($(ARCH_ARM_HAVE_VFP_D32),true)
+        LOCAL_CFLAGS += -DARCH_ARM_HAVE_VFP_D32
+      endif
+    endif
+    ifeq ($(ARCH_ARM_HAVE_NEON),true)
+      LOCAL_CFLAGS += -DARCH_ARM_HAVE_NEON
+    endif
+  else
+    ifeq ($(TARGET_ARCH),x86)
+      LOCAL_CFLAGS += -DFORCE_X86_CODEGEN
+    else
+      $(error Unsupported architecture $(TARGET_ARCH))
+    endif
+  endif
+
+endif
diff --git a/libbcc-config.mk b/libbcc-config.mk
index f5c9eff..43c7897 100644
--- a/libbcc-config.mk
+++ b/libbcc-config.mk
@@ -70,25 +70,6 @@
 libbcc_CFLAGS += -D__DISABLE_ASSERTS
 endif
 
-ifeq ($(TARGET_ARCH),arm)
-  libbcc_CFLAGS += -DFORCE_ARM_CODEGEN=1
-  ifeq (true,$(ARCH_ARM_HAVE_VFP))
-    libbcc_CFLAGS += -DARCH_ARM_HAVE_VFP
-    ifeq (true,$(ARCH_ARM_HAVE_VFP_D32))
-      libbcc_CFLAGS += -DARCH_ARM_HAVE_VFP_D32
-    endif
-  endif
-  ifeq (true,$(ARCH_ARM_HAVE_NEON))
-    libbcc_CFLAGS += -DARCH_ARM_HAVE_NEON
-  endif
-else
-  ifeq ($(TARGET_ARCH),x86)
-    libbcc_CFLAGS += -DFORCE_X86_CODEGEN=1
-  else
-    $(error Unsupported TARGET_ARCH $(TARGET_ARCH))
-  endif
-endif
-
 # Include File Search Path
 libbcc_C_INCLUDES := \
   $(RSLOADER_ROOT_PATH)/android \
diff --git a/runtime/Android.mk b/runtime/Android.mk
index bb2ff0f..39e662a 100644
--- a/runtime/Android.mk
+++ b/runtime/Android.mk
@@ -86,4 +86,5 @@
   endif
 endif
 
+include $(LIBBCC_ROOT_PATH)/libbcc-build-rules.mk
 include $(BUILD_STATIC_LIBRARY)