blob: 4fbe9ea3712d5118be4c823f5538eccc837c02f3 [file] [log] [blame]
Derek Schuffbc643132014-05-22 16:39:25 -07001# The following variables will likely need to be modified, depending on where
2# and how you built LLVM & Clang. They can be overridden in a command-line
3# invocation of make, like:
4#
Jim Stichnoth0a9e1262015-04-21 09:59:21 -07005# make LLVM_SRC_PATH=<path> LIBCXX_INSTALL_PATH=<path> CLANG_PATH=<path> \
Jan Voung44c3a802015-03-27 16:29:08 -07006# PNACL_BIN_PATH=<path> ...
Derek Schuffbc643132014-05-22 16:39:25 -07007#
8
9# LLVM_SRC_PATH is the path to the root of the checked out source code. This
10# directory should contain the configure script, the include/ and lib/
11# directories of LLVM, Clang in tools/clang/, etc.
12# Alternatively, if you're building vs. a binary download of LLVM, then
13# LLVM_SRC_PATH can point to the main untarred directory.
14LLVM_SRC_PATH ?= ../llvm
15
Jan Voung44c3a802015-03-27 16:29:08 -070016# The x86-32-specific sandboxed translator directory.
17# It holds sandboxed versions of libraries and binaries.
18SB_LLVM_PATH ?= $(shell readlink -e \
Jim Stichnoth2e7de232015-11-02 08:25:57 -080019 ../../out/sandboxed_translators_work/translator-i686/llvm-sb/Release)
Jan Voung44c3a802015-03-27 16:29:08 -070020
21# NACL_ROOT is the root of the native client repository.
22NACL_ROOT ?= $(shell python -c "import sys; sys.path.insert(0, 'pydir'); \
Jim Stichnoth2e7de232015-11-02 08:25:57 -080023 import utils; print utils.FindBaseNaCl()")
Jan Voung44c3a802015-03-27 16:29:08 -070024
Jan Voung8e32fed2015-06-17 10:16:23 -070025# TOOLCHAIN_ROOT is the location of NaCl/PNaCl toolchains and other
26# tools like qemu.
27TOOLCHAIN_ROOT ?= $(shell readlink -e $(NACL_ROOT)/toolchain/linux_x86)
28
Jan Voung68a06332015-03-05 14:33:38 -080029# PNACL_TOOLCHAIN_ROOT is the location of the PNaCl toolchain.
30# This is used as the default root for finding binutils, libcxx, etc.
Jan Voung8e32fed2015-06-17 10:16:23 -070031PNACL_TOOLCHAIN_ROOT ?= $(shell readlink -e $(TOOLCHAIN_ROOT)/pnacl_newlib_raw)
Jan Voung44c3a802015-03-27 16:29:08 -070032
33# The location of PNaCl tools (e.g., binutils objdump, pnacl-clang++, etc.).
34PNACL_BIN_PATH ?= $(shell readlink -e $(PNACL_TOOLCHAIN_ROOT)/bin)
Karl Schimpf8fcefc32014-09-15 12:56:50 -070035
Reed Kotler2c3c82e2016-01-21 20:33:08 -080036# Allow tests to be overridden, e.g.:
37# make -f Makefile.standalone check-lit \
38# CHECK_LIT_TESTS="tests_lit/llvm2ice_tests/{alloc,arith}.ll"
39# make -f Makefile.standalone check-xtest \
40# CHECK_XTEST_TESTS=crosstest/Output/simple_loop_x8632_native_O2_sse2.xtest
41CHECK_LIT_TESTS ?= tests_lit
42CHECK_XTEST_TESTS ?= crosstest/Output
43
Jim Stichnoth0a9e1262015-04-21 09:59:21 -070044# Hack to auto-detect autoconf versus cmake build of LLVM. If the LLVM tools
Jim Stichnothe5b58fb2015-06-01 15:17:20 -070045# were dynamically linked with something like libLLVM-3.7svn.so, it is an
Jim Stichnoth0a9e1262015-04-21 09:59:21 -070046# autoconf build, otherwise it is a cmake build. AUTOCONF is set to 0 for
47# cmake, nonzero for autoconf.
48AUTOCONF ?= $(shell ldd $(PNACL_BIN_PATH)/opt | grep -c libLLVM-)
49
Jan Voung68a06332015-03-05 14:33:38 -080050# CLANG_PATH is the location of the clang compiler to use for building
51# the host binaries.
Karl Schimpf8fcefc32014-09-15 12:56:50 -070052CLANG_PATH ?= $(shell readlink -e \
Jim Stichnoth2e7de232015-11-02 08:25:57 -080053 $(NACL_ROOT)/../third_party/llvm-build/Release+Asserts/bin)
Karl Schimpf8fcefc32014-09-15 12:56:50 -070054
Jan Voung68a06332015-03-05 14:33:38 -080055# LIBCXX_INSTALL_PATH is the directory where libc++ is located. It should
56# contain header files and corresponding libraries. This is used for
57# building the host binaries in conjuction with clang.
58LIBCXX_INSTALL_PATH ?= $(PNACL_TOOLCHAIN_ROOT)
Karl Schimpf9d928542015-04-16 15:08:05 -070059STDLIB_FLAGS := -stdlib=libc++ -I$(LIBCXX_INSTALL_PATH)/include/c++/v1
Jan Voung68a06332015-03-05 14:33:38 -080060
Jan Voung4c127ba2014-09-19 13:11:36 -070061HOST_ARCH ?= x86_64
Jan Voung839c4ce2014-07-28 15:19:43 -070062ifeq ($(HOST_ARCH),x86_64)
Jim Stichnoth6c6adf12015-04-07 14:22:25 -070063 HOST_FLAGS = -m64
Jan Voung839c4ce2014-07-28 15:19:43 -070064else
65 ifeq ($(HOST_ARCH),x86)
Jim Stichnoth6c6adf12015-04-07 14:22:25 -070066 HOST_FLAGS = -m32
Jan Voung839c4ce2014-07-28 15:19:43 -070067 endif
68endif
69
Jim Stichnothfddef242014-09-26 18:53:41 -070070ifdef DEBUG
71 OBJDIR = build/Debug
72 OPTLEVEL = -O0
Jan Voung44c3a802015-03-27 16:29:08 -070073 LINKOPTLEVEL = -O0
Jim Stichnothfddef242014-09-26 18:53:41 -070074else
75 OBJDIR = build/Release
Jim Stichnotha49e9d92014-12-07 14:25:34 -080076 OPTLEVEL = -O2 -ffunction-sections -fdata-sections
Jan Voung44c3a802015-03-27 16:29:08 -070077 LINKOPTLEVEL = -O2
Jim Stichnothfddef242014-09-26 18:53:41 -070078endif
79
Karl Schimpfb262c5e2014-10-27 14:41:57 -070080# The list of CXX defines that are dependent on build parameters.
Jan Voung44c3a802015-03-27 16:29:08 -070081BASE_CXX_DEFINES =
Jim Stichnothfa4efea2015-01-27 05:06:03 -080082CXX_EXTRA =
83LD_EXTRA =
Karl Schimpfb262c5e2014-10-27 14:41:57 -070084
85ifdef MINIMAL
Jim Stichnothe3c02c22014-12-05 14:16:07 -080086 NOASSERT = 1
Karl Schimpfb262c5e2014-10-27 14:41:57 -070087 OBJDIR := $(OBJDIR)+Min
Jan Voung44c3a802015-03-27 16:29:08 -070088 BASE_CXX_DEFINES += -DALLOW_DUMP=0 -DALLOW_LLVM_CL=0 -DALLOW_LLVM_IR=0 \
Jim Stichnoth0d4fc922015-12-13 21:36:33 -080089 -DALLOW_LLVM_IR_AS_INPUT=0 -DALLOW_MINIMAL_BUILD=1
Karl Schimpfb262c5e2014-10-27 14:41:57 -070090else
Jan Voung44c3a802015-03-27 16:29:08 -070091 BASE_CXX_DEFINES += -DALLOW_DUMP=1 -DALLOW_LLVM_CL=1 -DALLOW_LLVM_IR=1 \
Jim Stichnoth0d4fc922015-12-13 21:36:33 -080092 -DALLOW_LLVM_IR_AS_INPUT=1 -DALLOW_MINIMAL_BUILD=0
Karl Schimpfb262c5e2014-10-27 14:41:57 -070093endif
94
Jan Voung44c3a802015-03-27 16:29:08 -070095SB_CXX_DEFINES := $(BASE_CXX_DEFINES) -DPNACL_BROWSER_TRANSLATOR=1
96CXX_DEFINES := $(BASE_CXX_DEFINES) -DPNACL_BROWSER_TRANSLATOR=0
97
Jim Stichnoth9c234e22014-10-01 09:28:21 -070098ifdef NOASSERT
99 ASSERTIONS = -DNDEBUG
100else
101 ASSERTIONS =
102 OBJDIR := $(OBJDIR)+Asserts
103endif
104
Andrew Scull6ef79492015-09-09 15:50:42 -0700105ifdef UBSAN
106 OBJDIR := $(OBJDIR)+UBSan
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800107 CXX_EXTRA += -fsanitize=undefined -fno-sanitize=vptr \
108 -fno-sanitize=nonnull-attribute
Andrew Scull6ef79492015-09-09 15:50:42 -0700109 LD_EXTRA += -fsanitize=undefined
110endif
111
112ifdef UBSAN_TRAP
113 OBJDIR := $(OBJDIR)+UBSan_Trap
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800114 CXX_EXTRA += -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error \
115 -fno-sanitize=vptr -fno-sanitize=nonnull-attribute
Andrew Scull6ef79492015-09-09 15:50:42 -0700116 LD_EXTRA += -fsanitize=undefined-trap
117endif
118
Jim Stichnothfa4efea2015-01-27 05:06:03 -0800119ifdef TSAN
120 OBJDIR := $(OBJDIR)+TSan
121 CXX_EXTRA += -fsanitize=thread
122 LD_EXTRA += -fsanitize=thread
123endif
124
Andrew Scull86df4e92015-07-30 13:54:44 -0700125ifdef ASAN
126 OBJDIR := $(OBJDIR)+ASan
127 CXX_EXTRA += -fsanitize=address
128 LD_EXTRA += -fsanitize=address
129endif
130
Andrew Scull6ef79492015-09-09 15:50:42 -0700131ifdef MSAN
Andrew Scull00741a02015-09-16 19:04:09 -0700132 # TODO(ascull): this has an as yet undiagnosed uninitialized memory access
Andrew Scull6ef79492015-09-09 15:50:42 -0700133 OBJDIR := $(OBJDIR)+MSan
134 CXX_EXTRA += -fsanitize=memory
135 LD_EXTRA += -fsanitize=memory
136endif
137
David Sehrb19d39c2016-01-13 14:17:37 -0800138ifdef FORCEASM
139 FORCEASM_FLAG = --filetype=asm
140 # With --filetype=asm and --sandbox, the llvm-mc assembler emits the lock and
141 # 16-bit prefixes in the "wrong" order, causing the validator to reject the
142 # resulting nexe. So we just disable those tests for now.
143 FORCEASM_XTEST_EXCLUDES = -e x8632,sandbox,test_sync_atomic
144 FORCEASM_LIT_PARAM = --param=FORCEASM
John Porto27fddcc2016-02-02 15:06:09 -0800145 # x86 sandboxing lit tests are disabled because filetype=asm does not
146 # handle bundle_lock pad-to-end correctly.
John Porto56958cb2016-01-14 09:18:18 -0800147 # TODO(jpp): fix this.
148 FORCEASM_LIT_TEST_EXCLUDES = --filter='^(?!.*/x86/sandboxing.ll).*'
David Sehrb19d39c2016-01-13 14:17:37 -0800149else
150 FORCEASM_FLAG =
151 FORCEASM_XTEST_EXCLUDES =
152 FORCEASM_LIT_PARAM =
John Porto56958cb2016-01-14 09:18:18 -0800153 FORCEASM_LIT_TEST_EXCLUDES =
David Sehrb19d39c2016-01-13 14:17:37 -0800154endif
155
Jan Voung44c3a802015-03-27 16:29:08 -0700156SB_OBJDIR := $(OBJDIR)+Sandboxed
157
Derek Schuffbc643132014-05-22 16:39:25 -0700158$(info -----------------------------------------------)
159$(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH))
Jan Voung44c3a802015-03-27 16:29:08 -0700160$(info Using SB_LLVM_PATH = $(SB_LLVM_PATH))
161$(info Using NACL_ROOT = $(NACL_ROOT))
Jan Voung8e32fed2015-06-17 10:16:23 -0700162$(info Using TOOLCHAIN_ROOT = $(TOOLCHAIN_ROOT))
Jan Voung68a06332015-03-05 14:33:38 -0800163$(info Using PNACL_TOOLCHAIN_ROOT = $(PNACL_TOOLCHAIN_ROOT))
Jan Voung44c3a802015-03-27 16:29:08 -0700164$(info Using PNACL_BIN_PATH = $(PNACL_BIN_PATH))
Karl Schimpf8fcefc32014-09-15 12:56:50 -0700165$(info Using CLANG_PATH = $(CLANG_PATH))
Jan Voung68a06332015-03-05 14:33:38 -0800166$(info Using LIBCXX_INSTALL_PATH = $(LIBCXX_INSTALL_PATH))
Jan Voung839c4ce2014-07-28 15:19:43 -0700167$(info Using HOST_ARCH = $(HOST_ARCH))
Derek Schuffbc643132014-05-22 16:39:25 -0700168$(info -----------------------------------------------)
169
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700170LLVM_CXXFLAGS := `$(PNACL_BIN_PATH)/llvm-config --cxxflags`
Jan Voung44c3a802015-03-27 16:29:08 -0700171SB_LLVM_CXXFLAGS := $(LLVM_CXXFLAGS)
172
173# Listing specific libraries that are needed for pnacl-sz
174# and the unittests, since we build "tools-only" for the
175# sandboxed_translators (which doesn't include every library
176# listed by llvm-config).
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700177
178LLVM_LIBS_LIST := -lLLVMIRReader -lLLVMBitReader -lLLVMNaClBitTestUtils \
179 -lLLVMNaClBitReader -lLLVMNaClBitAnalysis -lLLVMNaClBitWriter \
180 -lLLVMAsmParser -lLLVMNaClAnalysis -lLLVMCore -lLLVMSupport
181
182ifeq ($(AUTOCONF), 0)
183 # LLVM cmake build
Karl Schimpf28f3f732015-06-24 09:32:40 -0700184 LLVM_LIBS := $(LLVM_LIBS_LIST)
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700185 # For the cmake build, the gtest libs end up in the same place as the LLVM
186 # libs, so no "-L..." arg is needed.
187 GTEST_LIB_PATH ?=
188 CLANG_FORMAT_PATH ?= $(PNACL_BIN_PATH)
189else
190 # LLVM autoconf build
Jim Stichnothe5b58fb2015-06-01 15:17:20 -0700191 LLVM_LIBS := -lLLVM-3.7svn
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700192 GTEST_LIB_PATH ?= -L../../out/llvm_x86_64_linux_work/Release+Asserts/lib
193 CLANG_FORMAT_PATH ?= ../../out/llvm_x86_64_linux_work/Release+Asserts/bin
194endif
195
Jan Voung44c3a802015-03-27 16:29:08 -0700196LLVM_LDFLAGS := $(LLVM_LIBS) \
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700197 `$(PNACL_BIN_PATH)/llvm-config --ldflags` \
198 `$(PNACL_BIN_PATH)/llvm-config --system-libs`
199SB_LLVM_LDFLAGS := $(LLVM_LIBS_LIST) \
Jan Voung44c3a802015-03-27 16:29:08 -0700200 -L$(SB_LLVM_PATH)/lib
Derek Schuffbc643132014-05-22 16:39:25 -0700201
Jim Stichnoth5e06f9f2014-09-17 08:41:21 -0700202CCACHE := `command -v ccache`
203CXX := CCACHE_CPP2=yes $(CCACHE) $(CLANG_PATH)/clang++
Jan Voung44c3a802015-03-27 16:29:08 -0700204SB_CXX := CCACHE_CPP2=yes $(CCACHE) $(PNACL_BIN_PATH)/pnacl-clang++
205SB_TRANSLATE := $(PNACL_BIN_PATH)/pnacl-translate
Jan Voung839c4ce2014-07-28 15:19:43 -0700206
Jan Voungc2648c22015-07-30 21:29:14 -0700207# Extra warnings that LLVM's build system adds in addition to -Wall.
208LLVM_EXTRA_WARNINGS := -Wcovered-switch-default
209
Jim Stichnothcaeaa272016-01-10 12:53:44 -0800210# Use g++ to compile, to check for errors/warnings that clang++ might have
211# missed. It's unlikely to link, unless LLVM was also built with g++, so the
212# compile_only target should be used. Note: This ifdef section is deliberately
213# placed here instead of with the other ifdef sections, so that its redefinition
214# of CXX/STDLIB_FLAGS/LLVM_EXTRA_WARNINGS follows their normal definitions.
215ifdef GPLUSPLUS
216 CXX := CCACHE_CPP2=yes $(CCACHE) g++
217 STDLIB_FLAGS :=
Jim Stichnothb0051df2016-01-13 11:39:15 -0800218 LLVM_EXTRA_WARNINGS := \
219 -Wcast-qual \
220 -Wno-comment \
221 -Wno-long-long \
222 -Wno-maybe-uninitialized \
223 -Wno-missing-field-initializers \
224 -Wno-unused-parameter \
225 -Wwrite-strings
Jim Stichnothcaeaa272016-01-10 12:53:44 -0800226 OBJDIR := $(OBJDIR)+Gplusplus
227endif
228
Jan Voung44c3a802015-03-27 16:29:08 -0700229BASE_CXXFLAGS := -std=gnu++11 -Wall -Wextra -Werror -fno-rtti \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800230 -fno-exceptions $(OPTLEVEL) $(ASSERTIONS) -g -pedantic \
231 $(LLVM_EXTRA_WARNINGS) $(CXX_EXTRA)
Jan Voung44c3a802015-03-27 16:29:08 -0700232
233CXXFLAGS := $(LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(CXX_DEFINES) $(HOST_FLAGS) \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800234 $(STDLIB_FLAGS)
Jan Voung44c3a802015-03-27 16:29:08 -0700235SB_CXXFLAGS := $(SB_LLVM_CXXFLAGS) $(BASE_CXXFLAGS) $(SB_CXX_DEFINES)
236
Jim Stichnothfa4efea2015-01-27 05:06:03 -0800237LDFLAGS := $(HOST_FLAGS) -L$(LIBCXX_INSTALL_PATH)/lib -Wl,--gc-sections \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800238 $(LD_EXTRA) $(STDLIB_FLAGS)
Jan Voung44c3a802015-03-27 16:29:08 -0700239# Not specifying -Wl,--gc-sections but instead doing bitcode linking GC w/ LTO.
240SB_LDFLAGS := $(LINKOPTLEVEL) $(LD_EXTRA)
Derek Schuffbc643132014-05-22 16:39:25 -0700241
Jim Stichnothc59288b2015-11-09 11:38:40 -0800242# List the target-specific source files first, which generally take longer to
243# compile, in the hope of improving parallel build time.
Karl Schimpfab06df32014-10-29 14:58:25 -0700244SRCS = \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800245 IceAssemblerARM32.cpp \
Jim Stichnothc59288b2015-11-09 11:38:40 -0800246 IceInstARM32.cpp \
247 IceInstMIPS32.cpp \
248 IceInstX8632.cpp \
249 IceInstX8664.cpp \
250 IceTargetLowering.cpp \
251 IceTargetLoweringARM32.cpp \
252 IceTargetLoweringMIPS32.cpp \
David Sehr6b80cf12016-01-21 23:16:58 -0800253 IceTargetLoweringX86.cpp \
Jim Stichnothc59288b2015-11-09 11:38:40 -0800254 IceTargetLoweringX8632.cpp \
255 IceTargetLoweringX8664.cpp \
256 IceAssembler.cpp \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800257 IceBrowserCompileServer.cpp \
258 IceCfg.cpp \
259 IceCfgNode.cpp \
260 IceClFlags.cpp \
261 IceCompiler.cpp \
262 IceCompileServer.cpp \
263 IceELFObjectWriter.cpp \
264 IceELFSection.cpp \
265 IceFixups.cpp \
266 IceGlobalContext.cpp \
267 IceGlobalInits.cpp \
268 IceInst.cpp \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800269 IceIntrinsics.cpp \
270 IceLiveness.cpp \
271 IceLoopAnalyzer.cpp \
272 IceOperand.cpp \
273 IceRegAlloc.cpp \
274 IceRNG.cpp \
275 IceSwitchLowering.cpp \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800276 IceThreading.cpp \
277 IceTimerTree.cpp \
278 IceTranslator.cpp \
279 IceTypes.cpp \
280 main.cpp \
281 PNaClTranslator.cpp
Derek Schuffbc643132014-05-22 16:39:25 -0700282
Karl Schimpfab06df32014-10-29 14:58:25 -0700283ifndef MINIMAL
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800284 SRCS += \
285 IceConverter.cpp \
286 IceTypeConverter.cpp
Karl Schimpfab06df32014-10-29 14:58:25 -0700287endif
288
Jim Stichnothfddef242014-09-26 18:53:41 -0700289OBJS=$(patsubst %.cpp, $(OBJDIR)/%.o, $(SRCS))
Jan Voung44c3a802015-03-27 16:29:08 -0700290SB_OBJS=$(patsubst %.cpp, $(SB_OBJDIR)/%.o, $(SRCS))
Derek Schuffbc643132014-05-22 16:39:25 -0700291
Jan Voung08c3bcd2014-12-01 17:55:16 -0800292UNITTEST_SRCS = \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800293 BitcodeMunge.cpp \
294 IceELFSectionTest.cpp \
295 IceParseInstsTest.cpp
John Porto59f2d922015-07-31 13:45:48 -0700296
297# The X86 assembler tests take too long to compile. Given how infrequently the
298# assembler will change, we disable them.
299ifdef CHECK_X86_ASM
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800300 ifndef DEBUG
301 $(error Run check-unit with DEBUG=1 lest your machine perish)
302 endif
John Porto59f2d922015-07-31 13:45:48 -0700303 UNITTEST_SRCS += AssemblerX8632/LowLevel.cpp \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800304 AssemblerX8632/DataMov.cpp \
305 AssemblerX8632/Locked.cpp \
306 AssemblerX8632/GPRArith.cpp \
307 AssemblerX8632/XmmArith.cpp \
308 AssemblerX8632/ControlFlow.cpp \
309 AssemblerX8632/Other.cpp \
310 AssemblerX8632/X87.cpp \
311 AssemblerX8664/LowLevel.cpp \
312 AssemblerX8664/DataMov.cpp \
313 AssemblerX8664/Locked.cpp \
314 AssemblerX8664/GPRArith.cpp \
315 AssemblerX8664/XmmArith.cpp \
316 AssemblerX8664/ControlFlow.cpp \
317 AssemblerX8664/Other.cpp
John Porto59f2d922015-07-31 13:45:48 -0700318endif
Jan Voung08c3bcd2014-12-01 17:55:16 -0800319
320UNITTEST_OBJS = $(patsubst %.cpp, $(OBJDIR)/unittest/%.o, $(UNITTEST_SRCS))
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800321UNITTEST_LIB_OBJS = $(filter-out $(OBJDIR)/main.o,$(OBJS))
Jan Voung08c3bcd2014-12-01 17:55:16 -0800322
Derek Schuffbc643132014-05-22 16:39:25 -0700323# Keep all the first target so it's the default.
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800324all: $(OBJDIR)/pnacl-sz make_symlink runtime
Derek Schuffbc643132014-05-22 16:39:25 -0700325
Jan Voung44c3a802015-03-27 16:29:08 -0700326ifdef TSAN
327sb:
328 @echo "Skipping pnacl-sz.*.nexe: TSAN isn't supported under NaCl."
329else
330sb: $(SB_OBJDIR)/pnacl-sz.x86-32.nexe
331endif
332
Karl Schimpf6f9ba112015-06-22 13:20:23 -0700333# SHOW_BUILD_ATTS is an executable that is run to show what build
334# attributes were used to build pnacl-sz.
Karl Schimpfcb6e95a2015-07-23 09:10:03 -0700335SHOW_BUILD_ATTS = $(OBJDIR)/pnacl-sz --build-atts
Karl Schimpf6f9ba112015-06-22 13:20:23 -0700336
Karl Schimpf6af63362014-10-29 14:55:00 -0700337# Creates symbolic link so that testing is easier. Also runs
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800338# pnacl-sz to verify that the defines flags have valid values,
Karl Schimpf6af63362014-10-29 14:55:00 -0700339# as well as describe the corresponding build attributes.
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800340make_symlink: $(OBJDIR)/pnacl-sz
341 rm -rf pnacl-sz
342 ln -s $(OBJDIR)/pnacl-sz
Karl Schimpf6af63362014-10-29 14:55:00 -0700343 @echo "Build Attributes:"
Karl Schimpf6f9ba112015-06-22 13:20:23 -0700344 @$(SHOW_BUILD_ATTS)
Derek Schuffbc643132014-05-22 16:39:25 -0700345
Reed Kotler2c3c82e2016-01-21 20:33:08 -0800346.PHONY: all compile_only make_symlink runtime bloat sb docs help \
347 help-check-lit help-check-xtest
Jim Stichnoth23bee882015-11-17 06:14:05 -0800348
349compile_only: $(OBJS)
Jim Stichnothfddef242014-09-26 18:53:41 -0700350
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800351$(OBJDIR)/pnacl-sz: $(OBJS)
Jim Stichnoth33246422014-11-24 14:36:23 -0800352 $(CXX) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800353 -Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib)
Derek Schuffbc643132014-05-22 16:39:25 -0700354
Jan Voung44c3a802015-03-27 16:29:08 -0700355$(SB_OBJDIR)/pnacl-sz.x86-32.nexe: $(SB_OBJS)
356 $(eval PNACL_SZ_BASE := $(patsubst %.nexe, %, $@))
357 $(SB_CXX) $(SB_LDFLAGS) -o $(PNACL_SZ_BASE).nonfinal.pexe $^ \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800358 $(SB_LLVM_LDFLAGS)
Jan Voung44c3a802015-03-27 16:29:08 -0700359 $(SB_TRANSLATE) -arch x86-32 $(PNACL_SZ_BASE).nonfinal.pexe -o $@ \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800360 --allow-llvm-bitcode-input
Jan Voung44c3a802015-03-27 16:29:08 -0700361
John Porto2187c842015-12-16 07:48:25 -0800362src/IceRegistersARM32.def: pydir/gen_arm32_reg_tables.py
363 python $< > $@
364
Jim Stichnothdd842db2015-01-27 12:53:53 -0800365# TODO(stichnot): Be more precise than "*.h" here and elsewhere.
Jim Stichnothfddef242014-09-26 18:53:41 -0700366$(OBJS): $(OBJDIR)/%.o: src/%.cpp src/*.h src/*.def
Derek Schuffbc643132014-05-22 16:39:25 -0700367 $(CXX) -c $(CXXFLAGS) $< -o $@
368
Jan Voung44c3a802015-03-27 16:29:08 -0700369$(SB_OBJS): $(SB_OBJDIR)/%.o: src/%.cpp src/*.h src/*.def
370 $(SB_CXX) -c $(SB_CXXFLAGS) $< -o $@
371
Jan Voung08c3bcd2014-12-01 17:55:16 -0800372$(OBJDIR)/run_unittests: $(UNITTEST_OBJS) $(UNITTEST_LIB_OBJS)
Jim Stichnothe7e9b022015-04-21 15:05:22 -0700373 $(CXX) $(GTEST_LIB_PATH) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800374 -lgtest -lgtest_main -ldl \
375 -Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib)
Jan Voung08c3bcd2014-12-01 17:55:16 -0800376
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800377$(UNITTEST_OBJS): $(OBJDIR)/unittest/%.o: unittest/%.cpp unittest/*.h \
378 src/*.h src/*.def
Jan Voung08c3bcd2014-12-01 17:55:16 -0800379 $(CXX) -c $(CXXFLAGS) \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800380 -Isrc/ \
381 -Iunittest/ \
382 -I$(LLVM_SRC_PATH)/utils/unittest/googletest/include \
383 -I$(LLVM_SRC_PATH) \
384 -DGTEST_HAS_RTTI=0 -DGTEST_USE_OWN_TR1_TUPLE \
385 $< -o $@
Jan Voung08c3bcd2014-12-01 17:55:16 -0800386
Jim Stichnothfddef242014-09-26 18:53:41 -0700387$(OBJS): | $(OBJDIR)
Jan Voung44c3a802015-03-27 16:29:08 -0700388$(SB_OBJS): | $(SB_OBJDIR)
Derek Schuffbc643132014-05-22 16:39:25 -0700389
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800390$(UNITTEST_OBJS): | $(OBJDIR)/unittest $(OBJDIR)/unittest/AssemblerX8632 \
391 $(OBJDIR)/unittest/AssemblerX8664
Jan Voung08c3bcd2014-12-01 17:55:16 -0800392
Jim Stichnothfddef242014-09-26 18:53:41 -0700393$(OBJDIR):
Derek Schuffbc643132014-05-22 16:39:25 -0700394 @mkdir -p $@
Jan Voung44c3a802015-03-27 16:29:08 -0700395$(SB_OBJDIR):
396 @mkdir -p $@
Derek Schuffbc643132014-05-22 16:39:25 -0700397
Jan Voung08c3bcd2014-12-01 17:55:16 -0800398$(OBJDIR)/unittest: $(OBJDIR)
399 @mkdir -p $@
400
John Porto2fea26c2015-07-28 16:28:07 -0700401$(OBJDIR)/unittest/AssemblerX8632: $(OBJDIR)/unittest
402 @mkdir -p $@
403$(OBJDIR)/unittest/AssemblerX8664: $(OBJDIR)/unittest
404 @mkdir -p $@
405
Jim Stichnoth8ff4b282016-01-04 15:39:06 -0800406RT_SRC := runtime/szrt.c runtime/szrt_ll.ll runtime/szrt_profiler.c \
407 runtime/szrt_asm_x8632.s runtime/szrt_asm_x8664.s \
408 runtime/szrt_asm_arm32.s
Jan Voung050deaa2015-06-12 15:12:05 -0700409RT_OBJ := build/runtime/szrt_native_x8632.o build/runtime/szrt_sb_x8632.o \
Jim Stichnoth8ff4b282016-01-04 15:39:06 -0800410 build/runtime/szrt_nonsfi_x8632.o \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800411 build/runtime/szrt_native_x8664.o build/runtime/szrt_sb_x8664.o \
Jim Stichnoth8ff4b282016-01-04 15:39:06 -0800412 build/runtime/szrt_nonsfi_x8664.o \
413 build/runtime/szrt_native_arm32.o build/runtime/szrt_sb_arm32.o \
414 build/runtime/szrt_nonsfi_arm32.o
Jim Stichnoth9738a9e2015-02-23 16:39:06 -0800415
416runtime: $(RT_OBJ)
417
418# Use runtime.is.built so that build-runtime.py is invoked only once
419# even in a parallel build.
420.INTERMEDIATE: runtime.is.built
421$(RT_OBJ): runtime.is.built
John Portof8b4cc82015-06-09 18:06:19 -0700422runtime.is.built: $(RT_SRC) pydir/build-runtime.py
Jim Stichnoth9738a9e2015-02-23 16:39:06 -0800423 @echo ================ Building Subzero runtime ================
Jan Voung68a06332015-03-05 14:33:38 -0800424 ./pydir/build-runtime.py -v --pnacl-root $(PNACL_TOOLCHAIN_ROOT)
Jim Stichnoth9738a9e2015-02-23 16:39:06 -0800425
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800426check-lit: $(OBJDIR)/pnacl-sz make_symlink
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700427 PNACL_BIN_PATH=$(PNACL_BIN_PATH) \
Reed Kotler2c3c82e2016-01-21 20:33:08 -0800428 $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_LIT_TESTS) \
John Porto56958cb2016-01-14 09:18:18 -0800429 $(FORCEASM_LIT_TEST_EXCLUDES) $(FORCEASM_LIT_PARAM)
Jim Stichnothac9c9432014-08-26 14:07:13 -0700430
Karl Schimpfab06df32014-10-29 14:58:25 -0700431ifdef MINIMAL
Jim Stichnothc9258222015-03-13 11:59:49 -0700432check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime
433 @echo "Crosstests disabled, minimal build"
Karl Schimpfab06df32014-10-29 14:58:25 -0700434else
Jim Stichnothc9258222015-03-13 11:59:49 -0700435check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime
Jim Stichnothdc7c5972015-03-10 11:17:15 -0700436 # Do all native/sse2 tests, but only test_vector_ops for native/sse4.1.
437 # For (slow) sandboxed tests, limit to Om1/sse4.1.
438 ./pydir/crosstest_generator.py -v --lit \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800439 --toolchain-root $(TOOLCHAIN_ROOT) \
David Sehrb19d39c2016-01-13 14:17:37 -0800440 $(FORCEASM_FLAG) \
441 $(FORCEASM_XTEST_EXCLUDES) \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800442 -i x8632,native,sse2 \
443 -i x8632,native,sse4.1,test_vector_ops \
444 -i x8632,sandbox,sse4.1,Om1 \
Jim Stichnoth57a8aab2016-01-06 09:34:36 -0800445 -i x8632,nonsfi,sse2,O2 \
John Porto008f4ce2015-12-24 13:22:18 -0800446 -i x8664,native,sse2 \
447 -i x8664,native,sse4.1,test_vector_ops \
John Porto56958cb2016-01-14 09:18:18 -0800448 -i x8664,sandbox,sse4.1,Om1 \
John Porto52b51572015-12-05 14:16:25 -0800449 -i arm32,neon \
Jim Stichnoth8ff4b282016-01-04 15:39:06 -0800450 -e arm32,nonsfi \
John Porto52b51572015-12-05 14:16:25 -0800451 -e arm32,neon,test_vector_ops \
452 -e arm32,neon,test_select
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700453 PNACL_BIN_PATH=$(PNACL_BIN_PATH) \
Reed Kotler2c3c82e2016-01-21 20:33:08 -0800454 $(LLVM_SRC_PATH)/utils/lit/lit.py -sv $(CHECK_XTEST_TESTS)
Karl Schimpfab06df32014-10-29 14:58:25 -0700455endif
Derek Schuffbc643132014-05-22 16:39:25 -0700456
Jim Stichnothc9258222015-03-13 11:59:49 -0700457check-unit: $(OBJDIR)/run_unittests
458 $(OBJDIR)/run_unittests
459
Jim Stichnothc59288b2015-11-09 11:38:40 -0800460# List the spec2k components in roughly reverse order of runtime, to help with
461# parallel execution speed.
462ALLSPEC := 253.perlbmk 177.mesa 188.ammp 256.bzip2 164.gzip 179.art 183.equake \
463 175.vpr 176.gcc 181.mcf 186.crafty 197.parser 254.gap 255.vortex \
464 300.twolf 252.eon
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800465.PHONY: $(ALLSPEC)
466
467TARGET := x8632
468ifeq ($(TARGET),x8632)
469 TARGETFLAG=x8632
470 SETUP=SetupGccX8632Opt
471 SPEC := -O2 --filetype=obj
472endif
John Porto3c275ce2015-12-22 08:14:00 -0800473ifeq ($(TARGET),x8664)
474 TARGETFLAG=x8664
475 SETUP=SetupGccX8664Opt
476 SPEC := -O2 --filetype=obj
477endif
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800478ifeq ($(TARGET),arm32)
479 TARGETFLAG=arm32
480 SETUP=SetupGccArmOpt
John Porto7d595132016-02-01 12:43:13 -0800481 SPEC := -O2 --filetype=obj
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800482endif
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800483SPECFLAGS :=
484SPECBUILDONLY := false
Jim Stichnothc59288b2015-11-09 11:38:40 -0800485%.spec2k: % $(OBJDIR)/pnacl-sz make_symlink runtime
Jim Stichnothbc3bd502016-01-20 15:01:39 -0800486 ./pydir/szbuild_spec2k.py -v \
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800487 $(SPECFLAGS) --target=$(TARGETFLAG) $(SPEC) $<
488 $(SPECBUILDONLY) || ( cd ../../../tests/spec2k; \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800489 ./run_all.sh RunTimedBenchmarks $(SETUP) train $< )
490
Jim Stichnothc59288b2015-11-09 11:38:40 -0800491check-spec: $(ALLSPEC:=.spec2k)
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800492
Jim Stichnothc9258222015-03-13 11:59:49 -0700493check: check-lit check-unit check-xtest
494
Jim Stichnoth23bee882015-11-17 06:14:05 -0800495check-presubmit presubmit:
496# Make sure clang-format gets run.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800497 +make -f Makefile.standalone format
Jim Stichnoth23bee882015-11-17 06:14:05 -0800498# Verify MINIMAL build, plus proper usage of REQUIRES in lit tests.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800499 +make -f Makefile.standalone \
500 MINIMAL=1 check
Jim Stichnothfc22f772015-11-22 06:06:34 -0800501# Check that there are no g++ build errors or warnings.
502 +make -f Makefile.standalone \
503 GPLUSPLUS=1 compile_only
Jim Stichnoth23bee882015-11-17 06:14:05 -0800504# Check the x86 assembler unit tests.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800505 +make -f Makefile.standalone \
506 DEBUG=1 CHECK_X86_ASM=1 check-unit
David Sehrb19d39c2016-01-13 14:17:37 -0800507# Run lit tests, cross tests, unit tests, and spec2k/x86-32.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800508 +make -f Makefile.standalone \
509 check check-spec
John Porto4ab4fbe2016-01-20 13:44:30 -0800510# Run spec2k/x86-64.
511 +make -f Makefile.standalone \
512 TARGET=x8664 check-spec
Jim Stichnoth23bee882015-11-17 06:14:05 -0800513# Build spec2k under -Om1/x86-32, to check for liveness errors.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800514 +make -f Makefile.standalone \
515 SPECFLAGS='-Om1' SPECBUILDONLY=true check-spec
John Porto4ab4fbe2016-01-20 13:44:30 -0800516# Build spec2k under -Om1/x86-64, to check for liveness errors.
517 +make -f Makefile.standalone \
518 SPECFLAGS='-Om1' TARGET=x8664 SPECBUILDONLY=true check-spec
Jim Stichnoth23bee882015-11-17 06:14:05 -0800519# Run spec2k for x86-32 without advanced phi lowering.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800520 +make -f Makefile.standalone \
521 SPECFLAGS='--sz=--phi-edge-split=0' check-spec
John Porto4ab4fbe2016-01-20 13:44:30 -0800522# Run spec2k for x86-64 without advanced phi lowering.
523 +make -f Makefile.standalone \
524 SPECFLAGS='--sz=--phi-edge-split=0' TARGET=x8664 check-spec
David Sehrb19d39c2016-01-13 14:17:37 -0800525# Run cross tests and lit tests to validate filetype=asm output.
526 +make -f Makefile.standalone \
527 FORCEASM=1 check-xtest check-lit
Jim Stichnoth23bee882015-11-17 06:14:05 -0800528# Build spec2k for arm32.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800529 +make -f Makefile.standalone \
530 TARGET=arm32 SPECBUILDONLY=true check-spec
Jim Stichnoth23bee882015-11-17 06:14:05 -0800531# Build spec2k under -Om1/arm32.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800532 +make -f Makefile.standalone \
533 TARGET=arm32 SPECFLAGS='-Om1' SPECBUILDONLY=true check-spec
John Portob8196652016-01-19 06:19:14 -0800534# Run a few spec2k tests for arm32 using qemu. Keep the list sorted in
535# roughly reverse order of runtime.
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800536 +make -f Makefile.standalone \
John Portob8196652016-01-19 06:19:14 -0800537 TARGET=arm32 ALLSPEC='252.eon 254.gap 176.gcc 181.mcf' check-spec
Jim Stichnoth23bee882015-11-17 06:14:05 -0800538# Provide validation of user awesomeness!
Jim Stichnoth6c4ad842015-11-16 12:47:57 -0800539 echo Success
540
Jim Stichnothdd842db2015-01-27 12:53:53 -0800541FORMAT_BLACKLIST =
542# Add one of the following lines for each source file to ignore.
543FORMAT_BLACKLIST += ! -name IceParseInstsTest.cpp
Karl Schimpf74cd8832015-06-23 11:05:01 -0700544FORMAT_BLACKLIST += ! -name IceParseTypesTest.cpp
Karl Schimpf3e53dc92015-10-07 13:24:01 -0700545FORMAT_BLACKLIST += ! -name assembler_arm.h
546FORMAT_BLACKLIST += ! -name assembler_arm.cc
Derek Schuffbc643132014-05-22 16:39:25 -0700547format:
Jim Stichnoth0a9e1262015-04-21 09:59:21 -0700548 $(CLANG_FORMAT_PATH)/clang-format -style=LLVM -i \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800549 `find . -regex '.*\.\(c\|h\|cpp\)' $(FORMAT_BLACKLIST)`
Jim Stichnoth240e0f82014-07-09 16:53:40 -0700550
Jim Stichnoth240e0f82014-07-09 16:53:40 -0700551format-diff:
Jim Stichnoth206833c2014-08-07 10:58:05 -0700552 git diff -U0 `git merge-base HEAD master` | \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800553 PATH=$(PNACL_BIN_PATH):$(PATH) \
554 $(LLVM_SRC_PATH)/../clang/tools/clang-format/clang-format-diff.py \
555 -p1 -style=LLVM -i
Derek Schuffbc643132014-05-22 16:39:25 -0700556
Jim Stichnoth307e3262015-02-12 16:10:37 -0800557bloat: make_symlink
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800558 nm -C -S -l pnacl-sz | \
Jim Stichnoth2e7de232015-11-02 08:25:57 -0800559 bloat/bloat.py --nm-output=/dev/stdin syms > build/pnacl-sz.bloat.json
Jim Stichnothfa0cfa52015-02-26 09:42:36 -0800560 @echo See Subzero size breakdown in bloat/pnacl-sz.bloat.html
Jim Stichnoth307e3262015-02-12 16:10:37 -0800561
Andrew Sculla509e1d2015-06-29 11:07:08 -0700562docs:
Reed Kotler4cba1cb2016-01-07 08:45:13 -0800563 make -C docs -f Makefile.standalone
Andrew Sculla509e1d2015-06-29 11:07:08 -0700564
Reed Kotler2c3c82e2016-01-21 20:33:08 -0800565help:
566 @cat Makefile.standalone-help/help.txt
567
568help-check-lit:
569 @cat Makefile.standalone-help/check-lit.txt
570
571help-check-xtest:
572 @cat Makefile.standalone-help/check-xtest.txt
573
Derek Schuffbc643132014-05-22 16:39:25 -0700574clean:
Jan Voung44c3a802015-03-27 16:29:08 -0700575 rm -rf pnacl-sz *.o $(OBJDIR) $(SB_OBJDIR) build/pnacl-sz.bloat.json
Karl Schimpfb262c5e2014-10-27 14:41:57 -0700576
577clean-all: clean
Reed Kotler4cba1cb2016-01-07 08:45:13 -0800578 rm -rf build/ crosstest/Output/