summaryrefslogtreecommitdiffstats
path: root/iwyu_include_picker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'iwyu_include_picker.cc')
-rw-r--r--iwyu_include_picker.cc141
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]);
}