aboutsummaryrefslogtreecommitdiff
path: root/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Basic/SourceManager.cpp')
-rw-r--r--lib/Basic/SourceManager.cpp34
1 files changed, 17 insertions, 17 deletions
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 410d4dfbeb..0c27e996c7 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -39,7 +39,6 @@ using llvm::MemoryBuffer;
ContentCache::~ContentCache() {
if (shouldFreeBuffer())
delete Buffer.getPointer();
- delete MacroArgsCache;
}
/// getSizeBytesMapped - Returns the number of bytes actually mapped for this
@@ -389,6 +388,11 @@ SourceManager::~SourceManager() {
}
delete FakeBufferForRecovery;
+
+ for (llvm::DenseMap<FileID, MacroArgsMap *>::iterator
+ I = MacroArgsCacheMap.begin(),E = MacroArgsCacheMap.end(); I!=E; ++I) {
+ delete I->second;
+ }
}
void SourceManager::clearIDTables() {
@@ -1503,13 +1507,13 @@ SourceLocation SourceManager::translateLineCol(FileID FID,
/// 0 -> SourceLocation()
/// 100 -> Expanded macro arg location
/// 110 -> SourceLocation()
-void SourceManager::computeMacroArgsCache(ContentCache *Content,
+void SourceManager::computeMacroArgsCache(MacroArgsMap *&CachePtr,
FileID FID) const {
- assert(!Content->MacroArgsCache);
assert(!FID.isInvalid());
+ assert(!CachePtr);
- Content->MacroArgsCache = new ContentCache::MacroArgsMap();
- ContentCache::MacroArgsMap &MacroArgsCache = *Content->MacroArgsCache;
+ CachePtr = new MacroArgsMap();
+ MacroArgsMap &MacroArgsCache = *CachePtr;
// Initially no macro argument chunk is present.
MacroArgsCache.insert(std::make_pair(0, SourceLocation()));
@@ -1566,7 +1570,7 @@ void SourceManager::computeMacroArgsCache(ContentCache *Content,
// previous chunks, we only need to find where the ending of the new macro
// chunk is mapped to and update the map with new begin/end mappings.
- ContentCache::MacroArgsMap::iterator I= MacroArgsCache.upper_bound(EndOffs);
+ MacroArgsMap::iterator I = MacroArgsCache.upper_bound(EndOffs);
--I;
SourceLocation EndOffsMappedLoc = I->second;
MacroArgsCache[BeginOffs] = SourceLocation::getMacroLoc(Entry.getOffset());
@@ -1594,15 +1598,12 @@ SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const {
if (FID.isInvalid())
return Loc;
- ContentCache *Content
- = const_cast<ContentCache *>(getSLocEntry(FID).getFile().getContentCache());
- if (!Content->MacroArgsCache)
- computeMacroArgsCache(Content, FID);
-
- assert(Content->MacroArgsCache);
- assert(!Content->MacroArgsCache->empty());
- ContentCache::MacroArgsMap::iterator
- I = Content->MacroArgsCache->upper_bound(Offset);
+ MacroArgsMap *&MacroArgsCache = MacroArgsCacheMap[FID];
+ if (!MacroArgsCache)
+ computeMacroArgsCache(MacroArgsCache, FID);
+
+ assert(!MacroArgsCache->empty());
+ MacroArgsMap::iterator I = MacroArgsCache->upper_bound(Offset);
--I;
unsigned MacroArgBeginOffs = I->first;
@@ -1720,13 +1721,12 @@ void SourceManager::PrintStats() const {
<< "B of Sloc address space used.\n";
unsigned NumLineNumsComputed = 0;
- unsigned NumMacroArgsComputed = 0;
unsigned NumFileBytesMapped = 0;
for (fileinfo_iterator I = fileinfo_begin(), E = fileinfo_end(); I != E; ++I){
NumLineNumsComputed += I->second->SourceLineCache != 0;
- NumMacroArgsComputed += I->second->MacroArgsCache != 0;
NumFileBytesMapped += I->second->getSizeBytesMapped();
}
+ unsigned NumMacroArgsComputed = MacroArgsCacheMap.size();
llvm::errs() << NumFileBytesMapped << " bytes of files mapped, "
<< NumLineNumsComputed << " files with line #'s computed, "