HeaderSearch.h revision ec356c320a81062b1843f0dbe7fedf29ed947ece
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- HeaderSearch.h - Resolve Header File Locations ---------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines the HeaderSearch interface.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_LEX_HEADERSEARCH_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_LEX_HEADERSEARCH_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Lex/DirectoryLookup.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringMap.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalIdentifierLookup;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileEntry;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileManager;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IdentifierInfo;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// HeaderFileInfo - The preprocessor keeps track of this information for each
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/// file that is #included.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HeaderFileInfo {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// isImport - True if this is a #import'd or #pragma once file.
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned isImport : 1;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// DirInfo - Keep track of whether this is a system header, and if so,
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// whether it is C++ clean or not.  This can be set by the include paths or
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// by #pragma gcc system_header.  This is an instance of
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// SrcMgr::CharacteristicKind.
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned DirInfo : 2;
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// \brief Whether this header file info was supplied by an external source.
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned External : 1;
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Whether this structure is considered to already have been
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// "resolved", meaning that it was loaded from the external source.
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned Resolved : 1;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// NumIncludes - This is the number of times the file has been included
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// already.
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned short NumIncludes;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief The ID number of the controlling macro.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// This ID number will be non-zero when there is a controlling
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// macro whose IdentifierInfo may not yet have been loaded from
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// external storage.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned ControllingMacroID;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// ControllingMacro - If this file has a #ifndef XXX (or equivalent) guard
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// that protects the entire contents of the file, this is the identifier
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// for the macro that controls whether or not it has any effect.
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// Note: Most clients should use getControllingMacro() to access
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// the controlling macro of this header, since
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// getControllingMacro() is able to load a controlling macro from
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// external storage.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const IdentifierInfo *ControllingMacro;
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  HeaderFileInfo()
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : isImport(false), DirInfo(SrcMgr::C_User), External(false),
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Resolved(false), NumIncludes(0), ControllingMacroID(0),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ControllingMacro(0)  {}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Retrieve the controlling macro for this header file, if
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// any.
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const IdentifierInfo *getControllingMacro(ExternalIdentifierLookup *External);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Determine whether this is a non-default header file info, e.g.,
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// it corresponds to an actual header we've included or tried to include.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool isNonDefault() const {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return isImport || NumIncludes || ControllingMacro || ControllingMacroID;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// \brief An external source of header file information, which may supply
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// information about header files already included.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExternalHeaderFileInfoSource {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~ExternalHeaderFileInfoSource();
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Retrieve the header file information for the given file entry.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \returns Header file information for the given file entry, with the
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \c External bit set. If the file entry is not known, return a
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// default-constructed \c HeaderFileInfo.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual HeaderFileInfo GetHeaderFileInfo(const FileEntry *FE) = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// HeaderSearch - This class encapsulates the information needed to find the
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// file referenced by a #include or #include_next, (sub-)framework lookup, etc.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HeaderSearch {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileManager &FileMgr;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// #include search path information.  Requests for #include "x" search the
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// directory of the #including file first, then each directory in SearchDirs
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// consequtively. Requests for <x> search the current dir first, then each
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// directory in SearchDirs, starting at SystemDirIdx, consequtively.  If
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// NoCurDirSearch is true, then the check for the file in the current
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// directory is supressed.
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<DirectoryLookup> SearchDirs;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned SystemDirIdx;
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool NoCurDirSearch;
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// FileInfo - This contains all of the preprocessor-specific data about files
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// that are included.  The vector is indexed by the FileEntry's UID.
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<HeaderFileInfo> FileInfo;
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// LookupFileCache - This is keeps track of each lookup performed by
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// LookupFile.  The first part of the value is the starting index in
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// SearchDirs that the cached search was performed from.  If there is a hit
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// and this value doesn't match the current query, the cache has to be
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// ignored.  The second value is the entry in SearchDirs that satisfied the
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// query.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::StringMap<std::pair<unsigned, unsigned> > LookupFileCache;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// FrameworkMap - This is a collection mapping a framework or subframework
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// name like "Carbon" to the Carbon.framework directory.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  llvm::StringMap<const DirectoryEntry *> FrameworkMap;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// HeaderMaps - This is a mapping from FileEntry -> HeaderMap, uniquing
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// headermaps.  This vector owns the headermap.
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::pair<const FileEntry*, const HeaderMap*> > HeaderMaps;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Entity used to resolve the identifier IDs of controlling
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// macros into IdentifierInfo pointers, as needed.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalIdentifierLookup *ExternalLookup;
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// \brief Entity used to look up stored header file information.
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ExternalHeaderFileInfoSource *ExternalSource;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Various statistics we track for performance analysis.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned NumIncluded;
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned NumMultiIncludeFileOptzn;
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned NumFrameworkLookups, NumSubFrameworkLookups;
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // HeaderSearch doesn't support default or copy construction.
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit HeaderSearch();
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit HeaderSearch(const HeaderSearch&);
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void operator=(const HeaderSearch&);
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)public:
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  HeaderSearch(FileManager &FM);
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~HeaderSearch();
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FileManager &getFileMgr() const { return FileMgr; }
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// SetSearchPaths - Interface for setting the file search paths.
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ///
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void SetSearchPaths(const std::vector<DirectoryLookup> &dirs,
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                      unsigned systemDirIdx, bool noCurDirSearch) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SearchDirs = dirs;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SystemDirIdx = systemDirIdx;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NoCurDirSearch = noCurDirSearch;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //LookupFileCache.clear();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ClearFileInfo - Forget everything we know about headers so far.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearFileInfo() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileInfo.clear();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExternalLookup(ExternalIdentifierLookup *EIL) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExternalLookup = EIL;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalIdentifierLookup *getExternalLookup() const {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ExternalLookup;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Set the external source of header information.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExternalSource(ExternalHeaderFileInfoSource *ES) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExternalSource = ES;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// LookupFile - Given a "foo" or <foo> reference, look up the indicated file,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// return null on failure.  isAngled indicates whether the file reference is
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// a <> reference.  If successful, this returns 'UsedDir', the
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// DirectoryLookup member the file was found in, or null if not applicable.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// If CurDir is non-null, the file was found in the specified directory
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// search location.  This is used to implement #include_next.  CurFileEnt, if
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// non-null, indicates where the #including file is, in case a relative
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// search is needed.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileEntry *LookupFile(llvm::StringRef Filename, bool isAngled,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const DirectoryLookup *FromDir,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const DirectoryLookup *&CurDir,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const FileEntry *CurFileEnt);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// LookupSubframeworkHeader - Look up a subframework for the specified
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// #include file.  For example, if #include'ing <HIToolbox/HIToolbox.h> from
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// within ".../Carbon.framework/Headers/Carbon.h", check to see if HIToolbox
200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// is a subframework within Carbon.framework.  If so, return the FileEntry
201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// for the designated file, otherwise return null.
202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const FileEntry *LookupSubframeworkHeader(llvm::StringRef Filename,
203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            const FileEntry *RelativeFileEnt);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// LookupFrameworkCache - Look up the specified framework name in our
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// framework cache, returning the DirectoryEntry it is in if we know,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// otherwise, return null.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const DirectoryEntry *&LookupFrameworkCache(llvm::StringRef FWName) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FrameworkMap.GetOrCreateValue(FWName).getValue();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ShouldEnterIncludeFile - Mark the specified file as a target of of a
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// #include, #include_next, or #import directive.  Return false if #including
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// the file will have no effect or true if we should include it.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldEnterIncludeFile(const FileEntry *File, bool isImport);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getFileDirFlavor - Return whether the specified file is a normal header,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// a system header, or a C++ friendly system header.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcMgr::CharacteristicKind getFileDirFlavor(const FileEntry *File) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (SrcMgr::CharacteristicKind)getFileInfo(File).DirInfo;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// MarkFileIncludeOnce - Mark the specified file as a "once only" file, e.g.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// due to #pragma once.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MarkFileIncludeOnce(const FileEntry *File) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getFileInfo(File).isImport = true;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// MarkFileSystemHeader - Mark the specified file as a system header, e.g.
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// due to #pragma GCC system_header.
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void MarkFileSystemHeader(const FileEntry *File) {
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    getFileInfo(File).DirInfo = SrcMgr::C_System;
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// IncrementIncludeCount - Increment the count for the number of times the
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// specified FileEntry has been entered.
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void IncrementIncludeCount(const FileEntry *File) {
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ++getFileInfo(File).NumIncludes;
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// SetFileControllingMacro - Mark the specified file as having a controlling
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// macro.  This is used by the multiple-include optimization to eliminate
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// no-op #includes.
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetFileControllingMacro(const FileEntry *File,
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               const IdentifierInfo *ControllingMacro) {
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    getFileInfo(File).ControllingMacro = ControllingMacro;
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /// CreateHeaderMap - This method returns a HeaderMap for the specified
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /// FileEntry, uniquing them through the the 'HeaderMaps' datastructure.
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const HeaderMap *CreateHeaderMap(const FileEntry *FE);
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void IncrementFrameworkLookupCount() { ++NumFrameworkLookups; }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<HeaderFileInfo>::const_iterator header_file_iterator;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header_file_iterator header_file_begin() const { return FileInfo.begin(); }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header_file_iterator header_file_end() const { return FileInfo.end(); }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned header_file_size() const { return FileInfo.size(); }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by ASTReader.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by external tools
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<DirectoryLookup>::const_iterator search_dir_iterator;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search_dir_iterator search_dir_begin() const { return SearchDirs.begin(); }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search_dir_iterator search_dir_end() const { return SearchDirs.end(); }
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned search_dir_size() const { return SearchDirs.size(); }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  search_dir_iterator system_dir_begin() const {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SearchDirs.begin() + SystemDirIdx;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search_dir_iterator system_dir_end() const { return SearchDirs.end(); }
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrintStats();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getFileInfo - Return the HeaderFileInfo structure for the specified
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// FileEntry.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HeaderFileInfo &getFileInfo(const FileEntry *FE);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace clang
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)