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