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)