diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Basic/SourceManager.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Basic/SourceManager.cpp | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/contrib/llvm-project/clang/lib/Basic/SourceManager.cpp b/contrib/llvm-project/clang/lib/Basic/SourceManager.cpp index 37734d3b10e7..533a9fe88a21 100644 --- a/contrib/llvm-project/clang/lib/Basic/SourceManager.cpp +++ b/contrib/llvm-project/clang/lib/Basic/SourceManager.cpp @@ -20,6 +20,7 @@ #include "llvm/ADT/MapVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/Allocator.h" @@ -46,6 +47,13 @@ using namespace clang; using namespace SrcMgr; using llvm::MemoryBuffer; +#define DEBUG_TYPE "source-manager" + +// Reaching a limit of 2^31 results in a hard error. This metric allows to track +// if particular invocation of the compiler is close to it. +STATISTIC(MaxUsedSLocBytes, "Maximum number of bytes used by source locations " + "(both loaded and local)."); + //===----------------------------------------------------------------------===// // SourceManager Helper Classes //===----------------------------------------------------------------------===// @@ -276,14 +284,14 @@ void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, std::pair<FileID, unsigned> LocInfo = getDecomposedExpansionLoc(Loc); bool Invalid = false; - const SLocEntry &Entry = getSLocEntry(LocInfo.first, &Invalid); + SLocEntry &Entry = getSLocEntry(LocInfo.first, &Invalid); if (!Entry.isFile() || Invalid) return; - const SrcMgr::FileInfo &FileInfo = Entry.getFile(); + SrcMgr::FileInfo &FileInfo = Entry.getFile(); // Remember that this file has #line directives now if it doesn't already. - const_cast<SrcMgr::FileInfo&>(FileInfo).setHasLineDirectives(); + FileInfo.setHasLineDirectives(); (void) getLineTable(); @@ -431,6 +439,10 @@ ContentCache &SourceManager::createMemBufferContentCache( const SrcMgr::SLocEntry &SourceManager::loadSLocEntry(unsigned Index, bool *Invalid) const { + return const_cast<SourceManager *>(this)->loadSLocEntry(Index, Invalid); +} + +SrcMgr::SLocEntry &SourceManager::loadSLocEntry(unsigned Index, bool *Invalid) { assert(!SLocEntryLoaded[Index]); if (ExternalSLocEntries->ReadSLocEntry(-(static_cast<int>(Index) + 2))) { if (Invalid) @@ -462,6 +474,7 @@ SourceManager::AllocateLoadedSLocEntries(unsigned NumSLocEntries, SLocEntryLoaded.resize(LoadedSLocEntryTable.size()); SLocEntryOffsetLoaded.resize(LoadedSLocEntryTable.size()); CurrentLoadedOffset -= TotalSize; + updateSlocUsageStats(); int BaseID = -int(LoadedSLocEntryTable.size()) - 1; LoadedSLocEntryAllocBegin.push_back(FileID::get(BaseID)); return std::make_pair(BaseID, CurrentLoadedOffset); @@ -615,6 +628,7 @@ FileID SourceManager::createFileIDImpl(ContentCache &File, StringRef Filename, // We do a +1 here because we want a SourceLocation that means "the end of the // file", e.g. for the "no newline at the end of the file" diagnostic. NextLocalOffset += FileSize + 1; + updateSlocUsageStats(); // Set LastFileIDLookup to the newly created file. The next getFileID call is // almost guaranteed to be from that file. @@ -675,6 +689,7 @@ SourceManager::createExpansionLocImpl(const ExpansionInfo &Info, } // See createFileID for that +1. NextLocalOffset += Length + 1; + updateSlocUsageStats(); return SourceLocation::getMacroLoc(NextLocalOffset - (Length + 1)); } @@ -1839,6 +1854,12 @@ void SourceManager::associateFileChunkWithMacroArgExp( MacroArgsCache[EndOffs] = EndOffsMappedLoc; } +void SourceManager::updateSlocUsageStats() const { + SourceLocation::UIntTy UsedBytes = + NextLocalOffset + (MaxLoadedOffset - CurrentLoadedOffset); + MaxUsedSLocBytes.updateMax(UsedBytes); +} + /// If \arg Loc points inside a function macro argument, the returned /// location will be the macro location in which the argument was expanded. /// If a macro argument is used multiple times, the expanded location will @@ -1911,6 +1932,24 @@ SourceManager::getDecomposedIncludedLoc(FileID FID) const { return DecompLoc; } +FileID SourceManager::getUniqueLoadedASTFileID(SourceLocation Loc) const { + assert(isLoadedSourceLocation(Loc) && + "Must be a source location in a loaded PCH/Module file"); + + auto [FID, Ignore] = getDecomposedLoc(Loc); + // `LoadedSLocEntryAllocBegin` stores the sorted lowest FID of each loaded + // allocation. Later allocations have lower FileIDs. The call below is to find + // the lowest FID of a loaded allocation from any FID in the same allocation. + // The lowest FID is used to identify a loaded allocation. + const FileID *FirstFID = + llvm::lower_bound(LoadedSLocEntryAllocBegin, FID, std::greater<FileID>{}); + + assert(FirstFID && + "The failure to find the first FileID of a " + "loaded AST from a loaded source location was unexpected."); + return *FirstFID; +} + bool SourceManager::isInTheSameTranslationUnitImpl( const std::pair<FileID, unsigned> &LOffs, const std::pair<FileID, unsigned> &ROffs) const { |