HeaderSearch.h revision 26697979fb0a4e2b720a0c8d062047edca92bc92
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. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (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 "clang/Lex/ModuleMap.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringMap.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringSet.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/Allocator.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiagnosticsEngine; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalIdentifierLookup; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileEntry; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileManager; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IdentifierInfo; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// HeaderFileInfo - The preprocessor keeps track of this information for each 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// file that is #included. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HeaderFileInfo { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isImport - True if this is a #import'd or #pragma once file. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned isImport : 1; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// isPragmaOnce - True if this is #pragma once file. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned isPragmaOnce : 1; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// DirInfo - Keep track of whether this is a system header, and if so, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// whether it is C++ clean or not. This can be set by the include paths or 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// by #pragma gcc system_header. This is an instance of 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SrcMgr::CharacteristicKind. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned DirInfo : 2; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this header file info was supplied by an external source. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned External : 1; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this structure is considered to already have been 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// "resolved", meaning that it was loaded from the external source. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Resolved : 1; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this is a header inside a framework that is currently 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// being built. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// When a framework is being built, the headers have not yet been placed 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// into the appropriate framework subdirectories, and therefore are 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// provided via a header map. This bit indicates when this is one of 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// those framework headers. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned IndexHeaderMapHeader : 1; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// NumIncludes - This is the number of times the file has been included 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// already. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short NumIncludes; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The ID number of the controlling macro. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// This ID number will be non-zero when there is a controlling 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// macro whose IdentifierInfo may not yet have been loaded from 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// external storage. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned ControllingMacroID; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ControllingMacro - If this file has a #ifndef XXX (or equivalent) guard 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// that protects the entire contents of the file, this is the identifier 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// for the macro that controls whether or not it has any effect. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Note: Most clients should use getControllingMacro() to access 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the controlling macro of this header, since 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getControllingMacro() is able to load a controlling macro from 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// external storage. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IdentifierInfo *ControllingMacro; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief If this header came from a framework include, this is the name 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// of the framework. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef Framework; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeaderFileInfo() 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : isImport(false), isPragmaOnce(false), DirInfo(SrcMgr::C_User), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) External(false), Resolved(false), IndexHeaderMapHeader(false), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumIncludes(0), ControllingMacroID(0), ControllingMacro(0) {} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the controlling macro for this header file, if 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// any. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IdentifierInfo *getControllingMacro(ExternalIdentifierLookup *External); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Determine whether this is a non-default header file info, e.g., 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// it corresponds to an actual header we've included or tried to include. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isNonDefault() const { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isImport || isPragmaOnce || NumIncludes || ControllingMacro || 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ControllingMacroID; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief An external source of header file information, which may supply 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// information about header files already included. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalHeaderFileInfoSource { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExternalHeaderFileInfoSource(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the header file information for the given file entry. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \returns Header file information for the given file entry, with the 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \c External bit set. If the file entry is not known, return a 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// default-constructed \c HeaderFileInfo. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HeaderFileInfo GetHeaderFileInfo(const FileEntry *FE) = 0; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// HeaderSearch - This class encapsulates the information needed to find the 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// file referenced by a #include or #include_next, (sub-)framework lookup, etc. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HeaderSearch { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileManager &FileMgr; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DiagnosticsEngine &Diags; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// #include search path information. Requests for #include "x" search the 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// directory of the #including file first, then each directory in SearchDirs 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// consecutively. Requests for <x> search the current dir first, then each 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// directory in SearchDirs, starting at AngledDirIdx, consecutively. If 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// NoCurDirSearch is true, then the check for the file in the current 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// directory is suppressed. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<DirectoryLookup> SearchDirs; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned AngledDirIdx; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned SystemDirIdx; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool NoCurDirSearch; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The path to the module cache. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ModuleCachePath; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The name of the module we're building. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string BuildingModule; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// FileInfo - This contains all of the preprocessor-specific data about files 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// that are included. The vector is indexed by the FileEntry's UID. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<HeaderFileInfo> FileInfo; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LookupFileCache - This is keeps track of each lookup performed by 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LookupFile. The first part of the value is the starting index in 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SearchDirs that the cached search was performed from. If there is a hit 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// and this value doesn't match the current query, the cache has to be 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ignored. The second value is the entry in SearchDirs that satisfied the 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// query. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::StringMap<std::pair<unsigned, unsigned>, llvm::BumpPtrAllocator> 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LookupFileCache; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// FrameworkMap - This is a collection mapping a framework or subframework 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// name like "Carbon" to the Carbon.framework directory. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::StringMap<const DirectoryEntry *, llvm::BumpPtrAllocator> 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameworkMap; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// HeaderMaps - This is a mapping from FileEntry -> HeaderMap, uniquing 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// headermaps. This vector owns the headermap. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::pair<const FileEntry*, const HeaderMap*> > HeaderMaps; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The mapping between modules and headers. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleMap ModMap; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Describes whether a given directory has a module map in it. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::DenseMap<const DirectoryEntry *, bool> DirectoryHasModuleMap; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Uniqued set of framework names, which is used to track which 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// headers were included as framework headers. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::StringSet<llvm::BumpPtrAllocator> FrameworkNames; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Entity used to resolve the identifier IDs of controlling 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// macros into IdentifierInfo pointers, as needed. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExternalIdentifierLookup *ExternalLookup; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Entity used to look up stored header file information. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExternalHeaderFileInfoSource *ExternalSource; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Various statistics we track for performance analysis. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumIncluded; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumMultiIncludeFileOptzn; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned NumFrameworkLookups, NumSubFrameworkLookups; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HeaderSearch doesn't support default or copy construction. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HeaderSearch(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HeaderSearch(const HeaderSearch&); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void operator=(const HeaderSearch&); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeaderSearch(FileManager &FM, DiagnosticsEngine &Diags); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~HeaderSearch(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileManager &getFileMgr() const { return FileMgr; } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SetSearchPaths - Interface for setting the file search paths. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetSearchPaths(const std::vector<DirectoryLookup> &dirs, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned angledDirIdx, unsigned systemDirIdx, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool noCurDirSearch) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(angledDirIdx <= systemDirIdx && systemDirIdx <= dirs.size() && 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Directory indicies are unordered"); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchDirs = dirs; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AngledDirIdx = angledDirIdx; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SystemDirIdx = systemDirIdx; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoCurDirSearch = noCurDirSearch; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //LookupFileCache.clear(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Set the path to the module cache and the name of the module 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// we're building 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void configureModules(StringRef CachePath, StringRef BuildingModule) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleCachePath = CachePath; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this->BuildingModule = BuildingModule; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ClearFileInfo - Forget everything we know about headers so far. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearFileInfo() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileInfo.clear(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExternalLookup(ExternalIdentifierLookup *EIL) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExternalLookup = EIL; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExternalIdentifierLookup *getExternalLookup() const { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExternalLookup; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Set the external source of header information. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExternalSource(ExternalHeaderFileInfoSource *ES) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExternalSource = ES; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LookupFile - Given a "foo" or <foo> reference, look up the indicated file, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// return null on failure. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \returns If successful, this returns 'UsedDir', the DirectoryLookup member 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the file was found in, or null if not applicable. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param isAngled indicates whether the file reference is a <> reference. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param CurDir If non-null, the file was found in the specified directory 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// search location. This is used to implement #include_next. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param CurFileEnt If non-null, indicates where the #including file is, in 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// case a relative search is needed. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param SearchPath If non-null, will be set to the search path relative 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// to which the file was found. If the include path is absolute, SearchPath 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// will be set to an empty string. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param RelativePath If non-null, will be set to the path relative to 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SearchPath at which the file was found. This only differs from the 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Filename for framework includes. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param SuggestedModule If non-null, and the file found is semantically 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// part of a known module, this will be set to the name of the module that 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// could be imported instead of preprocessing/parsing the file found. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *LookupFile(StringRef Filename, bool isAngled, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DirectoryLookup *FromDir, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DirectoryLookup *&CurDir, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *CurFileEnt, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmallVectorImpl<char> *SearchPath, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmallVectorImpl<char> *RelativePath, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef *SuggestedModule); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LookupSubframeworkHeader - Look up a subframework for the specified 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// #include file. For example, if #include'ing <HIToolbox/HIToolbox.h> from 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// within ".../Carbon.framework/Headers/Carbon.h", check to see if HIToolbox 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// is a subframework within Carbon.framework. If so, return the FileEntry 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// for the designated file, otherwise return null. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *LookupSubframeworkHeader( 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef Filename, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *RelativeFileEnt, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmallVectorImpl<char> *SearchPath, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SmallVectorImpl<char> *RelativePath); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LookupFrameworkCache - Look up the specified framework name in our 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// framework cache, returning the DirectoryEntry it is in if we know, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// otherwise, return null. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DirectoryEntry *&LookupFrameworkCache(StringRef FWName) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FrameworkMap.GetOrCreateValue(FWName).getValue(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ShouldEnterIncludeFile - Mark the specified file as a target of of a 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// #include, #include_next, or #import directive. Return false if #including 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the file will have no effect or true if we should include it. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ShouldEnterIncludeFile(const FileEntry *File, bool isImport); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getFileDirFlavor - Return whether the specified file is a normal header, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// a system header, or a C++ friendly system header. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcMgr::CharacteristicKind getFileDirFlavor(const FileEntry *File) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (SrcMgr::CharacteristicKind)getFileInfo(File).DirInfo; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// MarkFileIncludeOnce - Mark the specified file as a "once only" file, e.g. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// due to #pragma once. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkFileIncludeOnce(const FileEntry *File) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeaderFileInfo &FI = getFileInfo(File); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FI.isImport = true; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FI.isPragmaOnce = true; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// MarkFileSystemHeader - Mark the specified file as a system header, e.g. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// due to #pragma GCC system_header. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MarkFileSystemHeader(const FileEntry *File) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getFileInfo(File).DirInfo = SrcMgr::C_System; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// IncrementIncludeCount - Increment the count for the number of times the 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// specified FileEntry has been entered. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncrementIncludeCount(const FileEntry *File) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++getFileInfo(File).NumIncludes; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SetFileControllingMacro - Mark the specified file as having a controlling 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// macro. This is used by the multiple-include optimization to eliminate 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// no-op #includes. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFileControllingMacro(const FileEntry *File, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IdentifierInfo *ControllingMacro) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getFileInfo(File).ControllingMacro = ControllingMacro; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Determine whether this file is intended to be safe from 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// multiple inclusions, e.g., it has #pragma once or a controlling 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// macro. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// This routine does not consider the effect of #import 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isFileMultipleIncludeGuarded(const FileEntry *File); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// CreateHeaderMap - This method returns a HeaderMap for the specified 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// FileEntry, uniquing them through the the 'HeaderMaps' datastructure. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HeaderMap *CreateHeaderMap(const FileEntry *FE); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Search in the module cache path for a module with the given 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// name. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param If non-NULL, will be set to the module file name we expected to 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// find (regardless of whether it was actually found or not). 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param UmbrellaHeader If non-NULL, and no module was found in the module 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// cache, this routine will search in the framework paths to determine 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// whether a module can be built from an umbrella header. If so, the pointee 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// will be set to the path of the umbrella header. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \returns A file describing the named module, if available, or NULL to 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// indicate that the module could not be found. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileEntry *lookupModule(StringRef ModuleName, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string *ModuleFileName = 0, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string *UmbrellaHeader = 0); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncrementFrameworkLookupCount() { ++NumFrameworkLookups; } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Determine whether there is a module map that may map the header 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// with the given file name to a (sub)module. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param Filename The name of the file. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param Root The "root" directory, at which we should stop looking for 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// module maps. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasModuleMap(StringRef Filename, const DirectoryEntry *Root); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve the module that corresponds to the given file, if any. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// FIXME: This will need to be generalized for submodules. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef findModuleForHeader(const FileEntry *File); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<HeaderFileInfo>::const_iterator header_file_iterator; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_file_iterator header_file_begin() const { return FileInfo.begin(); } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_file_iterator header_file_end() const { return FileInfo.end(); } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned header_file_size() const { return FileInfo.size(); } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by ASTReader. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by external tools 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<DirectoryLookup>::const_iterator search_dir_iterator; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator search_dir_begin() const { return SearchDirs.begin(); } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator search_dir_end() const { return SearchDirs.end(); } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned search_dir_size() const { return SearchDirs.size(); } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator quoted_dir_begin() const { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SearchDirs.begin(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator quoted_dir_end() const { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SearchDirs.begin() + AngledDirIdx; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator angled_dir_begin() const { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SearchDirs.begin() + AngledDirIdx; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator angled_dir_end() const { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SearchDirs.begin() + SystemDirIdx; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator system_dir_begin() const { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SearchDirs.begin() + SystemDirIdx; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_dir_iterator system_dir_end() const { return SearchDirs.end(); } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Retrieve a uniqued framework name. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringRef getUniqueFrameworkName(StringRef Framework); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PrintStats(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t getTotalMemory() const; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Describes what happened when we tried to load a module map file. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum LoadModuleMapResult { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The module map file had already been loaded. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LMM_AlreadyLoaded, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The module map file was loaded by this invocation. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LMM_NewlyLoaded, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief There is was directory with the given name. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LMM_NoDirectory, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief There was either no module map file or the module map file was 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// invalid. 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LMM_InvalidModuleMap 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Try to load the module map file in the given directory. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param DirName The name of the directory where we will look for a module 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// map file. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \returns The result of attempting to load the module map file from the 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// named directory. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadModuleMapResult loadModuleMapFile(StringRef DirName); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Try to load the module map file in the given directory. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param Dir The directory where we will look for a module map file. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \returns The result of attempting to load the module map file from the 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// named directory. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadModuleMapResult loadModuleMapFile(const DirectoryEntry *Dir); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getFileInfo - Return the HeaderFileInfo structure for the specified 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// FileEntry. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeaderFileInfo &getFileInfo(const FileEntry *FE); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace clang 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)