• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#===- lib/asan/Makefile.old --------------------------------*- Makefile -*--===#
2#
3#                     The LLVM Compiler Infrastructure
4#
5# This file is distributed under the University of Illinois Open Source
6# License. See LICENSE.TXT for details.
7#
8#===------------------------------------------------------------------------===#
9
10OS=$(shell uname | tr '[A-Z]' '[a-z]')
11ROOT=$(shell pwd)
12MAKEFILE=Makefile.old  # this file.
13
14ifeq ($(ARCH), android)
15  ANDROID_CFLAGS= \
16		-DANDROID \
17		-D__WORDSIZE=32 \
18		-I$(ANDROID_BUILD_TOP)/external/stlport/stlport \
19		-I$(ANDROID_BUILD_TOP)/bionic \
20		-I$(ANDROID_BUILD_TOP)/bionic/libstdc++/include \
21		-I$(ANDROID_BUILD_TOP)/bionic/libc/arch-arm/include \
22		-I$(ANDROID_BUILD_TOP)/bionic/libc/include \
23		-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/common \
24		-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/arch-arm \
25		-I$(ANDROID_BUILD_TOP)/bionic/libm/include \
26		-I$(ANDROID_BUILD_TOP)/bionic/libm/include/arm \
27		-I$(ANDROID_BUILD_TOP)/bionic/libthread_db/include \
28		-L$(ANDROID_PRODUCT_OUT)/obj/lib
29  CLANG_FLAGS= \
30		-ccc-host-triple arm-linux-androideabi \
31		-D__compiler_offsetof=__builtin_offsetof \
32		-D__ELF__=1 \
33		-ccc-gcc-name arm-linux-androideabi-g++ \
34		$(ANDROID_CFLAGS)
35  CC=$(ANDROID_EABI_TOOLCHAIN)/arm-linux-androideabi-gcc $(ANDROID_CFLAGS)
36  CXX=$(ANDROID_EABI_TOOLCHAIN)/arm-linux-androideabi-g++ $(ANDROID_CFLAGS)
37endif
38
39ifeq ($(ARCH), arm)
40  # Example make command line:
41  # CROSSTOOL=$HOME/x-tools/arm-unknown-linux-gnueabi/ PATH=$CROSSTOOL/bin:$PATH make ARCH=arm asan_test
42  CLANG_FLAGS= \
43		-ccc-host-triple arm-unknown-linux-gnueabi \
44		-march=armv7-a -mfloat-abi=softfp -mfp=neon \
45		-ccc-gcc-name arm-unknown-linux-gnueabi-g++ \
46		-B$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4 \
47		-B$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/lib \
48		-I$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4/include \
49		-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/include/c++/4.4.4 \
50		-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/include/c++/4.4.4/arm-unknown-linux-gnueabi \
51		-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/include \
52		-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/include \
53		-L$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4 \
54		-L$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/lib \
55		-L$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/lib
56  CC=$(CROSSTOOL)/bin/arm-unknown-linux-gnueabi-gcc
57  CXX=$(CROSSTOOL)/bin/arm-unknown-linux-gnueabi-g++
58endif
59
60CLANG_FLAGS=
61CLANG_BUILD=$(ROOT)/../../../../build/Release+Asserts
62CLANG_CC=$(CLANG_BUILD)/bin/clang $(CLANG_FLAGS)
63CLANG_CXX=$(CLANG_BUILD)/bin/clang++ $(CLANG_FLAGS)
64FILE_CHECK=$(CLANG_BUILD)/bin/FileCheck
65
66CC=$(CLANG_CC)
67CXX=$(CLANG_CXX)
68
69CFLAGS:=-Wall -fvisibility=hidden
70
71CLEANROOM_CXX=$(CXX) -Wall
72
73INSTALL_DIR=../asan_clang_$(OS)
74BIN=bin_$(OS)
75
76LIBS=#-lpthread -ldl
77ARCH=x86_64
78
79ASAN_STACK=1
80ASAN_GLOBALS=1
81ASAN_SCALE=0  # default will be used
82ASAN_OFFSET=-1  #default will be used
83ASAN_UAR=0
84ASAN_HAS_EXCEPTIONS=1
85ASAN_FLEXIBLE_MAPPING_AND_OFFSET=0
86ASAN_HAS_BLACKLIST=1
87ASAN_NEEDS_SEGV=1
88ASAN_PIE=0
89
90ifeq ($(ARCH), i386)
91BITS=32
92SUFF=$(BITS)
93CFLAGS:=$(CFLAGS) -m$(BITS)
94endif
95
96ifeq ($(ARCH), x86_64)
97BITS=64
98SUFF=$(BITS)
99CFLAGS:=$(CFLAGS) -m$(BITS)
100endif
101
102ifeq ($(ARCH), arm)
103BITS=32
104SUFF=_arm
105CFLAGS:=$(CFLAGS) -march=armv7-a
106ASAN_HAS_EXCEPTIONS=0
107endif
108
109ifeq ($(ARCH), android)
110BITS=32
111SUFF=_android
112CFLAGS:=$(CFLAGS)
113ASAN_HAS_EXCEPTIONS=0
114endif
115
116PIE=
117ifeq ($(ASAN_PIE), 1)
118  PIE=-fPIE -pie
119endif
120
121# This will build libasan on linux for both x86_64 and i386 in the
122# desired location. The Mac library is already build by the clang's make.
123# $(CLANG_BUILD)/lib/clang/3.1/lib/$(OS)/libclang_rt.asan-$(ARCH).a
124LIBASAN_INST_DIR=$(CLANG_BUILD)/lib/clang/3.1/lib/$(OS)
125LIBASAN_A=$(LIBASAN_INST_DIR)/libclang_rt.asan-$(ARCH).a
126
127BLACKLIST=
128ifeq ($(ASAN_HAS_BLACKLIST), 1)
129  BLACKLIST=-mllvm -asan-blacklist=$(ROOT)/tests/asan_test.ignore
130endif
131
132COMMON_ASAN_DEFINES=\
133                -DASAN_UAR=$(ASAN_UAR) \
134		-DASAN_HAS_EXCEPTIONS=$(ASAN_HAS_EXCEPTIONS) \
135		-DASAN_NEEDS_SEGV=$(ASAN_NEEDS_SEGV) \
136		-DASAN_HAS_BLACKLIST=$(ASAN_HAS_BLACKLIST)
137
138CLANG_ASAN_CXX=$(CLANG_CXX) \
139	       -faddress-sanitizer \
140		$(BLACKLIST)  \
141		-mllvm -asan-stack=$(ASAN_STACK)      \
142		-mllvm -asan-globals=$(ASAN_GLOBALS)  \
143		-mllvm -asan-mapping-scale=$(ASAN_SCALE) \
144		-mllvm -asan-mapping-offset-log=$(ASAN_OFFSET) \
145		-mllvm -asan-use-after-return=$(ASAN_UAR) \
146		$(COMMON_ASAN_DEFINES)
147
148CLANG_ASAN_LD=$(CLANG_CXX) -faddress-sanitizer
149
150GCC_ASAN_PATH=SET_FROM_COMMAND_LINE
151GCC_ASAN_CXX=$(GCC_ASAN_PATH)/g++ \
152	     -faddress-sanitizer \
153	     $(COMMON_ASAN_DEFINES)
154
155GCC_ASAN_LD=$(GCC_ASAN_PATH)/g++ -ldl -lpthread
156
157ASAN_COMPILER=clang
158
159ifeq ($(ASAN_COMPILER), clang)
160  ASAN_CXX=$(CLANG_ASAN_CXX)
161  ASAN_LD=$(CLANG_ASAN_LD)
162  ASAN_LD_TAIL=
163endif
164
165ifeq ($(ASAN_COMPILER), gcc)
166  ASAN_CXX=$(GCC_ASAN_CXX)
167  ASAN_LD=$(GCC_ASAN_LD)
168  ASAN_LD_TAIL=$(LIBASAN_A)
169endif
170
171RTL_HDR=asan_allocator.h \
172	asan_internal.h \
173	asan_interceptors.h \
174	asan_interface.h \
175	asan_lock.h \
176	asan_mapping.h \
177	asan_procmaps.h \
178	asan_stack.h \
179	asan_stats.h \
180	asan_thread.h \
181	asan_thread_registry.h \
182	interception/interception.h \
183	interception/interception_linux.h \
184	interception/interception_mac.h \
185	interception/mach_override/mach_override.h
186
187LIBASAN_OBJ=$(BIN)/asan_rtl$(SUFF).o \
188	    $(BIN)/asan_allocator$(SUFF).o  \
189	    $(BIN)/asan_globals$(SUFF).o  \
190	    $(BIN)/asan_interceptors$(SUFF).o  \
191	    $(BIN)/asan_linux$(SUFF).o \
192	    $(BIN)/asan_mac$(SUFF).o \
193	    $(BIN)/asan_malloc_linux$(SUFF).o \
194	    $(BIN)/asan_malloc_mac$(SUFF).o \
195	    $(BIN)/asan_new_delete$(SUFF).o \
196	    $(BIN)/asan_poisoning$(SUFF).o  \
197	    $(BIN)/asan_posix$(SUFF).o  \
198	    $(BIN)/asan_printf$(SUFF).o  \
199	    $(BIN)/asan_stack$(SUFF).o  \
200	    $(BIN)/asan_stats$(SUFF).o  \
201	    $(BIN)/asan_thread$(SUFF).o  \
202	    $(BIN)/asan_thread_registry$(SUFF).o  \
203	    $(BIN)/interception/interception_linux$(SUFF).o  \
204	    $(BIN)/interception/interception_mac$(SUFF).o  \
205	    $(BIN)/interception/mach_override/mach_override$(SUFF).o
206
207GTEST_ROOT=third_party/googletest
208GTEST_INCLUDE=-I$(GTEST_ROOT)/include
209GTEST_MAKE_DIR=$(GTEST_ROOT)/make-$(OS)$(SUFF)
210GTEST_LIB=$(GTEST_MAKE_DIR)/gtest-all.o
211
212all: b64 b32
213
214test: t64 t32 output_tests lint
215	@echo "ALL TESTS PASSED"
216
217output_tests: b32 b64
218	cd output_tests && ./test_output.sh $(CLANG_CXX) $(CLANG_CC) $(FILE_CHECK)
219
220t64: b64
221	$(BIN)/asan_test64
222t32: b32
223	$(BIN)/asan_test32
224
225b64: | mk_bin_dir
226	$(MAKE) -f $(MAKEFILE) ARCH=x86_64 asan_test asan_benchmarks
227b32: | mk_bin_dir
228	$(MAKE) -f $(MAKEFILE) ARCH=i386 asan_test asan_benchmarks
229
230lib64:
231	$(MAKE) -f $(MAKEFILE) ARCH=x86_64 lib
232lib32:
233	$(MAKE) -f $(MAKEFILE) ARCH=i386 lib
234
235mk_bin_dir:
236	mkdir -p $(BIN)
237	mkdir -p $(BIN)/interception
238	mkdir -p $(BIN)/interception/mach_override
239
240clang:
241	cd ../ && llvm/rebuild_clang_and_asan.sh > /dev/null
242
243install: install_clang
244
245$(INSTALL_DIR):
246	mkdir -p $(INSTALL_DIR) $(INSTALL_DIR)/bin $(INSTALL_DIR)/lib
247
248install_clang: | $(INSTALL_DIR)
249	cp -v $(CLANG_BUILD)/bin/clang $(INSTALL_DIR)/bin
250	cp -rv $(CLANG_BUILD)/lib/clang $(INSTALL_DIR)/lib
251	(cd $(INSTALL_DIR)/bin; ln -sf clang clang++)
252
253#install_lib: | $(INSTALL_DIR)
254#	cp -v $(CLANG_BUILD)/lib/libasan*.a $(INSTALL_DIR)/lib
255
256$(BIN)/asan_noinst_test$(SUFF).o: tests/asan_noinst_test.cc $(RTL_HDR) $(MAKEFILE)
257	$(CLEANROOM_CXX) $(PIE) $(CFLAGS) $(GTEST_INCLUDE) -I. -g -c $< -O2 -o $@
258
259$(BIN)/asan_break_optimization$(SUFF).o: tests/asan_break_optimization.cc $(MAKEFILE)
260	$(CLEANROOM_CXX) $(PIE) $(CFLAGS) -c $< -O0 -o $@
261
262$(BIN)/%_test$(SUFF).o: tests/%_test.cc $(RTL_HDR) $(MAKEFILE)
263	$(ASAN_CXX) $(GTEST_INCLUDE) -I. -g -c $< -O2 -o $@ $(PIE) $(CFLAGS)
264
265$(BIN)/%_test$(SUFF).o: tests/%_test.mm $(RTL_HDR) $(MAKEFILE)
266	$(ASAN_CXX) $(GTEST_INCLUDE) -I. -g -c $< -O2 -o $@ -ObjC $(PIE) $(CFLAGS)
267
268$(BIN)/%$(SUFF).o: %.cc $(RTL_HDR) $(MAKEFILE)
269	$(CXX) $(PIE) $(CFLAGS) -fPIC -c -O2 -fno-exceptions -funwind-tables \
270		-o $@ -g $< -Ithird_party \
271		-DASAN_NEEDS_SEGV=$(ASAN_NEEDS_SEGV) \
272		-DASAN_HAS_EXCEPTIONS=$(ASAN_HAS_EXCEPTIONS) \
273		-DASAN_FLEXIBLE_MAPPING_AND_OFFSET=$(ASAN_FLEXIBLE_MAPPING_AND_OFFSET) \
274		$(ASAN_FLAGS)
275
276$(BIN)/%$(SUFF).o: %.c $(RTL_HDR) $(MAKEFILE)
277	$(CC) $(PIE) $(CFLAGS) -fPIC -c -O2 -o $@ -g $< -Ithird_party \
278		$(ASAN_FLAGS)
279
280ifeq ($(OS),darwin)
281LD_FLAGS=-framework Foundation
282else
283LD_FLAGS=
284endif
285
286lib: $(LIBASAN_A)
287
288$(LIBASAN_A): mk_bin_dir $(LIBASAN_OBJ) $(MAKEFILE)
289	mkdir -p $(LIBASAN_INST_DIR)
290	ar ru $@ $(LIBASAN_OBJ)
291	$(CXX) -shared $(CFLAGS) $(LIBASAN_OBJ) $(LD_FLAGS) -o $(BIN)/libasan$(SUFF).so
292
293TEST_OBJECTS_COMMON=\
294	     $(BIN)/asan_test$(SUFF).o \
295	     $(BIN)/asan_globals_test$(SUFF).o \
296	     $(BIN)/asan_break_optimization$(SUFF).o \
297	     $(BIN)/asan_noinst_test$(SUFF).o \
298	     $(BIN)/asan_interface_test$(SUFF).o
299
300BENCHMARK_OBJECTS=\
301	     $(BIN)/asan_benchmarks_test$(SUFF).o \
302	     $(BIN)/asan_break_optimization$(SUFF).o
303
304ifeq ($(OS),darwin)
305TEST_OBJECTS=$(TEST_OBJECTS_COMMON) \
306	     $(BIN)/asan_mac_test$(SUFF).o
307else
308TEST_OBJECTS=$(TEST_OBJECTS_COMMON)
309endif
310
311$(BIN)/asan_test$(SUFF): $(TEST_OBJECTS) $(LIBASAN_A) $(MAKEFILE) tests/asan_test.ignore $(GTEST_LIB)
312	$(ASAN_LD) $(PIE) $(CFLAGS) -g -O3 $(TEST_OBJECTS) \
313		$(LD_FLAGS) -o $@ $(LIBS) $(GTEST_LIB) $(ASAN_LD_TAIL)
314
315$(BIN)/asan_benchmarks$(SUFF): $(BENCHMARK_OBJECTS) $(LIBASAN_A) $(MAKEFILE) $(GTEST_LIB)
316	$(ASAN_LD) $(PIE) $(CFLAGS) -g -O3 $(BENCHMARK_OBJECTS) \
317		$(LD_FLAGS) -o $@ $(LIBS) $(GTEST_LIB) $(ASAN_LD_TAIL)
318
319asan_test: $(BIN)/asan_test$(SUFF)
320
321asan_benchmarks: $(BIN)/asan_benchmarks$(SUFF)
322
323# for now, build gtest with clang/asan even if we use a different compiler.
324$(GTEST_LIB):
325	mkdir -p $(GTEST_MAKE_DIR) && \
326	cd $(GTEST_MAKE_DIR) && \
327	$(MAKE) -f ../make/Makefile CXXFLAGS="$(PIE) $(CFLAGS) -g -w" \
328	  CXX="$(CLANG_CXX)"
329
330RTL_LINT_FITLER=-readability/casting,-readability/check,-build/include,-build/header_guard,-build/class,-legal/copyright
331# TODO(kcc): remove these filters one by one
332TEST_LINT_FITLER=-readability/casting,-build/include,-legal/copyright,-whitespace/newline,-runtime/sizeof,-runtime/int,-runtime/printf
333
334LLVM_LINT_FILTER=-,+whitespace
335
336ADDRESS_SANITIZER_CPP=../../../../lib/Transforms/Instrumentation/AddressSanitizer.cpp
337
338lint:
339	third_party/cpplint/cpplint.py --filter=$(LLVM_LINT_FILTER) $(ADDRESS_SANITIZER_CPP)
340	third_party/cpplint/cpplint.py --filter=$(RTL_LINT_FITLER) asan_*.cc asan_*.h
341	third_party/cpplint/cpplint.py --filter=$(RTL_LINT_FITLER) interception/interception*.h interception/interception*.cc
342	third_party/cpplint/cpplint.py --filter=$(TEST_LINT_FITLER) tests/*.cc output_tests/*.cc
343
344get_third_party:
345	rm -rf third_party
346	mkdir third_party
347	(cd third_party && \
348	svn co -r375        http://googletest.googlecode.com/svn/trunk googletest && \
349	svn co -r69 http://google-styleguide.googlecode.com/svn/trunk/cpplint cpplint \
350	)
351
352clean:
353	rm -f *.o *.ll *.S *.a *.log asan_test64* asan_test32*  a.out perf.data log
354	rm -rf $(BIN)
355	rm -rf $(GTEST_ROOT)/make-*
356