forked from OSchip/llvm-project
351 lines
11 KiB
Makefile
351 lines
11 KiB
Makefile
#===- lib/asan/Makefile.old --------------------------------*- Makefile -*--===#
|
|
#
|
|
# The LLVM Compiler Infrastructure
|
|
#
|
|
# This file is distributed under the University of Illinois Open Source
|
|
# License. See LICENSE.TXT for details.
|
|
#
|
|
#===------------------------------------------------------------------------===#
|
|
|
|
OS=$(shell uname | tr '[A-Z]' '[a-z]')
|
|
ROOT=$(shell pwd)
|
|
MAKEFILE=Makefile.old # this file.
|
|
|
|
ifeq ($(ARCH), android)
|
|
ANDROID_CFLAGS= \
|
|
-DANDROID \
|
|
-D__WORDSIZE=32 \
|
|
-I$(ANDROID_BUILD_TOP)/external/stlport/stlport \
|
|
-I$(ANDROID_BUILD_TOP)/bionic \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libstdc++/include \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libc/arch-arm/include \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libc/include \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/common \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libc/kernel/arch-arm \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libm/include \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libm/include/arm \
|
|
-I$(ANDROID_BUILD_TOP)/bionic/libthread_db/include \
|
|
-L$(ANDROID_PRODUCT_OUT)/obj/lib
|
|
CLANG_FLAGS= \
|
|
-ccc-host-triple arm-linux-androideabi \
|
|
-D__compiler_offsetof=__builtin_offsetof \
|
|
-D__ELF__=1 \
|
|
-ccc-gcc-name arm-linux-androideabi-g++ \
|
|
$(ANDROID_CFLAGS)
|
|
CC=$(ANDROID_EABI_TOOLCHAIN)/arm-linux-androideabi-gcc $(ANDROID_CFLAGS)
|
|
CXX=$(ANDROID_EABI_TOOLCHAIN)/arm-linux-androideabi-g++ $(ANDROID_CFLAGS)
|
|
endif
|
|
|
|
ifeq ($(ARCH), arm)
|
|
# Example make command line:
|
|
# CROSSTOOL=$HOME/x-tools/arm-unknown-linux-gnueabi/ PATH=$CROSSTOOL/bin:$PATH make ARCH=arm asan_test
|
|
CLANG_FLAGS= \
|
|
-ccc-host-triple arm-unknown-linux-gnueabi \
|
|
-march=armv7-a -mfloat-abi=softfp -mfp=neon \
|
|
-ccc-gcc-name arm-unknown-linux-gnueabi-g++ \
|
|
-B$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4 \
|
|
-B$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/lib \
|
|
-I$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4/include \
|
|
-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/include/c++/4.4.4 \
|
|
-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/include/c++/4.4.4/arm-unknown-linux-gnueabi \
|
|
-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/include \
|
|
-I$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/include \
|
|
-L$(CROSSTOOL)/lib/gcc/arm-unknown-linux-gnueabi/4.4.4 \
|
|
-L$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/lib \
|
|
-L$(CROSSTOOL)/arm-unknown-linux-gnueabi/sys-root/usr/lib
|
|
CC=$(CROSSTOOL)/bin/arm-unknown-linux-gnueabi-gcc
|
|
CXX=$(CROSSTOOL)/bin/arm-unknown-linux-gnueabi-g++
|
|
endif
|
|
|
|
CLANG_FLAGS=
|
|
CLANG_VERSION=3.2
|
|
CLANG_BUILD=$(ROOT)/../../../../build/Release+Asserts
|
|
CLANG_CC=$(CLANG_BUILD)/bin/clang $(CLANG_FLAGS)
|
|
CLANG_CXX=$(CLANG_BUILD)/bin/clang++ $(CLANG_FLAGS)
|
|
FILE_CHECK=$(CLANG_BUILD)/bin/FileCheck
|
|
|
|
CC=$(CLANG_CC)
|
|
CXX=$(CLANG_CXX)
|
|
|
|
CFLAGS:=-Wall -fvisibility=hidden
|
|
|
|
CLEANROOM_CXX=$(CXX) -Wall
|
|
|
|
INSTALL_DIR=../asan_clang_$(OS)
|
|
BIN=bin_$(OS)
|
|
|
|
LIBS=#-lpthread -ldl
|
|
ARCH=x86_64
|
|
|
|
ASAN_STACK=1
|
|
ASAN_GLOBALS=1
|
|
ASAN_SCALE=0 # default will be used
|
|
ASAN_OFFSET=-1 #default will be used
|
|
ASAN_UAR=0
|
|
ASAN_HAS_EXCEPTIONS=1
|
|
ASAN_FLEXIBLE_MAPPING_AND_OFFSET=0
|
|
ASAN_HAS_BLACKLIST=1
|
|
ASAN_NEEDS_SEGV=1
|
|
ASAN_PIE=0
|
|
|
|
ifeq ($(ARCH), i386)
|
|
BITS=32
|
|
SUFF=$(BITS)
|
|
CFLAGS:=$(CFLAGS) -m$(BITS)
|
|
endif
|
|
|
|
ifeq ($(ARCH), x86_64)
|
|
BITS=64
|
|
SUFF=$(BITS)
|
|
CFLAGS:=$(CFLAGS) -m$(BITS)
|
|
endif
|
|
|
|
ifeq ($(ARCH), arm)
|
|
BITS=32
|
|
SUFF=_arm
|
|
CFLAGS:=$(CFLAGS) -march=armv7-a
|
|
ASAN_HAS_EXCEPTIONS=0
|
|
endif
|
|
|
|
ifeq ($(ARCH), android)
|
|
BITS=32
|
|
SUFF=_android
|
|
CFLAGS:=$(CFLAGS)
|
|
ASAN_HAS_EXCEPTIONS=0
|
|
endif
|
|
|
|
PIE=
|
|
ifeq ($(ASAN_PIE), 1)
|
|
PIE=-fPIE -pie
|
|
endif
|
|
|
|
# This will build libasan on linux for both x86_64 and i386 in the
|
|
# desired location. The Mac library is already build by the clang's make.
|
|
# $(CLANG_BUILD)/lib/clang/$(CLANG_VERSION)/lib/$(OS)/libclang_rt.asan-$(ARCH).a
|
|
LIBASAN_INST_DIR=$(CLANG_BUILD)/lib/clang/$(CLANG_VERSION)/lib/$(OS)
|
|
LIBASAN_A=$(LIBASAN_INST_DIR)/libclang_rt.asan-$(ARCH).a
|
|
|
|
BLACKLIST=
|
|
ifeq ($(ASAN_HAS_BLACKLIST), 1)
|
|
BLACKLIST=-mllvm -asan-blacklist=$(ROOT)/tests/asan_test.ignore
|
|
endif
|
|
|
|
COMMON_ASAN_DEFINES=\
|
|
-DASAN_UAR=$(ASAN_UAR) \
|
|
-DASAN_HAS_EXCEPTIONS=$(ASAN_HAS_EXCEPTIONS) \
|
|
-DASAN_NEEDS_SEGV=$(ASAN_NEEDS_SEGV) \
|
|
-DASAN_HAS_BLACKLIST=$(ASAN_HAS_BLACKLIST)
|
|
|
|
CLANG_ASAN_CXX=$(CLANG_CXX) \
|
|
-faddress-sanitizer \
|
|
$(BLACKLIST) \
|
|
-mllvm -asan-stack=$(ASAN_STACK) \
|
|
-mllvm -asan-globals=$(ASAN_GLOBALS) \
|
|
-mllvm -asan-mapping-scale=$(ASAN_SCALE) \
|
|
-mllvm -asan-mapping-offset-log=$(ASAN_OFFSET) \
|
|
-mllvm -asan-use-after-return=$(ASAN_UAR) \
|
|
$(COMMON_ASAN_DEFINES)
|
|
|
|
CLANG_ASAN_LD=$(CLANG_CXX) -faddress-sanitizer
|
|
|
|
GCC_ASAN_PATH=SET_FROM_COMMAND_LINE
|
|
GCC_ASAN_CXX=$(GCC_ASAN_PATH)/g++ \
|
|
-faddress-sanitizer \
|
|
$(COMMON_ASAN_DEFINES)
|
|
|
|
GCC_ASAN_LD=$(GCC_ASAN_PATH)/g++ -ldl -lpthread
|
|
|
|
ASAN_COMPILER=clang
|
|
|
|
ifeq ($(ASAN_COMPILER), clang)
|
|
ASAN_CXX=$(CLANG_ASAN_CXX)
|
|
ASAN_LD=$(CLANG_ASAN_LD)
|
|
ASAN_LD_TAIL=
|
|
endif
|
|
|
|
ifeq ($(ASAN_COMPILER), gcc)
|
|
ASAN_CXX=$(GCC_ASAN_CXX)
|
|
ASAN_LD=$(GCC_ASAN_LD)
|
|
ASAN_LD_TAIL=$(LIBASAN_A)
|
|
endif
|
|
|
|
INTERCEPTION=../interception
|
|
MACH_OVERRIDE=$(INTERCEPTION)/mach_override
|
|
COMMON=../sanitizer_common
|
|
|
|
RTL_HDR=$(wildcard *.h) \
|
|
$(wildcard $(INTERCEPTION)/*.h) \
|
|
$(wildcard $(MACH_OVERRIDE)/*.h) \
|
|
$(wildcard $(COMMON)/*.h)
|
|
|
|
LIBTSAN_SRC=$(wildcard *.cc)
|
|
INTERCEPTION_SRC=$(wildcard $(INTERCEPTION)/*.cc)
|
|
MACH_OVERRIDE_SRC=$(wildcard $(MACH_OVERRIDE)/*.c)
|
|
COMMON_SRC=$(wildcard $(COMMON)/*.cc)
|
|
|
|
|
|
LIBASAN_OBJ=$(patsubst %.cc,$(BIN)/%$(SUFF).o,$(LIBTSAN_SRC)) \
|
|
$(patsubst $(INTERCEPTION)/%.cc,$(BIN)/%$(SUFF).o,$(INTERCEPTION_SRC)) \
|
|
$(patsubst $(COMMON)/%.cc,$(BIN)/%$(SUFF).o,$(COMMON_SRC)) \
|
|
$(patsubst $(MACH_OVERRIDE)/%.c,$(BIN)/%$(SUFF).o,$(MACH_OVERRIDE_SRC))
|
|
|
|
GTEST_ROOT=third_party/googletest
|
|
GTEST_INCLUDE=-I$(GTEST_ROOT)/include
|
|
GTEST_MAKE_DIR=$(GTEST_ROOT)/make-$(OS)$(SUFF)
|
|
GTEST_LIB=$(GTEST_MAKE_DIR)/gtest-all.o
|
|
|
|
all: b64 b32
|
|
|
|
test: t64 t32 output_tests lint
|
|
@echo "ALL TESTS PASSED"
|
|
|
|
output_tests: b32 b64
|
|
cd output_tests && ./test_output.sh $(CLANG_CXX) $(CLANG_CC) $(FILE_CHECK)
|
|
|
|
t64: b64
|
|
$(BIN)/asan_test64
|
|
t32: b32
|
|
$(BIN)/asan_test32
|
|
|
|
b64: | mk_bin_dir
|
|
$(MAKE) -f $(MAKEFILE) ARCH=x86_64 asan_test asan_benchmarks
|
|
b32: | mk_bin_dir
|
|
$(MAKE) -f $(MAKEFILE) ARCH=i386 asan_test asan_benchmarks
|
|
|
|
lib64:
|
|
$(MAKE) -f $(MAKEFILE) ARCH=x86_64 lib
|
|
lib32:
|
|
$(MAKE) -f $(MAKEFILE) ARCH=i386 lib
|
|
|
|
mk_bin_dir:
|
|
mkdir -p $(BIN)
|
|
|
|
clang:
|
|
cd ../ && llvm/rebuild_clang_and_asan.sh > /dev/null
|
|
|
|
install: install_clang
|
|
|
|
$(INSTALL_DIR):
|
|
mkdir -p $(INSTALL_DIR) $(INSTALL_DIR)/bin $(INSTALL_DIR)/lib
|
|
|
|
install_clang: | $(INSTALL_DIR)
|
|
cp -v $(CLANG_BUILD)/bin/clang $(INSTALL_DIR)/bin
|
|
cp -rv $(CLANG_BUILD)/lib/clang $(INSTALL_DIR)/lib
|
|
(cd $(INSTALL_DIR)/bin; ln -sf clang clang++)
|
|
|
|
#install_lib: | $(INSTALL_DIR)
|
|
# cp -v $(CLANG_BUILD)/lib/libasan*.a $(INSTALL_DIR)/lib
|
|
|
|
$(BIN)/asan_noinst_test$(SUFF).o: tests/asan_noinst_test.cc $(RTL_HDR) $(MAKEFILE)
|
|
$(CLEANROOM_CXX) $(PIE) $(CFLAGS) $(GTEST_INCLUDE) -I. -I.. -g -c $< -O2 -o $@
|
|
|
|
$(BIN)/asan_break_optimization$(SUFF).o: tests/asan_break_optimization.cc $(MAKEFILE)
|
|
$(CLEANROOM_CXX) $(PIE) $(CFLAGS) -c $< -O0 -o $@
|
|
|
|
$(BIN)/%_test$(SUFF).o: tests/%_test.cc $(RTL_HDR) $(MAKEFILE)
|
|
$(ASAN_CXX) $(GTEST_INCLUDE) -I. -I.. -g -c $< -O2 -o $@ $(PIE) $(CFLAGS)
|
|
|
|
$(BIN)/%_test$(SUFF).o: tests/%_test.mm $(RTL_HDR) $(MAKEFILE)
|
|
$(ASAN_CXX) $(GTEST_INCLUDE) -I. -I.. -g -c $< -O2 -o $@ -ObjC $(PIE) $(CFLAGS)
|
|
|
|
RTL_COMMON_FLAGS=$(PIE) $(CFLAGS) -fPIC -c -O2 -fno-exceptions -funwind-tables \
|
|
-Ithird_party -I.. $(ASAN_FLAGS)
|
|
|
|
$(BIN)/%$(SUFF).o: $(INTERCEPTION)/%.cc $(RTL_HDR) $(MAKEFILE)
|
|
$(CXX) $(RTL_COMMON_FLAGS) -o $@ -g $<
|
|
|
|
$(BIN)/%$(SUFF).o: $(COMMON)/%.cc $(RTL_HDR) $(MAKEFILE)
|
|
$(CXX) $(RTL_COMMON_FLAGS) -o $@ -g $<
|
|
|
|
$(BIN)/%$(SUFF).o: $(MACH_OVERRIDE)/%.c $(RTL_HDR) $(MAKEFILE)
|
|
$(CC) $(RTL_COMMON_FLAGS) -o $@ -g $<
|
|
|
|
$(BIN)/%$(SUFF).o: %.cc $(RTL_HDR) $(MAKEFILE)
|
|
$(CXX) $(RTL_COMMON_FLAGS) -o $@ -g $< \
|
|
-DASAN_NEEDS_SEGV=$(ASAN_NEEDS_SEGV) \
|
|
-DASAN_HAS_EXCEPTIONS=$(ASAN_HAS_EXCEPTIONS) \
|
|
-DASAN_FLEXIBLE_MAPPING_AND_OFFSET=$(ASAN_FLEXIBLE_MAPPING_AND_OFFSET)
|
|
|
|
$(BIN)/%$(SUFF).o: %.c $(RTL_HDR) $(MAKEFILE)
|
|
$(CC) $(PIE) $(CFLAGS) -fPIC -c -O2 -o $@ -g $< -Ithird_party \
|
|
$(ASAN_FLAGS)
|
|
|
|
ifeq ($(OS),darwin)
|
|
LD_FLAGS=-framework Foundation
|
|
else
|
|
LD_FLAGS=
|
|
endif
|
|
|
|
lib: $(LIBASAN_A)
|
|
|
|
$(LIBASAN_A): mk_bin_dir $(LIBASAN_OBJ) $(MAKEFILE)
|
|
mkdir -p $(LIBASAN_INST_DIR)
|
|
ar ru $@ $(LIBASAN_OBJ)
|
|
$(CXX) -shared $(CFLAGS) $(LIBASAN_OBJ) $(LD_FLAGS) -o $(BIN)/libasan$(SUFF).so
|
|
|
|
TEST_OBJECTS_COMMON=\
|
|
$(BIN)/asan_globals_test$(SUFF).o \
|
|
$(BIN)/asan_break_optimization$(SUFF).o \
|
|
$(BIN)/asan_noinst_test$(SUFF).o \
|
|
$(BIN)/asan_interface_test$(SUFF).o \
|
|
$(BIN)/asan_test$(SUFF).o
|
|
|
|
BENCHMARK_OBJECTS=\
|
|
$(BIN)/asan_benchmarks_test$(SUFF).o \
|
|
$(BIN)/asan_break_optimization$(SUFF).o
|
|
|
|
ifeq ($(OS),darwin)
|
|
TEST_OBJECTS=$(TEST_OBJECTS_COMMON) \
|
|
$(BIN)/asan_mac_test$(SUFF).o
|
|
else
|
|
TEST_OBJECTS=$(TEST_OBJECTS_COMMON)
|
|
endif
|
|
|
|
$(BIN)/asan_test$(SUFF): $(TEST_OBJECTS) $(LIBASAN_A) $(MAKEFILE) tests/asan_test.ignore $(GTEST_LIB)
|
|
$(ASAN_LD) $(PIE) $(CFLAGS) -g -O3 $(TEST_OBJECTS) \
|
|
$(LD_FLAGS) -o $@ $(LIBS) $(GTEST_LIB) $(ASAN_LD_TAIL)
|
|
|
|
$(BIN)/asan_benchmarks$(SUFF): $(BENCHMARK_OBJECTS) $(LIBASAN_A) $(MAKEFILE) $(GTEST_LIB)
|
|
$(ASAN_LD) $(PIE) $(CFLAGS) -g -O3 $(BENCHMARK_OBJECTS) \
|
|
$(LD_FLAGS) -o $@ $(LIBS) $(GTEST_LIB) $(ASAN_LD_TAIL)
|
|
|
|
asan_test: $(BIN)/asan_test$(SUFF)
|
|
|
|
asan_benchmarks: $(BIN)/asan_benchmarks$(SUFF)
|
|
|
|
# for now, build gtest with clang/asan even if we use a different compiler.
|
|
$(GTEST_LIB):
|
|
mkdir -p $(GTEST_MAKE_DIR) && \
|
|
cd $(GTEST_MAKE_DIR) && \
|
|
$(MAKE) -f ../make/Makefile CXXFLAGS="$(PIE) $(CFLAGS) -g -w" \
|
|
CXX="$(CLANG_CXX)"
|
|
|
|
RTL_LINT_FILTER=-readability/casting,-readability/check,-build/include,-build/header_guard,-build/class,-legal/copyright,-build/namespaces
|
|
# TODO(kcc): remove these filters one by one
|
|
TEST_LINT_FILTER=-readability/casting,-build/include,-legal/copyright,-whitespace/newline,-runtime/sizeof,-runtime/int,-runtime/printf
|
|
|
|
LLVM_LINT_FILTER=-,+whitespace
|
|
|
|
ADDRESS_SANITIZER_CPP=../../../../lib/Transforms/Instrumentation/AddressSanitizer.cpp
|
|
|
|
lint:
|
|
third_party/cpplint/cpplint.py --filter=$(LLVM_LINT_FILTER) $(ADDRESS_SANITIZER_CPP)
|
|
third_party/cpplint/cpplint.py --filter=$(RTL_LINT_FILTER) asan_*.cc asan_*.h
|
|
third_party/cpplint/cpplint.py --filter=$(RTL_LINT_FILTER) $(INTERCEPTION)/interception*.h $(INTERCEPTION)/interception*.cc
|
|
third_party/cpplint/cpplint.py --filter=$(RTL_LINT_FILTER) $(COMMON)/sanitizer_*.h $(COMMON)/sanitizer_*.cc
|
|
third_party/cpplint/cpplint.py --filter=$(TEST_LINT_FILTER) tests/*.cc output_tests/*.cc
|
|
|
|
get_third_party:
|
|
rm -rf third_party
|
|
mkdir third_party
|
|
(cd third_party && \
|
|
svn co -r375 http://googletest.googlecode.com/svn/trunk googletest && \
|
|
svn co -r69 http://google-styleguide.googlecode.com/svn/trunk/cpplint cpplint \
|
|
)
|
|
|
|
clean:
|
|
rm -f *.o *.ll *.S *.a *.log asan_test64* asan_test32* a.out perf.data log
|
|
rm -f $(LIBASAN_INST_DIR)/libclang_rt.asan-*.a
|
|
rm -rf $(BIN)
|
|
rm -rf $(GTEST_ROOT)/make-*
|