Home | History | Annotate | Download | only in asan
      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 
     10 OS=$(shell uname | tr '[A-Z]' '[a-z]')
     11 ROOT=$(shell pwd)
     12 MAKEFILE=Makefile.old  # this file.
     13 
     14 ifeq ($(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)
     37 endif
     38 
     39 ifeq ($(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++
     58 endif
     59 
     60 CLANG_FLAGS=
     61 CLANG_BUILD=$(ROOT)/../../../../build/Release+Asserts
     62 CLANG_CC=$(CLANG_BUILD)/bin/clang $(CLANG_FLAGS)
     63 CLANG_CXX=$(CLANG_BUILD)/bin/clang++ $(CLANG_FLAGS)
     64 FILE_CHECK=$(CLANG_BUILD)/bin/FileCheck
     65 
     66 CC=$(CLANG_CC)
     67 CXX=$(CLANG_CXX)
     68 
     69 CFLAGS:=-Wall -fvisibility=hidden
     70 
     71 CLEANROOM_CXX=$(CXX) -Wall
     72 
     73 INSTALL_DIR=../asan_clang_$(OS)
     74 BIN=bin_$(OS)
     75 
     76 LIBS=#-lpthread -ldl
     77 ARCH=x86_64
     78 
     79 ASAN_STACK=1
     80 ASAN_GLOBALS=1
     81 ASAN_SCALE=0  # default will be used
     82 ASAN_OFFSET=-1  #default will be used
     83 ASAN_UAR=0
     84 ASAN_HAS_EXCEPTIONS=1
     85 ASAN_FLEXIBLE_MAPPING_AND_OFFSET=0
     86 ASAN_HAS_BLACKLIST=1
     87 ASAN_NEEDS_SEGV=1
     88 ASAN_PIE=0
     89 
     90 ifeq ($(ARCH), i386)
     91 BITS=32
     92 SUFF=$(BITS)
     93 CFLAGS:=$(CFLAGS) -m$(BITS)
     94 endif
     95 
     96 ifeq ($(ARCH), x86_64)
     97 BITS=64
     98 SUFF=$(BITS)
     99 CFLAGS:=$(CFLAGS) -m$(BITS)
    100 endif
    101 
    102 ifeq ($(ARCH), arm)
    103 BITS=32
    104 SUFF=_arm
    105 CFLAGS:=$(CFLAGS) -march=armv7-a
    106 ASAN_HAS_EXCEPTIONS=0
    107 endif
    108 
    109 ifeq ($(ARCH), android)
    110 BITS=32
    111 SUFF=_android
    112 CFLAGS:=$(CFLAGS)
    113 ASAN_HAS_EXCEPTIONS=0
    114 endif
    115 
    116 PIE=
    117 ifeq ($(ASAN_PIE), 1)
    118   PIE=-fPIE -pie
    119 endif
    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
    124 LIBASAN_INST_DIR=$(CLANG_BUILD)/lib/clang/3.1/lib/$(OS)
    125 LIBASAN_A=$(LIBASAN_INST_DIR)/libclang_rt.asan-$(ARCH).a
    126 
    127 BLACKLIST=
    128 ifeq ($(ASAN_HAS_BLACKLIST), 1)
    129   BLACKLIST=-mllvm -asan-blacklist=$(ROOT)/tests/asan_test.ignore
    130 endif
    131 
    132 COMMON_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 
    138 CLANG_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 
    148 CLANG_ASAN_LD=$(CLANG_CXX) -faddress-sanitizer
    149 
    150 GCC_ASAN_PATH=SET_FROM_COMMAND_LINE
    151 GCC_ASAN_CXX=$(GCC_ASAN_PATH)/g++ \
    152 	     -faddress-sanitizer \
    153 	     $(COMMON_ASAN_DEFINES)
    154 
    155 GCC_ASAN_LD=$(GCC_ASAN_PATH)/g++ -ldl -lpthread
    156 
    157 ASAN_COMPILER=clang
    158 
    159 ifeq ($(ASAN_COMPILER), clang)
    160   ASAN_CXX=$(CLANG_ASAN_CXX)
    161   ASAN_LD=$(CLANG_ASAN_LD)
    162   ASAN_LD_TAIL=
    163 endif
    164 
    165 ifeq ($(ASAN_COMPILER), gcc)
    166   ASAN_CXX=$(GCC_ASAN_CXX)
    167   ASAN_LD=$(GCC_ASAN_LD)
    168   ASAN_LD_TAIL=$(LIBASAN_A)
    169 endif
    170 
    171 RTL_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 
    187 LIBASAN_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 
    207 GTEST_ROOT=third_party/googletest
    208 GTEST_INCLUDE=-I$(GTEST_ROOT)/include
    209 GTEST_MAKE_DIR=$(GTEST_ROOT)/make-$(OS)$(SUFF)
    210 GTEST_LIB=$(GTEST_MAKE_DIR)/gtest-all.o
    211 
    212 all: b64 b32
    213 
    214 test: t64 t32 output_tests lint
    215 	@echo "ALL TESTS PASSED"
    216 
    217 output_tests: b32 b64
    218 	cd output_tests && ./test_output.sh $(CLANG_CXX) $(CLANG_CC) $(FILE_CHECK)
    219 
    220 t64: b64
    221 	$(BIN)/asan_test64
    222 t32: b32
    223 	$(BIN)/asan_test32
    224 
    225 b64: | mk_bin_dir
    226 	$(MAKE) -f $(MAKEFILE) ARCH=x86_64 asan_test asan_benchmarks
    227 b32: | mk_bin_dir
    228 	$(MAKE) -f $(MAKEFILE) ARCH=i386 asan_test asan_benchmarks
    229 
    230 lib64:
    231 	$(MAKE) -f $(MAKEFILE) ARCH=x86_64 lib
    232 lib32:
    233 	$(MAKE) -f $(MAKEFILE) ARCH=i386 lib
    234 
    235 mk_bin_dir:
    236 	mkdir -p $(BIN)
    237 	mkdir -p $(BIN)/interception
    238 	mkdir -p $(BIN)/interception/mach_override
    239 
    240 clang:
    241 	cd ../ && llvm/rebuild_clang_and_asan.sh > /dev/null
    242 
    243 install: install_clang
    244 
    245 $(INSTALL_DIR):
    246 	mkdir -p $(INSTALL_DIR) $(INSTALL_DIR)/bin $(INSTALL_DIR)/lib
    247 
    248 install_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 
    280 ifeq ($(OS),darwin)
    281 LD_FLAGS=-framework Foundation
    282 else
    283 LD_FLAGS=
    284 endif
    285 
    286 lib: $(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 
    293 TEST_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 
    300 BENCHMARK_OBJECTS=\
    301 	     $(BIN)/asan_benchmarks_test$(SUFF).o \
    302 	     $(BIN)/asan_break_optimization$(SUFF).o
    303 
    304 ifeq ($(OS),darwin)
    305 TEST_OBJECTS=$(TEST_OBJECTS_COMMON) \
    306 	     $(BIN)/asan_mac_test$(SUFF).o
    307 else
    308 TEST_OBJECTS=$(TEST_OBJECTS_COMMON)
    309 endif
    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 
    319 asan_test: $(BIN)/asan_test$(SUFF)
    320 
    321 asan_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 
    330 RTL_LINT_FITLER=-readability/casting,-readability/check,-build/include,-build/header_guard,-build/class,-legal/copyright
    331 # TODO(kcc): remove these filters one by one
    332 TEST_LINT_FITLER=-readability/casting,-build/include,-legal/copyright,-whitespace/newline,-runtime/sizeof,-runtime/int,-runtime/printf
    333 
    334 LLVM_LINT_FILTER=-,+whitespace
    335 
    336 ADDRESS_SANITIZER_CPP=../../../../lib/Transforms/Instrumentation/AddressSanitizer.cpp
    337 
    338 lint:
    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 
    344 get_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 
    352 clean:
    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