aboutsummaryrefslogtreecommitdiff
path: root/Lex/HeaderSearch.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-12-17 06:36:45 +0000
committerChris Lattner <sabre@nondot.org>2007-12-17 06:36:45 +0000
commit822da61b74ce14e89b3fa8774db18c833aa5748b (patch)
tree94c98ef06bf1e44bd5a9bda3dbd702bc360df92b /Lex/HeaderSearch.cpp
parentd66552797f9a34f5b966adbe45234111752678a0 (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.cpp28
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.
//===----------------------------------------------------------------------===//