1#!/bin/sh
2
3SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
4
5# Guess path to LLVM_CHECKOUT if not provided
6if [ "${LLVM_CHECKOUT}" = "" ]; then
7  LLVM_CHECKOUT="${SCRIPT_DIR}/../../../../../"
8fi
9
10# python tools setup
11CPPLINT=${SCRIPT_DIR}/cpplint.py
12LITLINT=${SCRIPT_DIR}/litlint.py
13if [ "${PYTHON_EXECUTABLE}" != "" ]; then
14  CPPLINT="${PYTHON_EXECUTABLE} ${CPPLINT}"
15  LITLINT="${PYTHON_EXECUTABLE} ${LITLINT}"
16fi
17
18# Filters
19# TODO: remove some of these filters
20COMMON_LINT_FILTER=-build/include,-build/header_guard,-legal/copyright,-whitespace/comments,-readability/casting,\
21-build/namespaces,-readability/braces
22ASAN_RTL_LINT_FILTER=${COMMON_LINT_FILTER},-runtime/int
23ASAN_TEST_LINT_FILTER=${COMMON_LINT_FILTER},-runtime/sizeof,-runtime/int,-runtime/printf,-runtime/threadsafe_fn
24ASAN_LIT_TEST_LINT_FILTER=${ASAN_TEST_LINT_FILTER},-whitespace/line_length
25TSAN_RTL_LINT_FILTER=${COMMON_LINT_FILTER}
26TSAN_TEST_LINT_FILTER=${TSAN_RTL_LINT_FILTER},-runtime/threadsafe_fn,-runtime/int
27TSAN_LIT_TEST_LINT_FILTER=${TSAN_TEST_LINT_FILTER},-whitespace/line_length
28MSAN_RTL_LINT_FILTER=${COMMON_LINT_FILTER}
29LSAN_RTL_LINT_FILTER=${COMMON_LINT_FILTER}
30LSAN_LIT_TEST_LINT_FILTER=${LSAN_RTL_LINT_FILTER},-whitespace/line_length
31DFSAN_RTL_LINT_FILTER=${COMMON_LINT_FILTER},-runtime/int,-runtime/printf,-runtime/references,-readability/function
32SCUDO_RTL_LINT_FILTER=${COMMON_LINT_FILTER}
33COMMON_RTL_INC_LINT_FILTER=${COMMON_LINT_FILTER},-runtime/int,-runtime/sizeof,-runtime/printf,-readability/fn_size
34SANITIZER_INCLUDES_LINT_FILTER=${COMMON_LINT_FILTER},-runtime/int
35
36MKTEMP_DIR=$(mktemp -qd /tmp/check_lint.XXXXXXXXXX)
37MKTEMP="mktemp -q ${MKTEMP_DIR}/tmp.XXXXXXXXXX"
38cleanup() {
39  rm -rf $MKTEMP_DIR
40}
41trap cleanup EXIT
42
43cd ${LLVM_CHECKOUT}
44
45EXITSTATUS=0
46ERROR_LOG=$(${MKTEMP})
47
48run_lint() {
49  FILTER=$1
50  shift
51  TASK_LOG=$(${MKTEMP})
52  ${CPPLINT} --filter=${FILTER} "$@" 2>$TASK_LOG
53  if [ "$?" != "0" ]; then
54    cat $TASK_LOG | grep -v "Done processing" | grep -v "Total errors found" \
55      | grep -v "Skipping input" >> $ERROR_LOG
56  fi
57  if [ "${SILENT}" != "1" ]; then
58    cat $TASK_LOG
59  fi
60  ${LITLINT} "$@" 2>>$ERROR_LOG
61}
62
63if [ "${COMPILER_RT}" = "" ]; then
64  COMPILER_RT=projects/compiler-rt
65fi
66LIT_TESTS=${COMPILER_RT}/test
67# Headers
68SANITIZER_INCLUDES=${COMPILER_RT}/include/sanitizer
69run_lint ${SANITIZER_INCLUDES_LINT_FILTER} ${SANITIZER_INCLUDES}/*.h &
70
71# Sanitizer_common
72COMMON_RTL=${COMPILER_RT}/lib/sanitizer_common
73run_lint ${COMMON_RTL_INC_LINT_FILTER} ${COMMON_RTL}/*.cc \
74                                       ${COMMON_RTL}/*.h \
75                                       ${COMMON_RTL}/tests/*.cc &
76
77# Interception
78INTERCEPTION=${COMPILER_RT}/lib/interception
79run_lint ${ASAN_RTL_LINT_FILTER} ${INTERCEPTION}/*.cc \
80                                 ${INTERCEPTION}/*.h &
81
82# ASan
83ASAN_RTL=${COMPILER_RT}/lib/asan
84run_lint ${ASAN_RTL_LINT_FILTER} ${ASAN_RTL}/*.cc \
85                                 ${ASAN_RTL}/*.h &
86run_lint ${ASAN_TEST_LINT_FILTER} ${ASAN_RTL}/tests/*.cc \
87                                  ${ASAN_RTL}/tests/*.h &
88run_lint ${ASAN_LIT_TEST_LINT_FILTER} ${LIT_TESTS}/asan/*/*.cc &
89
90# TSan
91TSAN_RTL=${COMPILER_RT}/lib/tsan
92run_lint ${TSAN_RTL_LINT_FILTER} ${TSAN_RTL}/rtl/*.cc \
93                                 ${TSAN_RTL}/rtl/*.h &
94run_lint ${TSAN_TEST_LINT_FILTER} ${TSAN_RTL}/tests/rtl/*.cc \
95                                  ${TSAN_RTL}/tests/rtl/*.h \
96                                  ${TSAN_RTL}/tests/unit/*.cc &
97run_lint ${TSAN_LIT_TEST_LINT_FILTER} ${LIT_TESTS}/tsan/*.cc &
98
99# MSan
100MSAN_RTL=${COMPILER_RT}/lib/msan
101run_lint ${MSAN_RTL_LINT_FILTER} ${MSAN_RTL}/*.cc \
102                                 ${MSAN_RTL}/*.h &
103
104# LSan
105LSAN_RTL=${COMPILER_RT}/lib/lsan
106run_lint ${LSAN_RTL_LINT_FILTER} ${LSAN_RTL}/*.cc \
107                                 ${LSAN_RTL}/*.h &
108run_lint ${LSAN_LIT_TEST_LINT_FILTER} ${LIT_TESTS}/lsan/*/*.cc &
109
110# DFSan
111DFSAN_RTL=${COMPILER_RT}/lib/dfsan
112run_lint ${DFSAN_RTL_LINT_FILTER} ${DFSAN_RTL}/*.cc \
113                                  ${DFSAN_RTL}/*.h &
114${DFSAN_RTL}/scripts/check_custom_wrappers.sh >> $ERROR_LOG
115
116# Scudo
117SCUDO_RTL=${COMPILER_RT}/lib/scudo
118run_lint ${SCUDO_RTL_LINT_FILTER} ${SCUDO_RTL}/*.cpp \
119                                  ${SCUDO_RTL}/*.h &
120
121# Misc files
122FILES=${COMMON_RTL}/*.inc
123TMPFILES=""
124for FILE in $FILES; do
125  TMPFILE="$(${MKTEMP}).$(basename ${FILE}).cc"
126  cp -f $FILE $TMPFILE
127  run_lint ${COMMON_RTL_INC_LINT_FILTER} $TMPFILE &
128  TMPFILES="$TMPFILES $TMPFILE"
129done
130
131wait
132
133for temp in $TMPFILES; do
134  rm -f $temp
135done
136
137if [ -s $ERROR_LOG ]; then
138  cat $ERROR_LOG
139  exit 1
140fi
141
142exit 0
143