diff options
Diffstat (limited to 'iwyu_include_picker.cc')
-rw-r--r-- | iwyu_include_picker.cc | 141 |
1 files changed, 118 insertions, 23 deletions
diff --git a/iwyu_include_picker.cc b/iwyu_include_picker.cc index f5d2dbc..26b55d8 100644 --- a/iwyu_include_picker.cc +++ b/iwyu_include_picker.cc @@ -16,6 +16,7 @@ // not hash_map: it's not as portable and needs hash<string>. #include <map> // for map, map<>::mapped_type, etc #include <memory> +#include <regex> #include <string> // for string, basic_string, etc #include <system_error> // for error_code #include <utility> // for pair, make_pair @@ -33,7 +34,6 @@ #include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Regex.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/YAMLParser.h" #include "clang/Basic/FileManager.h" @@ -89,19 +89,33 @@ const IncludeMapEntry libc_symbol_map[] = { // an option for this type. That's the preferred #include all else // equal. The visibility on the symbol-name is ignored; by convention // we always set it to kPrivate. - { "blksize_t", kPrivate, "<sys/types.h>", kPublic }, - { "blkcnt_t", kPrivate, "<sys/stat.h>", kPublic }, + { "aiocb", kPrivate, "<aio.h>", kPublic }, { "blkcnt_t", kPrivate, "<sys/types.h>", kPublic }, + { "blkcnt_t", kPrivate, "<sys/stat.h>", kPublic }, + { "blksize_t", kPrivate, "<sys/types.h>", kPublic }, { "blksize_t", kPrivate, "<sys/stat.h>", kPublic }, + { "cc_t", kPrivate, "<termios.h>", kPublic }, { "clock_t", kPrivate, "<sys/types.h>", kPublic }, + { "clock_t", kPrivate, "<sys/time.h>", kPublic }, { "clock_t", kPrivate, "<time.h>", kPublic }, + { "clockid_t", kPrivate, "<sys/types.h>", kPublic }, + { "clockid_t", kPrivate, "<time.h>", kPublic }, { "daddr_t", kPrivate, "<sys/types.h>", kPublic }, { "daddr_t", kPrivate, "<rpc/types.h>", kPublic }, { "dev_t", kPrivate, "<sys/types.h>", kPublic }, { "dev_t", kPrivate, "<sys/stat.h>", kPublic }, + { "div_t", kPrivate, "<stdlib.h>", kPublic }, + { "double_t", kPrivate, "<math.h>", kPublic }, { "error_t", kPrivate, "<errno.h>", kPublic }, { "error_t", kPrivate, "<argp.h>", kPublic }, { "error_t", kPrivate, "<argz.h>", kPublic }, + { "fd_set", kPrivate, "<sys/select.h>", kPublic }, + { "fd_set", kPrivate, "<sys/time.h>", kPublic }, + { "fenv_t", kPrivate, "<fenv.h>", kPublic }, + { "fexcept_t", kPrivate, "<fenv.h>", kPublic }, + { "FILE", kPrivate, "<stdio.h>", kPublic }, + { "FILE", kPrivate, "<wchar.h>", kPublic }, + { "float_t", kPrivate, "<math.h>", kPublic }, { "fsblkcnt_t", kPrivate, "<sys/types.h>", kPublic }, { "fsblkcnt_t", kPrivate, "<sys/statvfs.h>", kPublic }, { "fsfilcnt_t", kPrivate, "<sys/types.h>", kPublic }, @@ -109,18 +123,21 @@ const IncludeMapEntry libc_symbol_map[] = { { "gid_t", kPrivate, "<sys/types.h>", kPublic }, { "gid_t", kPrivate, "<grp.h>", kPublic }, { "gid_t", kPrivate, "<pwd.h>", kPublic }, + { "gid_t", kPrivate, "<signal.h>", kPublic }, { "gid_t", kPrivate, "<stropts.h>", kPublic }, { "gid_t", kPrivate, "<sys/ipc.h>", kPublic }, { "gid_t", kPrivate, "<sys/stat.h>", kPublic }, { "gid_t", kPrivate, "<unistd.h>", kPublic }, { "id_t", kPrivate, "<sys/types.h>", kPublic }, { "id_t", kPrivate, "<sys/resource.h>", kPublic }, + { "imaxdiv_t", kPrivate, "<inttypes.h>", kPublic }, + { "intmax_t", kPrivate, "<stdint.h>", kPublic }, + { "uintmax_t", kPrivate, "<stdint.h>", kPublic }, { "ino64_t", kPrivate, "<sys/types.h>", kPublic }, { "ino64_t", kPrivate, "<dirent.h>", kPublic }, { "ino_t", kPrivate, "<sys/types.h>", kPublic }, { "ino_t", kPrivate, "<dirent.h>", kPublic }, { "ino_t", kPrivate, "<sys/stat.h>", kPublic }, - { "int8_t", kPrivate, "<sys/types.h>", kPublic }, { "int8_t", kPrivate, "<stdint.h>", kPublic }, { "int16_t", kPrivate, "<stdint.h>", kPublic }, { "int32_t", kPrivate, "<stdint.h>", kPublic }, @@ -131,71 +148,140 @@ const IncludeMapEntry libc_symbol_map[] = { { "uint64_t", kPrivate, "<stdint.h>", kPublic }, { "intptr_t", kPrivate, "<stdint.h>", kPublic }, { "uintptr_t", kPrivate, "<stdint.h>", kPublic }, - { "intptr_t", kPrivate, "<unistd.h>", kPublic }, { "key_t", kPrivate, "<sys/types.h>", kPublic }, { "key_t", kPrivate, "<sys/ipc.h>", kPublic }, + { "lconv", kPrivate, "<locale.h>", kPublic }, + { "ldiv_t", kPrivate, "<stdlib.h>", kPublic }, + { "lldiv_t", kPrivate, "<stdlib.h>", kPublic }, { "max_align_t", kPrivate, "<stddef.h>", kPublic }, { "mode_t", kPrivate, "<sys/types.h>", kPublic }, - { "mode_t", kPrivate, "<sys/stat.h>", kPublic }, + { "mode_t", kPrivate, "<fcntl.h>", kPublic }, + { "mode_t", kPrivate, "<ndbm.h>", kPublic }, + { "mode_t", kPrivate, "<spawn.h>", kPublic }, { "mode_t", kPrivate, "<sys/ipc.h>", kPublic }, { "mode_t", kPrivate, "<sys/mman.h>", kPublic }, + { "mode_t", kPrivate, "<sys/stat.h>", kPublic }, { "nlink_t", kPrivate, "<sys/types.h>", kPublic }, { "nlink_t", kPrivate, "<sys/stat.h>", kPublic }, { "off64_t", kPrivate, "<sys/types.h>", kPublic }, { "off64_t", kPrivate, "<unistd.h>", kPublic }, { "off_t", kPrivate, "<sys/types.h>", kPublic }, - { "off_t", kPrivate, "<unistd.h>", kPublic }, - { "off_t", kPrivate, "<sys/stat.h>", kPublic }, + { "off_t", kPrivate, "<aio.h>", kPublic }, + { "off_t", kPrivate, "<fcntl.h>", kPublic }, + { "off_t", kPrivate, "<stdio.h>", kPublic }, { "off_t", kPrivate, "<sys/mman.h>", kPublic }, + { "off_t", kPrivate, "<sys/stat.h>", kPublic }, + { "off_t", kPrivate, "<unistd.h>", kPublic }, { "pid_t", kPrivate, "<sys/types.h>", kPublic }, - { "pid_t", kPrivate, "<unistd.h>", kPublic }, + { "pid_t", kPrivate, "<fcntl.h>", kPublic }, + { "pid_t", kPrivate, "<sched.h>", kPublic }, { "pid_t", kPrivate, "<signal.h>", kPublic }, + { "pid_t", kPrivate, "<spawn.h>", kPublic }, { "pid_t", kPrivate, "<sys/msg.h>", kPublic }, + { "pid_t", kPrivate, "<sys/sem.h>", kPublic }, { "pid_t", kPrivate, "<sys/shm.h>", kPublic }, + { "pid_t", kPrivate, "<sys/wait.h>", kPublic }, { "pid_t", kPrivate, "<termios.h>", kPublic }, { "pid_t", kPrivate, "<time.h>", kPublic }, + { "pid_t", kPrivate, "<unistd.h>", kPublic }, { "pid_t", kPrivate, "<utmpx.h>", kPublic }, { "ptrdiff_t", kPrivate, "<stddef.h>", kPublic }, + { "regex_t", kPrivate, "<regex.h>", kPublic }, + { "regmatch_t", kPrivate, "<regex.h>", kPublic }, + { "regoff_t", kPrivate, "<regex.h>", kPublic }, + { "sigevent", kPrivate, "<signal.h>", kPublic }, + { "sigevent", kPrivate, "<aio.h>", kPublic }, + { "sigevent", kPrivate, "<mqueue.h>", kPublic }, + { "sigevent", kPrivate, "<time.h>", kPublic }, + { "siginfo_t", kPrivate, "<signal.h>", kPublic }, + { "siginfo_t", kPrivate, "<sys/wait.h>", kPublic }, { "sigset_t", kPrivate, "<signal.h>", kPublic }, - { "sigset_t", kPrivate, "<sys/epoll.h>", kPublic }, + { "sigset_t", kPrivate, "<spawn.h>", kPublic }, { "sigset_t", kPrivate, "<sys/select.h>", kPublic }, - { "socklen_t", kPrivate, "<bits/socket.h>", kPrivate }, - { "socklen_t", kPrivate, "<unistd.h>", kPublic }, - { "socklen_t", kPrivate, "<arpa/inet.h>", kPublic }, + { "sigval", kPrivate, "<signal.h>", kPublic }, + { "sockaddr", kPrivate, "<sys/socket.h>", kPublic }, + { "socklen_t", kPrivate, "<sys/socket.h>", kPublic }, + { "socklen_t", kPrivate, "<netdb.h>", kPublic }, { "ssize_t", kPrivate, "<sys/types.h>", kPublic }, - { "ssize_t", kPrivate, "<unistd.h>", kPublic }, + { "ssize_t", kPrivate, "<aio.h>", kPublic }, { "ssize_t", kPrivate, "<monetary.h>", kPublic }, + { "ssize_t", kPrivate, "<mqueue.h>", kPublic }, + { "ssize_t", kPrivate, "<stdio.h>", kPublic }, { "ssize_t", kPrivate, "<sys/msg.h>", kPublic }, + { "ssize_t", kPrivate, "<sys/socket.h>", kPublic }, + { "ssize_t", kPrivate, "<sys/uio.h>", kPublic }, + { "ssize_t", kPrivate, "<unistd.h>", kPublic }, + { "stat", kPrivate, "<sys/stat.h>", kPublic }, + { "stat", kPrivate, "<ftw.h>", kPublic }, { "suseconds_t", kPrivate, "<sys/types.h>", kPublic }, - { "suseconds_t", kPrivate, "<sys/time.h>", kPublic }, { "suseconds_t", kPrivate, "<sys/select.h>", kPublic }, - { "time_t", kPrivate, "<sys/types.h>", kPublic }, + { "suseconds_t", kPrivate, "<sys/time.h>", kPublic }, { "time_t", kPrivate, "<time.h>", kPublic }, + { "time_t", kPrivate, "<sched.h>", kPublic }, + { "time_t", kPrivate, "<sys/msg.h>", kPublic }, + { "time_t", kPrivate, "<sys/select.h>", kPublic }, + { "time_t", kPrivate, "<sys/sem.h>", kPublic }, + { "time_t", kPrivate, "<sys/shm.h>", kPublic }, + { "time_t", kPrivate, "<sys/stat.h>", kPublic }, + { "time_t", kPrivate, "<sys/time.h>", kPublic }, + { "time_t", kPrivate, "<sys/types.h>", kPublic }, + { "time_t", kPrivate, "<utime.h>", kPublic }, + { "timer_t", kPrivate, "<sys/types.h>", kPublic }, + { "timer_t", kPrivate, "<time.h>", kPublic }, { "timespec", kPrivate, "<time.h>", kPublic }, + { "timespec", kPrivate, "<aio.h>", kPublic }, + { "timespec", kPrivate, "<mqueue.h>", kPublic }, + { "timespec", kPrivate, "<sched.h>", kPublic }, + { "timespec", kPrivate, "<signal.h>", kPublic }, + { "timespec", kPrivate, "<sys/select.h>", kPublic }, + { "timespec", kPrivate, "<sys/stat.h>", kPublic }, { "timeval", kPrivate, "<sys/time.h>", kPublic }, + { "timeval", kPrivate, "<sys/resource.h>", kPublic }, + { "timeval", kPrivate, "<sys/select.h>", kPublic }, + { "timeval", kPrivate, "<utmpx.h>", kPublic }, { "u_char", kPrivate, "<sys/types.h>", kPublic }, { "u_char", kPrivate, "<rpc/types.h>", kPublic }, { "uid_t", kPrivate, "<sys/types.h>", kPublic }, - { "uid_t", kPrivate, "<unistd.h>", kPublic }, { "uid_t", kPrivate, "<pwd.h>", kPublic }, { "uid_t", kPrivate, "<signal.h>", kPublic }, { "uid_t", kPrivate, "<stropts.h>", kPublic }, { "uid_t", kPrivate, "<sys/ipc.h>", kPublic }, { "uid_t", kPrivate, "<sys/stat.h>", kPublic }, + { "uid_t", kPrivate, "<unistd.h>", kPublic }, { "useconds_t", kPrivate, "<sys/types.h>", kPublic }, { "useconds_t", kPrivate, "<unistd.h>", kPublic }, { "wchar_t", kPrivate, "<stddef.h>", kPublic }, { "wchar_t", kPrivate, "<stdlib.h>", kPublic }, - // glob.h seems to define size_t if necessary, but it should come from stddef. // It is unspecified if the cname headers provide ::size_t. // <locale.h> is the one header which defines NULL but not size_t. { "size_t", kPrivate, "<stddef.h>", kPublic }, // 'canonical' location for size_t + { "size_t", kPrivate, "<aio.h>", kPublic }, + { "size_t", kPrivate, "<glob.h>", kPublic }, + { "size_t", kPrivate, "<grp.h>", kPublic }, + { "size_t", kPrivate, "<iconv.h>", kPublic }, + { "size_t", kPrivate, "<monetary.h>", kPublic }, + { "size_t", kPrivate, "<mqueue.h>", kPublic }, + { "size_t", kPrivate, "<ndbm.h>", kPublic }, + { "size_t", kPrivate, "<pwd.h>", kPublic }, + { "size_t", kPrivate, "<regex.h>", kPublic }, + { "size_t", kPrivate, "<search.h>", kPublic }, + { "size_t", kPrivate, "<signal.h>", kPublic }, { "size_t", kPrivate, "<stdio.h>", kPublic }, { "size_t", kPrivate, "<stdlib.h>", kPublic }, { "size_t", kPrivate, "<string.h>", kPublic }, + { "size_t", kPrivate, "<strings.h>", kPublic }, + { "size_t", kPrivate, "<sys/mman.h>", kPublic }, + { "size_t", kPrivate, "<sys/msg.h>", kPublic }, + { "size_t", kPrivate, "<sys/sem.h>", kPublic }, + { "size_t", kPrivate, "<sys/shm.h>", kPublic }, + { "size_t", kPrivate, "<sys/socket.h>", kPublic }, + { "size_t", kPrivate, "<sys/types.h>", kPublic }, + { "size_t", kPrivate, "<sys/uio.h>", kPublic }, { "size_t", kPrivate, "<time.h>", kPublic }, { "size_t", kPrivate, "<uchar.h>", kPublic }, + { "size_t", kPrivate, "<unistd.h>", kPublic }, { "size_t", kPrivate, "<wchar.h>", kPublic }, + { "size_t", kPrivate, "<wordexp.h>", kPublic }, // 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 @@ -203,7 +289,13 @@ const IncludeMapEntry libc_symbol_map[] = { { "EOF", kPrivate, "<stdio.h>", kPublic }, { "EOF", kPrivate, "<libio.h>", kPublic }, { "FILE", kPrivate, "<stdio.h>", kPublic }, + { "MAP_STACK", kPrivate, "<sys/mman.h>", kPublic }, + { "MAP_STACK", kPrivate, "<linux/mman.h>", kPublic }, + { "SIGCHLD", kPrivate, "<signal.h>", kPublic }, + { "SIGCHLD", kPrivate, "<linux/signal.h>", kPublic }, { "va_list", kPrivate, "<stdarg.h>", kPublic }, + { "va_list", kPrivate, "<stdio.h>", kPublic }, + { "va_list", kPrivate, "<wchar.h>", kPublic }, // These are symbols that could be defined in either stdlib.h or // malloc.h, but we always want the stdlib location. { "malloc", kPrivate, "<stdlib.h>", kPublic }, @@ -262,8 +354,8 @@ const IncludeMapEntry libstdcpp_symbol_map[] = { { "std::size_t", kPrivate, "<cwchar>", kPublic }, }; -// Private -> public include mappings for GNU libc const IncludeMapEntry libc_include_map[] = { + // Private -> public include mappings for GNU libc // ( cd /usr/include && grep '^ *# *include' {sys/,net/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | grep bits/ | sort ) // When I saw more than one mapping for these, I typically picked // what I thought was the "best" one. @@ -467,6 +559,8 @@ const IncludeMapEntry libc_include_map[] = { { "<linux/limits.h>", kPrivate, "<limits.h>", kPublic }, // PATH_MAX { "<linux/prctl.h>", kPrivate, "<sys/prctl.h>", kPublic }, { "<sys/ucontext.h>", kPrivate, "<ucontext.h>", kPublic }, + // Exports guaranteed by the C standard + { "<stdint.h>", kPublic, "<inttypes.h>", kPublic }, }; const IncludeMapEntry stdlib_c_include_map[] = { @@ -1315,16 +1409,17 @@ void IncludePicker::ExpandRegexes() { for (const string& regex_key : filepath_include_map_regex_keys) { const vector<MappedInclude>& map_to = filepath_include_map_[regex_key]; // Enclose the regex in ^(...)$ for full match. - llvm::Regex regex(std::string("^(" + regex_key.substr(1) + ")$")); - if (regex.match(hdr, nullptr) && !ContainsQuotedInclude(map_to, hdr)) { + std::regex regex(std::string("^(" + regex_key.substr(1) + ")$")); + if (std::regex_match(hdr, regex) && + !ContainsQuotedInclude(map_to, hdr)) { Extend(&filepath_include_map_[hdr], filepath_include_map_[regex_key]); MarkVisibility(&include_visibility_map_, hdr, include_visibility_map_[regex_key]); } } for (const string& regex_key : friend_to_headers_map_regex_keys) { - llvm::Regex regex(std::string("^(" + regex_key.substr(1) + ")$")); - if (regex.match(hdr, nullptr)) { + std::regex regex(std::string("^(" + regex_key.substr(1) + ")$")); + if (std::regex_match(hdr, regex)) { InsertAllInto(friend_to_headers_map_[regex_key], &friend_to_headers_map_[hdr]); } |