Build with Subzero for Android on ARM.
Bug b/37478805
Change-Id: I3a452410d44c0da1cb01c80e3e4fcade221f7304
Reviewed-on: https://swiftshader-review.googlesource.com/9569
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/Android.mk b/Android.mk
index b97a8ba..b4d82e3 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,6 +16,6 @@
LOCAL_PATH:= $(call my-dir)
-ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64))
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64 arm))
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
diff --git a/DEPS b/DEPS
index 3e5071b..43434a2 100644
--- a/DEPS
+++ b/DEPS
@@ -7,10 +7,10 @@
vars = {
'chromium_git': 'https://chromium.googlesource.com',
# Current revision of subzero.
- 'subzero_revision': 'c48bb8b02c98ae49438e43aa1143a958784822a5',
+ 'subzero_revision': 'fb705a6d55003b2c32772ae49e25b0babcff5acc',
}
deps = {
'third_party/pnacl-subzero':
Var('chromium_git') + '/native_client/pnacl-subzero@' + Var('subzero_revision'),
-}
\ No newline at end of file
+}
diff --git a/src/Android.mk b/src/Android.mk
index fde56e3..395b41c 100644
--- a/src/Android.mk
+++ b/src/Android.mk
@@ -1,5 +1,10 @@
LOCAL_PATH:= $(call my-dir)
+# Use Subzero as the Reactor JIT back-end on ARM, else LLVM.
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),arm))
+use_subzero := true
+endif
+
COMMON_C_INCLUDES += \
bionic \
$(LOCAL_PATH)/../include \
@@ -8,9 +13,19 @@
$(LOCAL_PATH)/Renderer/ \
$(LOCAL_PATH)/Common/ \
$(LOCAL_PATH)/Shader/ \
- $(LOCAL_PATH)/../third_party/LLVM/include \
$(LOCAL_PATH)/Main/
+ifdef use_subzero
+COMMON_C_INCLUDES += \
+ $(LOCAL_PATH)/../third_party/pnacl-subzero/ \
+ $(LOCAL_PATH)/../third_party/llvm-subzero/include/ \
+ $(LOCAL_PATH)/../third_party/llvm-subzero/build/Android/include/ \
+ $(LOCAL_PATH)/../third_party/pnacl-subzero/pnacl-llvm/include/
+else
+COMMON_C_INCLUDES += \
+ $(LOCAL_PATH)/../third_party/LLVM/include
+endif
+
# Marshmallow does not have stlport, but comes with libc++ by default
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23 && echo PreMarshmallow),PreMarshmallow)
COMMON_C_INCLUDES += external/stlport/stlport
@@ -35,11 +50,18 @@
Main/FrameBufferAndroid.cpp \
Main/SwiftConfig.cpp
+ifdef use_subzero
+COMMON_SRC_FILES += \
+ Reactor/SubzeroReactor.cpp \
+ Reactor/Routine.cpp \
+ Reactor/Optimizer.cpp
+else
COMMON_SRC_FILES += \
Reactor/LLVMReactor.cpp \
Reactor/Routine.cpp \
Reactor/LLVMRoutine.cpp \
Reactor/LLVMRoutineManager.cpp
+endif
COMMON_SRC_FILES += \
Renderer/Blitter.cpp \
@@ -85,6 +107,7 @@
-Wno-unused-parameter \
-Wno-implicit-exception-spec-mismatch \
-Wno-overloaded-virtual \
+ -Wno-non-virtual-dtor \
-fno-operator-names \
-msse2 \
-D__STDC_CONSTANT_MACROS \
@@ -98,6 +121,14 @@
COMMON_CFLAGS += -D__STDC_INT64__
endif
+# Common Subzero defines
+COMMON_CFLAGS += -DALLOW_DUMP=0 -DALLOW_TIMERS=0 -DALLOW_LLVM_CL=0 -DALLOW_LLVM_IR=0 -DALLOW_LLVM_IR_AS_INPUT=0 -DALLOW_MINIMAL_BUILD=0 -DALLOW_WASM=0 -DICE_THREAD_LOCAL_HACK=1
+
+# Subzero target
+LOCAL_CFLAGS_x86 += -DSZTARGET=X8632
+LOCAL_CFLAGS_x86_64 += -DSZTARGET=X8664
+LOCAL_CFLAGS_arm += -DSZTARGET=ARM32
+
include $(CLEAR_VARS)
LOCAL_CLANG := true
LOCAL_MODULE := swiftshader_top_release
diff --git a/src/OpenGL/compiler/Android.mk b/src/OpenGL/compiler/Android.mk
index aab0b3a..3916255 100644
--- a/src/OpenGL/compiler/Android.mk
+++ b/src/OpenGL/compiler/Android.mk
@@ -5,9 +5,6 @@
$(LOCAL_PATH)/../../../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/../../ \
- $(LOCAL_PATH)/../../../third_party/LLVM/include-android \
- $(LOCAL_PATH)/../../../third_party/LLVM/include \
- $(LOCAL_PATH)/../../../third_party/LLVM/lib/Target/X86 \
$(LOCAL_PATH)/../../Renderer/ \
$(LOCAL_PATH)/../../Common/ \
$(LOCAL_PATH)/../../Shader/ \
diff --git a/src/OpenGL/libGLES_CM/Android.mk b/src/OpenGL/libGLES_CM/Android.mk
index 75f1ca4..582f35f 100644
--- a/src/OpenGL/libGLES_CM/Android.mk
+++ b/src/OpenGL/libGLES_CM/Android.mk
@@ -41,15 +41,16 @@
$(LOCAL_PATH)/../../../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/../../ \
- $(LOCAL_PATH)/../../../third_party/LLVM/include-android \
- $(LOCAL_PATH)/../../../third_party/LLVM/include \
- $(LOCAL_PATH)/../../../third_party/LLVM/lib/Target/X86 \
$(LOCAL_PATH)/../../Renderer/ \
$(LOCAL_PATH)/../../Common/ \
$(LOCAL_PATH)/../../Shader/ \
$(LOCAL_PATH)/../../Main/
+ifdef use_subzero
+COMMON_STATIC_LIBRARIES := libsubzero
+else
COMMON_STATIC_LIBRARIES := libLLVM_swiftshader
+endif
COMMON_SHARED_LIBRARIES := \
libdl \
diff --git a/src/OpenGL/libGLESv2/Android.mk b/src/OpenGL/libGLESv2/Android.mk
index 379af99..d630de3 100644
--- a/src/OpenGL/libGLESv2/Android.mk
+++ b/src/OpenGL/libGLESv2/Android.mk
@@ -47,16 +47,16 @@
$(LOCAL_PATH)/../../../include \
$(LOCAL_PATH)/../ \
$(LOCAL_PATH)/../../ \
- $(LOCAL_PATH)/../../../third_party/LLVM/include-android \
- $(LOCAL_PATH)/../../../third_party/LLVM/include \
- $(LOCAL_PATH)/../../../third_party/LLVM/lib/Target/X86 \
$(LOCAL_PATH)/../../Renderer/ \
$(LOCAL_PATH)/../../Common/ \
$(LOCAL_PATH)/../../Shader/ \
$(LOCAL_PATH)/../../Main/
-COMMON_STATIC_LIBRARIES := \
- libLLVM_swiftshader
+ifdef use_subzero
+COMMON_STATIC_LIBRARIES := libsubzero
+else
+COMMON_STATIC_LIBRARIES := libLLVM_swiftshader
+endif
COMMON_SHARED_LIBRARIES := \
libdl \
diff --git a/src/Reactor/Android.mk b/src/Reactor/Android.mk
new file mode 100644
index 0000000..0a62e8a
--- /dev/null
+++ b/src/Reactor/Android.mk
@@ -0,0 +1,149 @@
+#
+# Copyright 2016 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.
+#
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_CLANG := true
+
+LOCAL_MODULE := libsubzero
+LOCAL_MODULE_TAGS := optional
+
+SUBZERO_PATH := ../../third_party/pnacl-subzero
+LLVMDEPENDENCIES_PATH := ../../third_party/llvm-subzero
+
+LOCAL_SRC_FILES := \
+ $(SUBZERO_PATH)/src/IceAssembler.cpp \
+ $(SUBZERO_PATH)/src/IceCfg.cpp \
+ $(SUBZERO_PATH)/src/IceCfgNode.cpp \
+ $(SUBZERO_PATH)/src/IceClFlags.cpp \
+ $(SUBZERO_PATH)/src/IceELFObjectWriter.cpp \
+ $(SUBZERO_PATH)/src/IceELFSection.cpp \
+ $(SUBZERO_PATH)/src/IceFixups.cpp \
+ $(SUBZERO_PATH)/src/IceGlobalContext.cpp \
+ $(SUBZERO_PATH)/src/IceGlobalInits.cpp \
+ $(SUBZERO_PATH)/src/IceInst.cpp \
+ $(SUBZERO_PATH)/src/IceInstrumentation.cpp \
+ $(SUBZERO_PATH)/src/IceIntrinsics.cpp \
+ $(SUBZERO_PATH)/src/IceLiveness.cpp \
+ $(SUBZERO_PATH)/src/IceLoopAnalyzer.cpp \
+ $(SUBZERO_PATH)/src/IceMangling.cpp \
+ $(SUBZERO_PATH)/src/IceMemory.cpp \
+ $(SUBZERO_PATH)/src/IceOperand.cpp \
+ $(SUBZERO_PATH)/src/IceRangeSpec.cpp \
+ $(SUBZERO_PATH)/src/IceRegAlloc.cpp \
+ $(SUBZERO_PATH)/src/IceRevision.cpp \
+ $(SUBZERO_PATH)/src/IceRNG.cpp \
+ $(SUBZERO_PATH)/src/IceSwitchLowering.cpp \
+ $(SUBZERO_PATH)/src/IceTargetLowering.cpp \
+ $(SUBZERO_PATH)/src/IceThreading.cpp \
+ $(SUBZERO_PATH)/src/IceTimerTree.cpp \
+ $(SUBZERO_PATH)/src/IceTypes.cpp \
+ $(SUBZERO_PATH)/src/IceVariableSplitting.cpp
+
+LOCAL_SRC_FILES_x86 += \
+ $(SUBZERO_PATH)/src/IceInstX8632.cpp \
+ $(SUBZERO_PATH)/src/IceTargetLoweringX8632.cpp
+LOCAL_SRC_FILES_x86_64 += \
+ $(SUBZERO_PATH)/src/IceInstX8664.cpp \
+ $(SUBZERO_PATH)/src/IceTargetLoweringX8664.cpp
+LOCAL_SRC_FILES_arm += \
+ $(SUBZERO_PATH)/src/IceAssemblerARM32.cpp \
+ $(SUBZERO_PATH)/src/IceTargetLoweringARM32.cpp \
+ $(SUBZERO_PATH)/src/IceInstARM32.cpp
+
+LOCAL_SRC_FILES += \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/APInt.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Atomic.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/circular_raw_ostream.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/CommandLine.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/ConvertUTF.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/ConvertUTFWrapper.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Debug.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/ErrorHandling.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/FoldingSet.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Hashing.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Host.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/ManagedStatic.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/MemoryBuffer.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Mutex.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/NativeFormatting.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Path.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Process.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Program.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/raw_ostream.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/raw_os_ostream.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/regcomp.c \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/regerror.c \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Regex.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/regexec.c \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/regfree.c \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/regstrlcpy.c \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Signals.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/SmallPtrSet.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/SmallVector.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/StringExtras.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/StringMap.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/StringRef.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/StringSaver.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/TargetParser.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Threading.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Timer.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Triple.cpp \
+ $(LLVMDEPENDENCIES_PATH)/lib/Support/Twine.cpp
+
+LOCAL_CPPFLAGS := -std=c++11
+
+LOCAL_CFLAGS += -DLOG_TAG=\"libsubzero\" \
+ -Wno-unused-parameter \
+ -Wno-implicit-exception-spec-mismatch \
+ -Wno-overloaded-virtual \
+ -Wno-non-virtual-dtor
+
+ifneq (16,${PLATFORM_SDK_VERSION})
+LOCAL_CFLAGS += -Xclang -fuse-init-array
+else
+LOCAL_CFLAGS += -D__STDC_INT64__
+endif
+
+LOCAL_CFLAGS += -fomit-frame-pointer -Os -ffunction-sections -fdata-sections
+LOCAL_CFLAGS += -fno-operator-names -msse2 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
+
+# Common Subzero defines
+LOCAL_CFLAGS += -DALLOW_DUMP=0 -DALLOW_TIMERS=0 -DALLOW_LLVM_CL=0 -DALLOW_LLVM_IR=0 -DALLOW_LLVM_IR_AS_INPUT=0 -DALLOW_MINIMAL_BUILD=0 -DALLOW_WASM=0 -DICE_THREAD_LOCAL_HACK=1
+
+# Subzero target
+LOCAL_CFLAGS_x86 += -DSZTARGET=X8632
+LOCAL_CFLAGS_x86_64 += -DSZTARGET=X8664
+LOCAL_CFLAGS_arm += -DSZTARGET=ARM32
+
+# Android's make system also uses NDEBUG, so we need to set/unset it forcefully
+# Uncomment for debug ON:
+# LOCAL_CFLAGS += -UNDEBUG -g -O0
+
+LOCAL_C_INCLUDES += \
+ bionic \
+ $(LOCAL_PATH)/$(SUBZERO_PATH)/ \
+ $(LOCAL_PATH)/$(LLVMDEPENDENCIES_PATH)/include/ \
+ $(LOCAL_PATH)/$(LLVMDEPENDENCIES_PATH)/build/Android/include/ \
+ $(LOCAL_PATH)/$(SUBZERO_PATH)/pnacl-llvm/include/
+
+# Marshmallow does not have stlport, but comes with libc++ by default
+ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23 && echo PreMarshmallow),PreMarshmallow)
+LOCAL_C_INCLUDES += external/stlport/stlport
+endif
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/third_party/pnacl-subzero b/third_party/pnacl-subzero
index 47b6ba6..fb705a6 160000
--- a/third_party/pnacl-subzero
+++ b/third_party/pnacl-subzero
@@ -1 +1 @@
-Subproject commit 47b6ba6db7c8b8dd36ac54dbd19ae7b4a5b77424
+Subproject commit fb705a6d55003b2c32772ae49e25b0babcff5acc