diff options
author | Chris Lattner <sabre@nondot.org> | 2007-12-17 06:36:45 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-12-17 06:36:45 +0000 |
commit | 822da61b74ce14e89b3fa8774db18c833aa5748b (patch) | |
tree | 94c98ef06bf1e44bd5a9bda3dbd702bc360df92b /Lex/HeaderSearch.cpp | |
parent | d66552797f9a34f5b966adbe45234111752678a0 (diff) |
Step #1 in adding headermap support to clang.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45089 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Lex/HeaderSearch.cpp')
-rw-r--r-- | Lex/HeaderSearch.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/Lex/HeaderSearch.cpp b/Lex/HeaderSearch.cpp index 719b9fb9c6..c91c4f9ba4 100644 --- a/Lex/HeaderSearch.cpp +++ b/Lex/HeaderSearch.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Lex/HeaderSearch.h" +#include "clang/Lex/HeaderMap.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/IdentifierTable.h" #include "llvm/System/Path.h" @@ -27,6 +28,12 @@ HeaderSearch::HeaderSearch(FileManager &FM) : FileMgr(FM), FrameworkMap(64) { NumFrameworkLookups = NumSubFrameworkLookups = 0; } +HeaderSearch::~HeaderSearch() { + // Delete headermaps. + for (unsigned i = 0, e = HeaderMaps.size(); i != e; ++i) + delete HeaderMaps[i].second; +} + void HeaderSearch::PrintStats() { fprintf(stderr, "\n*** HeaderSearch Stats:\n"); fprintf(stderr, "%d files tracked.\n", (int)FileInfo.size()); @@ -49,6 +56,27 @@ void HeaderSearch::PrintStats() { fprintf(stderr, "%d subframework lookups.\n", NumSubFrameworkLookups); } +/// CreateHeaderMap - This method returns a HeaderMap for the specified +/// FileEntry, uniquing them through the the 'HeaderMaps' datastructure. +const HeaderMap *HeaderSearch::CreateHeaderMap(const FileEntry *FE, + std::string &ErrorInfo) { + // We expect the number of headermaps to be small, and almost always empty. + // If it ever grows, use of a linear search should be reevaluated. + if (!HeaderMaps.empty()) { + for (unsigned i = 0, e = HeaderMaps.size(); i != e; ++i) + if (HeaderMaps[i].first == FE) + return HeaderMaps[i].second; + } + + if (const HeaderMap *HM = HeaderMap::Create(FE, ErrorInfo)) { + HeaderMaps.push_back(std::make_pair(FE, HM)); + return HM; + } + + return 0; +} + + //===----------------------------------------------------------------------===// // Header File Location. //===----------------------------------------------------------------------===// |