blob: a91798587862156cd66aebf3f98f2b5ceaab3307 [file] [log] [blame]
# 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)
# 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
OBJDIR := $(OBJDIR)+Min
BASE_CXX_DEFINES += -DALLOW_DUMP=0 -DALLOW_LLVM_CL=0 -DALLOW_LLVM_IR=0 \
-DALLOW_LLVM_IR_AS_INPUT=0 -DALLOW_MINIMAL_BUILD=1
else
BASE_CXX_DEFINES += -DALLOW_DUMP=1 -DALLOW_LLVM_CL=1 -DALLOW_LLVM_IR=1 \
-DALLOW_LLVM_IR_AS_INPUT=1 -DALLOW_MINIMAL_BUILD=0
endif
SB_CXX_DEFINES := $(BASE_CXX_DEFINES) -DPNACL_BROWSER_TRANSLATOR=1
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 llvm-mc uses different
# relocations for pushing return addresses onto the stack.
# 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
SB_OBJDIR := $(OBJDIR)+Sandboxed
$(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
CLANG_FORMAT_PATH ?= ../../out/llvm_x86_64_linux_work/Release+Asserts/bin
endif
LLVM_LDFLAGS := $(LLVM_LIBS) \
`$(PNACL_BIN_PATH)/llvm-config --ldflags` \
`$(PNACL_BIN_PATH)/llvm-config --system-libs`
SB_LLVM_LDFLAGS := $(LLVM_LIBS_LIST) \
-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
# 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 -Werror -fno-rtti \
-fno-exceptions $(OPTLEVEL) $(ASSERTIONS) -g -pedantic \
$(LLVM_EXTRA_WARNINGS) $(CXX_EXTRA)
CXXFLAGS := $(LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(CXX_DEFINES) $(HOST_FLAGS) \
$(STDLIB_FLAGS)
SB_CXXFLAGS := $(SB_LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(SB_CXX_DEFINES)
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 \
IceInstARM32.cpp \
IceInstMIPS32.cpp \
IceInstX8632.cpp \
IceInstX8664.cpp \
IceTargetLowering.cpp \
IceTargetLoweringARM32.cpp \
IceTargetLoweringMIPS32.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 \
IceOperand.cpp \
IceRegAlloc.cpp \
IceRNG.cpp \
IceSwitchLowering.cpp \
IceThreading.cpp \
IceTimerTree.cpp \
IceTranslator.cpp \
IceTypes.cpp \
main.cpp \
PNaClTranslator.cpp
ifndef MINIMAL
SRCS += \
IceConverter.cpp \
IceTypeConverter.cpp
endif
OBJS=$(patsubst %.cpp, $(OBJDIR)/%.o, $(SRCS))
SB_OBJS=$(patsubst %.cpp, $(SB_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))
# Keep all the first target so it's the default.
all: $(OBJDIR)/pnacl-sz make_symlink runtime
ifdef TSAN
sb:
@echo "Skipping pnacl-sz.*.nexe: TSAN isn't supported under NaCl."
else
sb: $(SB_OBJDIR)/pnacl-sz.x86-32.nexe
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)
.PHONY: all compile_only make_symlink runtime bloat sb docs
compile_only: $(OBJS)
$(OBJDIR)/pnacl-sz: $(OBJS)
$(CXX) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) \
-Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib)
$(SB_OBJDIR)/pnacl-sz.x86-32.nexe: $(SB_OBJS)
$(eval PNACL_SZ_BASE := $(patsubst %.nexe, %, $@))
$(SB_CXX) $(SB_LDFLAGS) -o $(PNACL_SZ_BASE).nonfinal.pexe $^ \
$(SB_LLVM_LDFLAGS)
$(SB_TRANSLATE) -arch x86-32 $(PNACL_SZ_BASE).nonfinal.pexe -o $@ \
--allow-llvm-bitcode-input
src/IceRegistersARM32.def: pydir/gen_arm32_reg_tables.py
python $< > $@
# TODO(stichnot): Be more precise than "*.h" here and elsewhere.
$(OBJS): $(OBJDIR)/%.o: src/%.cpp src/*.h src/*.def
$(CXX) -c $(CXXFLAGS) $< -o $@
$(SB_OBJS): $(SB_OBJDIR)/%.o: src/%.cpp src/*.h src/*.def
$(SB_CXX) -c $(SB_CXXFLAGS) $< -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)
$(UNITTEST_OBJS): $(OBJDIR)/unittest/%.o: unittest/%.cpp unittest/*.h \
src/*.h src/*.def
$(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 \
$< -o $@
$(OBJS): | $(OBJDIR)
$(SB_OBJS): | $(SB_OBJDIR)
$(UNITTEST_OBJS): | $(OBJDIR)/unittest $(OBJDIR)/unittest/AssemblerX8632 \
$(OBJDIR)/unittest/AssemblerX8664
$(OBJDIR):
@mkdir -p $@
$(SB_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
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
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)
check-lit: $(OBJDIR)/pnacl-sz make_symlink
PNACL_BIN_PATH=$(PNACL_BIN_PATH) \
$(LLVM_SRC_PATH)/utils/lit/lit.py -sv tests_lit \
$(FORCEASM_LIT_TEST_EXCLUDES) $(FORCEASM_LIT_PARAM)
ifdef MINIMAL
check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime
@echo "Crosstests disabled, minimal build"
else
check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime
# Do all native/sse2 tests, but only test_vector_ops for native/sse4.1.
# For (slow) sandboxed tests, limit to Om1/sse4.1.
./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,neon \
-e arm32,nonsfi \
-e arm32,neon,test_vector_ops \
-e arm32,neon,test_select
PNACL_BIN_PATH=$(PNACL_BIN_PATH) \
$(LLVM_SRC_PATH)/utils/lit/lit.py -sv crosstest/Output
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 := -O2 --filetype=obj
endif
ifeq ($(TARGET),x8664)
TARGETFLAG=x8664
SETUP=SetupGccX8664Opt
SPEC := -O2 --filetype=obj
endif
ifeq ($(TARGET),arm32)
TARGETFLAG=arm32
SETUP=SetupGccArmOpt
SPEC := -O2 --filetype=asm
endif
SPECFLAGS :=
SPECBUILDONLY := false
%.spec2k: % $(OBJDIR)/pnacl-sz make_symlink runtime
./pydir/szbuild_spec2k.py -v --force \
$(SPECFLAGS) --target=$(TARGETFLAG) $(SPEC) $<
$(SPECBUILDONLY) || ( cd ../../../tests/spec2k; \
./run_all.sh RunTimedBenchmarks $(SETUP) train $< )
check-spec: $(ALLSPEC:=.spec2k)
check: check-lit check-unit check-xtest
check-presubmit presubmit:
# 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
# Run lit tests, cross tests, unit tests, and spec2k/x86-32.
+make -f Makefile.standalone \
check check-spec
# Build spec2k under -Om1/x86-32, to check for liveness errors.
+make -f Makefile.standalone \
SPECFLAGS='-Om1' SPECBUILDONLY=true check-spec
# Run spec2k for x86-32 without advanced phi lowering.
+make -f Makefile.standalone \
SPECFLAGS='--sz=--phi-edge-split=0' 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 SPECBUILDONLY=true check-spec
# Build spec2k under -Om1/arm32.
+make -f Makefile.standalone \
TARGET=arm32 SPECFLAGS='-Om1' SPECBUILDONLY=true check-spec
# Run a few spec2k tests for arm32 using qemu.
+make -f Makefile.standalone \
TARGET=arm32 ALLSPEC='176.gcc 181.mcf 254.gap' 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:
$(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
docs:
make -C docs -f Makefile.standalone
clean:
rm -rf pnacl-sz *.o $(OBJDIR) $(SB_OBJDIR) build/pnacl-sz.bloat.json
clean-all: clean
rm -rf build/ crosstest/Output/