1 //===- HeaderSearch.h - Resolve Header File Locations -----------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the HeaderSearch interface. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LEX_HEADERSEARCH_H 14 #define LLVM_CLANG_LEX_HEADERSEARCH_H 15 16 #include "clang/Basic/SourceLocation.h" 17 #include "clang/Basic/SourceManager.h" 18 #include "clang/Lex/DirectoryLookup.h" 19 #include "clang/Lex/HeaderMap.h" 20 #include "clang/Lex/ModuleMap.h" 21 #include "llvm/ADT/ArrayRef.h" 22 #include "llvm/ADT/DenseMap.h" 23 #include "llvm/ADT/SmallString.h" 24 #include "llvm/ADT/StringMap.h" 25 #include "llvm/ADT/StringRef.h" 26 #include "llvm/ADT/StringSet.h" 27 #include "llvm/Support/Allocator.h" 28 #include <cassert> 29 #include <cstddef> 30 #include <memory> 31 #include <string> 32 #include <utility> 33 #include <vector> 34 35 namespace llvm { 36 37 class Triple; 38 39 } // namespace llvm 40 41 namespace clang { 42 43 class DiagnosticsEngine; 44 class DirectoryEntry; 45 class ExternalPreprocessorSource; 46 class FileEntry; 47 class FileManager; 48 class HeaderSearch; 49 class HeaderSearchOptions; 50 class IdentifierInfo; 51 class LangOptions; 52 class Module; 53 class Preprocessor; 54 class TargetInfo; 55 56 /// The preprocessor keeps track of this information for each 57 /// file that is \#included. 58 struct HeaderFileInfo { 59 // TODO: Whether the file was imported is not a property of the file itself. 60 // It's a preprocessor state, move it there. 61 /// True if this is a \#import'd file. 62 unsigned isImport : 1; 63 64 /// True if this is a \#pragma once file. 65 unsigned isPragmaOnce : 1; 66 67 /// Keep track of whether this is a system header, and if so, 68 /// whether it is C++ clean or not. This can be set by the include paths or 69 /// by \#pragma gcc system_header. This is an instance of 70 /// SrcMgr::CharacteristicKind. 71 unsigned DirInfo : 3; 72 73 /// Whether this header file info was supplied by an external source, 74 /// and has not changed since. 75 unsigned External : 1; 76 77 /// Whether this header is part of a module. 78 unsigned isModuleHeader : 1; 79 80 /// Whether this header is part of the module that we are building. 81 unsigned isCompilingModuleHeader : 1; 82 83 /// Whether this structure is considered to already have been 84 /// "resolved", meaning that it was loaded from the external source. 85 unsigned Resolved : 1; 86 87 /// Whether this is a header inside a framework that is currently 88 /// being built. 89 /// 90 /// When a framework is being built, the headers have not yet been placed 91 /// into the appropriate framework subdirectories, and therefore are 92 /// provided via a header map. This bit indicates when this is one of 93 /// those framework headers. 94 unsigned IndexHeaderMapHeader : 1; 95 96 /// Whether this file has been looked up as a header. 97 unsigned IsValid : 1; 98 99 /// The ID number of the controlling macro. 100 /// 101 /// This ID number will be non-zero when there is a controlling 102 /// macro whose IdentifierInfo may not yet have been loaded from 103 /// external storage. 104 unsigned ControllingMacroID = 0; 105 106 /// If this file has a \#ifndef XXX (or equivalent) guard that 107 /// protects the entire contents of the file, this is the identifier 108 /// for the macro that controls whether or not it has any effect. 109 /// 110 /// Note: Most clients should use getControllingMacro() to access 111 /// the controlling macro of this header, since 112 /// getControllingMacro() is able to load a controlling macro from 113 /// external storage. 114 const IdentifierInfo *ControllingMacro = nullptr; 115 116 /// If this header came from a framework include, this is the name 117 /// of the framework. 118 StringRef Framework; 119 HeaderFileInfoHeaderFileInfo120 HeaderFileInfo() 121 : isImport(false), isPragmaOnce(false), DirInfo(SrcMgr::C_User), 122 External(false), isModuleHeader(false), isCompilingModuleHeader(false), 123 Resolved(false), IndexHeaderMapHeader(false), IsValid(false) {} 124 125 /// Retrieve the controlling macro for this header file, if 126 /// any. 127 const IdentifierInfo * 128 getControllingMacro(ExternalPreprocessorSource *External); 129 }; 130 131 /// An external source of header file information, which may supply 132 /// information about header files already included. 133 class ExternalHeaderFileInfoSource { 134 public: 135 virtual ~ExternalHeaderFileInfoSource(); 136 137 /// Retrieve the header file information for the given file entry. 138 /// 139 /// \returns Header file information for the given file entry, with the 140 /// \c External bit set. If the file entry is not known, return a 141 /// default-constructed \c HeaderFileInfo. 142 virtual HeaderFileInfo GetHeaderFileInfo(const FileEntry *FE) = 0; 143 }; 144 145 /// This structure is used to record entries in our framework cache. 146 struct FrameworkCacheEntry { 147 /// The directory entry which should be used for the cached framework. 148 OptionalDirectoryEntryRef Directory; 149 150 /// Whether this framework has been "user-specified" to be treated as if it 151 /// were a system framework (even if it was found outside a system framework 152 /// directory). 153 bool IsUserSpecifiedSystemFramework; 154 }; 155 156 namespace detail { 157 template <bool Const, typename T> 158 using Qualified = std::conditional_t<Const, const T, T>; 159 160 /// Forward iterator over the search directories of \c HeaderSearch. 161 template <bool IsConst> 162 struct SearchDirIteratorImpl 163 : llvm::iterator_facade_base<SearchDirIteratorImpl<IsConst>, 164 std::forward_iterator_tag, 165 Qualified<IsConst, DirectoryLookup>> { 166 /// Const -> non-const iterator conversion. 167 template <typename Enable = std::enable_if<IsConst, bool>> SearchDirIteratorImplSearchDirIteratorImpl168 SearchDirIteratorImpl(const SearchDirIteratorImpl<false> &Other) 169 : HS(Other.HS), Idx(Other.Idx) {} 170 171 SearchDirIteratorImpl(const SearchDirIteratorImpl &) = default; 172 173 SearchDirIteratorImpl &operator=(const SearchDirIteratorImpl &) = default; 174 175 bool operator==(const SearchDirIteratorImpl &RHS) const { 176 return HS == RHS.HS && Idx == RHS.Idx; 177 } 178 179 SearchDirIteratorImpl &operator++() { 180 assert(*this && "Invalid iterator."); 181 ++Idx; 182 return *this; 183 } 184 185 Qualified<IsConst, DirectoryLookup> &operator*() const { 186 assert(*this && "Invalid iterator."); 187 return HS->SearchDirs[Idx]; 188 } 189 190 /// Creates an invalid iterator. SearchDirIteratorImplSearchDirIteratorImpl191 SearchDirIteratorImpl(std::nullptr_t) : HS(nullptr), Idx(0) {} 192 193 /// Checks whether the iterator is valid. 194 explicit operator bool() const { return HS != nullptr; } 195 196 private: 197 /// The parent \c HeaderSearch. This is \c nullptr for invalid iterator. 198 Qualified<IsConst, HeaderSearch> *HS; 199 200 /// The index of the current element. 201 size_t Idx; 202 203 /// The constructor that creates a valid iterator. SearchDirIteratorImplSearchDirIteratorImpl204 SearchDirIteratorImpl(Qualified<IsConst, HeaderSearch> &HS, size_t Idx) 205 : HS(&HS), Idx(Idx) {} 206 207 /// Only HeaderSearch is allowed to instantiate valid iterators. 208 friend HeaderSearch; 209 210 /// Enables const -> non-const conversion. 211 friend SearchDirIteratorImpl<!IsConst>; 212 }; 213 } // namespace detail 214 215 using ConstSearchDirIterator = detail::SearchDirIteratorImpl<true>; 216 using SearchDirIterator = detail::SearchDirIteratorImpl<false>; 217 218 using ConstSearchDirRange = llvm::iterator_range<ConstSearchDirIterator>; 219 using SearchDirRange = llvm::iterator_range<SearchDirIterator>; 220 221 /// Encapsulates the information needed to find the file referenced 222 /// by a \#include or \#include_next, (sub-)framework lookup, etc. 223 class HeaderSearch { 224 friend class DirectoryLookup; 225 226 friend ConstSearchDirIterator; 227 friend SearchDirIterator; 228 229 /// Header-search options used to initialize this header search. 230 std::shared_ptr<HeaderSearchOptions> HSOpts; 231 232 /// Mapping from SearchDir to HeaderSearchOptions::UserEntries indices. 233 llvm::DenseMap<unsigned, unsigned> SearchDirToHSEntry; 234 235 DiagnosticsEngine &Diags; 236 FileManager &FileMgr; 237 238 /// \#include search path information. Requests for \#include "x" search the 239 /// directory of the \#including file first, then each directory in SearchDirs 240 /// consecutively. Requests for <x> search the current dir first, then each 241 /// directory in SearchDirs, starting at AngledDirIdx, consecutively. If 242 /// NoCurDirSearch is true, then the check for the file in the current 243 /// directory is suppressed. 244 std::vector<DirectoryLookup> SearchDirs; 245 /// Whether the DirectoryLookup at the corresponding index in SearchDirs has 246 /// been successfully used to lookup a file. 247 std::vector<bool> SearchDirsUsage; 248 unsigned AngledDirIdx = 0; 249 unsigned SystemDirIdx = 0; 250 bool NoCurDirSearch = false; 251 252 /// Maps HeaderMap keys to SearchDir indices. When HeaderMaps are used 253 /// heavily, SearchDirs can start with thousands of HeaderMaps, so this Index 254 /// lets us avoid scanning them all to find a match. 255 llvm::StringMap<unsigned, llvm::BumpPtrAllocator> SearchDirHeaderMapIndex; 256 257 /// The index of the first SearchDir that isn't a header map. 258 unsigned FirstNonHeaderMapSearchDirIdx = 0; 259 260 /// \#include prefixes for which the 'system header' property is 261 /// overridden. 262 /// 263 /// For a \#include "x" or \#include \<x> directive, the last string in this 264 /// list which is a prefix of 'x' determines whether the file is treated as 265 /// a system header. 266 std::vector<std::pair<std::string, bool>> SystemHeaderPrefixes; 267 268 /// The hash used for module cache paths. 269 std::string ModuleHash; 270 271 /// The path to the module cache. 272 std::string ModuleCachePath; 273 274 /// All of the preprocessor-specific data about files that are 275 /// included, indexed by the FileEntry's UID. 276 mutable std::vector<HeaderFileInfo> FileInfo; 277 278 /// Keeps track of each lookup performed by LookupFile. 279 struct LookupFileCacheInfo { 280 /// Starting search directory iterator that the cached search was performed 281 /// from. If there is a hit and this value doesn't match the current query, 282 /// the cache has to be ignored. 283 ConstSearchDirIterator StartIt = nullptr; 284 285 /// The search directory iterator that satisfied the query. 286 ConstSearchDirIterator HitIt = nullptr; 287 288 /// This is non-null if the original filename was mapped to a framework 289 /// include via a headermap. 290 const char *MappedName = nullptr; 291 292 /// Default constructor -- Initialize all members with zero. 293 LookupFileCacheInfo() = default; 294 resetLookupFileCacheInfo295 void reset(ConstSearchDirIterator NewStartIt) { 296 StartIt = NewStartIt; 297 MappedName = nullptr; 298 } 299 }; 300 llvm::StringMap<LookupFileCacheInfo, llvm::BumpPtrAllocator> LookupFileCache; 301 302 /// Collection mapping a framework or subframework 303 /// name like "Carbon" to the Carbon.framework directory. 304 llvm::StringMap<FrameworkCacheEntry, llvm::BumpPtrAllocator> FrameworkMap; 305 306 /// Maps include file names (including the quotes or 307 /// angle brackets) to other include file names. This is used to support the 308 /// include_alias pragma for Microsoft compatibility. 309 using IncludeAliasMap = 310 llvm::StringMap<std::string, llvm::BumpPtrAllocator>; 311 std::unique_ptr<IncludeAliasMap> IncludeAliases; 312 313 /// This is a mapping from FileEntry -> HeaderMap, uniquing headermaps. 314 std::vector<std::pair<const FileEntry *, std::unique_ptr<HeaderMap>>> HeaderMaps; 315 316 /// The mapping between modules and headers. 317 mutable ModuleMap ModMap; 318 319 /// Describes whether a given directory has a module map in it. 320 llvm::DenseMap<const DirectoryEntry *, bool> DirectoryHasModuleMap; 321 322 /// Set of module map files we've already loaded, and a flag indicating 323 /// whether they were valid or not. 324 llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps; 325 326 // A map of discovered headers with their associated include file name. 327 llvm::DenseMap<const FileEntry *, llvm::SmallString<64>> IncludeNames; 328 329 /// Uniqued set of framework names, which is used to track which 330 /// headers were included as framework headers. 331 llvm::StringSet<llvm::BumpPtrAllocator> FrameworkNames; 332 333 /// Entity used to resolve the identifier IDs of controlling 334 /// macros into IdentifierInfo pointers, and keep the identifire up to date, 335 /// as needed. 336 ExternalPreprocessorSource *ExternalLookup = nullptr; 337 338 /// Entity used to look up stored header file information. 339 ExternalHeaderFileInfoSource *ExternalSource = nullptr; 340 341 /// Scan all of the header maps at the beginning of SearchDirs and 342 /// map their keys to the SearchDir index of their header map. 343 void indexInitialHeaderMaps(); 344 345 public: 346 HeaderSearch(std::shared_ptr<HeaderSearchOptions> HSOpts, 347 SourceManager &SourceMgr, DiagnosticsEngine &Diags, 348 const LangOptions &LangOpts, const TargetInfo *Target); 349 HeaderSearch(const HeaderSearch &) = delete; 350 HeaderSearch &operator=(const HeaderSearch &) = delete; 351 352 /// Retrieve the header-search options with which this header search 353 /// was initialized. getHeaderSearchOpts()354 HeaderSearchOptions &getHeaderSearchOpts() const { return *HSOpts; } 355 getFileMgr()356 FileManager &getFileMgr() const { return FileMgr; } 357 getDiags()358 DiagnosticsEngine &getDiags() const { return Diags; } 359 360 /// Interface for setting the file search paths. 361 void SetSearchPaths(std::vector<DirectoryLookup> dirs, unsigned angledDirIdx, 362 unsigned systemDirIdx, bool noCurDirSearch, 363 llvm::DenseMap<unsigned, unsigned> searchDirToHSEntry); 364 365 /// Add an additional search path. 366 void AddSearchPath(const DirectoryLookup &dir, bool isAngled); 367 368 /// Add an additional system search path. AddSystemSearchPath(const DirectoryLookup & dir)369 void AddSystemSearchPath(const DirectoryLookup &dir) { 370 SearchDirs.push_back(dir); 371 SearchDirsUsage.push_back(false); 372 } 373 374 /// Set the list of system header prefixes. SetSystemHeaderPrefixes(ArrayRef<std::pair<std::string,bool>> P)375 void SetSystemHeaderPrefixes(ArrayRef<std::pair<std::string, bool>> P) { 376 SystemHeaderPrefixes.assign(P.begin(), P.end()); 377 } 378 379 /// Checks whether the map exists or not. HasIncludeAliasMap()380 bool HasIncludeAliasMap() const { return (bool)IncludeAliases; } 381 382 /// Map the source include name to the dest include name. 383 /// 384 /// The Source should include the angle brackets or quotes, the dest 385 /// should not. This allows for distinction between <> and "" headers. AddIncludeAlias(StringRef Source,StringRef Dest)386 void AddIncludeAlias(StringRef Source, StringRef Dest) { 387 if (!IncludeAliases) 388 IncludeAliases.reset(new IncludeAliasMap); 389 (*IncludeAliases)[Source] = std::string(Dest); 390 } 391 392 /// Maps one header file name to a different header 393 /// file name, for use with the include_alias pragma. Note that the source 394 /// file name should include the angle brackets or quotes. Returns StringRef 395 /// as null if the header cannot be mapped. MapHeaderToIncludeAlias(StringRef Source)396 StringRef MapHeaderToIncludeAlias(StringRef Source) { 397 assert(IncludeAliases && "Trying to map headers when there's no map"); 398 399 // Do any filename replacements before anything else 400 IncludeAliasMap::const_iterator Iter = IncludeAliases->find(Source); 401 if (Iter != IncludeAliases->end()) 402 return Iter->second; 403 return {}; 404 } 405 406 /// Set the hash to use for module cache paths. setModuleHash(StringRef Hash)407 void setModuleHash(StringRef Hash) { ModuleHash = std::string(Hash); } 408 409 /// Set the path to the module cache. setModuleCachePath(StringRef CachePath)410 void setModuleCachePath(StringRef CachePath) { 411 ModuleCachePath = std::string(CachePath); 412 } 413 414 /// Retrieve the module hash. getModuleHash()415 StringRef getModuleHash() const { return ModuleHash; } 416 417 /// Retrieve the path to the module cache. getModuleCachePath()418 StringRef getModuleCachePath() const { return ModuleCachePath; } 419 420 /// Consider modules when including files from this directory. setDirectoryHasModuleMap(const DirectoryEntry * Dir)421 void setDirectoryHasModuleMap(const DirectoryEntry* Dir) { 422 DirectoryHasModuleMap[Dir] = true; 423 } 424 425 /// Forget everything we know about headers so far. ClearFileInfo()426 void ClearFileInfo() { 427 FileInfo.clear(); 428 } 429 SetExternalLookup(ExternalPreprocessorSource * EPS)430 void SetExternalLookup(ExternalPreprocessorSource *EPS) { 431 ExternalLookup = EPS; 432 } 433 getExternalLookup()434 ExternalPreprocessorSource *getExternalLookup() const { 435 return ExternalLookup; 436 } 437 438 /// Set the external source of header information. SetExternalSource(ExternalHeaderFileInfoSource * ES)439 void SetExternalSource(ExternalHeaderFileInfoSource *ES) { 440 ExternalSource = ES; 441 } 442 443 /// Set the target information for the header search, if not 444 /// already known. 445 void setTarget(const TargetInfo &Target); 446 447 /// Given a "foo" or \<foo> reference, look up the indicated file, 448 /// return null on failure. 449 /// 450 /// \returns If successful, this returns 'UsedDir', the DirectoryLookup member 451 /// the file was found in, or null if not applicable. 452 /// 453 /// \param IncludeLoc Used for diagnostics if valid. 454 /// 455 /// \param isAngled indicates whether the file reference is a <> reference. 456 /// 457 /// \param CurDir If non-null, the file was found in the specified directory 458 /// search location. This is used to implement \#include_next. 459 /// 460 /// \param Includers Indicates where the \#including file(s) are, in case 461 /// relative searches are needed. In reverse order of inclusion. 462 /// 463 /// \param SearchPath If non-null, will be set to the search path relative 464 /// to which the file was found. If the include path is absolute, SearchPath 465 /// will be set to an empty string. 466 /// 467 /// \param RelativePath If non-null, will be set to the path relative to 468 /// SearchPath at which the file was found. This only differs from the 469 /// Filename for framework includes. 470 /// 471 /// \param SuggestedModule If non-null, and the file found is semantically 472 /// part of a known module, this will be set to the module that should 473 /// be imported instead of preprocessing/parsing the file found. 474 /// 475 /// \param IsMapped If non-null, and the search involved header maps, set to 476 /// true. 477 /// 478 /// \param IsFrameworkFound If non-null, will be set to true if a framework is 479 /// found in any of searched SearchDirs. Will be set to false if a framework 480 /// is found only through header maps. Doesn't guarantee the requested file is 481 /// found. 482 OptionalFileEntryRef LookupFile( 483 StringRef Filename, SourceLocation IncludeLoc, bool isAngled, 484 ConstSearchDirIterator FromDir, ConstSearchDirIterator *CurDir, 485 ArrayRef<std::pair<const FileEntry *, const DirectoryEntry *>> Includers, 486 SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath, 487 Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule, 488 bool *IsMapped, bool *IsFrameworkFound, bool SkipCache = false, 489 bool BuildSystemModule = false, bool OpenFile = true, 490 bool CacheFailures = true); 491 492 /// Look up a subframework for the specified \#include file. 493 /// 494 /// For example, if \#include'ing <HIToolbox/HIToolbox.h> from 495 /// within ".../Carbon.framework/Headers/Carbon.h", check to see if 496 /// HIToolbox is a subframework within Carbon.framework. If so, return 497 /// the FileEntry for the designated file, otherwise return null. 498 OptionalFileEntryRef LookupSubframeworkHeader( 499 StringRef Filename, const FileEntry *ContextFileEnt, 500 SmallVectorImpl<char> *SearchPath, SmallVectorImpl<char> *RelativePath, 501 Module *RequestingModule, ModuleMap::KnownHeader *SuggestedModule); 502 503 /// Look up the specified framework name in our framework cache. 504 /// \returns The DirectoryEntry it is in if we know, null otherwise. LookupFrameworkCache(StringRef FWName)505 FrameworkCacheEntry &LookupFrameworkCache(StringRef FWName) { 506 return FrameworkMap[FWName]; 507 } 508 509 /// Mark the specified file as a target of a \#include, 510 /// \#include_next, or \#import directive. 511 /// 512 /// \return false if \#including the file will have no effect or true 513 /// if we should include it. 514 bool ShouldEnterIncludeFile(Preprocessor &PP, const FileEntry *File, 515 bool isImport, bool ModulesEnabled, Module *M, 516 bool &IsFirstIncludeOfFile); 517 518 /// Return whether the specified file is a normal header, 519 /// a system header, or a C++ friendly system header. getFileDirFlavor(const FileEntry * File)520 SrcMgr::CharacteristicKind getFileDirFlavor(const FileEntry *File) { 521 return (SrcMgr::CharacteristicKind)getFileInfo(File).DirInfo; 522 } 523 524 /// Mark the specified file as a "once only" file due to 525 /// \#pragma once. MarkFileIncludeOnce(const FileEntry * File)526 void MarkFileIncludeOnce(const FileEntry *File) { 527 HeaderFileInfo &FI = getFileInfo(File); 528 FI.isPragmaOnce = true; 529 } 530 531 /// Mark the specified file as a system header, e.g. due to 532 /// \#pragma GCC system_header. MarkFileSystemHeader(const FileEntry * File)533 void MarkFileSystemHeader(const FileEntry *File) { 534 getFileInfo(File).DirInfo = SrcMgr::C_System; 535 } 536 537 /// Mark the specified file as part of a module. 538 void MarkFileModuleHeader(const FileEntry *FE, 539 ModuleMap::ModuleHeaderRole Role, 540 bool isCompilingModuleHeader); 541 542 /// Mark the specified file as having a controlling macro. 543 /// 544 /// This is used by the multiple-include optimization to eliminate 545 /// no-op \#includes. SetFileControllingMacro(const FileEntry * File,const IdentifierInfo * ControllingMacro)546 void SetFileControllingMacro(const FileEntry *File, 547 const IdentifierInfo *ControllingMacro) { 548 getFileInfo(File).ControllingMacro = ControllingMacro; 549 } 550 551 /// Determine whether this file is intended to be safe from 552 /// multiple inclusions, e.g., it has \#pragma once or a controlling 553 /// macro. 554 /// 555 /// This routine does not consider the effect of \#import 556 bool isFileMultipleIncludeGuarded(const FileEntry *File); 557 558 /// Determine whether the given file is known to have ever been \#imported. hasFileBeenImported(const FileEntry * File)559 bool hasFileBeenImported(const FileEntry *File) { 560 const HeaderFileInfo *FI = getExistingFileInfo(File); 561 return FI && FI->isImport; 562 } 563 564 /// Determine which HeaderSearchOptions::UserEntries have been successfully 565 /// used so far and mark their index with 'true' in the resulting bit vector. 566 /// Note: implicit module maps don't contribute to entry usage. 567 std::vector<bool> computeUserEntryUsage() const; 568 569 /// This method returns a HeaderMap for the specified 570 /// FileEntry, uniquing them through the 'HeaderMaps' datastructure. 571 const HeaderMap *CreateHeaderMap(const FileEntry *FE); 572 573 /// Get filenames for all registered header maps. 574 void getHeaderMapFileNames(SmallVectorImpl<std::string> &Names) const; 575 576 /// Retrieve the name of the cached module file that should be used 577 /// to load the given module. 578 /// 579 /// \param Module The module whose module file name will be returned. 580 /// 581 /// \returns The name of the module file that corresponds to this module, 582 /// or an empty string if this module does not correspond to any module file. 583 std::string getCachedModuleFileName(Module *Module); 584 585 /// Retrieve the name of the prebuilt module file that should be used 586 /// to load a module with the given name. 587 /// 588 /// \param ModuleName The module whose module file name will be returned. 589 /// 590 /// \param FileMapOnly If true, then only look in the explicit module name 591 // to file name map and skip the directory search. 592 /// 593 /// \returns The name of the module file that corresponds to this module, 594 /// or an empty string if this module does not correspond to any module file. 595 std::string getPrebuiltModuleFileName(StringRef ModuleName, 596 bool FileMapOnly = false); 597 598 /// Retrieve the name of the prebuilt module file that should be used 599 /// to load the given module. 600 /// 601 /// \param Module The module whose module file name will be returned. 602 /// 603 /// \returns The name of the module file that corresponds to this module, 604 /// or an empty string if this module does not correspond to any module file. 605 std::string getPrebuiltImplicitModuleFileName(Module *Module); 606 607 /// Retrieve the name of the (to-be-)cached module file that should 608 /// be used to load a module with the given name. 609 /// 610 /// \param ModuleName The module whose module file name will be returned. 611 /// 612 /// \param ModuleMapPath A path that when combined with \c ModuleName 613 /// uniquely identifies this module. See Module::ModuleMap. 614 /// 615 /// \returns The name of the module file that corresponds to this module, 616 /// or an empty string if this module does not correspond to any module file. 617 std::string getCachedModuleFileName(StringRef ModuleName, 618 StringRef ModuleMapPath); 619 620 /// Lookup a module Search for a module with the given name. 621 /// 622 /// \param ModuleName The name of the module we're looking for. 623 /// 624 /// \param ImportLoc Location of the module include/import. 625 /// 626 /// \param AllowSearch Whether we are allowed to search in the various 627 /// search directories to produce a module definition. If not, this lookup 628 /// will only return an already-known module. 629 /// 630 /// \param AllowExtraModuleMapSearch Whether we allow to search modulemaps 631 /// in subdirectories. 632 /// 633 /// \returns The module with the given name. 634 Module *lookupModule(StringRef ModuleName, 635 SourceLocation ImportLoc = SourceLocation(), 636 bool AllowSearch = true, 637 bool AllowExtraModuleMapSearch = false); 638 639 /// Try to find a module map file in the given directory, returning 640 /// \c nullptr if none is found. 641 const FileEntry *lookupModuleMapFile(const DirectoryEntry *Dir, 642 bool IsFramework); 643 644 /// Determine whether there is a module map that may map the header 645 /// with the given file name to a (sub)module. 646 /// Always returns false if modules are disabled. 647 /// 648 /// \param Filename The name of the file. 649 /// 650 /// \param Root The "root" directory, at which we should stop looking for 651 /// module maps. 652 /// 653 /// \param IsSystem Whether the directories we're looking at are system 654 /// header directories. 655 bool hasModuleMap(StringRef Filename, const DirectoryEntry *Root, 656 bool IsSystem); 657 658 /// Retrieve the module that corresponds to the given file, if any. 659 /// 660 /// \param File The header that we wish to map to a module. 661 /// \param AllowTextual Whether we want to find textual headers too. 662 ModuleMap::KnownHeader findModuleForHeader(const FileEntry *File, 663 bool AllowTextual = false, 664 bool AllowExcluded = false) const; 665 666 /// Retrieve all the modules corresponding to the given file. 667 /// 668 /// \ref findModuleForHeader should typically be used instead of this. 669 ArrayRef<ModuleMap::KnownHeader> 670 findAllModulesForHeader(const FileEntry *File) const; 671 672 /// Read the contents of the given module map file. 673 /// 674 /// \param File The module map file. 675 /// \param IsSystem Whether this file is in a system header directory. 676 /// \param ID If the module map file is already mapped (perhaps as part of 677 /// processing a preprocessed module), the ID of the file. 678 /// \param Offset [inout] An offset within ID to start parsing. On exit, 679 /// filled by the end of the parsed contents (either EOF or the 680 /// location of an end-of-module-map pragma). 681 /// \param OriginalModuleMapFile The original path to the module map file, 682 /// used to resolve paths within the module (this is required when 683 /// building the module from preprocessed source). 684 /// \returns true if an error occurred, false otherwise. 685 bool loadModuleMapFile(const FileEntry *File, bool IsSystem, 686 FileID ID = FileID(), unsigned *Offset = nullptr, 687 StringRef OriginalModuleMapFile = StringRef()); 688 689 /// Collect the set of all known, top-level modules. 690 /// 691 /// \param Modules Will be filled with the set of known, top-level modules. 692 void collectAllModules(SmallVectorImpl<Module *> &Modules); 693 694 /// Load all known, top-level system modules. 695 void loadTopLevelSystemModules(); 696 697 private: 698 /// Lookup a module with the given module name and search-name. 699 /// 700 /// \param ModuleName The name of the module we're looking for. 701 /// 702 /// \param SearchName The "search-name" to derive filesystem paths from 703 /// when looking for the module map; this is usually equal to ModuleName, 704 /// but for compatibility with some buggy frameworks, additional attempts 705 /// may be made to find the module under a related-but-different search-name. 706 /// 707 /// \param ImportLoc Location of the module include/import. 708 /// 709 /// \param AllowExtraModuleMapSearch Whether we allow to search modulemaps 710 /// in subdirectories. 711 /// 712 /// \returns The module named ModuleName. 713 Module *lookupModule(StringRef ModuleName, StringRef SearchName, 714 SourceLocation ImportLoc, 715 bool AllowExtraModuleMapSearch = false); 716 717 /// Retrieve the name of the (to-be-)cached module file that should 718 /// be used to load a module with the given name. 719 /// 720 /// \param ModuleName The module whose module file name will be returned. 721 /// 722 /// \param ModuleMapPath A path that when combined with \c ModuleName 723 /// uniquely identifies this module. See Module::ModuleMap. 724 /// 725 /// \param CachePath A path to the module cache. 726 /// 727 /// \returns The name of the module file that corresponds to this module, 728 /// or an empty string if this module does not correspond to any module file. 729 std::string getCachedModuleFileNameImpl(StringRef ModuleName, 730 StringRef ModuleMapPath, 731 StringRef CachePath); 732 733 /// Retrieve a module with the given name, which may be part of the 734 /// given framework. 735 /// 736 /// \param Name The name of the module to retrieve. 737 /// 738 /// \param Dir The framework directory (e.g., ModuleName.framework). 739 /// 740 /// \param IsSystem Whether the framework directory is part of the system 741 /// frameworks. 742 /// 743 /// \returns The module, if found; otherwise, null. 744 Module *loadFrameworkModule(StringRef Name, DirectoryEntryRef Dir, 745 bool IsSystem); 746 747 /// Load all of the module maps within the immediate subdirectories 748 /// of the given search directory. 749 void loadSubdirectoryModuleMaps(DirectoryLookup &SearchDir); 750 751 /// Find and suggest a usable module for the given file. 752 /// 753 /// \return \c true if the file can be used, \c false if we are not permitted to 754 /// find this file due to requirements from \p RequestingModule. 755 bool findUsableModuleForHeader(const FileEntry *File, 756 const DirectoryEntry *Root, 757 Module *RequestingModule, 758 ModuleMap::KnownHeader *SuggestedModule, 759 bool IsSystemHeaderDir); 760 761 /// Find and suggest a usable module for the given file, which is part of 762 /// the specified framework. 763 /// 764 /// \return \c true if the file can be used, \c false if we are not permitted to 765 /// find this file due to requirements from \p RequestingModule. 766 bool findUsableModuleForFrameworkHeader( 767 const FileEntry *File, StringRef FrameworkName, Module *RequestingModule, 768 ModuleMap::KnownHeader *SuggestedModule, bool IsSystemFramework); 769 770 /// Look up the file with the specified name and determine its owning 771 /// module. 772 OptionalFileEntryRef 773 getFileAndSuggestModule(StringRef FileName, SourceLocation IncludeLoc, 774 const DirectoryEntry *Dir, bool IsSystemHeaderDir, 775 Module *RequestingModule, 776 ModuleMap::KnownHeader *SuggestedModule, 777 bool OpenFile = true, bool CacheFailures = true); 778 779 /// Cache the result of a successful lookup at the given include location 780 /// using the search path at \c HitIt. 781 void cacheLookupSuccess(LookupFileCacheInfo &CacheLookup, 782 ConstSearchDirIterator HitIt, 783 SourceLocation IncludeLoc); 784 785 /// Note that a lookup at the given include location was successful using the 786 /// search path at index `HitIdx`. 787 void noteLookupUsage(unsigned HitIdx, SourceLocation IncludeLoc); 788 789 public: 790 /// Retrieve the module map. getModuleMap()791 ModuleMap &getModuleMap() { return ModMap; } 792 793 /// Retrieve the module map. getModuleMap()794 const ModuleMap &getModuleMap() const { return ModMap; } 795 header_file_size()796 unsigned header_file_size() const { return FileInfo.size(); } 797 798 /// Return the HeaderFileInfo structure for the specified FileEntry, 799 /// in preparation for updating it in some way. 800 HeaderFileInfo &getFileInfo(const FileEntry *FE); 801 802 /// Return the HeaderFileInfo structure for the specified FileEntry, 803 /// if it has ever been filled in. 804 /// \param WantExternal Whether the caller wants purely-external header file 805 /// info (where \p External is true). 806 const HeaderFileInfo *getExistingFileInfo(const FileEntry *FE, 807 bool WantExternal = true) const; 808 search_dir_begin()809 SearchDirIterator search_dir_begin() { return {*this, 0}; } search_dir_end()810 SearchDirIterator search_dir_end() { return {*this, SearchDirs.size()}; } search_dir_range()811 SearchDirRange search_dir_range() { 812 return {search_dir_begin(), search_dir_end()}; 813 } 814 search_dir_begin()815 ConstSearchDirIterator search_dir_begin() const { return quoted_dir_begin(); } search_dir_nth(size_t n)816 ConstSearchDirIterator search_dir_nth(size_t n) const { 817 assert(n < SearchDirs.size()); 818 return {*this, n}; 819 } search_dir_end()820 ConstSearchDirIterator search_dir_end() const { return system_dir_end(); } search_dir_range()821 ConstSearchDirRange search_dir_range() const { 822 return {search_dir_begin(), search_dir_end()}; 823 } 824 search_dir_size()825 unsigned search_dir_size() const { return SearchDirs.size(); } 826 quoted_dir_begin()827 ConstSearchDirIterator quoted_dir_begin() const { return {*this, 0}; } quoted_dir_end()828 ConstSearchDirIterator quoted_dir_end() const { return angled_dir_begin(); } 829 angled_dir_begin()830 ConstSearchDirIterator angled_dir_begin() const { 831 return {*this, AngledDirIdx}; 832 } angled_dir_end()833 ConstSearchDirIterator angled_dir_end() const { return system_dir_begin(); } 834 system_dir_begin()835 ConstSearchDirIterator system_dir_begin() const { 836 return {*this, SystemDirIdx}; 837 } system_dir_end()838 ConstSearchDirIterator system_dir_end() const { 839 return {*this, SearchDirs.size()}; 840 } 841 842 /// Get the index of the given search directory. 843 unsigned searchDirIdx(const DirectoryLookup &DL) const; 844 845 /// Retrieve a uniqued framework name. 846 StringRef getUniqueFrameworkName(StringRef Framework); 847 848 /// Retrieve the include name for the header. 849 /// 850 /// \param File The entry for a given header. 851 /// \returns The name of how the file was included when the header's location 852 /// was resolved. 853 StringRef getIncludeNameForHeader(const FileEntry *File) const; 854 855 /// Suggest a path by which the specified file could be found, for use in 856 /// diagnostics to suggest a #include. Returned path will only contain forward 857 /// slashes as separators. MainFile is the absolute path of the file that we 858 /// are generating the diagnostics for. It will try to shorten the path using 859 /// MainFile location, if none of the include search directories were prefix 860 /// of File. 861 /// 862 /// \param IsSystem If non-null, filled in to indicate whether the suggested 863 /// path is relative to a system header directory. 864 std::string suggestPathToFileForDiagnostics(const FileEntry *File, 865 llvm::StringRef MainFile, 866 bool *IsSystem = nullptr); 867 868 /// Suggest a path by which the specified file could be found, for use in 869 /// diagnostics to suggest a #include. Returned path will only contain forward 870 /// slashes as separators. MainFile is the absolute path of the file that we 871 /// are generating the diagnostics for. It will try to shorten the path using 872 /// MainFile location, if none of the include search directories were prefix 873 /// of File. 874 /// 875 /// \param WorkingDir If non-empty, this will be prepended to search directory 876 /// paths that are relative. 877 std::string suggestPathToFileForDiagnostics(llvm::StringRef File, 878 llvm::StringRef WorkingDir, 879 llvm::StringRef MainFile, 880 bool *IsSystem = nullptr); 881 882 void PrintStats(); 883 884 size_t getTotalMemory() const; 885 886 private: 887 /// Describes what happened when we tried to load a module map file. 888 enum LoadModuleMapResult { 889 /// The module map file had already been loaded. 890 LMM_AlreadyLoaded, 891 892 /// The module map file was loaded by this invocation. 893 LMM_NewlyLoaded, 894 895 /// There is was directory with the given name. 896 LMM_NoDirectory, 897 898 /// There was either no module map file or the module map file was 899 /// invalid. 900 LMM_InvalidModuleMap 901 }; 902 903 LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File, 904 bool IsSystem, 905 DirectoryEntryRef Dir, 906 FileID ID = FileID(), 907 unsigned *Offset = nullptr); 908 909 /// Try to load the module map file in the given directory. 910 /// 911 /// \param DirName The name of the directory where we will look for a module 912 /// map file. 913 /// \param IsSystem Whether this is a system header directory. 914 /// \param IsFramework Whether this is a framework directory. 915 /// 916 /// \returns The result of attempting to load the module map file from the 917 /// named directory. 918 LoadModuleMapResult loadModuleMapFile(StringRef DirName, bool IsSystem, 919 bool IsFramework); 920 921 /// Try to load the module map file in the given directory. 922 /// 923 /// \param Dir The directory where we will look for a module map file. 924 /// \param IsSystem Whether this is a system header directory. 925 /// \param IsFramework Whether this is a framework directory. 926 /// 927 /// \returns The result of attempting to load the module map file from the 928 /// named directory. 929 LoadModuleMapResult loadModuleMapFile(DirectoryEntryRef Dir, bool IsSystem, 930 bool IsFramework); 931 }; 932 933 /// Apply the header search options to get given HeaderSearch object. 934 void ApplyHeaderSearchOptions(HeaderSearch &HS, 935 const HeaderSearchOptions &HSOpts, 936 const LangOptions &Lang, 937 const llvm::Triple &triple); 938 939 } // namespace clang 940 941 #endif // LLVM_CLANG_LEX_HEADERSEARCH_H 942