From 41d2b14d1b5d9fbb3e7f2d11abcfc1f531e64755 Mon Sep 17 00:00:00 2001 From: "jkummerow@chromium.org" Date: Wed, 17 Apr 2013 08:27:40 +0000 Subject: [PATCH] Enable Native Client build of V8. These changes implement make targets nacl_ia32.check, nacl_x64.check, and related debug/release targets. BUG=2614 Review URL: https://codereview.chromium.org/13841011 Patch from Brad Chen . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14299 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- Makefile | 45 ++++++++++++++++++++++++++++++++++++++++++--- build/common.gypi | 10 +++++++++- src/globals.h | 12 ++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 191bb89..a46b333 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,7 @@ TESTFLAGS ?= ANDROID_NDK_ROOT ?= ANDROID_TOOLCHAIN ?= ANDROID_V8 ?= /data/local/v8 +NACL_SDK_ROOT ?= # Special build flags. Use them like this: "make library=shared" @@ -185,6 +186,7 @@ endif # - "native": current host's architecture, release mode # - any of the above with .check appended, e.g. "ia32.release.check" # - "android": cross-compile for Android/ARM +# - "nacl" : cross-compile for Native Client (ia32 and x64) # - default (no target specified): build all DEFAULT_ARCHES and MODES # - "check": build all targets and run all tests # - ".clean" for any in ARCHES @@ -198,6 +200,7 @@ ARCHES = ia32 x64 arm mipsel DEFAULT_ARCHES = ia32 x64 arm MODES = release debug ANDROID_ARCHES = android_ia32 android_arm android_mipsel +NACL_ARCHES = nacl_ia32 nacl_x64 # List of files that trigger Makefile regeneration: GYPFILES = build/all.gyp build/common.gypi build/standalone.gypi \ @@ -212,9 +215,12 @@ endif BUILDS = $(foreach mode,$(MODES),$(addsuffix .$(mode),$(ARCHES))) ANDROID_BUILDS = $(foreach mode,$(MODES), \ $(addsuffix .$(mode),$(ANDROID_ARCHES))) +NACL_BUILDS = $(foreach mode,$(MODES), \ + $(addsuffix .$(mode),$(NACL_ARCHES))) # Generates corresponding test targets, e.g. "ia32.release.check". CHECKS = $(addsuffix .check,$(BUILDS)) ANDROID_CHECKS = $(addsuffix .check,$(ANDROID_BUILDS)) +NACL_CHECKS = $(addsuffix .check,$(NACL_BUILDS)) # File where previously used GYPFLAGS are stored. ENVFILE = $(OUTDIR)/environment @@ -222,7 +228,9 @@ ENVFILE = $(OUTDIR)/environment $(ARCHES) $(MODES) $(BUILDS) $(CHECKS) $(addsuffix .clean,$(ARCHES)) \ $(addsuffix .check,$(MODES)) $(addsuffix .check,$(ARCHES)) \ $(ANDROID_ARCHES) $(ANDROID_BUILDS) $(ANDROID_CHECKS) \ - must-set-ANDROID_NDK_ROOT_OR_TOOLCHAIN + must-set-ANDROID_NDK_ROOT_OR_TOOLCHAIN \ + $(NACL_ARCHES) $(NACL_BUILDS) $(NACL_CHECKS) \ + must-set-NACL_SDK_ROOT # Target definitions. "all" is the default. all: $(MODES) @@ -266,6 +274,16 @@ $(ANDROID_BUILDS): $(GYPFILES) $(ENVFILE) build/android.gypi \ OUTDIR="$(OUTDIR)" \ GYPFLAGS="$(GYPFLAGS)" +$(NACL_ARCHES): $(addprefix $$@.,$(MODES)) + +$(NACL_BUILDS): $(GYPFILES) $(ENVFILE) \ + Makefile.nacl must-set-NACL_SDK_ROOT + @$(MAKE) -f Makefile.nacl $@ \ + ARCH="$(basename $@)" \ + MODE="$(subst .,,$(suffix $@))" \ + OUTDIR="$(OUTDIR)" \ + GYPFLAGS="$(GYPFLAGS)" + # Test targets. check: all @tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \ @@ -297,12 +315,21 @@ $(addsuffix .check, $(ANDROID_BUILDS)): $$(basename $$@).sync $(addsuffix .check, $(ANDROID_ARCHES)): \ $(addprefix $$(basename $$@).,$(MODES)).check +$(addsuffix .check, $(NACL_BUILDS)): $$(basename $$@) + @tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR) \ + --arch-and-mode=$(basename $@) \ + --timeout=600 --nopresubmit \ + --command-prefix="tools/nacl-run.py" + +$(addsuffix .check, $(NACL_ARCHES)): \ + $(addprefix $$(basename $$@).,$(MODES)).check + native.check: native @tools/run-tests.py $(TESTJOBS) --outdir=$(OUTDIR)/native \ --arch-and-mode=. $(TESTFLAGS) # Clean targets. You can clean each architecture individually, or everything. -$(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES)): +$(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES) $(NACL_ARCHES)): rm -f $(OUTDIR)/Makefile.$(basename $@) rm -rf $(OUTDIR)/$(basename $@).release rm -rf $(OUTDIR)/$(basename $@).debug @@ -313,7 +340,7 @@ native.clean: rm -rf $(OUTDIR)/native find $(OUTDIR) -regex '.*\(host\|target\).native\.mk' -delete -clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES)) native.clean +clean: $(addsuffix .clean, $(ARCHES) $(ANDROID_ARCHES) $(NACL_ARCHES)) native.clean # GYP file generation targets. OUT_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(ARCHES)) @@ -336,6 +363,18 @@ ifndef ANDROID_TOOLCHAIN endif endif +# Note that NACL_SDK_ROOT must be set to point to an appropriate +# Native Client SDK before using this makefile. You can download +# an SDK here: +# https://developers.google.com/native-client/sdk/download +# The path indicated by NACL_SDK_ROOT will typically end with +# a folder for a pepper version such as "pepper_25" that should +# have "tools" and "toolchain" subdirectories. +must-set-NACL_SDK_ROOT: +ifndef NACL_SDK_ROOT + $(error NACL_SDK_ROOT must be set) +endif + # Replaces the old with the new environment file if they're different, which # will trigger GYP to regenerate Makefiles. $(ENVFILE): $(ENVFILE).new diff --git a/build/common.gypi b/build/common.gypi index 6dc9a7b..0b1f397 100644 --- a/build/common.gypi +++ b/build/common.gypi @@ -35,6 +35,13 @@ 'CXX%': '${CXX:-$(which g++)}', # Used to assemble a shell command. 'v8_compress_startup_data%': 'off', 'v8_target_arch%': '<(target_arch)', + # Native Client builds currently use the V8 ARM JIT and + # arm/simulator-arm.cc to defer the significant effort required + # for NaCl JIT support. The nacl_target_arch variable provides + # the 'true' target arch for places in this file that need it. + # TODO(bradchen): get rid of nacl_target_arch when someday + # NaCl V8 builds stop using the ARM simulator + 'nacl_target_arch%': 'none', # must be set externally # Setting 'v8_can_use_unaligned_accesses' to 'true' will allow the code # generated by V8 to do unaligned memory access, and setting it to 'false' @@ -357,7 +364,8 @@ 'clang%': 0, }, 'conditions': [ - ['OS!="android" or clang==1', { + ['(OS!="android" or clang==1) and \ + nacl_target_arch!="nacl_x64"', { 'cflags': [ '<(m32flag)' ], 'ldflags': [ '<(m32flag)' ], }], diff --git a/src/globals.h b/src/globals.h index 1606996..59931bf 100644 --- a/src/globals.h +++ b/src/globals.h @@ -67,9 +67,21 @@ namespace internal { // http://www.agner.org/optimize/calling_conventions.pdf // or with gcc, run: "echo | gcc -E -dM -" #if defined(_M_X64) || defined(__x86_64__) +#if defined(__native_client__) +// For Native Client builds of V8, use V8_TARGET_ARCH_ARM, so that V8 +// generates ARM machine code, together with a portable ARM simulator +// compiled for the host architecture in question. +// +// Since Native Client is ILP-32 on all architectures we use +// V8_HOST_ARCH_IA32 on both 32- and 64-bit x86. +#define V8_HOST_ARCH_IA32 1 +#define V8_HOST_ARCH_32_BIT 1 +#define V8_HOST_CAN_READ_UNALIGNED 1 +#else #define V8_HOST_ARCH_X64 1 #define V8_HOST_ARCH_64_BIT 1 #define V8_HOST_CAN_READ_UNALIGNED 1 +#endif // __native_client__ #elif defined(_M_IX86) || defined(__i386__) #define V8_HOST_ARCH_IA32 1 #define V8_HOST_ARCH_32_BIT 1 -- 2.7.4