34#ifndef LLVM_CLANG_BASIC_SOURCEMANAGER_H
35#define LLVM_CLANG_BASIC_SOURCEMANAGER_H
41#include "llvm/ADT/ArrayRef.h"
42#include "llvm/ADT/BitVector.h"
43#include "llvm/ADT/DenseMap.h"
44#include "llvm/ADT/DenseSet.h"
45#include "llvm/ADT/IntrusiveRefCntPtr.h"
46#include "llvm/ADT/PagedVector.h"
47#include "llvm/ADT/PointerIntPair.h"
48#include "llvm/ADT/SmallVector.h"
49#include "llvm/ADT/StringRef.h"
50#include "llvm/Support/Allocator.h"
51#include "llvm/Support/Compiler.h"
52#include "llvm/Support/MemoryBuffer.h"
104 explicit operator bool()
const {
return Storage; }
118 llvm::BumpPtrAllocator &Alloc);
122 llvm::BumpPtrAllocator &Alloc);
126 unsigned *Storage =
nullptr;
135 mutable std::unique_ptr<llvm::MemoryBuffer> Buffer;
171 LLVM_PREFERRED_TYPE(
bool)
176 LLVM_PREFERRED_TYPE(
bool)
182 LLVM_PREFERRED_TYPE(
bool)
185 LLVM_PREFERRED_TYPE(
bool)
209 "Passed ContentCache object cannot own a buffer.");
221 std::optional<llvm::MemoryBufferRef>
246 return Buffer->getMemBufferRef();
254 return Buffer->getBuffer();
261 Buffer = std::move(B);
268 assert(!Buffer &&
"Expected to be called right after construction");
270 setBuffer(llvm::MemoryBuffer::getMemBuffer(*B));
280static_assert(
alignof(ContentCache) >= 8,
281 "ContentCache must be 8-byte aligned.");
310 unsigned NumCreatedFIDs : 31;
313 LLVM_PREFERRED_TYPE(
bool)
314 unsigned HasLineDirectives : 1;
317 llvm::PointerIntPair<const ContentCache *, 3, CharacteristicKind>
326 X.NumCreatedFIDs = 0;
327 X.HasLineDirectives =
false;
328 X.ContentAndKind.setPointer(&Con);
329 X.ContentAndKind.setInt(FileCharacter);
339 return *ContentAndKind.getPointer();
344 return ContentAndKind.getInt();
377 bool ExpansionIsTokenRange;
385 return ExpansionLocStart;
423 bool ExpansionIsTokenRange =
true) {
425 X.SpellingLoc = SpellingLoc;
426 X.ExpansionLocStart = Start;
427 X.ExpansionLocEnd = End;
428 X.ExpansionIsTokenRange = ExpansionIsTokenRange;
467 return create(SpellingLoc, Start, End,
false);
475static_assert(
sizeof(FileInfo) <=
sizeof(ExpansionInfo),
476 "FileInfo must be no larger than ExpansionInfo.");
485 LLVM_PREFERRED_TYPE(
bool)
505 assert(
isFile() &&
"Not a file SLocEntry!");
510 assert(
isExpansion() &&
"Not a macro expansion SLocEntry!");
516 assert(!(Offset & (1ULL << OffsetBits)) &&
"Offset is too large");
523 assert(!(Offset & (1ULL << OffsetBits)) &&
"Offset is too large");
526 E.IsExpansion =
false;
533 assert(!(Offset & (1ULL << OffsetBits)) &&
"Offset is too large");
536 E.IsExpansion =
true;
576 FileID LQueryFID, RQueryFID;
581 bool LChildBeforeRChild;
592 unsigned LCommonOffset, RCommonOffset;
605 return CommonFID.isValid();
613 if (LQueryFID != CommonFID) LOffset = LCommonOffset;
614 if (RQueryFID != CommonFID) ROffset = RCommonOffset;
621 if (LOffset == ROffset)
622 return LChildBeforeRChild;
624 return LOffset < ROffset;
631 if (LQueryFID != LHS || RQueryFID != RHS) {
639 unsigned rCommonOffset,
bool LParentBeforeRParent) {
640 CommonFID = commonFID;
641 LCommonOffset = lCommonOffset;
642 RCommonOffset = rCommonOffset;
643 LChildBeforeRChild = LParentBeforeRParent;
670 mutable llvm::BumpPtrAllocator ContentCacheAlloc;
678 llvm::DenseMap<FileEntryRef, SrcMgr::ContentCache*> FileInfos;
682 bool OverridenFilesKeepOriginalName =
true;
686 bool UserFilesAreVolatile;
691 bool FilesAreTransient =
false;
693 struct OverriddenFilesInfoTy {
696 llvm::DenseMap<const FileEntry *, FileEntryRef> OverriddenFiles;
699 llvm::DenseSet<const FileEntry *> OverriddenFilesWithBuffer;
704 std::unique_ptr<OverriddenFilesInfoTy> OverriddenFilesInfo;
706 OverriddenFilesInfoTy &getOverriddenFilesInfo() {
707 if (!OverriddenFilesInfo)
708 OverriddenFilesInfo.reset(
new OverriddenFilesInfoTy);
709 return *OverriddenFilesInfo;
716 std::vector<SrcMgr::ContentCache*> MemBufferInfos;
722 std::vector<SrcMgr::ContentCache *> FileIDContentCaches;
736 llvm::PagedVector<SrcMgr::SLocEntry, 32> LoadedSLocEntryTable;
763 llvm::BitVector SLocEntryLoaded;
769 llvm::BitVector SLocEntryOffsetLoaded;
778 mutable FileID LastFileIDLookup;
785 std::unique_ptr<LineTableInfo> LineTable;
789 mutable FileID LastLineNoFileIDQuery;
791 mutable unsigned LastLineNoFilePos;
792 mutable unsigned LastLineNoResult;
801 mutable unsigned NumLinearScans = 0;
802 mutable unsigned NumBinaryProbes = 0;
809 mutable llvm::DenseMap<FileID, FileIDAndOffset> IncludedLocMap;
812 using IsBeforeInTUCacheKey = std::pair<FileID, FileID>;
816 using InBeforeInTUCache =
817 llvm::DenseMap<IsBeforeInTUCacheKey, InBeforeInTUCacheEntry>;
820 mutable InBeforeInTUCache IBTUCache;
828 mutable std::unique_ptr<llvm::MemoryBuffer> FakeBufferForRecovery;
830 mutable std::unique_ptr<SrcMgr::ContentCache> FakeContentCacheForRecovery;
832 mutable std::unique_ptr<SrcMgr::SLocEntry> FakeSLocEntryForRecovery;
836 using MacroArgsMap = std::map<unsigned, SourceLocation>;
838 mutable llvm::DenseMap<FileID, std::unique_ptr<MacroArgsMap>>
852 bool UserFilesAreVolatile =
false);
871 OverridenFilesKeepOriginalName = value;
880 return StoredModuleBuildStack;
885 StoredModuleBuildStack.clear();
886 StoredModuleBuildStack.append(stack.begin(), stack.end());
891 StoredModuleBuildStack.push_back(std::make_pair(moduleName.str(),importLoc));
913 assert(PreambleFileID.isInvalid() &&
"PreambleFileID already set!");
971 bool ExpansionIsTokenRange =
true,
984 std::optional<llvm::MemoryBufferRef>
993 return getFakeBufferForRecovery();
1004 const llvm::MemoryBufferRef &Buffer) {
1016 std::unique_ptr<llvm::MemoryBuffer> Buffer);
1028 if (OverriddenFilesInfo) {
1029 if (OverriddenFilesInfo->OverriddenFilesWithBuffer.count(
File))
1031 if (OverriddenFilesInfo->OverriddenFiles.contains(
File))
1050 FilesAreTransient = Transient;
1061 std::optional<llvm::MemoryBufferRef>
1063 if (
auto *Entry = getSLocEntryForFile(FID))
1064 return Entry->getFile().getContentCache().getBufferOrNone(
1066 return std::nullopt;
1073 llvm::MemoryBufferRef
1077 return getFakeBufferForRecovery();
1089 if (
auto *Entry = getSLocEntryForFile(FID))
1090 return Entry->getFile().getContentCache().OrigEntry;
1091 return std::nullopt;
1130 if (
auto *Entry = getSLocEntryForFile(FID))
1131 return Entry->getFile().NumCreatedFIDs;
1138 bool Force =
false) {
1139 auto *Entry = getSLocEntryForFile(FID);
1142 assert((Force || Entry->getFile().NumCreatedFIDs == 0) &&
"Already set!");
1143 Entry->getFile().NumCreatedFIDs = NumFIDs;
1157 return getFileID(SpellingLoc.getOffset());
1166 if (
auto *Entry = getSLocEntryForFile(FID))
1167 return SourceLocation::getFileLoc(Entry->getOffset());
1174 if (
auto *Entry = getSLocEntryForFile(FID))
1175 return SourceLocation::getFileLoc(Entry->getOffset() +
1183 if (
auto *Entry = getSLocEntryForFile(FID))
1184 return Entry->getFile().getIncludeLoc();
1191 std::pair<SourceLocation, StringRef>
1200 return ExternalSLocEntries->getModuleImportLoc(FID.ID);
1209 return getExpansionLocSlowCase(Loc);
1220 unsigned MaxDepth = std::numeric_limits<unsigned>::max())
const {
1222 return getFileLocSlowCase(Loc, MaxDepth);
1248 if (Expansion.
getEnd() == Range.getEnd())
1262 return getSpellingLocSlowCase(Loc);
1275 auto *Entry = getSLocEntryOrNull(FID);
1280 return Entry->isFile() ? SourceLocation::getFileLoc(GlobalOffset)
1281 : SourceLocation::getMacroLoc(GlobalOffset);
1290 auto *Entry = getSLocEntryOrNull(FID);
1292 return std::make_pair(
FileID(), 0);
1293 return std::make_pair(FID, Loc.getOffset() - Entry->getOffset());
1368 assert(((Start.getOffset() < NextLocalOffset &&
1369 Start.getOffset()+Length <= NextLocalOffset) ||
1370 (Start.getOffset() >= CurrentLoadedOffset &&
1371 Start.getOffset()+Length < MaxLoadedOffset)) &&
1372 "Chunk is not valid SLoc address space");
1376 if (LocOffs >= BeginOffs && LocOffs < EndOffs) {
1378 *RelativeOffset = LocOffs - BeginOffs;
1393 bool LHSLoaded = LHSOffs >= CurrentLoadedOffset;
1394 bool RHSLoaded = RHSOffs >= CurrentLoadedOffset;
1396 if (LHSLoaded == RHSLoaded) {
1398 *RelativeOffset = RHSOffs - LHSOffs;
1414 bool *
Invalid =
nullptr)
const;
1423 bool *
Invalid =
nullptr)
const;
1426 bool *
Invalid =
nullptr)
const {
1430 bool *
Invalid =
nullptr)
const {
1434 bool *
Invalid =
nullptr)
const;
1445 bool *
Invalid =
nullptr)
const {
1449 bool *
Invalid =
nullptr)
const {
1487 bool UseLineDirectives =
true)
const;
1520 return Filename ==
"<built-in>";
1529 return Filename ==
"<command line>";
1538 return Filename ==
"<scratch space>";
1547 return Filename ==
"<module-includes>";
1556 return Filename ==
"<built-in>" || Filename ==
"<command line>";
1596 unsigned *RelativeOffset =
nullptr)
const {
1598 if (isOffsetInFileID(FID, Offs)) {
1619 bool IsFileEntry,
bool IsFileExit,
1635 return ContentCacheAlloc.getTotalMemory();
1663 unsigned Line,
unsigned Col)
const;
1677 unsigned Line,
unsigned Col)
const;
1702 std::pair<bool, bool>
1728 bool LHSLoaded = LHSOffset >= CurrentLoadedOffset;
1729 bool RHSLoaded = RHS >= CurrentLoadedOffset;
1730 if (LHSLoaded == RHSLoaded)
1731 return LHSOffset < RHS;
1739 return Location == Start || Location == End ||
1746 llvm::DenseMap<FileEntryRef, SrcMgr::ContentCache *>::const_iterator;
1751 return FileInfos.find_as(
File) != FileInfos.end();
1761 std::optional<unsigned> MaxNotes = 32)
const;
1773 assert(Index < LocalSLocEntryTable.size() &&
"Invalid index");
1774 return LocalSLocEntryTable[Index];
1782 bool *
Invalid =
nullptr)
const {
1790 assert(Index < LoadedSLocEntryTable.size() &&
"Invalid index");
1791 if (SLocEntryLoaded[Index])
1792 return LoadedSLocEntryTable[Index];
1793 return loadSLocEntry(Index,
Invalid);
1797 bool *
Invalid =
nullptr)
const {
1802 if (FID.ID == 0 || FID.ID == -1) {
1804 return LocalSLocEntryTable[0];
1806 return getSLocEntryByID(FID.ID,
Invalid);
1812 assert(LoadedSLocEntryTable.empty() &&
1813 "Invalidating existing loaded entries");
1814 ExternalSLocEntries = Source;
1823 std::pair<int, SourceLocation::UIntTy>
1829 return isLoadedOffset(Loc.getOffset());
1834 return isLocalOffset(Loc.getOffset());
1839 assert(FID.ID != -1 &&
"Using FileID sentinel value");
1871 llvm::MemoryBufferRef getFakeBufferForRecovery()
const;
1878 return const_cast<SourceManager *
>(
this)->getSLocEntryOrNull(FID);
1887 const SrcMgr::SLocEntry *getSLocEntryForFile(FileID FID)
const {
1888 return const_cast<SourceManager *
>(
this)->getSLocEntryForFile(FID);
1891 SrcMgr::SLocEntry *getSLocEntryForFile(FileID FID) {
1892 if (
auto *Entry = getSLocEntryOrNull(FID))
1893 if (Entry->isFile())
1900 const SrcMgr::SLocEntry &getSLocEntryByID(
int ID,
1901 bool *
Invalid =
nullptr)
const {
1905 SrcMgr::SLocEntry &getSLocEntryByID(
int ID,
bool *
Invalid =
nullptr) {
1906 assert(ID != -1 &&
"Using FileID sentinel value");
1908 return getLoadedSLocEntryByID(ID,
Invalid);
1912 const SrcMgr::SLocEntry &
1913 getLoadedSLocEntryByID(
int ID,
bool *
Invalid =
nullptr)
const {
1914 return const_cast<SourceManager *
>(
this)->getLoadedSLocEntryByID(ID,
1918 SrcMgr::SLocEntry &getLoadedSLocEntryByID(
int ID,
bool *
Invalid =
nullptr) {
1924 if (SLocOffset >= LastLookupStartOffset && SLocOffset < LastLookupEndOffset)
1925 return LastFileIDLookup;
1926 return getFileIDSlow(SLocOffset);
1930 return SLocOffset < CurrentLoadedOffset;
1934 return SLocOffset >= CurrentLoadedOffset;
1940 createExpansionLocImpl(
const SrcMgr::ExpansionInfo &Expansion,
1941 unsigned Length,
int LoadedID = 0,
1946 inline bool isOffsetInFileID(FileID FID,
1950 if (SLocOffset < Entry.getOffset())
return false;
1957 if (FID.ID+1 ==
static_cast<int>(LocalSLocEntryTable.size()))
1958 return SLocOffset < NextLocalOffset;
1962 return SLocOffset < getSLocEntryByID(FID.ID+1).getOffset();
1967 FileID getPreviousFileID(FileID FID)
const;
1971 FileID getNextFileID(FileID FID)
const;
1978 FileID createFileIDImpl(SrcMgr::ContentCache &
File, StringRef Filename,
1979 SourceLocation IncludePos,
1983 SrcMgr::ContentCache &getOrCreateContentCache(FileEntryRef SourceFile,
1984 bool isSystemFile =
false);
1987 SrcMgr::ContentCache &
1988 createMemBufferContentCache(std::unique_ptr<llvm::MemoryBuffer> Buf);
1994 SourceLocation getExpansionLocSlowCase(SourceLocation Loc)
const;
1995 SourceLocation getSpellingLocSlowCase(SourceLocation Loc)
const;
1996 SourceLocation getFileLocSlowCase(SourceLocation Loc,
1997 unsigned MaxDepth)
const;
1999 void computeMacroArgsCache(MacroArgsMap &MacroArgsCache, FileID FID)
const;
2000 void associateFileChunkWithMacroArgExp(MacroArgsMap &MacroArgsCache,
2002 SourceLocation SpellLoc,
2003 SourceLocation ExpansionLoc,
2004 unsigned ExpansionLength)
const;
2005 void updateSlocUsageStats()
const;
2021 return SM.isBeforeInTranslationUnit(LHS, RHS);
2055 std::unique_ptr<FileManager>
FileMgr;
2056 std::unique_ptr<DiagnosticOptions> DiagOpts;
2057 std::unique_ptr<DiagnosticsEngine> Diagnostics;
2058 std::unique_ptr<SourceManager> SourceMgr;
Defines the Diagnostic-related interfaces.
Defines interfaces for clang::FileEntry and clang::FileEntryRef.
Defines the clang::FileManager interface and associated types.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
Defines the clang::SourceLocation class and associated facilities.
Reads an AST files chain containing the contents of a translation unit.
Writes an AST file containing the contents of a translation unit.
bool operator()(SourceLocation LHS, SourceLocation RHS) const
BeforeThanCompare(SourceManager &SM)
BeforeThanCompare(SourceManager &SM)
bool operator()(SourceRange LHS, SourceRange RHS) const
Comparison function object.
Represents a byte-granular source range.
bool isTokenRange() const
Return true if the end of this range specifies the start of the last token.
SourceLocation getEnd() const
SourceLocation getBegin() const
void setTokenRange(bool TR)
Concrete class used by the front-end to report problems and issues.
External source of source location entries.
virtual int getSLocEntryID(SourceLocation::UIntTy SLocOffset)=0
Get the index ID for the loaded SourceLocation offset.
virtual std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID)=0
Retrieve the module import location and name for the given ID, if in fact it was loaded from a module...
virtual ~ExternalSLocEntrySource()
virtual bool ReadSLocEntry(int ID)=0
Read the source location entry with index ID, which will always be less than -1.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
const FileEntry & getFileEntry() const
Cached information about one file (either on disk or in the virtual file system).
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
A SourceLocation and its associated SourceManager.
Holds the cache used by isBeforeInTranslationUnit.
void setCommonLoc(FileID commonFID, unsigned lCommonOffset, unsigned rCommonOffset, bool LParentBeforeRParent)
bool getCachedResult(unsigned LOffset, unsigned ROffset) const
If the cache is valid, compute the result given the specified offsets in the LHS/RHS FileID's.
void setQueryFIDs(FileID LHS, FileID RHS)
Set up a new query.
InBeforeInTUCacheEntry(FileID L, FileID R)
InBeforeInTUCacheEntry()=default
bool isCacheValid() const
Return true if the currently cached values match up with the specified LHS/RHS query.
Used to hold and unique data used to represent #line information.
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceManagerForFile(StringRef FileName, StringRef Content)
Creates SourceManager and necessary dependencies (e.g.
This class handles loading and caching of source files into memory.
std::optional< StringRef > getNonBuiltinFilenameForID(FileID FID) const
Returns the filename for the provided FileID, unless it's a built-in buffer that's not represented by...
FileIDAndOffset getDecomposedExpansionLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
bool isMacroBodyExpansion(SourceLocation Loc) const
Tests whether the given source location represents the expansion of a macro body.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
unsigned getPresumedLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
bool isBeforeInSLocAddrSpace(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the "source locationaddress space".
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
bool isAtEndOfImmediateMacroExpansion(SourceLocation Loc, SourceLocation *MacroEnd=nullptr) const
Returns true if the given MacroID location points at the character end of the immediate macro expansi...
DiagnosticsEngine & getDiagnostics() const
bool isInPredefinedFile(SourceLocation Loc) const
Returns whether Loc is located in a built-in or command line source.
SourceLocation::UIntTy getNextLocalOffset() const
bool isWrittenInBuiltinFile(SourceLocation Loc) const
Returns whether Loc is located in a <built-in> file.
unsigned getColumnNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const
Return the column # for the specified file position.
void noteSLocAddressSpaceUsage(DiagnosticsEngine &Diag, std::optional< unsigned > MaxNotes=32) const
void setAllFilesAreTransient(bool Transient)
Specify that all files that are read during this compilation are transient.
bool isWrittenInModuleIncludes(SourceLocation Loc) const
Returns whether Loc is located in a <module-includes> file.
unsigned getFileOffset(SourceLocation SpellingLoc) const
Returns the offset from the start of the file that the specified SourceLocation represents.
bool isLocalSourceLocation(SourceLocation Loc) const
Returns true if Loc did not come from a PCH/Module.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
void AddLineNote(SourceLocation Loc, unsigned LineNo, int FilenameID, bool IsFileEntry, bool IsFileExit, SrcMgr::CharacteristicKind FileKind)
Add a line note to the line table for the FileID and offset specified by Loc.
SourceManager(DiagnosticsEngine &Diag, FileManager &FileMgr, bool UserFilesAreVolatile=false)
SourceLocation createTokenSplitLoc(SourceLocation SpellingLoc, SourceLocation TokenStart, SourceLocation TokenEnd)
Return a new SourceLocation that encodes that the token starting at TokenStart ends prematurely at To...
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
const FileEntry * getFileEntryForSLocEntry(const SrcMgr::SLocEntry &SLocEntry) const
Returns the FileEntry record for the provided SLocEntry.
bool isInTheSameTranslationUnitImpl(const FileIDAndOffset &LOffs, const FileIDAndOffset &ROffs) const
Determines whether the two decomposed source location is in the same TU.
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
bool isWrittenInCommandLineFile(SourceLocation Loc) const
Returns whether Loc is located in a <command line> file.
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
void setFileIsTransient(FileEntryRef SourceFile)
Specify that a file is transient.
unsigned getExpansionColumnNumber(SourceLocation Loc, bool *Invalid=nullptr) const
bool isFileOverridden(const FileEntry *File) const
Returns true if the file contents have been overridden.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
CharSourceRange getExpansionRange(SourceRange Range) const
Given a SourceRange object, return the range of tokens or characters covered by the expansion in the ...
bool isInSLocAddrSpace(SourceLocation Loc, SourceLocation Start, unsigned Length, SourceLocation::UIntTy *RelativeOffset=nullptr) const
Returns true if Loc is inside the [Start, +Length) chunk of the source location address space.
SourceLocation translateLineCol(FileID FID, unsigned Line, unsigned Col) const
Get the source location in FID for the given line:col.
size_t getContentCacheSize() const
Return the total amount of physical memory allocated by the ContentCache allocator.
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
SourceLocation getTopMacroCallerLoc(SourceLocation Loc) const
std::optional< StringRef > getBufferDataOrNone(FileID FID) const
Return a StringRef to the source buffer data for the specified FileID, returning std::nullopt if inva...
FileID translateFile(const FileEntry *SourceFile) const
Get the FileID for the given file.
CharSourceRange getExpansionRange(CharSourceRange Range) const
Given a CharSourceRange object, return the range of tokens or characters covered by the expansion in ...
void setModuleBuildStack(ModuleBuildStack stack)
Set the module build stack.
StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const
Return a StringRef to the source buffer data for the specified FileID.
FileID createFileID(FileEntryRef SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Create a new FileID that represents the specified file being #included from the specified IncludePosi...
void PrintStats() const
Print statistics to stderr.
FileID getUniqueLoadedASTFileID(SourceLocation Loc) const
SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr)
bool isMainFile(const FileEntry &SourceFile)
Returns true when the given FileEntry corresponds to the main file.
size_t getDataStructureSizes() const
Return the amount of memory used for various side tables and data structures in the SourceManager.
bool isMacroArgExpansion(SourceLocation Loc, SourceLocation *StartLoc=nullptr) const
Tests whether the given source location represents a macro argument's expansion into the function-lik...
unsigned getSpellingColumnNumber(SourceLocation Loc, bool *Invalid=nullptr) const
const SrcMgr::SLocEntry & getLocalSLocEntry(unsigned Index) const
Get a local SLocEntry. This is exposed for indexing.
SourceLocation getComposedLoc(FileID FID, unsigned Offset) const
Form a SourceLocation from a FileID and Offset pair.
void setPreambleFileID(FileID Preamble)
Set the file ID for the precompiled preamble.
OptionalFileEntryRef bypassFileContentsOverride(FileEntryRef File)
Bypass the overridden contents of a file.
bool userFilesAreVolatile() const
True if non-system source files should be treated as volatile (likely to change while trying to use t...
const SrcMgr::SLocEntry & getLoadedSLocEntry(unsigned Index, bool *Invalid=nullptr) const
Get a loaded SLocEntry. This is exposed for indexing.
llvm::DenseMap< FileEntryRef, SrcMgr::ContentCache * >::const_iterator fileinfo_iterator
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
FileManager & getFileManager() const
void setOverridenFilesKeepOriginalName(bool value)
Set true if the SourceManager should report the original file name for contents of files that were ov...
fileinfo_iterator fileinfo_end() const
FileID translateFile(FileEntryRef SourceFile) const
ModuleBuildStack getModuleBuildStack() const
Retrieve the module build stack.
unsigned local_sloc_entry_size() const
Get the number of local SLocEntries we have.
std::optional< StringRef > getBufferDataIfLoaded(FileID FID) const
Return a StringRef to the source buffer data for the specified FileID, returning std::nullopt if it's...
SourceLocation getLocForEndOfFile(FileID FID) const
Return the source location corresponding to the last byte of the specified file.
FileIDAndOffset getDecomposedSpellingLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
FileID getMainFileID() const
Returns the FileID of the main source file.
SourceLocation getImmediateMacroCallerLoc(SourceLocation Loc) const
Gets the location of the immediate macro caller, one level up the stack toward the initial macro type...
const char * getCharacterData(SourceLocation SL, bool *Invalid=nullptr) const
Return a pointer to the start of the specified location in the appropriate spelling MemoryBuffer.
std::pair< int, SourceLocation::UIntTy > AllocateLoadedSLocEntries(unsigned NumSLocEntries, SourceLocation::UIntTy TotalSize)
Allocate a number of loaded SLocEntries, which will be actually loaded on demand from the external so...
void pushModuleBuildStack(StringRef moduleName, FullSourceLoc importLoc)
Push an entry to the module build stack.
void overrideFileContents(FileEntryRef SourceFile, const llvm::MemoryBufferRef &Buffer)
Override the contents of the given source file by providing an already-allocated buffer.
SourceLocation getIncludeLoc(FileID FID) const
Returns the include location if FID is a #include'd file otherwise it returns an invalid location.
llvm::MemoryBufferRef getBufferOrFake(FileID FID, SourceLocation Loc=SourceLocation()) const
Return the buffer for the specified FileID.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
void setMainFileID(FileID FID)
Set the file ID for the main source file.
unsigned getLineNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const
Given a SourceLocation, return the spelling line number for the position indicated.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
bool hasLineTable() const
Determine if the source manager has a line table.
CharSourceRange getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
bool isWrittenInScratchSpace(SourceLocation Loc) const
Returns whether Loc is located in a <scratch space> file.
bool isInFileID(SourceLocation Loc, FileID FID, unsigned *RelativeOffset=nullptr) const
Given a specific FileID, returns true if Loc is inside that FileID chunk and sets relative offset (of...
void setExternalSLocEntrySource(ExternalSLocEntrySource *Source)
unsigned getLineTableFilenameID(StringRef Str)
Return the uniqued ID for the specified filename.
void setNumCreatedFIDsForFileID(FileID FID, unsigned NumFIDs, bool Force=false)
Set the number of FileIDs (files and macros) that were created during preprocessing of FID,...
bool isLocalFileID(FileID FID) const
Returns true if FID did not come from a PCH/Module.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
FileID getPreambleFileID() const
Get the file ID for the precompiled preamble if there is one.
SrcMgr::SLocEntry & getLocalSLocEntry(unsigned Index)
Get a local SLocEntry. This is exposed for indexing.
void initializeForReplay(const SourceManager &Old)
Initialize this source manager suitably to replay the compilation described by Old.
FileIDAndOffset getDecomposedIncludedLoc(FileID FID) const
Returns the "included/expanded in" decomposed location of the given FileID.
bool isLoadedSourceLocation(SourceLocation Loc) const
Returns true if Loc came from a PCH/Module.
unsigned loaded_sloc_entry_size() const
Get the number of loaded SLocEntries we have.
unsigned getSpellingLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
SourceManager & operator=(const SourceManager &)=delete
FileID getOrCreateFileID(FileEntryRef SourceFile, SrcMgr::CharacteristicKind FileCharacter)
Get the FileID for SourceFile if it exists.
bool hasFileInfo(const FileEntry *File) const
SourceLocation translateFileLineCol(const FileEntry *SourceFile, unsigned Line, unsigned Col) const
Get the source location for the given file:line:col triplet.
std::pair< SourceLocation, StringRef > getModuleImportLoc(SourceLocation Loc) const
bool isLoadedFileID(FileID FID) const
Returns true if FID came from a PCH/Module.
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
bool isInSameSLocAddrSpace(SourceLocation LHS, SourceLocation RHS, SourceLocation::IntTy *RelativeOffset) const
Return true if both LHS and RHS are in the local source location address space or the loaded one.
llvm::MemoryBufferRef getMemoryBufferForFileOrFake(FileEntryRef File)
Retrieve the memory buffer associated with the given file.
SrcMgr::SLocEntry & getLoadedSLocEntry(unsigned Index, bool *Invalid=nullptr)
Get a loaded SLocEntry. This is exposed for indexing.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
bool isAtStartOfImmediateMacroExpansion(SourceLocation Loc, SourceLocation *MacroBegin=nullptr) const
Returns true if the given MacroID location points at the beginning of the immediate macro expansion.
SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const
Return the file characteristic of the specified source location, indicating whether this is a normal ...
SourceLocation createExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned Length, bool ExpansionIsTokenRange=true, int LoadedID=0, SourceLocation::UIntTy LoadedOffset=0)
Creates an expansion SLocEntry for a macro use.
bool isWrittenInSameFile(SourceLocation Loc1, SourceLocation Loc2) const
Returns true if the spelling locations for both SourceLocations are part of the same file buffer.
bool isInExternCSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in an "extern C" system header.
unsigned getPresumedColumnNumber(SourceLocation Loc, bool *Invalid=nullptr) const
bool isWrittenInMainFile(SourceLocation Loc) const
Returns true if the spelling location for the given location is in the main file buffer.
std::pair< bool, bool > isInTheSameTranslationUnit(FileIDAndOffset &LOffs, FileIDAndOffset &ROffs) const
Determines whether the two decomposed source location is in the same translation unit.
bool isPointWithin(SourceLocation Location, SourceLocation Start, SourceLocation End) const
Return true if the Point is within Start and End.
SourceManager(const SourceManager &)=delete
StringRef getFilename(SourceLocation SpellingLoc) const
Return the filename of the file containing a SourceLocation.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
SourceLocation getMacroArgExpandedLocation(SourceLocation Loc) const
If Loc points inside a function macro argument, the returned location will be the macro location in w...
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
unsigned getNumCreatedFIDsForFileID(FileID FID) const
Get the number of FileIDs (files and macros) that were created during preprocessing of FID,...
SourceLocation getFileLoc(SourceLocation Loc, unsigned MaxDepth=std::numeric_limits< unsigned >::max()) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
std::optional< llvm::MemoryBufferRef > getBufferOrNone(FileID FID, SourceLocation Loc=SourceLocation()) const
Return the buffer for the specified FileID.
fileinfo_iterator fileinfo_begin() const
bool isBeforeInSLocAddrSpace(SourceLocation LHS, SourceLocation::UIntTy RHS) const
Determines the order of a source location and a source location offset in the "source location addres...
LineTableInfo & getLineTable()
Retrieve the stored line table.
SourceLocation getImmediateSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
std::optional< llvm::MemoryBufferRef > getMemoryBufferForFileOrNone(FileEntryRef File)
Retrieve the memory buffer associated with the given file.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
SourceLocation createMacroArgExpansionLoc(SourceLocation SpellingLoc, SourceLocation ExpansionLoc, unsigned Length)
Creates an expansion SLocEntry for the substitution of an argument into a function-like macro's body.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
One instance of this struct is kept for every file loaded or used.
void setBuffer(std::unique_ptr< llvm::MemoryBuffer > B)
Set the buffer.
std::optional< StringRef > getBufferDataIfLoaded() const
Return a StringRef to the source buffer data, only if it has already been loaded.
void setUnownedBuffer(std::optional< llvm::MemoryBufferRef > B)
Set the buffer to one that's not owned (or to nullptr).
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
unsigned getSizeBytesMapped() const
Returns the number of bytes actually mapped for this ContentCache.
unsigned IsTransient
True if this file may be transient, that is, if it might not exist at some later point in time when t...
StringRef Filename
The filename that is used to access OrigEntry.
ContentCache(FileEntryRef Ent)
ContentCache(FileEntryRef Ent, FileEntryRef contentEnt)
unsigned getSize() const
Returns the size of the content encapsulated by this ContentCache.
llvm::MemoryBuffer::BufferKind getMemoryBufferKind() const
Returns the kind of memory used to back the memory buffer for this content cache.
unsigned IsFileVolatile
True if this content cache was initially created for a source file considered to be volatile (likely ...
LineOffsetMapping SourceLineCache
A bump pointer allocated array of offsets for each source line.
std::optional< llvm::MemoryBufferRef > getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc=SourceLocation()) const
Returns the memory buffer for the associated content.
static const char * getInvalidBOM(StringRef BufStr)
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
ContentCache(const ContentCache &RHS)
The copy ctor does not allow copies where source object has either a non-NULL Buffer or SourceLineCac...
ContentCache & operator=(const ContentCache &RHS)=delete
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Each ExpansionInfo encodes the expansion location - where the token was ultimately expanded,...
SourceLocation getExpansionLocStart() const
static ExpansionInfo create(SourceLocation SpellingLoc, SourceLocation Start, SourceLocation End, bool ExpansionIsTokenRange=true)
Return a ExpansionInfo for an expansion.
bool isMacroBodyExpansion() const
bool isExpansionTokenRange() const
bool isFunctionMacroExpansion() const
SourceLocation getSpellingLoc() const
CharSourceRange getExpansionLocRange() const
bool isMacroArgExpansion() const
static ExpansionInfo createForMacroArg(SourceLocation SpellingLoc, SourceLocation ExpansionLoc)
Return a special ExpansionInfo for the expansion of a macro argument into a function-like macro's bod...
static ExpansionInfo createForTokenSplit(SourceLocation SpellingLoc, SourceLocation Start, SourceLocation End)
Return a special ExpansionInfo representing a token that ends prematurely.
SourceLocation getExpansionLocEnd() const
Information about a FileID, basically just the logical file that it represents and include stack info...
const ContentCache & getContentCache() const
CharacteristicKind getFileCharacteristic() const
Return whether this is a system header or not.
static FileInfo get(SourceLocation IL, ContentCache &Con, CharacteristicKind FileCharacter, StringRef Filename)
Return a FileInfo object.
bool hasLineDirectives() const
Return true if this FileID has #line directives in it.
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
SourceLocation getIncludeLoc() const
StringRef getName() const
Returns the name of the file that was used when the file was loaded from the underlying file system.
Mapping of line offsets into a source file.
const unsigned * begin() const
LineOffsetMapping()=default
const unsigned * end() const
const unsigned & operator[](int I) const
static LineOffsetMapping get(llvm::MemoryBufferRef Buffer, llvm::BumpPtrAllocator &Alloc)
ArrayRef< unsigned > getLines() const
This is a discriminated union of FileInfo and ExpansionInfo.
SourceLocation::UIntTy getOffset() const
static SLocEntry getOffsetOnly(SourceLocation::UIntTy Offset)
Creates an incomplete SLocEntry that is only able to report its offset.
static SLocEntry get(SourceLocation::UIntTy Offset, const FileInfo &FI)
const FileInfo & getFile() const
static SLocEntry get(SourceLocation::UIntTy Offset, const ExpansionInfo &Expansion)
const ExpansionInfo & getExpansion() const
Public enums and private classes that are part of the SourceManager implementation.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
bool isSystem(CharacteristicKind CK)
Determine whether a file / directory characteristic is for system code.
bool isModuleMap(CharacteristicKind CK)
Determine whether a file characteristic is for a module map.
Top level wrappers for InstallAPI frontend operations.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
ArrayRef< std::pair< std::string, FullSourceLoc > > ModuleBuildStack
The stack used when building modules on demand, which is used to provide a link between the source ma...
std::pair< FileID, unsigned > FileIDAndOffset
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
const size_t malloc_bytes
MemoryBufferSizes(size_t malloc_bytes, size_t mmap_bytes)