diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp | 135 |
1 files changed, 47 insertions, 88 deletions
diff --git a/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp b/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp index 9d79551..61dfe35 100644 --- a/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp @@ -26,7 +26,6 @@ #include <algorithm> #include <cstring> #include <string> -#include <sys/stat.h> using namespace clang; using namespace SrcMgr; @@ -55,8 +54,8 @@ llvm::MemoryBuffer::BufferKind ContentCache::getMemoryBufferKind() const { // Should be unreachable, but keep for sanity. if (!Buffer.getPointer()) return llvm::MemoryBuffer::MemoryBuffer_Malloc; - - const llvm::MemoryBuffer *buf = Buffer.getPointer(); + + llvm::MemoryBuffer *buf = Buffer.getPointer(); return buf->getBufferKind(); } @@ -69,8 +68,7 @@ unsigned ContentCache::getSize() const { : (unsigned) ContentsEntry->getSize(); } -void ContentCache::replaceBuffer(const llvm::MemoryBuffer *B, - bool DoNotFree) { +void ContentCache::replaceBuffer(llvm::MemoryBuffer *B, bool DoNotFree) { if (B && B == Buffer.getPointer()) { assert(0 && "Replacing with the same buffer"); Buffer.setInt(DoNotFree? DoNotFreeFlag : 0); @@ -83,13 +81,13 @@ void ContentCache::replaceBuffer(const llvm::MemoryBuffer *B, Buffer.setInt(DoNotFree? DoNotFreeFlag : 0); } -const llvm::MemoryBuffer *ContentCache::getBuffer(DiagnosticsEngine &Diag, - const SourceManager &SM, - SourceLocation Loc, - bool *Invalid) const { +llvm::MemoryBuffer *ContentCache::getBuffer(DiagnosticsEngine &Diag, + const SourceManager &SM, + SourceLocation Loc, + bool *Invalid) const { // Lazily create the Buffer for ContentCaches that wrap files. If we already // computed it, just return what we have. - if (Buffer.getPointer() || ContentsEntry == 0) { + if (Buffer.getPointer() || !ContentsEntry) { if (Invalid) *Invalid = isBufferInvalid(); @@ -163,7 +161,7 @@ const llvm::MemoryBuffer *ContentCache::getBuffer(DiagnosticsEngine &Diag, .StartsWith("\x0E\xFE\xFF", "SDSU") .StartsWith("\xFB\xEE\x28", "BOCU-1") .StartsWith("\x84\x31\x95\x33", "GB-18030") - .Default(0); + .Default(nullptr); if (InvalidBOM) { Diag.Report(Loc, diag::err_unsupported_bom) @@ -272,7 +270,7 @@ const LineEntry *LineTableInfo::FindNearestLineEntry(FileID FID, // Do a binary search to find the maximal element that is still before Offset. std::vector<LineEntry>::const_iterator I = std::upper_bound(Entries.begin(), Entries.end(), Offset); - if (I == Entries.begin()) return 0; + if (I == Entries.begin()) return nullptr; return &*--I; } @@ -286,7 +284,7 @@ void LineTableInfo::AddEntry(FileID FID, /// getLineTableFilenameID - Return the uniqued ID for the specified filename. /// unsigned SourceManager::getLineTableFilenameID(StringRef Name) { - if (LineTable == 0) + if (!LineTable) LineTable = new LineTableInfo(); return LineTable->getLineTableFilenameID(Name); } @@ -309,7 +307,7 @@ void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, // Remember that this file has #line directives now if it doesn't already. const_cast<SrcMgr::FileInfo&>(FileInfo).setHasLineDirectives(); - if (LineTable == 0) + if (!LineTable) LineTable = new LineTableInfo(); LineTable->AddLineNote(LocInfo.first, LocInfo.second, LineNo, FilenameID); } @@ -339,7 +337,7 @@ void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, // Remember that this file has #line directives now if it doesn't already. const_cast<SrcMgr::FileInfo&>(FileInfo).setHasLineDirectives(); - if (LineTable == 0) + if (!LineTable) LineTable = new LineTableInfo(); SrcMgr::CharacteristicKind FileKind; @@ -361,7 +359,7 @@ void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, } LineTableInfo &SourceManager::getLineTable() { - if (LineTable == 0) + if (!LineTable) LineTable = new LineTableInfo(); return *LineTable; } @@ -374,9 +372,9 @@ SourceManager::SourceManager(DiagnosticsEngine &Diag, FileManager &FileMgr, bool UserFilesAreVolatile) : Diag(Diag), FileMgr(FileMgr), OverridenFilesKeepOriginalName(true), UserFilesAreVolatile(UserFilesAreVolatile), - ExternalSLocEntries(0), LineTable(0), NumLinearScans(0), - NumBinaryProbes(0), FakeBufferForRecovery(0), - FakeContentCacheForRecovery(0) { + ExternalSLocEntries(nullptr), LineTable(nullptr), NumLinearScans(0), + NumBinaryProbes(0), FakeBufferForRecovery(nullptr), + FakeContentCacheForRecovery(nullptr) { clearIDTables(); Diag.setSourceManager(this); } @@ -404,10 +402,7 @@ SourceManager::~SourceManager() { delete FakeBufferForRecovery; delete FakeContentCacheForRecovery; - for (llvm::DenseMap<FileID, MacroArgsMap *>::iterator - I = MacroArgsCacheMap.begin(),E = MacroArgsCacheMap.end(); I!=E; ++I) { - delete I->second; - } + llvm::DeleteContainerSeconds(MacroArgsCacheMap); } void SourceManager::clearIDTables() { @@ -416,7 +411,7 @@ void SourceManager::clearIDTables() { LoadedSLocEntryTable.clear(); SLocEntryLoaded.clear(); LastLineNoFileIDQuery = FileID(); - LastLineNoContentCache = 0; + LastLineNoContentCache = nullptr; LastFileIDLookup = FileID(); if (LineTable) @@ -439,12 +434,8 @@ SourceManager::getOrCreateContentCache(const FileEntry *FileEnt, ContentCache *&Entry = FileInfos[FileEnt]; if (Entry) return Entry; - // Nope, create a new Cache entry. Make sure it is at least 8-byte aligned - // so that FileInfo can use the low 3 bits of the pointer for its own - // nefarious purposes. - unsigned EntryAlign = llvm::AlignOf<ContentCache>::Alignment; - EntryAlign = std::max(8U, EntryAlign); - Entry = ContentCacheAlloc.Allocate<ContentCache>(1, EntryAlign); + // Nope, create a new Cache entry. + Entry = ContentCacheAlloc.Allocate<ContentCache>(); if (OverriddenFilesInfo) { // If the file contents are overridden with contents from another file, @@ -469,14 +460,10 @@ SourceManager::getOrCreateContentCache(const FileEntry *FileEnt, /// createMemBufferContentCache - Create a new ContentCache for the specified /// memory buffer. This does no caching. -const ContentCache* -SourceManager::createMemBufferContentCache(const MemoryBuffer *Buffer) { - // Add a new ContentCache to the MemBufferInfos list and return it. Make sure - // it is at least 8-byte aligned so that FileInfo can use the low 3 bits of - // the pointer for its own nefarious purposes. - unsigned EntryAlign = llvm::AlignOf<ContentCache>::Alignment; - EntryAlign = std::max(8U, EntryAlign); - ContentCache *Entry = ContentCacheAlloc.Allocate<ContentCache>(1, EntryAlign); +const ContentCache * +SourceManager::createMemBufferContentCache(llvm::MemoryBuffer *Buffer) { + // Add a new ContentCache to the MemBufferInfos list and return it. + ContentCache *Entry = ContentCacheAlloc.Allocate<ContentCache>(); new (Entry) ContentCache(); MemBufferInfos.push_back(Entry); Entry->setBuffer(Buffer); @@ -516,7 +503,7 @@ SourceManager::AllocateLoadedSLocEntries(unsigned NumSLocEntries, /// \brief As part of recovering from missing or changed content, produce a /// fake, non-empty buffer. -const llvm::MemoryBuffer *SourceManager::getFakeBufferForRecovery() const { +llvm::MemoryBuffer *SourceManager::getFakeBufferForRecovery() const { if (!FakeBufferForRecovery) FakeBufferForRecovery = llvm::MemoryBuffer::getMemBuffer("<<<INVALID BUFFER>>"); @@ -655,16 +642,15 @@ SourceManager::createExpansionLocImpl(const ExpansionInfo &Info, return SourceLocation::getMacroLoc(NextLocalOffset - (TokLength + 1)); } -const llvm::MemoryBuffer * -SourceManager::getMemoryBufferForFile(const FileEntry *File, - bool *Invalid) { +llvm::MemoryBuffer *SourceManager::getMemoryBufferForFile(const FileEntry *File, + bool *Invalid) { const SrcMgr::ContentCache *IR = getOrCreateContentCache(File); assert(IR && "getOrCreateContentCache() cannot return NULL"); return IR->getBuffer(Diag, *this, SourceLocation(), Invalid); } void SourceManager::overrideFileContents(const FileEntry *SourceFile, - const llvm::MemoryBuffer *Buffer, + llvm::MemoryBuffer *Buffer, bool DoNotFree) { const SrcMgr::ContentCache *IR = getOrCreateContentCache(SourceFile); assert(IR && "getOrCreateContentCache() cannot return NULL"); @@ -691,7 +677,7 @@ void SourceManager::disableFileContentsOverride(const FileEntry *File) { return; const SrcMgr::ContentCache *IR = getOrCreateContentCache(File); - const_cast<SrcMgr::ContentCache *>(IR)->replaceBuffer(0); + const_cast<SrcMgr::ContentCache *>(IR)->replaceBuffer(nullptr); const_cast<SrcMgr::ContentCache *>(IR)->ContentsEntry = IR->OrigEntry; assert(OverriddenFilesInfo); @@ -707,10 +693,9 @@ StringRef SourceManager::getBufferData(FileID FID, bool *Invalid) const { *Invalid = true; return "<<<<<INVALID SOURCE LOCATION>>>>>"; } - - const llvm::MemoryBuffer *Buf - = SLoc.getFile().getContentCache()->getBuffer(Diag, *this, SourceLocation(), - &MyInvalid); + + llvm::MemoryBuffer *Buf = SLoc.getFile().getContentCache()->getBuffer( + Diag, *this, SourceLocation(), &MyInvalid); if (Invalid) *Invalid = MyInvalid; @@ -1128,9 +1113,8 @@ const char *SourceManager::getCharacterData(SourceLocation SL, return "<<<<INVALID BUFFER>>>>"; } - const llvm::MemoryBuffer *Buffer - = Entry.getFile().getContentCache() - ->getBuffer(Diag, *this, SourceLocation(), &CharDataInvalid); + llvm::MemoryBuffer *Buffer = Entry.getFile().getContentCache()->getBuffer( + Diag, *this, SourceLocation(), &CharDataInvalid); if (Invalid) *Invalid = CharDataInvalid; return Buffer->getBufferStart() + (CharDataInvalid? 0 : LocInfo.second); @@ -1142,7 +1126,7 @@ const char *SourceManager::getCharacterData(SourceLocation SL, unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos, bool *Invalid) const { bool MyInvalid = false; - const llvm::MemoryBuffer *MemBuf = getBuffer(FID, &MyInvalid); + llvm::MemoryBuffer *MemBuf = getBuffer(FID, &MyInvalid); if (Invalid) *Invalid = MyInvalid; @@ -1159,7 +1143,7 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos, // See if we just calculated the line number for this FilePos and can use // that to lookup the start of the line instead of searching for it. if (LastLineNoFileIDQuery == FID && - LastLineNoContentCache->SourceLineCache != 0 && + LastLineNoContentCache->SourceLineCache != nullptr && LastLineNoResult < LastLineNoContentCache->NumLines) { unsigned *SourceLineCache = LastLineNoContentCache->SourceLineCache; unsigned LineStart = SourceLineCache[LastLineNoResult - 1]; @@ -1216,8 +1200,7 @@ static void ComputeLineNumbers(DiagnosticsEngine &Diag, ContentCache *FI, llvm::BumpPtrAllocator &Alloc, const SourceManager &SM, bool &Invalid) { // Note that calling 'getBuffer()' may lazily page in the file. - const MemoryBuffer *Buffer = FI->getBuffer(Diag, SM, SourceLocation(), - &Invalid); + MemoryBuffer *Buffer = FI->getBuffer(Diag, SM, SourceLocation(), &Invalid); if (Invalid) return; @@ -1323,7 +1306,7 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos, // If this is the first use of line information for this buffer, compute the /// SourceLineCache for it on demand. - if (Content->SourceLineCache == 0) { + if (!Content->SourceLineCache) { bool MyInvalid = false; ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid); if (Invalid) @@ -1381,31 +1364,6 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos, } } - // If the spread is large, do a "radix" test as our initial guess, based on - // the assumption that lines average to approximately the same length. - // NOTE: This is currently disabled, as it does not appear to be profitable in - // initial measurements. - if (0 && SourceLineCacheEnd-SourceLineCache > 20) { - unsigned FileLen = Content->SourceLineCache[Content->NumLines-1]; - - // Take a stab at guessing where it is. - unsigned ApproxPos = Content->NumLines*QueriedFilePos / FileLen; - - // Check for -10 and +10 lines. - unsigned LowerBound = std::max(int(ApproxPos-10), 0); - unsigned UpperBound = std::min(ApproxPos+10, FileLen); - - // If the computed lower bound is less than the query location, move it in. - if (SourceLineCache < SourceLineCacheStart+LowerBound && - SourceLineCacheStart[LowerBound] < QueriedFilePos) - SourceLineCache = SourceLineCacheStart+LowerBound; - - // If the computed upper bound is greater than the query location, move it. - if (SourceLineCacheEnd > SourceLineCacheStart+UpperBound && - SourceLineCacheStart[UpperBound] >= QueriedFilePos) - SourceLineCacheEnd = SourceLineCacheStart+UpperBound; - } - unsigned *Pos = std::lower_bound(SourceLineCache, SourceLineCacheEnd, QueriedFilePos); unsigned LineNo = Pos-SourceLineCacheStart; @@ -1583,7 +1541,7 @@ bool SourceManager::isInMainFile(SourceLocation Loc) const { return FI.getIncludeLoc().isInvalid(); } -/// \brief The size of the SLocEnty that \arg FID represents. +/// \brief The size of the SLocEntry that \p FID represents. unsigned SourceManager::getFileIDSize(FileID FID) const { bool Invalid = false; const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid); @@ -1732,7 +1690,8 @@ FileID SourceManager::translateFile(const FileEntry *SourceFile) const { if (SLoc.isFile()) { const ContentCache *FileContentCache = SLoc.getFile().getContentCache(); - const FileEntry *Entry =FileContentCache? FileContentCache->OrigEntry : 0; + const FileEntry *Entry = FileContentCache ? FileContentCache->OrigEntry + : nullptr; if (Entry && *SourceFileName == llvm::sys::path::filename(Entry->getName())) { if (Optional<llvm::sys::fs::UniqueID> EntryUID = @@ -1784,7 +1743,7 @@ SourceLocation SourceManager::translateLineCol(FileID FID, // If this is the first use of line information for this buffer, compute the // SourceLineCache for it on demand. - if (Content->SourceLineCache == 0) { + if (!Content->SourceLineCache) { bool MyInvalid = false; ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid); if (MyInvalid) @@ -1798,7 +1757,7 @@ SourceLocation SourceManager::translateLineCol(FileID FID, return FileLoc.getLocWithOffset(Size); } - const llvm::MemoryBuffer *Buffer = Content->getBuffer(Diag, *this); + llvm::MemoryBuffer *Buffer = Content->getBuffer(Diag, *this); unsigned FilePos = Content->SourceLineCache[Line - 1]; const char *Buf = Buffer->getBufferStart() + FilePos; unsigned BufLength = Buffer->getBufferSize() - FilePos; @@ -1893,7 +1852,7 @@ void SourceManager::associateFileChunkWithMacroArgExp( FileID SpellFID; // Current FileID in the spelling range. unsigned SpellRelativeOffs; - llvm::tie(SpellFID, SpellRelativeOffs) = getDecomposedLoc(SpellLoc); + std::tie(SpellFID, SpellRelativeOffs) = getDecomposedLoc(SpellLoc); while (1) { const SLocEntry &Entry = getSLocEntry(SpellFID); unsigned SpellFIDBeginOffs = Entry.getOffset(); @@ -1972,7 +1931,7 @@ SourceManager::getMacroArgExpandedLocation(SourceLocation Loc) const { FileID FID; unsigned Offset; - llvm::tie(FID, Offset) = getDecomposedLoc(Loc); + std::tie(FID, Offset) = getDecomposedLoc(Loc); if (FID.isInvalid()) return Loc; @@ -2160,7 +2119,7 @@ void SourceManager::PrintStats() const { unsigned NumLineNumsComputed = 0; unsigned NumFileBytesMapped = 0; for (fileinfo_iterator I = fileinfo_begin(), E = fileinfo_end(); I != E; ++I){ - NumLineNumsComputed += I->second->SourceLineCache != 0; + NumLineNumsComputed += I->second->SourceLineCache != nullptr; NumFileBytesMapped += I->second->getSizeBytesMapped(); } unsigned NumMacroArgsComputed = MacroArgsCacheMap.size(); |