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