diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-01-06 01:55:26 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-01-06 01:55:26 +0000 |
commit | c16c208e8519476d838ad11fffc8e0ecea50550d (patch) | |
tree | cb1a831ffc1654d7f9136338925b6ba4033721b2 /lib/Basic/SourceManager.cpp | |
parent | 1e5f3ebb2982f8d7e414d5fc4808000b941563cc (diff) |
Misc changes to SourceManager::ContentCache:
- 'Buffer' is now private and must be accessed via 'getBuffer()'.
This paves the way for lazily mapping in source files on demand.
- Added 'getSize()' (which gets the size of the content without
necessarily accessing the MemBuffer) and 'getSizeBytesMapped()'.
- Modifed SourceManager to use these new methods. This reduces the
number of places that actually access the MemBuffer object for a file
to those that actually look at the character data.
These changes result in no performance change for -fsyntax-only on Cocoa.h.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61782 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic/SourceManager.cpp')
-rw-r--r-- | lib/Basic/SourceManager.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 44a6d66c1a..b040459e77 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -29,6 +29,26 @@ ContentCache::~ContentCache() { delete [] SourceLineCache; } +/// getSizeBytesMapped - Returns the number of bytes actually mapped for +/// this ContentCache. This can be 0 if the MemBuffer was not actually +/// instantiated. +unsigned ContentCache::getSizeBytesMapped() const { + return Buffer ? Buffer->getBufferSize() : 0; +} + +/// getSize - Returns the size of the content encapsulated by this ContentCache. +/// This can be the size of the source file or the size of an arbitrary +/// scratch buffer. If the ContentCache encapsulates a source file, that +/// file is not lazily brought in from disk to satisfy this query. +unsigned ContentCache::getSize() const { + return Entry ? Entry->getSize() : Buffer->getBufferSize(); +} + +const llvm::MemoryBuffer* ContentCache::getBuffer() const { + return Buffer; +} + + /// getFileInfo - Create or return a cached FileInfo for the specified file. /// const ContentCache* SourceManager::getContentCache(const FileEntry *FileEnt) { @@ -49,7 +69,9 @@ const ContentCache* SourceManager::getContentCache(const FileEntry *FileEnt) { ContentCache& Entry = const_cast<ContentCache&>(*FileInfos.insert(I,FileEnt)); - Entry.Buffer = File; + // FIXME: Shortly the above logic that creates a MemBuffer will be moved + // to ContentCache::getBuffer(). This way it can be done lazily. + Entry.setBuffer(File); Entry.SourceLineCache = 0; Entry.NumLines = 0; return &Entry; @@ -66,7 +88,7 @@ SourceManager::createMemBufferContentCache(const MemoryBuffer *Buffer) { // temporary we would use in the call to "push_back". MemBufferInfos.push_back(ContentCache()); ContentCache& Entry = const_cast<ContentCache&>(MemBufferInfos.back()); - Entry.Buffer = Buffer; + Entry.setBuffer(Buffer); return &Entry; } @@ -81,7 +103,7 @@ unsigned SourceManager::createFileID(const ContentCache *File, // to fit an arbitrary position in the file in the FilePos field. To handle // this, we create one FileID for each chunk of the file that fits in a // FilePos field. - unsigned FileSize = File->Buffer->getBufferSize(); + unsigned FileSize = File->getSize(); if (FileSize+1 < (1 << SourceLocation::FilePosBits)) { FileIDs.push_back(FileIDInfo::get(IncludePos, 0, File, FileCharacter)); assert(FileIDs.size() < (1 << SourceLocation::FileIDBits) && @@ -159,7 +181,8 @@ const char *SourceManager::getCharacterData(SourceLocation SL) const { // heavily used by -E mode. SL = getPhysicalLoc(SL); - return getContentCache(SL.getFileID())->Buffer->getBufferStart() + + // Note that calling 'getBuffer()' may lazily page in a source file. + return getContentCache(SL.getFileID())->getBuffer()->getBufferStart() + getFullFilePos(SL); } @@ -187,12 +210,17 @@ unsigned SourceManager::getColumnNumber(SourceLocation Loc) const { const char *SourceManager::getSourceName(SourceLocation Loc) const { unsigned FileID = Loc.getFileID(); if (FileID == 0) return ""; - return getContentCache(FileID)->Buffer->getBufferIdentifier(); + + // To get the source name, first consult the FileEntry (if one exists) before + // the MemBuffer as this will avoid unnecessarily paging in the MemBuffer. + const SrcMgr::ContentCache* C = getContentCache(FileID); + return C->Entry ? C->Entry->getName() : C->getBuffer()->getBufferIdentifier(); } static void ComputeLineNumbers(ContentCache* FI) DISABLE_INLINE; -static void ComputeLineNumbers(ContentCache* FI) { - const MemoryBuffer *Buffer = FI->Buffer; +static void ComputeLineNumbers(ContentCache* FI) { + // Note that calling 'getBuffer()' may lazily page in the file. + const MemoryBuffer *Buffer = FI->getBuffer(); // Find the file offsets of all of the *physical* source lines. This does // not look at trigraphs, escaped newlines, or anything else tricky. @@ -341,7 +369,7 @@ void SourceManager::PrintStats() const { for (std::set<ContentCache>::const_iterator I = FileInfos.begin(), E = FileInfos.end(); I != E; ++I) { NumLineNumsComputed += I->SourceLineCache != 0; - NumFileBytesMapped += I->Buffer->getBufferSize(); + NumFileBytesMapped += I->getSizeBytesMapped(); } llvm::cerr << NumFileBytesMapped << " bytes of files mapped, " |