861 lines
29 KiB
Text
861 lines
29 KiB
Text
# 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/
|