From 770e950c3cff2e6cddbd825a568b2f4b5925339a Mon Sep 17 00:00:00 2001 From: "German M. Bravo" Date: Fri, 4 Nov 2016 08:11:02 -0600 Subject: [PATCH] Support for Include What You Use --- CMakeLists.txt | 27 +- iwyu.imp | 671 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 696 insertions(+), 2 deletions(-) create mode 100644 iwyu.imp diff --git a/CMakeLists.txt b/CMakeLists.txt index f6afae5ff..7159590e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 2.8.10) +cmake_minimum_required (VERSION 3.3 FATAL_ERROR) project (xapiand C CXX) set (PACKAGE_NAME "Xapiand") @@ -11,6 +11,7 @@ set (PACKAGE_PATH_TEST "${PROJECT_SOURCE_DIR}/tests") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) +option (IWYU "Enable include-what-you-use" OFF) option (BINARY_PROXY "Define to what port binary traffic will be redirected to" OFF) option (CLUSTERING "Enable remote clustering" OFF) option (DATABASE_WAL "Enable database write ahead log (WAL)" ON) @@ -18,7 +19,7 @@ option (TRACEBACKS "Enable tracebacks for exceptions" OFF) option (V8 "Enable v8 engine" ON) option (BUILD_TESTS "Build all tests" OFF) -foreach(opt BINARY_PROXY CLUSTERING DATABASE_WAL TRACEBACKS V8) +foreach (opt BINARY_PROXY CLUSTERING DATABASE_WAL TRACEBACKS V8) if (${opt}) set ("XAPIAND_${opt}" 1) else () @@ -319,6 +320,28 @@ target_link_libraries (${PROJECT_NAME} install (TARGETS ${PROJECT_NAME} DESTINATION bin) +######################################################################## +# Enable Google's Include What You Use +######################################################################## + +if (IWYU) + find_program (IWYU_PATH NAMES include-what-you-use iwyu) + if (IWYU_PATH) + message (STATUS "Looking for include-what-you-use - found") + set (IWYU_OPTS + ${IWYU_PATH} + -Xiwyu + --mapping_file=${PROJECT_SOURCE_DIR}/iwyu.imp) + set_property (TARGET SRC_OBJ PROPERTY C_INCLUDE_WHAT_YOU_USE ${IWYU_OPTS}) + set_property (TARGET SRC_OBJ PROPERTY CXX_INCLUDE_WHAT_YOU_USE ${IWYU_OPTS}) + set_property (TARGET ${PROJECT_NAME} PROPERTY C_INCLUDE_WHAT_YOU_USE ${IWYU_OPTS}) + set_property (TARGET ${PROJECT_NAME} PROPERTY CXX_INCLUDE_WHAT_YOU_USE ${IWYU_OPTS}) + else () + message (STATUS "Looking for include-what-you-use - not found") + endif () +endif (IWYU) + + ######################################################################## # Testing. # diff --git a/iwyu.imp b/iwyu.imp new file mode 100644 index 000000000..2e77a2ca9 --- /dev/null +++ b/iwyu.imp @@ -0,0 +1,671 @@ +[ + ############################################################################ + # Mappings for GNU libc + # ( cd /usr/include && grep '^ *# *include' {sys/,net/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: [ "<$2>", private, "<$1>", public ] },@' | grep bits/ | sort ) + # When I saw more than one mapping for these, I typically picked + # what I thought was the "best" one. + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + # Sometimes libc tells you what mapping to do via an '#error': + # # error "Never use directly; include instead." + # or + # # error "Never include directly; use instead." + # ( cd /usr/include && grep -R '^ *# *error "Never use\|include' * | perl -nle 'm/<([^>]+).*directly.*<([^>]+)/ && print qq@ { include: [ "<$1>", private, "<$2>", public ] },@' | sort ) + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + # Top-level #includes that just forward to another file: + # $ for i in /usr/include/*; do [ -f $i ] } && [ `wc -l < $i` = 1 ] } && echo $i; done + # (poll.h, syscall.h, syslog.h, ustat.h, wait.h). + # For each file, I looked at the list of canonical header files -- + # http://www.opengroup.org/onlinepubs/9699919799/idx/head.html -- + # to decide which of the two files is canonical. If neither is + # on the POSIX.1 1998 list, I just choose the top-level one. + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + # These are all files in bits/ that delegate to asm/ and linux/ to + # do all (or lots) of the work. Note these are private->private. + # $ for i in /usr/include/bits/*; do for dir in asm linux; do grep -H -e $dir/`basename $i` $i; done; done + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + # Some asm files have 32- and 64-bit variants: + # $ ls /usr/include/asm/*_{32,64}.h + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", private ] }, + { include: [ "", private, "", private ] }, + # I don't know what grep would have found these. I found them + # via user report. + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, # PATH_MAX + { include: [ "", private, "", public ] }, + { include: [ "", private, "", public ] }, + + + ############################################################################ + # GCC STL headers + # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | grep -e bits/ -e tr1_impl/ | sort -u) + # I removed a lot of 'meaningless' dependencies -- for instance, + # //includes , but if someone is + # using strings, isn't enough to satisfy iwyu. + # We may need to add other dirs in future versions of gcc. + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + # This didn't come from the grep, but seems to be where swap() + # is defined? + { include: ["", private, "", public ] }, # for swap<>() + # Hash and hashtable-based containers. + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + # All .tcc files are gcc internal-include files. We get them from + # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep -R '^ *# *include.*tcc' * | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ && print qq@ { include: ["<$2>", private, "<$1>", public ] },@' | sort ) + # I had to manually edit some of the entries to say the map-to is private. + { include: ["", private, "", private ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, + "", private ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", private ] }, + # Some bits->bits //includes: A few files in bits re-export + # symbols from other files in bits. + # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include.*bits/' bits/* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { include: ["<$2>", private, "<$1>", private ] },@' | grep bits/ | sort -u) + # and carefully picked reasonable-looking results (algorithm + # *uses* pair but doesn't *re-export* pair, for instance). + { include: ["", private, + "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, + "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + { include: ["", private, "", private ] }, + # I don't think we want to be having people move to 'backward/' + # yet. (These hold deprecated STL classes that we still use + # actively.) These are the ones that turned up in an analysis of + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + # We have backward as part of the -I search path now, so have the + # non-backwards-prefix version as well. + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + # (This one should perhaps be found automatically somehow.) + { include: ["", private, "", public ] }, + # The iostream .h files are confusing. Lots of private headers, + # which are handled above, but we also have public headers + # #including each other (eg //includes ). We + # are pretty forgiving: if a user specifies any public header, we + # generally don't require the others. + # ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && egrep '^ *# *include <(istream|ostream|iostream|fstream|sstream|streambuf|ios|iosfwd)>' *stream* ios | perl -nle 'm/^([^:]+).*[<"]([^>"]+)[>"]/ and print qq@ { include: ["<$2>", public, "<$1>", public ] },@' | sort -u ) + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + { include: ["", public, "", public ] }, + # The location of exception_defines.h varies by GCC version. It should + # never be included directly. + { include: ["", private, "", public ] }, + { include: ["", private, "", public ] }, + + + ############################################################################ + # For library symbols that can be defined in more than one header + # file, maps from symbol-name to legitimate header files. + # This list was generated via + # grep -R '__.*_defined' /usr/include | perl -nle 'm,/usr/include/([^:]*):#\s*\S+ __(.*)_defined, and print qq@ { symbol: [ "$2", public, "<$1>", public ] },@' | sort -u + # I ignored all entries that only appeared once on the list (eg uint32_t). + # I then added in NULL, which according to [diff.null] C.2.2.3, can + # be defined in , , , , + # , , or . We also allow their C + # equivalents. + # In each case, I ordered them so was first, if it was + # an option for this type. That's the preferred #include all else + # equal. The visibility on the symbol-name is ignored; by convension + # we always set it to private. + { symbol: [ "blksize_t", private, "", public ] }, + { symbol: [ "blkcnt_t", private, "", public ] }, + { symbol: [ "blkcnt_t", private, "", public ] }, + { symbol: [ "blksize_t", private, "", public ] }, + { symbol: [ "daddr_t", private, "", public ] }, + { symbol: [ "daddr_t", private, "", public ] }, + { symbol: [ "dev_t", private, "", public ] }, + { symbol: [ "dev_t", private, "", public ] }, + { symbol: [ "error_t", private, "", public ] }, + { symbol: [ "error_t", private, "", public ] }, + { symbol: [ "error_t", private, "", public ] }, + { symbol: [ "fsblkcnt_t", private, "", public ] }, + { symbol: [ "fsblkcnt_t", private, "", public ] }, + { symbol: [ "fsfilcnt_t", private, "", public ] }, + { symbol: [ "fsfilcnt_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "gid_t", private, "", public ] }, + { symbol: [ "id_t", private, "", public ] }, + { symbol: [ "id_t", private, "", public ] }, + { symbol: [ "ino64_t", private, "", public ] }, + { symbol: [ "ino64_t", private, "", public ] }, + { symbol: [ "ino_t", private, "", public ] }, + { symbol: [ "ino_t", private, "", public ] }, + { symbol: [ "ino_t", private, "", public ] }, + { symbol: [ "int8_t", private, "", public ] }, + { symbol: [ "int8_t", private, "", public ] }, + { symbol: [ "intptr_t", private, "", public ] }, + { symbol: [ "intptr_t", private, "", public ] }, + { symbol: [ "key_t", private, "", public ] }, + { symbol: [ "key_t", private, "", public ] }, + { symbol: [ "mode_t", private, "", public ] }, + { symbol: [ "mode_t", private, "", public ] }, + { symbol: [ "mode_t", private, "", public ] }, + { symbol: [ "mode_t", private, "", public ] }, + { symbol: [ "nlink_t", private, "", public ] }, + { symbol: [ "nlink_t", private, "", public ] }, + { symbol: [ "off64_t", private, "", public ] }, + { symbol: [ "off64_t", private, "", public ] }, + { symbol: [ "off_t", private, "", public ] }, + { symbol: [ "off_t", private, "", public ] }, + { symbol: [ "off_t", private, "", public ] }, + { symbol: [ "off_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "pid_t", private, "", public ] }, + { symbol: [ "sigset_t", private, "", public ] }, + { symbol: [ "sigset_t", private, "", public ] }, + { symbol: [ "sigset_t", private, "", public ] }, + { symbol: [ "socklen_t", private, "", private ] }, + { symbol: [ "socklen_t", private, "", public ] }, + { symbol: [ "socklen_t", private, "", public ] }, + { symbol: [ "ssize_t", private, "", public ] }, + { symbol: [ "ssize_t", private, "", public ] }, + { symbol: [ "ssize_t", private, "", public ] }, + { symbol: [ "ssize_t", private, "", public ] }, + { symbol: [ "suseconds_t", private, "", public ] }, + { symbol: [ "suseconds_t", private, "", public ] }, + { symbol: [ "suseconds_t", private, "", public ] }, + { symbol: [ "u_char", private, "", public ] }, + { symbol: [ "u_char", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "uid_t", private, "", public ] }, + { symbol: [ "useconds_t", private, "", public ] }, + { symbol: [ "useconds_t", private, "", public ] }, + # glob.h seems to define size_t if necessary, but it should come from stddef. + { symbol: [ "size_t", private, "", public ] }, + { symbol: [ "size_t", private, "", public ] }, + { symbol: [ "size_t", private, "", public ] }, + { symbol: [ "size_t", private, "", public ] }, + { symbol: [ "size_t", private, "", public ] }, + { symbol: [ "size_t", private, "", public ] }, + # Macros that can be defined in more than one file, don't have the + # same __foo_defined guard that other types do, so the grep above + # doesn't discover them. Until I figure out a better way, I just + # add them in by hand as I discover them. + { symbol: [ "EOF", private, "", public ] }, + { symbol: [ "EOF", private, "", public ] }, + { symbol: [ "va_list", private, "", public ] }, + # These are symbols that could be defined in either stdlib.h or + # malloc.h, but we always want the stdlib location. + { symbol: [ "malloc", private, "", public ] }, + { symbol: [ "calloc", private, "", public ] }, + { symbol: [ "realloc", private, "", public ] }, + { symbol: [ "free", private, "", public ] }, + # Entries for NULL + { symbol: [ "NULL", private, "", public ] }, # 'canonical' location for NULL + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + { symbol: [ "NULL", private, "", public ] }, + + # Kludge time: almost all STL types take an allocator, but they + # almost always use the default value. Usually we detect that + # and don't try to do IWYU, but sometimes it passes through. + # For instance, when adding two strings, we end up calling + # template<_CharT,_Traits,_Alloc> ... operator+( + # basic_string<_CharT,_Traits,_Alloc>, ...) + # These look like normal template args to us, so we see they're + # used and declare an iwyu dependency, even though we don't need + # to #include the traits or alloc type ourselves. The surest way + # to deal with this is to just say that everyone provides + # std::allocator. We can add more here at need. + { symbol: [ "std::allocator", private, "", public ] }, + { symbol: [ "std::allocator", private, "", public ] }, + { symbol: [ "std::allocator", private, "", public ] }, + { symbol: [ "std::allocator", private, "", public ] }, + { symbol: [ "std::allocator", private, "", public ] }, + # A similar kludge for std::char_traits. basic_string, + # basic_ostream and basic_istream have this as a default template + # argument, and sometimes it bleeds through when clang desugars the + # string/ostream/istream type. + { symbol: [ "std::char_traits", private, "", public ] }, + { symbol: [ "std::char_traits", private, "", public ] }, + { symbol: [ "std::char_traits", private, "", public ] }, + + + ############################################################################ + # Allow the C++ wrappers around C files. Without these mappings, + # if you #include , iwyu will tell you to replace it with + # , which is where the symbols are actually defined. We + # inhibit that behavior to keep the alone. Note this is a + # public-to-public mapping: we don't want to *replace* + # with , we just want to avoid suggesting changing + # back to . (If you *did* want to replace + # assert.h with cassert, you'd change it to a public->private + # mapping.) Here is how I identified the files to map: + # $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done + # + # These headers are defined in C++14 [headers]p3. You can get them with + # $ sed -n '/begin{floattable}.*{tab:cpp.c.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{}/ && print qq@ { include: [ "<$1.h>", public, "", public ] },@' | sort + # on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + { include: [ "", public, "", public ] }, + + + ############################################################################ + # libc++ headers + { include: ["<__functional_base>", private, "", public ] }, + { include: ["<__mutex_base>", private, "", public ] }, + { include: ["<__hash_table>", private, "", public ] }, + { include: ["<__hash_table>", private, "", public ] }, + { include: ["<__tree>", private, "", public ] }, + { include: ["<__tree>", private, "", public ] }, + { include: ["<__bit_reference>", private, "", public ] }, + { symbol: [ "std::move", private, "", public ] }, + { symbol: [ "std::string", private, "", public ] }, + + + ############################################################################ + # Xapian headers + { include: ["\"xapian.h\"", private, "", public] }, + { include: ["@", private, "", public] }, + { include: ["@\"xapian/.*\"", private, "", public] }, + + + ############################################################################ + # Custom mappings + { include: [ "", private, "", public ] }, + { include: [ "<_wctype.h>", private, "", public ] }, + { symbol: [ "htonl", private, "", public ] }, + { symbol: [ "htons", private, "", public ] }, + { symbol: [ "ntohl", private, "", public ] }, + { symbol: [ "ntohs", private, "", public ] }, + { symbol: [ "time_t", private, "", public ] }, + { symbol: [ "int8_t", private, "", public ] }, + { symbol: [ "uint8_t", private, "", public ] }, + { symbol: [ "int16_t", private, "", public ] }, + { symbol: [ "uint16_t", private, "", public ] }, + { symbol: [ "int32_t", private, "", public ] }, + { symbol: [ "uint32_t", private, "", public ] }, + { symbol: [ "int64_t", private, "", public ] }, + { symbol: [ "uint64_t", private, "", public ] } +]