| # The following variables will likely need to be modified, depending on where |
| # and how you built LLVM & Clang. They can be overridden in a command-line |
| # invocation of make, like: |
| # |
| # make LLVM_SRC_PATH=<path> LIBCXX_INSTALL_PATH=<path> CLANG_PATH=<path> \ |
| # PNACL_BIN_PATH=<path> ... |
| # |
| |
| # LLVM_SRC_PATH is the path to the root of the checked out source code. This |
| # directory should contain the configure script, the include/ and lib/ |
| # directories of LLVM, Clang in tools/clang/, etc. |
| # Alternatively, if you're building vs. a binary download of LLVM, then |
| # LLVM_SRC_PATH can point to the main untarred directory. |
| LLVM_SRC_PATH ?= ../llvm |
| |
| # The x86-32-specific sandboxed translator directory. |
| # It holds sandboxed versions of libraries and binaries. |
| SB_LLVM_PATH ?= $(shell readlink -e \ |
| ../../out/sandboxed_translators_work/translator-i686/llvm-sb/Release) |
| |
| # NACL_ROOT is the root of the native client repository. |
| NACL_ROOT ?= $(shell python -c "import sys; sys.path.insert(0, 'pydir'); \ |
| import utils; print utils.FindBaseNaCl()") |
| |
| # TOOLCHAIN_ROOT is the location of NaCl/PNaCl toolchains and other |
| # tools like qemu. |
| TOOLCHAIN_ROOT ?= $(shell readlink -e $(NACL_ROOT)/toolchain/linux_x86) |
| |
| # PNACL_TOOLCHAIN_ROOT is the location of the PNaCl toolchain. |
| # This is used as the default root for finding binutils, libcxx, etc. |
| PNACL_TOOLCHAIN_ROOT ?= $(shell readlink -e $(TOOLCHAIN_ROOT)/pnacl_newlib_raw) |
| |
| # The location of PNaCl tools (e.g., binutils objdump, pnacl-clang++, etc.). |
| PNACL_BIN_PATH ?= $(shell readlink -e $(PNACL_TOOLCHAIN_ROOT)/bin) |
| |
| # Allow tests to be overridden, e.g.: |
| # make -f Makefile.standalone check-lit \ |
| # CHECK_LIT_TESTS="tests_lit/llvm2ice_tests/{alloc,arith}.ll" |
| # make -f Makefile.standalone check-xtest \ |
| # CHECK_XTEST_TESTS=crosstest/Output/simple_loop_x8632_native_O2_sse2.xtest |
| CHECK_LIT_TESTS ?= tests_lit |
| CHECK_XTEST_TESTS ?= crosstest/Output |
| |
| # Hack to auto-detect autoconf versus cmake build of LLVM. If the LLVM tools |
| # were dynamically linked with something like libLLVM-3.7svn.so, it is an |
| # autoconf build, otherwise it is a cmake build. AUTOCONF is set to 0 for |
| # cmake, nonzero for autoconf. |
| AUTOCONF ?= $(shell ldd $(PNACL_BIN_PATH)/opt | grep -c libLLVM-) |
| |
| # CLANG_PATH is the location of the clang compiler to use for building |
| # the host binaries. |
| CLANG_PATH ?= $(shell readlink -e \ |
| $(NACL_ROOT)/../third_party/llvm-build/Release+Asserts/bin) |
| |
| # LIBCXX_INSTALL_PATH is the directory where libc++ is located. It should |
| # contain header files and corresponding libraries. This is used for |
| # building the host binaries in conjuction with clang. |
| LIBCXX_INSTALL_PATH ?= $(PNACL_TOOLCHAIN_ROOT) |
| STDLIB_FLAGS := -stdlib=libc++ -I$(LIBCXX_INSTALL_PATH)/include/c++/v1 |
| |
| HOST_ARCH ?= x86_64 |
| ifeq ($(HOST_ARCH),x86_64) |
| HOST_FLAGS = -m64 |
| else |
| ifeq ($(HOST_ARCH),x86) |
| HOST_FLAGS = -m32 |
| endif |
| endif |
| |
| ifdef DEBUG |
| OBJDIR = build/Debug |
| OPTLEVEL = -O0 |
| LINKOPTLEVEL = -O0 |
| else |
| OBJDIR = build/Release |
| OPTLEVEL = -O2 -ffunction-sections -fdata-sections |
| LINKOPTLEVEL = -O2 |
| endif |
| |
| # The list of CXX defines that are dependent on build parameters. |
| BASE_CXX_DEFINES = |
| CXX_EXTRA = |
| LD_EXTRA = |
| |
| ifdef MINIMAL |
| NOASSERT = 1 |
| NODUMP = 1 |
| OBJDIR := $(OBJDIR)+Min |
| BASE_CXX_DEFINES += -DALLOW_LLVM_CL=0 -DALLOW_LLVM_IR=0 \ |
| -DALLOW_LLVM_IR_AS_INPUT=0 -DALLOW_TIMERS=0 -DALLOW_MINIMAL_BUILD=1 |
| else |
| BASE_CXX_DEFINES += -DALLOW_LLVM_CL=1 -DALLOW_LLVM_IR=1 \ |
| -DALLOW_LLVM_IR_AS_INPUT=1 -DALLOW_TIMERS=1 -DALLOW_MINIMAL_BUILD=0 |
| endif |
| |
| ifdef NODUMP |
| OBJDIR := $(OBJDIR)+NoDump |
| BASE_CXX_DEFINES += -DALLOW_DUMP=0 |
| else |
| BASE_CXX_DEFINES += -DALLOW_DUMP=1 |
| endif |
| |
| # Restrict to a single supported target. Current options: |
| # SZTARGET=ARM32 |
| # SZTARGET=MIPS32 |
| # SZTARGET=X8632 |
| # SZTARGET=X8664 |
| ifdef SZTARGET |
| OBJDIR := $(OBJDIR)+T_$(SZTARGET) |
| BASE_CXX_DEFINES += -DSZTARGET=$(SZTARGET) |
| endif |
| |
| BASE_CXX_DEFINES += -DPNACL_LLVM |
| SZ_COMMIT_COUNT := $(shell git rev-list --count HEAD) |
| SZ_GIT_HASH := $(shell git rev-parse HEAD) |
| BASE_CXX_DEFINES += -DSUBZERO_REVISION=$(SZ_COMMIT_COUNT)_$(SZ_GIT_HASH) |
| |
| CXX_DEFINES := $(BASE_CXX_DEFINES) -DPNACL_BROWSER_TRANSLATOR=0 |
| |
| ifdef NOASSERT |
| ASSERTIONS = -DNDEBUG |
| else |
| ASSERTIONS = |
| OBJDIR := $(OBJDIR)+Asserts |
| endif |
| |
| ifdef UBSAN |
| OBJDIR := $(OBJDIR)+UBSan |
| CXX_EXTRA += -fsanitize=undefined -fno-sanitize=vptr \ |
| -fno-sanitize=nonnull-attribute |
| LD_EXTRA += -fsanitize=undefined |
| endif |
| |
| ifdef UBSAN_TRAP |
| OBJDIR := $(OBJDIR)+UBSan_Trap |
| CXX_EXTRA += -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error \ |
| -fno-sanitize=vptr -fno-sanitize=nonnull-attribute |
| LD_EXTRA += -fsanitize=undefined-trap |
| endif |
| |
| ifdef TSAN |
| OBJDIR := $(OBJDIR)+TSan |
| CXX_EXTRA += -fsanitize=thread |
| LD_EXTRA += -fsanitize=thread |
| endif |
| |
| ifdef ASAN |
| OBJDIR := $(OBJDIR)+ASan |
| CXX_EXTRA += -fsanitize=address |
| LD_EXTRA += -fsanitize=address |
| endif |
| |
| ifdef MSAN |
| # TODO(ascull): this has an as yet undiagnosed uninitialized memory access |
| OBJDIR := $(OBJDIR)+MSan |
| CXX_EXTRA += -fsanitize=memory |
| LD_EXTRA += -fsanitize=memory |
| endif |
| |
| ifdef FORCEASM |
| FORCEASM_FLAG = --filetype=asm |
| # With --filetype=asm and --sandbox, the llvm-mc assembler emits the lock and |
| # 16-bit prefixes in the "wrong" order, causing the validator to reject the |
| # resulting nexe. So we just disable those tests for now. |
| FORCEASM_XTEST_EXCLUDES = -e x8632,sandbox,test_sync_atomic |
| FORCEASM_LIT_PARAM = --param=FORCEASM |
| # x86 sandboxing lit tests are disabled because filetype=asm does not |
| # handle bundle_lock pad-to-end correctly. |
| # TODO(jpp): fix this. |
| FORCEASM_LIT_TEST_EXCLUDES = --filter='^(?!.*/x86/sandboxing.ll).*' |
| else |
| FORCEASM_FLAG = |
| FORCEASM_XTEST_EXCLUDES = |
| FORCEASM_LIT_PARAM = |
| FORCEASM_LIT_TEST_EXCLUDES = |
| endif |
| |
| ifdef LINUX_MALLOC_PROFILE |
| OBJDIR := $(OBJDIR)+MalProf |
| CXX_EXTRA += -DALLOW_LINUX_MALLOC_PROFILE=1 |
| LD_EXTRA += -Wl,--export-dynamic |
| endif |
| |
| SB_OBJDIR := $(OBJDIR)+Sandboxed |
| SBB_OBJDIR := $(OBJDIR)+SandboxedBrowser |
| |
| V8_DIR = $(NACL_ROOT)/../v8 |
| V8_CXXFLAGS := -I$(V8_DIR) |
| |
| $(info -----------------------------------------------) |
| $(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH)) |
| $(info Using SB_LLVM_PATH = $(SB_LLVM_PATH)) |
| $(info Using NACL_ROOT = $(NACL_ROOT)) |
| $(info Using TOOLCHAIN_ROOT = $(TOOLCHAIN_ROOT)) |
| $(info Using PNACL_TOOLCHAIN_ROOT = $(PNACL_TOOLCHAIN_ROOT)) |
| $(info Using PNACL_BIN_PATH = $(PNACL_BIN_PATH)) |
| $(info Using CLANG_PATH = $(CLANG_PATH)) |
| $(info Using LIBCXX_INSTALL_PATH = $(LIBCXX_INSTALL_PATH)) |
| $(info Using HOST_ARCH = $(HOST_ARCH)) |
| $(info -----------------------------------------------) |
| |
| LLVM_CXXFLAGS := `$(PNACL_BIN_PATH)/llvm-config --cxxflags` |
| SB_LLVM_CXXFLAGS := $(LLVM_CXXFLAGS) |
| |
| # Listing specific libraries that are needed for pnacl-sz |
| # and the unittests, since we build "tools-only" for the |
| # sandboxed_translators (which doesn't include every library |
| # listed by llvm-config). |
| |
| LLVM_LIBS_LIST := -lLLVMIRReader -lLLVMBitReader -lLLVMNaClBitTestUtils \ |
| -lLLVMNaClBitReader -lLLVMNaClBitAnalysis -lLLVMNaClBitWriter \ |
| -lLLVMAsmParser -lLLVMNaClAnalysis -lLLVMCore -lLLVMSupport |
| |
| ifeq ($(AUTOCONF), 0) |
| # LLVM cmake build |
| LLVM_LIBS := $(LLVM_LIBS_LIST) |
| # For the cmake build, the gtest libs end up in the same place as the LLVM |
| # libs, so no "-L..." arg is needed. |
| GTEST_LIB_PATH ?= |
| CLANG_FORMAT_PATH ?= $(PNACL_BIN_PATH) |
| else |
| # LLVM autoconf build |
| LLVM_LIBS := -lLLVM-3.7svn |
| GTEST_LIB_PATH ?= -L../../out/llvm_x86_64_linux_work/Release+Asserts/lib |
| ifneq ($(wildcard \ |
| ../../out/llvm_x86_64_linux_work/Release+Asserts/bin/clang-format),) |
| CLANG_FORMAT_PATH ?= ../../out/llvm_x86_64_linux_work/Release+Asserts/bin |
| else |
| CLANG_FORMAT_PATH ?= \ |
| ../../out/llvm_x86_64_linux_debug_work/Debug+Asserts/bin |
| endif |
| endif |
| |
| LLVM_LDFLAGS := $(LLVM_LIBS) \ |
| `$(PNACL_BIN_PATH)/llvm-config --ldflags` \ |
| `$(PNACL_BIN_PATH)/llvm-config --system-libs` |
| SB_LLVM_LDFLAGS := -Wl,--start-group $(LLVM_LIBS_LIST) -Wl,--end-group \ |
| -L$(SB_LLVM_PATH)/lib |
| |
| CCACHE := `command -v ccache` |
| CXX := CCACHE_CPP2=yes $(CCACHE) $(CLANG_PATH)/clang++ |
| SB_CXX := CCACHE_CPP2=yes $(CCACHE) $(PNACL_BIN_PATH)/pnacl-clang++ |
| SB_TRANSLATE := $(PNACL_BIN_PATH)/pnacl-translate |
| SB_FINALIZE := $(PNACL_BIN_PATH)/pnacl-finalize --no-strip-syms |
| |
| # Extra warnings that LLVM's build system adds in addition to -Wall. |
| LLVM_EXTRA_WARNINGS := -Wcovered-switch-default |
| |
| # Use g++ to compile, to check for errors/warnings that clang++ might have |
| # missed. It's unlikely to link, unless LLVM was also built with g++, so the |
| # compile_only target should be used. Note: This ifdef section is deliberately |
| # placed here instead of with the other ifdef sections, so that its redefinition |
| # of CXX/STDLIB_FLAGS/LLVM_EXTRA_WARNINGS follows their normal definitions. |
| ifdef GPLUSPLUS |
| CXX := CCACHE_CPP2=yes $(CCACHE) g++ |
| STDLIB_FLAGS := |
| LLVM_EXTRA_WARNINGS := \ |
| -Wcast-qual \ |
| -Wno-comment \ |
| -Wno-long-long \ |
| -Wno-maybe-uninitialized \ |
| -Wno-missing-field-initializers \ |
| -Wno-unused-parameter \ |
| -Wwrite-strings |
| OBJDIR := $(OBJDIR)+Gplusplus |
| endif |
| |
| BASE_CXXFLAGS := -std=gnu++11 -Wall -Wextra -fno-rtti \ |
| -fno-exceptions $(OPTLEVEL) $(ASSERTIONS) -g -pedantic \ |
| $(LLVM_EXTRA_WARNINGS) $(CXX_EXTRA) -MP -MD -Werror |
| |
| ifdef WASM |
| BASE_CXXFLAGS := $(BASE_CXXFLAGS) $(V8_CXXFLAGS) -DALLOW_WASM=1 |
| OBJDIR := $(OBJDIR)+Wasm |
| else |
| BASE_CXXFLAGS := $(BASE_CXXFLAGS) -DALLOW_WASM=0 |
| endif |
| |
| # TODO(stichnot,jpp): Restructure static fields in template classes to avoid |
| # needing -Wno-undefined-var-template . |
| CXXFLAGS := $(LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(CXX_DEFINES) $(HOST_FLAGS) \ |
| $(STDLIB_FLAGS) -Wno-undefined-var-template |
| SB_CXXFLAGS := $(SB_LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(BASE_CXX_DEFINES) \ |
| -Wno-unknown-pragmas -I$(NACL_ROOT) -I$(NACL_ROOT)/.. |
| |
| LDFLAGS := $(HOST_FLAGS) -L$(LIBCXX_INSTALL_PATH)/lib -Wl,--gc-sections \ |
| $(LD_EXTRA) $(STDLIB_FLAGS) |
| # Not specifying -Wl,--gc-sections but instead doing bitcode linking GC w/ LTO. |
| SB_LDFLAGS := $(LINKOPTLEVEL) $(LD_EXTRA) |
| |
| # List the target-specific source files first, which generally take longer to |
| # compile, in the hope of improving parallel build time. |
| SRCS = \ |
| IceAssemblerARM32.cpp \ |
| IceAssemblerMIPS32.cpp \ |
| IceInstARM32.cpp \ |
| IceInstMIPS32.cpp \ |
| IceInstX8632.cpp \ |
| IceInstX8664.cpp \ |
| IceTargetLowering.cpp \ |
| IceTargetLoweringARM32.cpp \ |
| IceTargetLoweringMIPS32.cpp \ |
| IceTargetLoweringX86.cpp \ |
| IceTargetLoweringX8632.cpp \ |
| IceTargetLoweringX8664.cpp \ |
| IceAssembler.cpp \ |
| IceBrowserCompileServer.cpp \ |
| IceCfg.cpp \ |
| IceCfgNode.cpp \ |
| IceClFlags.cpp \ |
| IceCompiler.cpp \ |
| IceCompileServer.cpp \ |
| IceELFObjectWriter.cpp \ |
| IceELFSection.cpp \ |
| IceFixups.cpp \ |
| IceGlobalContext.cpp \ |
| IceGlobalInits.cpp \ |
| IceInst.cpp \ |
| IceIntrinsics.cpp \ |
| IceLiveness.cpp \ |
| IceLoopAnalyzer.cpp \ |
| IceMangling.cpp \ |
| IceMemory.cpp \ |
| IceOperand.cpp \ |
| IceRangeSpec.cpp \ |
| IceRegAlloc.cpp \ |
| IceRevision.cpp \ |
| IceRNG.cpp \ |
| IceSwitchLowering.cpp \ |
| IceThreading.cpp \ |
| IceTimerTree.cpp \ |
| IceTranslator.cpp \ |
| IceTypes.cpp \ |
| IceVariableSplitting.cpp \ |
| LinuxMallocProfiling.cpp \ |
| main.cpp \ |
| PNaClTranslator.cpp |
| |
| ifndef MINIMAL |
| SRCS += \ |
| IceASanInstrumentation.cpp \ |
| IceConverter.cpp \ |
| IceInstrumentation.cpp \ |
| IceTypeConverter.cpp |
| endif |
| |
| ifdef WASM |
| SRCS += \ |
| WasmTranslator.cpp |
| endif |
| |
| OBJS=$(patsubst %.cpp, $(OBJDIR)/%.o, $(SRCS)) |
| SB_OBJS=$(patsubst %.cpp, $(SB_OBJDIR)/%.o, $(SRCS)) |
| SBB_OBJS=$(patsubst %.cpp, $(SBB_OBJDIR)/%.o, $(SRCS)) |
| |
| UNITTEST_SRCS = \ |
| BitcodeMunge.cpp \ |
| IceELFSectionTest.cpp \ |
| IceParseInstsTest.cpp |
| |
| # The X86 assembler tests take too long to compile. Given how infrequently the |
| # assembler will change, we disable them. |
| ifdef CHECK_X86_ASM |
| ifndef DEBUG |
| $(error Run check-unit with DEBUG=1 lest your machine perish) |
| endif |
| UNITTEST_SRCS += AssemblerX8632/LowLevel.cpp \ |
| AssemblerX8632/DataMov.cpp \ |
| AssemblerX8632/Locked.cpp \ |
| AssemblerX8632/GPRArith.cpp \ |
| AssemblerX8632/XmmArith.cpp \ |
| AssemblerX8632/ControlFlow.cpp \ |
| AssemblerX8632/Other.cpp \ |
| AssemblerX8632/X87.cpp \ |
| AssemblerX8664/LowLevel.cpp \ |
| AssemblerX8664/DataMov.cpp \ |
| AssemblerX8664/Locked.cpp \ |
| AssemblerX8664/GPRArith.cpp \ |
| AssemblerX8664/XmmArith.cpp \ |
| AssemblerX8664/ControlFlow.cpp \ |
| AssemblerX8664/Other.cpp |
| endif |
| |
| UNITTEST_OBJS = $(patsubst %.cpp, $(OBJDIR)/unittest/%.o, $(UNITTEST_SRCS)) |
| UNITTEST_LIB_OBJS = $(filter-out $(OBJDIR)/main.o,$(OBJS)) |
| |
| NEXES = $(SB_OBJDIR)/pnacl-sz.x8632.nexe \ |
| $(SB_OBJDIR)/pnacl-sz.x8664.nexe \ |
| $(SBB_OBJDIR)/pnacl_public_x86_32_pnacl_sz_nexe \ |
| $(SBB_OBJDIR)/pnacl_public_x86_64_pnacl_sz_nexe |
| NEXES_LITE = $(SB_OBJDIR)/pnacl-sz.x8664.nexe |
| |
| # Keep all the first target so it's the default. |
| all: $(OBJDIR)/pnacl-sz make_symlink runtime |
| |
| ifdef TSAN |
| sb sb-lite: |
| @echo "Skipping pnacl-sz.*.nexe: TSAN isn't supported under NaCl." |
| else |
| sb: $(NEXES) sb_make_symlink exists-sbtc |
| sb-lite: $(NEXES_LITE) exists-sbtc |
| endif |
| |
| # SHOW_BUILD_ATTS is an executable that is run to show what build |
| # attributes were used to build pnacl-sz. |
| SHOW_BUILD_ATTS = $(OBJDIR)/pnacl-sz --build-atts |
| |
| # Creates symbolic link so that testing is easier. Also runs |
| # pnacl-sz to verify that the defines flags have valid values, |
| # as well as describe the corresponding build attributes. |
| make_symlink: $(OBJDIR)/pnacl-sz |
| rm -rf pnacl-sz |
| ln -s $(OBJDIR)/pnacl-sz |
| @echo "Build Attributes:" |
| @$(SHOW_BUILD_ATTS) |
| |
| sb_make_symlink: $(NEXES) |
| $(foreach nexe,$(NEXES),rm -rf $(notdir $(nexe)); ln -s $(nexe);) |
| |
| %.pexe : %.nonfinal.pexe |
| $(SB_FINALIZE) -o $@ $< |
| |
| .PHONY: all compile_only make_symlink runtime bloat sb docs help \ |
| help-check-lit help-check-xtest exists-nonsfi-x8632 \ |
| exists-nonsfi-arm32 exists-sbtc exists-spec |
| |
| compile_only: $(OBJS) |
| |
| V8_LIBDIR=$(V8_DIR)/out/native/lib.target |
| |
| ifdef WASM |
| V8_LIBS := \ |
| $(V8_LIBDIR)/libv8.so \ |
| $(V8_LIBDIR)/libicuuc.so \ |
| $(V8_LIBDIR)/libicui18n.so |
| endif |
| |
| $(OBJDIR)/pnacl-sz: $(OBJS) |
| $(CXX) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) \ |
| -Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib) $(V8_LIBS) |
| |
| $(SB_OBJDIR)/pnacl-sz.nonfinal.pexe: $(SB_OBJS) |
| $(SB_CXX) $(SB_LDFLAGS) -o $@ $^ $(SB_LLVM_LDFLAGS) |
| |
| $(SBB_OBJDIR)/pnacl-sz.nonfinal.pexe: $(SBB_OBJS) |
| $(SB_CXX) $(SB_LDFLAGS) -o $@ $^ $(SB_LLVM_LDFLAGS) \ |
| --pnacl-disable-abi-check |
| |
| $(SB_OBJDIR)/pnacl-sz.x8632.nexe: $(SB_OBJDIR)/pnacl-sz.pexe |
| $(SB_TRANSLATE) -arch x86-32 $^ -o $@ |
| |
| $(SB_OBJDIR)/pnacl-sz.x8664.nexe: $(SB_OBJDIR)/pnacl-sz.pexe |
| $(SB_TRANSLATE) -arch x86-64 $^ -o $@ |
| |
| $(SBB_OBJDIR)/pnacl_public_x86_32_pnacl_sz_nexe: $(SBB_OBJDIR)/pnacl-sz.pexe |
| $(SB_TRANSLATE) -arch x86-32 $^ -o $@ |
| |
| $(SBB_OBJDIR)/pnacl_public_x86_64_pnacl_sz_nexe: $(SBB_OBJDIR)/pnacl-sz.pexe |
| $(SB_TRANSLATE) -arch x86-64 $^ -o $@ |
| |
| src/IceRegistersARM32.def: pydir/gen_arm32_reg_tables.py |
| python $< > $@ |
| |
| -include $(foreach dep,$(SRCS:.cpp=.d),$(OBJDIR)/$(dep)) |
| $(OBJS): $(OBJDIR)/%.o: src/%.cpp |
| $(CXX) -c $(CXXFLAGS) $< -o $@ |
| |
| -include $(foreach dep,$(SRCS:.cpp=.d),$(SB_OBJDIR)/$(dep)) |
| $(SB_OBJS): $(SB_OBJDIR)/%.o: src/%.cpp |
| $(SB_CXX) -c $(SB_CXXFLAGS) -DPNACL_BROWSER_TRANSLATOR=0 $< -o $@ |
| |
| -include $(foreach dep,$(SRCS:.cpp=.d),$(SBB_OBJDIR)/$(dep)) |
| $(SBB_OBJS): $(SBB_OBJDIR)/%.o: src/%.cpp |
| $(SB_CXX) -c $(SB_CXXFLAGS) -DPNACL_BROWSER_TRANSLATOR=1 $< -o $@ |
| |
| $(OBJDIR)/run_unittests: $(UNITTEST_OBJS) $(UNITTEST_LIB_OBJS) |
| $(CXX) $(GTEST_LIB_PATH) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) \ |
| -lgtest -lgtest_main -ldl \ |
| -Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib) |
| |
| -include $(foreach dep,$(UNITTEST_SRCS:.cpp=.d),$(OBJDIR)/unittest/$(dep)) |
| $(UNITTEST_OBJS): $(OBJDIR)/unittest/%.o: unittest/%.cpp |
| $(CXX) -c $(CXXFLAGS) \ |
| -Isrc/ \ |
| -Iunittest/ \ |
| -I$(LLVM_SRC_PATH)/utils/unittest/googletest/include \ |
| -I$(LLVM_SRC_PATH) \ |
| -DGTEST_HAS_RTTI=0 -DGTEST_USE_OWN_TR1_TUPLE \ |
| -Wno-expansion-to-defined \ |
| $< -o $@ |
| |
| $(OBJS): | $(OBJDIR) |
| $(SB_OBJS): | $(SB_OBJDIR) |
| $(SBB_OBJS): | $(SBB_OBJDIR) |
| |
| $(UNITTEST_OBJS): | $(OBJDIR)/unittest $(OBJDIR)/unittest/AssemblerX8632 \ |
| $(OBJDIR)/unittest/AssemblerX8664 |
| |
| $(OBJDIR): |
| @mkdir -p $@ |
| $(SB_OBJDIR): |
| @mkdir -p $@ |
| $(SBB_OBJDIR): |
| @mkdir -p $@ |
| |
| $(OBJDIR)/unittest: $(OBJDIR) |
| @mkdir -p $@ |
| |
| $(OBJDIR)/unittest/AssemblerX8632: $(OBJDIR)/unittest |
| @mkdir -p $@ |
| $(OBJDIR)/unittest/AssemblerX8664: $(OBJDIR)/unittest |
| @mkdir -p $@ |
| |
| RT_SRC := runtime/szrt.c runtime/szrt_ll.ll runtime/szrt_profiler.c \ |
| runtime/szrt_asm_x8632.s runtime/szrt_asm_x8664.s \ |
| runtime/szrt_asm_arm32.s runtime/szrt_asan.c |
| RT_OBJ := build/runtime/szrt_native_x8632.o build/runtime/szrt_sb_x8632.o \ |
| build/runtime/szrt_nonsfi_x8632.o \ |
| build/runtime/szrt_native_x8664.o build/runtime/szrt_sb_x8664.o \ |
| build/runtime/szrt_nonsfi_x8664.o \ |
| build/runtime/szrt_native_arm32.o build/runtime/szrt_sb_arm32.o \ |
| build/runtime/szrt_nonsfi_arm32.o \ |
| build/runtime/szrt_asan_x8632.o build/runtime/szrt_asan_x8664.o \ |
| build/runtime/szrt_asan_arm32.o |
| |
| EXCLUDED_RT := |
| ifdef MIPS |
| RT_SRC += runtime/szrt_asm_mips32.s |
| RT_OBJ += build/runtime/szrt_native_mips32.o build/runtime/szrt_sb_mips32.o |
| else |
| EXCLUDED_RT += --exclude-target=mips32 |
| endif |
| |
| runtime: $(RT_OBJ) |
| |
| # Use runtime.is.built so that build-runtime.py is invoked only once |
| # even in a parallel build. |
| .INTERMEDIATE: runtime.is.built |
| $(RT_OBJ): runtime.is.built |
| runtime.is.built: $(RT_SRC) pydir/build-runtime.py |
| @echo ================ Building Subzero runtime ================ |
| ./pydir/build-runtime.py -v --pnacl-root $(PNACL_TOOLCHAIN_ROOT) \ |
| $(EXCLUDED_RT) |
| |
| check-lit: $(OBJDIR)/pnacl-sz make_symlink runtime |
| PNACL_BIN_PATH=$(PNACL_BIN_PATH) \ |
| $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_LIT_TESTS) \ |
| $(FORCEASM_LIT_TEST_EXCLUDES) $(FORCEASM_LIT_PARAM) |
| |
| ifdef MINIMAL |
| check-xtest check-xtest-lite: $(OBJDIR)/pnacl-sz make_symlink runtime |
| @echo "Crosstests disabled, minimal build" |
| else |
| ifdef MIPS |
| check-xtest check-xtest-lite: $(OBJDIR)/pnacl-sz make_symlink runtime \ |
| crosstest/test_arith_ll.ll |
| # Do all x8664/native/sse2 tests as a smoke test. |
| # Add in mips32 tests as they come online. |
| ./pydir/crosstest_generator.py -v --lit \ |
| --toolchain-root $(TOOLCHAIN_ROOT) \ |
| $(FORCEASM_FLAG) \ |
| $(FORCEASM_XTEST_EXCLUDES) \ |
| -i x8664,native,sse2 \ |
| -i mips32,native,Om1,simple_loop \ |
| -i mips32,native,Om1,test_strengthreduce |
| PNACL_BIN_PATH=$(PNACL_BIN_PATH) \ |
| $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_XTEST_TESTS) |
| else |
| check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime \ |
| exists-nonsfi-x8632 exists-nonsfi-arm32 crosstest/test_arith_ll.ll |
| # Do all native/sse2 tests, but only test_vector_ops for native/sse4.1. |
| # For (slow) sandboxed tests, limit to Om1/sse4.1. |
| # run.py (used to run the sandboxed xtests) does not support |
| # specifying -cpu cortex-a15 to qemu, hence we disable the |
| # hwdiv-arm tests. |
| ./pydir/crosstest_generator.py -v --lit \ |
| --toolchain-root $(TOOLCHAIN_ROOT) \ |
| $(FORCEASM_FLAG) \ |
| $(FORCEASM_XTEST_EXCLUDES) \ |
| -i x8632,native,sse2 \ |
| -i x8632,native,sse4.1,test_vector_ops \ |
| -i x8632,sandbox,sse4.1,Om1 \ |
| -i x8632,nonsfi,sse2,O2 \ |
| -i x8664,native,sse2 \ |
| -i x8664,native,sse4.1,test_vector_ops \ |
| -i x8664,sandbox,sse4.1,Om1 \ |
| -i arm32 \ |
| -e arm32,sandbox,hwdiv-arm |
| PNACL_BIN_PATH=$(PNACL_BIN_PATH) \ |
| $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_XTEST_TESTS) |
| check-xtest-lite: $(OBJDIR)/pnacl-sz make_symlink runtime \ |
| exists-nonsfi-x8632 exists-nonsfi-arm32 crosstest/test_arith_ll.ll |
| # Do all native/sse2/neon tests, which are relatively fast. |
| # Limit to test_global+mem_intrin for sandbox+nonsfi because sandbox and |
| # nonsfi builds are slow, and test_global and mem_intrin are the most |
| # common sources of problems. |
| ./pydir/crosstest_generator.py -v --lit \ |
| --toolchain-root $(TOOLCHAIN_ROOT) \ |
| $(FORCEASM_FLAG) \ |
| $(FORCEASM_XTEST_EXCLUDES) \ |
| -i x8632,native,sse2,O2 \ |
| -i x8664,native,sse2,O2 \ |
| -i arm32,native,neon,O2 \ |
| -i x8632,sse2,O2,test_global \ |
| -i x8632,sse2,O2,mem_intrin \ |
| -i x8664,sse2,O2,test_global \ |
| -i x8664,sse2,O2,mem_intrin \ |
| -i arm32,neon,O2,test_global \ |
| -i arm32,neon,O2,mem_intrin \ |
| -e x8664,nonsfi |
| PNACL_BIN_PATH=$(PNACL_BIN_PATH) \ |
| $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_XTEST_TESTS) |
| crosstest/test_arith_ll.ll: pydir/gen_test_arith_ll.py |
| python $< > $@ |
| endif |
| endif |
| |
| check-unit: $(OBJDIR)/run_unittests |
| $(OBJDIR)/run_unittests |
| |
| # List the spec2k components in roughly reverse order of runtime, to help with |
| # parallel execution speed. |
| ALLSPEC := 253.perlbmk 177.mesa 188.ammp 256.bzip2 164.gzip 179.art 183.equake \ |
| 175.vpr 176.gcc 181.mcf 186.crafty 197.parser 254.gap 255.vortex \ |
| 300.twolf 252.eon |
| .PHONY: $(ALLSPEC) |
| |
| TARGET := x8632 |
| ifeq ($(TARGET),x8632) |
| TARGETFLAG=x8632 |
| SETUP=SetupGccX8632Opt |
| SPEC := --filetype=obj |
| endif |
| ifeq ($(TARGET),x8664) |
| TARGETFLAG=x8664 |
| SETUP=SetupGccX8664Opt |
| SPEC := --filetype=obj |
| endif |
| ifeq ($(TARGET),arm32) |
| TARGETFLAG=arm32 |
| SETUP=SetupGccArmOpt |
| SPEC := --filetype=obj |
| endif |
| ifeq ($(TARGET),mips32) |
| # native_client/tests/spec2k/{Makefile.common,run_all.sh} do not currently |
| # have MIPS configs, so those would need to be added for proper Subzero |
| # testing. |
| TARGETFLAG=mips32 |
| SETUP=SetupGccMipsOpt |
| SPEC := --filetype=asm |
| endif |
| SPECFLAGS := -O2 |
| SPECRUN := --run |
| %.spec2k: % $(OBJDIR)/pnacl-sz make_symlink runtime |
| ./pydir/szbuild_spec2k.py -v \ |
| $(SPECFLAGS) --target=$(TARGETFLAG) $(SPEC) $< $(SPECRUN) |
| |
| ifdef MIPS |
| # Don't test spec2k on mips32, at least not yet. |
| check-spec: |
| else |
| check-spec: exists-spec $(ALLSPEC:=.spec2k) |
| endif |
| |
| check: check-lit check-unit check-xtest |
| |
| NONSFI_LOADER_X8632 = \ |
| $(NACL_ROOT)/scons-out/opt-linux-x86-32/obj/src/nonsfi/loader/nonsfi_loader |
| NONSFI_LOADER_ARM32 = \ |
| $(NACL_ROOT)/scons-out/opt-linux-arm/obj/src/nonsfi/loader/nonsfi_loader |
| SBTC_LIBFILE = $(SB_LLVM_PATH)/lib/libLLVMSupport.a |
| SPEC_SAMPLE_PEXE = $(NACL_ROOT)/tests/spec2k/176.gcc/gcc.opt.stripped.pexe |
| |
| exists-nonsfi-x8632: |
| @if [ ! -f $(NONSFI_LOADER_X8632) ] ; then \ |
| echo "Missing file $(NONSFI_LOADER_X8632)"; \ |
| echo "Consider running './scons nonsfi_loader'" \ |
| "in the native_client directory."; \ |
| exit 1 ; \ |
| fi |
| |
| exists-nonsfi-arm32: |
| @if [ ! -f $(NONSFI_LOADER_ARM32) ] ; then \ |
| echo "Missing file $(NONSFI_LOADER_ARM32)"; \ |
| echo "Consider running './scons platform=arm nonsfi_loader'" \ |
| "in the native_client directory."; \ |
| exit 1 ; \ |
| fi |
| |
| exists-sbtc: |
| @if [ ! -f $(SBTC_LIBFILE) ] ; then \ |
| echo "Missing file $(SBTC_LIBFILE)"; \ |
| echo "Consider running 'toolchain_build_pnacl.py --build-sbtc'."; \ |
| exit 1 ; \ |
| fi |
| |
| exists-spec: |
| @if [ ! -f $(SPEC_SAMPLE_PEXE) ] ; then \ |
| echo "Missing file $(SPEC_SAMPLE_PEXE)"; \ |
| echo "Consider running" \ |
| "'./run_all.sh BuildBenchmarks 0 SetupPnaclX8632Opt'" \ |
| "in the native_client/tests/spec2k directory."; \ |
| exit 1 ; \ |
| fi |
| |
| ifdef MIPS |
| check-presubmit presubmit: exists-sbtc |
| # Make sure clang-format gets run. |
| +make -f Makefile.standalone format |
| # Verify MINIMAL build, plus proper usage of REQUIRES in lit tests. |
| +make -f Makefile.standalone \ |
| MINIMAL=1 check |
| # Check that there are no g++ build errors or warnings. |
| +make -f Makefile.standalone \ |
| GPLUSPLUS=1 compile_only |
| # Run lit tests, cross tests, and unit tests. |
| +make -f Makefile.standalone \ |
| check |
| # Check a sandboxed translator build. |
| +make -f Makefile.standalone \ |
| DEBUG=1 sb |
| # Provide validation of user awesomeness! |
| echo Success |
| else |
| check-presubmit presubmit: exists-nonsfi-x8632 exists-nonsfi-arm32 \ |
| exists-sbtc exists-spec |
| # Make sure clang-format gets run. |
| +make -f Makefile.standalone format |
| # Verify MINIMAL build, plus proper usage of REQUIRES in lit tests. |
| +make -f Makefile.standalone \ |
| MINIMAL=1 check |
| # Check that there are no g++ build errors or warnings. |
| +make -f Makefile.standalone \ |
| GPLUSPLUS=1 compile_only |
| # Check the x86 assembler unit tests. |
| +make -f Makefile.standalone \ |
| DEBUG=1 CHECK_X86_ASM=1 check-unit sb |
| # Run lit tests, cross tests, unit tests, and spec2k/x86-32. |
| +make -f Makefile.standalone \ |
| check check-spec |
| # Run spec2k/x86-64. |
| +make -f Makefile.standalone \ |
| TARGET=x8664 check-spec |
| # Run spec2k/x86-64 with sandboxing. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-O2 --sandbox' TARGET=x8664 check-spec |
| # Build spec2k under -Om1/x86-32, to check for liveness errors. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-Om1' SPECRUN= check-spec |
| # Build spec2k under -Om1/x86-64, to check for liveness errors. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-Om1' TARGET=x8664 SPECRUN= check-spec |
| # Run spec2k for x86-32 without advanced phi lowering. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-O2 --sz=--phi-edge-split=0' check-spec |
| # Run spec2k for x86-64 without advanced phi lowering. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-O2 --sz=--phi-edge-split=0' TARGET=x8664 check-spec |
| # Run cross tests and lit tests to validate filetype=asm output. |
| +make -f Makefile.standalone \ |
| FORCEASM=1 check-xtest check-lit |
| # Build spec2k for arm32. |
| +make -f Makefile.standalone \ |
| TARGET=arm32 SPECRUN= check-spec |
| # Build spec2k under -Om1/arm32. |
| +make -f Makefile.standalone \ |
| TARGET=arm32 SPECFLAGS='-Om1' SPECRUN= check-spec |
| # Run a few spec2k tests for arm32 using qemu. Keep the list sorted in |
| # roughly reverse order of runtime. |
| +make -f Makefile.standalone \ |
| TARGET=arm32 ALLSPEC='252.eon 254.gap 176.gcc 181.mcf' check-spec |
| # Provide validation of user awesomeness! |
| echo Success |
| endif |
| |
| presubmit-lite: exists-nonsfi-x8632 exists-nonsfi-arm32 \ |
| exists-sbtc exists-spec |
| # Make sure clang-format gets run. |
| +make -f Makefile.standalone format |
| # Verify MINIMAL build, plus proper usage of REQUIRES in lit tests. |
| +make -f Makefile.standalone \ |
| MINIMAL=1 check sb-lite |
| # Check that there are no g++ build errors or warnings. |
| +make -f Makefile.standalone \ |
| GPLUSPLUS=1 compile_only |
| # Run lit tests, cross tests, unit tests, and spec2k/x86-32. |
| +make -f Makefile.standalone \ |
| check-lit check-unit check-spec |
| +make -f Makefile.standalone \ |
| check-xtest-lite |
| # Run spec2k/x86-64. |
| +make -f Makefile.standalone \ |
| TARGET=x8664 check-spec |
| # Build spec2k under -Om1/x86-32, to check for liveness errors. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-Om1' SPECRUN= check-spec |
| # Build spec2k under -Om1/x86-64, to check for liveness errors. |
| +make -f Makefile.standalone \ |
| SPECFLAGS='-Om1' TARGET=x8664 SPECRUN= check-spec |
| # Run cross tests and lit tests to validate filetype=asm output. |
| +make -f Makefile.standalone \ |
| FORCEASM=1 check-lit |
| +make -f Makefile.standalone \ |
| FORCEASM=1 check-xtest-lite |
| # Build spec2k under -Om1/arm32. |
| +make -f Makefile.standalone \ |
| TARGET=arm32 SPECFLAGS='-Om1' SPECRUN= check-spec |
| # Run a few spec2k tests for arm32 using qemu. Keep the list sorted in |
| # roughly reverse order of runtime. |
| +make -f Makefile.standalone \ |
| TARGET=arm32 ALLSPEC='254.gap 176.gcc 181.mcf' check-spec |
| # Provide validation of user awesomeness! |
| echo Success |
| |
| FORMAT_BLACKLIST = |
| # Add one of the following lines for each source file to ignore. |
| FORMAT_BLACKLIST += ! -name IceParseInstsTest.cpp |
| FORMAT_BLACKLIST += ! -name IceParseTypesTest.cpp |
| FORMAT_BLACKLIST += ! -name assembler_arm.h |
| FORMAT_BLACKLIST += ! -name assembler_arm.cc |
| FORMAT_BLACKLIST += ! -path "./wasm-install/*" |
| FORMAT_BLACKLIST += ! -path "./pnacl-llvm/*" |
| format: |
| $(CLANG_FORMAT_PATH)/clang-format -style=LLVM -i \ |
| `find . -regex '.*\.\(c\|h\|cpp\)' $(FORMAT_BLACKLIST)` |
| |
| format-diff: |
| git diff -U0 `git merge-base HEAD master` | \ |
| PATH=$(PNACL_BIN_PATH):$(PATH) \ |
| $(LLVM_SRC_PATH)/../clang/tools/clang-format/clang-format-diff.py \ |
| -p1 -style=LLVM -i |
| |
| bloat: make_symlink |
| nm -C -S -l pnacl-sz | \ |
| bloat/bloat.py --nm-output=/dev/stdin syms > build/pnacl-sz.bloat.json |
| @echo See Subzero size breakdown in bloat/pnacl-sz.bloat.html |
| |
| bloat-sb: sb_make_symlink |
| $(foreach nexe,$(NEXES),nm -C -S -l $(nexe) | bloat/bloat.py \ |
| --nm-output=/dev/stdin syms > build/$(notdir $(nexe)).bloat.json;) |
| @echo "See Subzero size breakdown in:" |
| @$(foreach nexe,$(NEXES),echo " bloat/$(notdir $(nexe)).bloat.html";) |
| |
| docs: |
| make -C docs -f Makefile.standalone |
| |
| help: |
| @cat Makefile.standalone-help/help.txt |
| |
| help-check-lit: |
| @cat Makefile.standalone-help/check-lit.txt |
| |
| help-check-xtest: |
| @cat Makefile.standalone-help/check-xtest.txt |
| |
| clean: |
| rm -rf pnacl-sz *.o $(foreach nexe,$(NEXES),$(notdir $(nexe))) \ |
| $(OBJDIR) $(SB_OBJDIR) $(SBB_OBJDIR) build/*.bloat.json |
| |
| clean-all: clean |
| rm -rf build/ crosstest/Output/ |