1 //===- SourceManager.cpp - Track and cache source files -------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the SourceManager interface.
11 //===----------------------------------------------------------------------===//
13 #include "clang/Basic/SourceManager.h"
14 #include "clang/Basic/Diagnostic.h"
15 #include "clang/Basic/FileManager.h"
16 #include "clang/Basic/LLVM.h"
17 #include "clang/Basic/SourceLocation.h"
18 #include "clang/Basic/SourceManagerInternals.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/ADT/None.h"
21 #include "llvm/ADT/Optional.h"
22 #include "llvm/ADT/STLExtras.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/ADT/StringSwitch.h"
26 #include "llvm/Support/Allocator.h"
27 #include "llvm/Support/Capacity.h"
28 #include "llvm/Support/Compiler.h"
29 #include "llvm/Support/Endian.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/FileSystem.h"
32 #include "llvm/Support/MathExtras.h"
33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/Path.h"
35 #include "llvm/Support/raw_ostream.h"
45 using namespace clang
;
46 using namespace SrcMgr
;
47 using llvm::MemoryBuffer
;
49 //===----------------------------------------------------------------------===//
50 // SourceManager Helper Classes
51 //===----------------------------------------------------------------------===//
53 /// getSizeBytesMapped - Returns the number of bytes actually mapped for this
54 /// ContentCache. This can be 0 if the MemBuffer was not actually expanded.
55 unsigned ContentCache::getSizeBytesMapped() const {
56 return Buffer
? Buffer
->getBufferSize() : 0;
59 /// Returns the kind of memory used to back the memory buffer for
60 /// this content cache. This is used for performance analysis.
61 llvm::MemoryBuffer::BufferKind
ContentCache::getMemoryBufferKind() const {
62 if (Buffer
== nullptr) {
63 assert(0 && "Buffer should never be null");
64 return llvm::MemoryBuffer::MemoryBuffer_Malloc
;
66 return Buffer
->getBufferKind();
69 /// getSize - Returns the size of the content encapsulated by this ContentCache.
70 /// This can be the size of the source file or the size of an arbitrary
71 /// scratch buffer. If the ContentCache encapsulates a source file, that
72 /// file is not lazily brought in from disk to satisfy this query.
73 unsigned ContentCache::getSize() const {
74 return Buffer
? (unsigned)Buffer
->getBufferSize()
75 : (unsigned)ContentsEntry
->getSize();
78 const char *ContentCache::getInvalidBOM(StringRef BufStr
) {
79 // If the buffer is valid, check to see if it has a UTF Byte Order Mark
80 // (BOM). We only support UTF-8 with and without a BOM right now. See
81 // http://en.wikipedia.org/wiki/Byte_order_mark for more information.
82 const char *InvalidBOM
=
83 llvm::StringSwitch
<const char *>(BufStr
)
84 .StartsWith(llvm::StringLiteral::withInnerNUL("\x00\x00\xFE\xFF"),
86 .StartsWith(llvm::StringLiteral::withInnerNUL("\xFF\xFE\x00\x00"),
88 .StartsWith("\xFE\xFF", "UTF-16 (BE)")
89 .StartsWith("\xFF\xFE", "UTF-16 (LE)")
90 .StartsWith("\x2B\x2F\x76", "UTF-7")
91 .StartsWith("\xF7\x64\x4C", "UTF-1")
92 .StartsWith("\xDD\x73\x66\x73", "UTF-EBCDIC")
93 .StartsWith("\x0E\xFE\xFF", "SCSU")
94 .StartsWith("\xFB\xEE\x28", "BOCU-1")
95 .StartsWith("\x84\x31\x95\x33", "GB-18030")
101 llvm::Optional
<llvm::MemoryBufferRef
>
102 ContentCache::getBufferOrNone(DiagnosticsEngine
&Diag
, FileManager
&FM
,
103 SourceLocation Loc
) const {
104 // Lazily create the Buffer for ContentCaches that wrap files. If we already
105 // computed it, just return what we have.
109 return Buffer
->getMemBufferRef();
113 // Start with the assumption that the buffer is invalid to simplify early
115 IsBufferInvalid
= true;
117 auto BufferOrError
= FM
.getBufferForFile(ContentsEntry
, IsFileVolatile
);
119 // If we were unable to open the file, then we are in an inconsistent
120 // situation where the content cache referenced a file which no longer
121 // exists. Most likely, we were using a stat cache with an invalid entry but
122 // the file could also have been removed during processing. Since we can't
123 // really deal with this situation, just create an empty buffer.
124 if (!BufferOrError
) {
125 if (Diag
.isDiagnosticInFlight())
126 Diag
.SetDelayedDiagnostic(diag::err_cannot_open_file
,
127 ContentsEntry
->getName(),
128 BufferOrError
.getError().message());
130 Diag
.Report(Loc
, diag::err_cannot_open_file
)
131 << ContentsEntry
->getName() << BufferOrError
.getError().message();
136 Buffer
= std::move(*BufferOrError
);
138 // Check that the file's size fits in an 'unsigned' (with room for a
139 // past-the-end value). This is deeply regrettable, but various parts of
140 // Clang (including elsewhere in this file!) use 'unsigned' to represent file
141 // offsets, line numbers, string literal lengths, and so on, and fail
142 // miserably on large source files.
144 // Note: ContentsEntry could be a named pipe, in which case
145 // ContentsEntry::getSize() could have the wrong size. Use
146 // MemoryBuffer::getBufferSize() instead.
147 if (Buffer
->getBufferSize() >= std::numeric_limits
<unsigned>::max()) {
148 if (Diag
.isDiagnosticInFlight())
149 Diag
.SetDelayedDiagnostic(diag::err_file_too_large
,
150 ContentsEntry
->getName());
152 Diag
.Report(Loc
, diag::err_file_too_large
)
153 << ContentsEntry
->getName();
158 // Unless this is a named pipe (in which case we can handle a mismatch),
159 // check that the file's size is the same as in the file entry (which may
160 // have come from a stat cache).
161 if (!ContentsEntry
->isNamedPipe() &&
162 Buffer
->getBufferSize() != (size_t)ContentsEntry
->getSize()) {
163 if (Diag
.isDiagnosticInFlight())
164 Diag
.SetDelayedDiagnostic(diag::err_file_modified
,
165 ContentsEntry
->getName());
167 Diag
.Report(Loc
, diag::err_file_modified
)
168 << ContentsEntry
->getName();
173 // If the buffer is valid, check to see if it has a UTF Byte Order Mark
174 // (BOM). We only support UTF-8 with and without a BOM right now. See
175 // http://en.wikipedia.org/wiki/Byte_order_mark for more information.
176 StringRef BufStr
= Buffer
->getBuffer();
177 const char *InvalidBOM
= getInvalidBOM(BufStr
);
180 Diag
.Report(Loc
, diag::err_unsupported_bom
)
181 << InvalidBOM
<< ContentsEntry
->getName();
185 // Buffer has been validated.
186 IsBufferInvalid
= false;
187 return Buffer
->getMemBufferRef();
190 unsigned LineTableInfo::getLineTableFilenameID(StringRef Name
) {
191 auto IterBool
= FilenameIDs
.try_emplace(Name
, FilenamesByID
.size());
193 FilenamesByID
.push_back(&*IterBool
.first
);
194 return IterBool
.first
->second
;
197 /// Add a line note to the line table that indicates that there is a \#line or
198 /// GNU line marker at the specified FID/Offset location which changes the
199 /// presumed location to LineNo/FilenameID. If EntryExit is 0, then this doesn't
200 /// change the presumed \#include stack. If it is 1, this is a file entry, if
201 /// it is 2 then this is a file exit. FileKind specifies whether this is a
202 /// system header or extern C system header.
203 void LineTableInfo::AddLineNote(FileID FID
, unsigned Offset
, unsigned LineNo
,
204 int FilenameID
, unsigned EntryExit
,
205 SrcMgr::CharacteristicKind FileKind
) {
206 std::vector
<LineEntry
> &Entries
= LineEntries
[FID
];
208 assert((Entries
.empty() || Entries
.back().FileOffset
< Offset
) &&
209 "Adding line entries out of order!");
211 unsigned IncludeOffset
= 0;
212 if (EntryExit
== 1) {
214 IncludeOffset
= Offset
-1;
216 const auto *PrevEntry
= Entries
.empty() ? nullptr : &Entries
.back();
217 if (EntryExit
== 2) {
219 assert(PrevEntry
&& PrevEntry
->IncludeOffset
&&
220 "PPDirectives should have caught case when popping empty include "
222 PrevEntry
= FindNearestLineEntry(FID
, PrevEntry
->IncludeOffset
);
225 IncludeOffset
= PrevEntry
->IncludeOffset
;
226 if (FilenameID
== -1) {
227 // An unspecified FilenameID means use the previous (or containing)
228 // filename if available, or the main source file otherwise.
229 FilenameID
= PrevEntry
->FilenameID
;
234 Entries
.push_back(LineEntry::get(Offset
, LineNo
, FilenameID
, FileKind
,
238 /// FindNearestLineEntry - Find the line entry nearest to FID that is before
239 /// it. If there is no line entry before Offset in FID, return null.
240 const LineEntry
*LineTableInfo::FindNearestLineEntry(FileID FID
,
242 const std::vector
<LineEntry
> &Entries
= LineEntries
[FID
];
243 assert(!Entries
.empty() && "No #line entries for this FID after all!");
245 // It is very common for the query to be after the last #line, check this
247 if (Entries
.back().FileOffset
<= Offset
)
248 return &Entries
.back();
250 // Do a binary search to find the maximal element that is still before Offset.
251 std::vector
<LineEntry
>::const_iterator I
= llvm::upper_bound(Entries
, Offset
);
252 if (I
== Entries
.begin())
257 /// Add a new line entry that has already been encoded into
258 /// the internal representation of the line table.
259 void LineTableInfo::AddEntry(FileID FID
,
260 const std::vector
<LineEntry
> &Entries
) {
261 LineEntries
[FID
] = Entries
;
264 /// getLineTableFilenameID - Return the uniqued ID for the specified filename.
265 unsigned SourceManager::getLineTableFilenameID(StringRef Name
) {
266 return getLineTable().getLineTableFilenameID(Name
);
269 /// AddLineNote - Add a line note to the line table for the FileID and offset
270 /// specified by Loc. If FilenameID is -1, it is considered to be
272 void SourceManager::AddLineNote(SourceLocation Loc
, unsigned LineNo
,
273 int FilenameID
, bool IsFileEntry
,
275 SrcMgr::CharacteristicKind FileKind
) {
276 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
278 bool Invalid
= false;
279 const SLocEntry
&Entry
= getSLocEntry(LocInfo
.first
, &Invalid
);
280 if (!Entry
.isFile() || Invalid
)
283 const SrcMgr::FileInfo
&FileInfo
= Entry
.getFile();
285 // Remember that this file has #line directives now if it doesn't already.
286 const_cast<SrcMgr::FileInfo
&>(FileInfo
).setHasLineDirectives();
288 (void) getLineTable();
290 unsigned EntryExit
= 0;
296 LineTable
->AddLineNote(LocInfo
.first
, LocInfo
.second
, LineNo
, FilenameID
,
297 EntryExit
, FileKind
);
300 LineTableInfo
&SourceManager::getLineTable() {
302 LineTable
.reset(new LineTableInfo());
306 //===----------------------------------------------------------------------===//
307 // Private 'Create' methods.
308 //===----------------------------------------------------------------------===//
310 SourceManager::SourceManager(DiagnosticsEngine
&Diag
, FileManager
&FileMgr
,
311 bool UserFilesAreVolatile
)
312 : Diag(Diag
), FileMgr(FileMgr
), UserFilesAreVolatile(UserFilesAreVolatile
) {
314 Diag
.setSourceManager(this);
317 SourceManager::~SourceManager() {
318 // Delete FileEntry objects corresponding to content caches. Since the actual
319 // content cache objects are bump pointer allocated, we just have to run the
320 // dtors, but we call the deallocate method for completeness.
321 for (unsigned i
= 0, e
= MemBufferInfos
.size(); i
!= e
; ++i
) {
322 if (MemBufferInfos
[i
]) {
323 MemBufferInfos
[i
]->~ContentCache();
324 ContentCacheAlloc
.Deallocate(MemBufferInfos
[i
]);
327 for (llvm::DenseMap
<const FileEntry
*, SrcMgr::ContentCache
*>::iterator
328 I
= FileInfos
.begin(), E
= FileInfos
.end(); I
!= E
; ++I
) {
330 I
->second
->~ContentCache();
331 ContentCacheAlloc
.Deallocate(I
->second
);
336 void SourceManager::clearIDTables() {
337 MainFileID
= FileID();
338 LocalSLocEntryTable
.clear();
339 LoadedSLocEntryTable
.clear();
340 SLocEntryLoaded
.clear();
341 LastLineNoFileIDQuery
= FileID();
342 LastLineNoContentCache
= nullptr;
343 LastFileIDLookup
= FileID();
348 // Use up FileID #0 as an invalid expansion.
350 CurrentLoadedOffset
= MaxLoadedOffset
;
351 createExpansionLoc(SourceLocation(), SourceLocation(), SourceLocation(), 1);
354 bool SourceManager::isMainFile(const FileEntry
&SourceFile
) {
355 assert(MainFileID
.isValid() && "expected initialized SourceManager");
356 if (auto *FE
= getFileEntryForID(MainFileID
))
357 return FE
->getUID() == SourceFile
.getUID();
361 void SourceManager::initializeForReplay(const SourceManager
&Old
) {
362 assert(MainFileID
.isInvalid() && "expected uninitialized SourceManager");
364 auto CloneContentCache
= [&](const ContentCache
*Cache
) -> ContentCache
* {
365 auto *Clone
= new (ContentCacheAlloc
.Allocate
<ContentCache
>()) ContentCache
;
366 Clone
->OrigEntry
= Cache
->OrigEntry
;
367 Clone
->ContentsEntry
= Cache
->ContentsEntry
;
368 Clone
->BufferOverridden
= Cache
->BufferOverridden
;
369 Clone
->IsFileVolatile
= Cache
->IsFileVolatile
;
370 Clone
->IsTransient
= Cache
->IsTransient
;
371 Clone
->setUnownedBuffer(Cache
->getBufferIfLoaded());
375 // Ensure all SLocEntries are loaded from the external source.
376 for (unsigned I
= 0, N
= Old
.LoadedSLocEntryTable
.size(); I
!= N
; ++I
)
377 if (!Old
.SLocEntryLoaded
[I
])
378 Old
.loadSLocEntry(I
, nullptr);
380 // Inherit any content cache data from the old source manager.
381 for (auto &FileInfo
: Old
.FileInfos
) {
382 SrcMgr::ContentCache
*&Slot
= FileInfos
[FileInfo
.first
];
385 Slot
= CloneContentCache(FileInfo
.second
);
389 ContentCache
&SourceManager::getOrCreateContentCache(FileEntryRef FileEnt
,
391 // Do we already have information about this file?
392 ContentCache
*&Entry
= FileInfos
[FileEnt
];
396 // Nope, create a new Cache entry.
397 Entry
= ContentCacheAlloc
.Allocate
<ContentCache
>();
399 if (OverriddenFilesInfo
) {
400 // If the file contents are overridden with contents from another file,
401 // pass that file to ContentCache.
402 llvm::DenseMap
<const FileEntry
*, const FileEntry
*>::iterator
403 overI
= OverriddenFilesInfo
->OverriddenFiles
.find(FileEnt
);
404 if (overI
== OverriddenFilesInfo
->OverriddenFiles
.end())
405 new (Entry
) ContentCache(FileEnt
);
407 new (Entry
) ContentCache(OverridenFilesKeepOriginalName
? FileEnt
411 new (Entry
) ContentCache(FileEnt
);
414 Entry
->IsFileVolatile
= UserFilesAreVolatile
&& !isSystemFile
;
415 Entry
->IsTransient
= FilesAreTransient
;
416 Entry
->BufferOverridden
|= FileEnt
.isNamedPipe();
421 /// Create a new ContentCache for the specified memory buffer.
422 /// This does no caching.
423 ContentCache
&SourceManager::createMemBufferContentCache(
424 std::unique_ptr
<llvm::MemoryBuffer
> Buffer
) {
425 // Add a new ContentCache to the MemBufferInfos list and return it.
426 ContentCache
*Entry
= ContentCacheAlloc
.Allocate
<ContentCache
>();
427 new (Entry
) ContentCache();
428 MemBufferInfos
.push_back(Entry
);
429 Entry
->setBuffer(std::move(Buffer
));
433 const SrcMgr::SLocEntry
&SourceManager::loadSLocEntry(unsigned Index
,
434 bool *Invalid
) const {
435 assert(!SLocEntryLoaded
[Index
]);
436 if (ExternalSLocEntries
->ReadSLocEntry(-(static_cast<int>(Index
) + 2))) {
439 // If the file of the SLocEntry changed we could still have loaded it.
440 if (!SLocEntryLoaded
[Index
]) {
441 // Try to recover; create a SLocEntry so the rest of clang can handle it.
442 if (!FakeSLocEntryForRecovery
)
443 FakeSLocEntryForRecovery
= std::make_unique
<SLocEntry
>(SLocEntry::get(
444 0, FileInfo::get(SourceLocation(), getFakeContentCacheForRecovery(),
445 SrcMgr::C_User
, "")));
446 return *FakeSLocEntryForRecovery
;
450 return LoadedSLocEntryTable
[Index
];
453 std::pair
<int, SourceLocation::UIntTy
>
454 SourceManager::AllocateLoadedSLocEntries(unsigned NumSLocEntries
,
455 SourceLocation::UIntTy TotalSize
) {
456 assert(ExternalSLocEntries
&& "Don't have an external sloc source");
457 // Make sure we're not about to run out of source locations.
458 if (CurrentLoadedOffset
- TotalSize
< NextLocalOffset
)
459 return std::make_pair(0, 0);
460 LoadedSLocEntryTable
.resize(LoadedSLocEntryTable
.size() + NumSLocEntries
);
461 SLocEntryLoaded
.resize(LoadedSLocEntryTable
.size());
462 CurrentLoadedOffset
-= TotalSize
;
463 int ID
= LoadedSLocEntryTable
.size();
464 return std::make_pair(-ID
- 1, CurrentLoadedOffset
);
467 /// As part of recovering from missing or changed content, produce a
468 /// fake, non-empty buffer.
469 llvm::MemoryBufferRef
SourceManager::getFakeBufferForRecovery() const {
470 if (!FakeBufferForRecovery
)
471 FakeBufferForRecovery
=
472 llvm::MemoryBuffer::getMemBuffer("<<<INVALID BUFFER>>");
474 return *FakeBufferForRecovery
;
477 /// As part of recovering from missing or changed content, produce a
478 /// fake content cache.
479 SrcMgr::ContentCache
&SourceManager::getFakeContentCacheForRecovery() const {
480 if (!FakeContentCacheForRecovery
) {
481 FakeContentCacheForRecovery
= std::make_unique
<SrcMgr::ContentCache
>();
482 FakeContentCacheForRecovery
->setUnownedBuffer(getFakeBufferForRecovery());
484 return *FakeContentCacheForRecovery
;
487 /// Returns the previous in-order FileID or an invalid FileID if there
488 /// is no previous one.
489 FileID
SourceManager::getPreviousFileID(FileID FID
) const {
500 } else if (unsigned(-(ID
-1) - 2) >= LoadedSLocEntryTable
.size()) {
504 return FileID::get(ID
-1);
507 /// Returns the next in-order FileID or an invalid FileID if there is
509 FileID
SourceManager::getNextFileID(FileID FID
) const {
515 if (unsigned(ID
+1) >= local_sloc_entry_size())
517 } else if (ID
+1 >= -1) {
521 return FileID::get(ID
+1);
524 //===----------------------------------------------------------------------===//
525 // Methods to create new FileID's and macro expansions.
526 //===----------------------------------------------------------------------===//
528 /// Create a new FileID that represents the specified file
529 /// being \#included from the specified IncludePosition.
531 /// This translates NULL into standard input.
532 FileID
SourceManager::createFileID(const FileEntry
*SourceFile
,
533 SourceLocation IncludePos
,
534 SrcMgr::CharacteristicKind FileCharacter
,
536 SourceLocation::UIntTy LoadedOffset
) {
537 return createFileID(SourceFile
->getLastRef(), IncludePos
, FileCharacter
,
538 LoadedID
, LoadedOffset
);
541 FileID
SourceManager::createFileID(FileEntryRef SourceFile
,
542 SourceLocation IncludePos
,
543 SrcMgr::CharacteristicKind FileCharacter
,
545 SourceLocation::UIntTy LoadedOffset
) {
546 SrcMgr::ContentCache
&IR
= getOrCreateContentCache(SourceFile
,
547 isSystem(FileCharacter
));
549 // If this is a named pipe, immediately load the buffer to ensure subsequent
550 // calls to ContentCache::getSize() are accurate.
551 if (IR
.ContentsEntry
->isNamedPipe())
552 (void)IR
.getBufferOrNone(Diag
, getFileManager(), SourceLocation());
554 return createFileIDImpl(IR
, SourceFile
.getName(), IncludePos
, FileCharacter
,
555 LoadedID
, LoadedOffset
);
558 /// Create a new FileID that represents the specified memory buffer.
560 /// This does no caching of the buffer and takes ownership of the
561 /// MemoryBuffer, so only pass a MemoryBuffer to this once.
562 FileID
SourceManager::createFileID(std::unique_ptr
<llvm::MemoryBuffer
> Buffer
,
563 SrcMgr::CharacteristicKind FileCharacter
,
565 SourceLocation::UIntTy LoadedOffset
,
566 SourceLocation IncludeLoc
) {
567 StringRef Name
= Buffer
->getBufferIdentifier();
568 return createFileIDImpl(createMemBufferContentCache(std::move(Buffer
)), Name
,
569 IncludeLoc
, FileCharacter
, LoadedID
, LoadedOffset
);
572 /// Create a new FileID that represents the specified memory buffer.
574 /// This does not take ownership of the MemoryBuffer. The memory buffer must
575 /// outlive the SourceManager.
576 FileID
SourceManager::createFileID(const llvm::MemoryBufferRef
&Buffer
,
577 SrcMgr::CharacteristicKind FileCharacter
,
579 SourceLocation::UIntTy LoadedOffset
,
580 SourceLocation IncludeLoc
) {
581 return createFileID(llvm::MemoryBuffer::getMemBuffer(Buffer
), FileCharacter
,
582 LoadedID
, LoadedOffset
, IncludeLoc
);
585 /// Get the FileID for \p SourceFile if it exists. Otherwise, create a
586 /// new FileID for the \p SourceFile.
588 SourceManager::getOrCreateFileID(const FileEntry
*SourceFile
,
589 SrcMgr::CharacteristicKind FileCharacter
) {
590 FileID ID
= translateFile(SourceFile
);
591 return ID
.isValid() ? ID
: createFileID(SourceFile
, SourceLocation(),
595 /// createFileID - Create a new FileID for the specified ContentCache and
596 /// include position. This works regardless of whether the ContentCache
597 /// corresponds to a file or some other input source.
598 FileID
SourceManager::createFileIDImpl(ContentCache
&File
, StringRef Filename
,
599 SourceLocation IncludePos
,
600 SrcMgr::CharacteristicKind FileCharacter
,
602 SourceLocation::UIntTy LoadedOffset
) {
604 assert(LoadedID
!= -1 && "Loading sentinel FileID");
605 unsigned Index
= unsigned(-LoadedID
) - 2;
606 assert(Index
< LoadedSLocEntryTable
.size() && "FileID out of range");
607 assert(!SLocEntryLoaded
[Index
] && "FileID already loaded");
608 LoadedSLocEntryTable
[Index
] = SLocEntry::get(
609 LoadedOffset
, FileInfo::get(IncludePos
, File
, FileCharacter
, Filename
));
610 SLocEntryLoaded
[Index
] = true;
611 return FileID::get(LoadedID
);
613 unsigned FileSize
= File
.getSize();
614 if (!(NextLocalOffset
+ FileSize
+ 1 > NextLocalOffset
&&
615 NextLocalOffset
+ FileSize
+ 1 <= CurrentLoadedOffset
)) {
616 Diag
.Report(IncludePos
, diag::err_include_too_large
);
619 LocalSLocEntryTable
.push_back(
620 SLocEntry::get(NextLocalOffset
,
621 FileInfo::get(IncludePos
, File
, FileCharacter
, Filename
)));
622 // We do a +1 here because we want a SourceLocation that means "the end of the
623 // file", e.g. for the "no newline at the end of the file" diagnostic.
624 NextLocalOffset
+= FileSize
+ 1;
626 // Set LastFileIDLookup to the newly created file. The next getFileID call is
627 // almost guaranteed to be from that file.
628 FileID FID
= FileID::get(LocalSLocEntryTable
.size()-1);
629 return LastFileIDLookup
= FID
;
632 SourceLocation
SourceManager::createMacroArgExpansionLoc(
633 SourceLocation SpellingLoc
, SourceLocation ExpansionLoc
, unsigned Length
) {
634 ExpansionInfo Info
= ExpansionInfo::createForMacroArg(SpellingLoc
,
636 return createExpansionLocImpl(Info
, Length
);
639 SourceLocation
SourceManager::createExpansionLoc(
640 SourceLocation SpellingLoc
, SourceLocation ExpansionLocStart
,
641 SourceLocation ExpansionLocEnd
, unsigned Length
,
642 bool ExpansionIsTokenRange
, int LoadedID
,
643 SourceLocation::UIntTy LoadedOffset
) {
644 ExpansionInfo Info
= ExpansionInfo::create(
645 SpellingLoc
, ExpansionLocStart
, ExpansionLocEnd
, ExpansionIsTokenRange
);
646 return createExpansionLocImpl(Info
, Length
, LoadedID
, LoadedOffset
);
649 SourceLocation
SourceManager::createTokenSplitLoc(SourceLocation Spelling
,
650 SourceLocation TokenStart
,
651 SourceLocation TokenEnd
) {
652 assert(getFileID(TokenStart
) == getFileID(TokenEnd
) &&
653 "token spans multiple files");
654 return createExpansionLocImpl(
655 ExpansionInfo::createForTokenSplit(Spelling
, TokenStart
, TokenEnd
),
656 TokenEnd
.getOffset() - TokenStart
.getOffset());
660 SourceManager::createExpansionLocImpl(const ExpansionInfo
&Info
,
661 unsigned Length
, int LoadedID
,
662 SourceLocation::UIntTy LoadedOffset
) {
664 assert(LoadedID
!= -1 && "Loading sentinel FileID");
665 unsigned Index
= unsigned(-LoadedID
) - 2;
666 assert(Index
< LoadedSLocEntryTable
.size() && "FileID out of range");
667 assert(!SLocEntryLoaded
[Index
] && "FileID already loaded");
668 LoadedSLocEntryTable
[Index
] = SLocEntry::get(LoadedOffset
, Info
);
669 SLocEntryLoaded
[Index
] = true;
670 return SourceLocation::getMacroLoc(LoadedOffset
);
672 LocalSLocEntryTable
.push_back(SLocEntry::get(NextLocalOffset
, Info
));
673 assert(NextLocalOffset
+ Length
+ 1 > NextLocalOffset
&&
674 NextLocalOffset
+ Length
+ 1 <= CurrentLoadedOffset
&&
675 "Ran out of source locations!");
676 // See createFileID for that +1.
677 NextLocalOffset
+= Length
+ 1;
678 return SourceLocation::getMacroLoc(NextLocalOffset
- (Length
+ 1));
681 llvm::Optional
<llvm::MemoryBufferRef
>
682 SourceManager::getMemoryBufferForFileOrNone(const FileEntry
*File
) {
683 SrcMgr::ContentCache
&IR
= getOrCreateContentCache(File
->getLastRef());
684 return IR
.getBufferOrNone(Diag
, getFileManager(), SourceLocation());
687 void SourceManager::overrideFileContents(
688 const FileEntry
*SourceFile
, std::unique_ptr
<llvm::MemoryBuffer
> Buffer
) {
689 SrcMgr::ContentCache
&IR
= getOrCreateContentCache(SourceFile
->getLastRef());
691 IR
.setBuffer(std::move(Buffer
));
692 IR
.BufferOverridden
= true;
694 getOverriddenFilesInfo().OverriddenFilesWithBuffer
.insert(SourceFile
);
697 void SourceManager::overrideFileContents(const FileEntry
*SourceFile
,
698 const FileEntry
*NewFile
) {
699 assert(SourceFile
->getSize() == NewFile
->getSize() &&
700 "Different sizes, use the FileManager to create a virtual file with "
702 assert(FileInfos
.count(SourceFile
) == 0 &&
703 "This function should be called at the initialization stage, before "
704 "any parsing occurs.");
705 getOverriddenFilesInfo().OverriddenFiles
[SourceFile
] = NewFile
;
708 Optional
<FileEntryRef
>
709 SourceManager::bypassFileContentsOverride(FileEntryRef File
) {
710 assert(isFileOverridden(&File
.getFileEntry()));
711 llvm::Optional
<FileEntryRef
> BypassFile
= FileMgr
.getBypassFile(File
);
713 // If the file can't be found in the FS, give up.
717 (void)getOrCreateContentCache(*BypassFile
);
721 void SourceManager::setFileIsTransient(const FileEntry
*File
) {
722 getOrCreateContentCache(File
->getLastRef()).IsTransient
= true;
726 SourceManager::getNonBuiltinFilenameForID(FileID FID
) const {
727 if (const SrcMgr::SLocEntry
*Entry
= getSLocEntryForFile(FID
))
728 if (Entry
->getFile().getContentCache().OrigEntry
)
729 return Entry
->getFile().getName();
733 StringRef
SourceManager::getBufferData(FileID FID
, bool *Invalid
) const {
734 auto B
= getBufferDataOrNone(FID
);
737 return B
? *B
: "<<<<<INVALID SOURCE LOCATION>>>>>";
740 llvm::Optional
<StringRef
>
741 SourceManager::getBufferDataIfLoaded(FileID FID
) const {
742 if (const SrcMgr::SLocEntry
*Entry
= getSLocEntryForFile(FID
))
743 return Entry
->getFile().getContentCache().getBufferDataIfLoaded();
747 llvm::Optional
<StringRef
> SourceManager::getBufferDataOrNone(FileID FID
) const {
748 if (const SrcMgr::SLocEntry
*Entry
= getSLocEntryForFile(FID
))
749 if (auto B
= Entry
->getFile().getContentCache().getBufferOrNone(
750 Diag
, getFileManager(), SourceLocation()))
751 return B
->getBuffer();
755 //===----------------------------------------------------------------------===//
756 // SourceLocation manipulation methods.
757 //===----------------------------------------------------------------------===//
759 /// Return the FileID for a SourceLocation.
761 /// This is the cache-miss path of getFileID. Not as hot as that function, but
762 /// still very important. It is responsible for finding the entry in the
763 /// SLocEntry tables that contains the specified location.
764 FileID
SourceManager::getFileIDSlow(SourceLocation::UIntTy SLocOffset
) const {
766 return FileID::get(0);
768 // Now it is time to search for the correct file. See where the SLocOffset
769 // sits in the global view and consult local or loaded buffers for it.
770 if (SLocOffset
< NextLocalOffset
)
771 return getFileIDLocal(SLocOffset
);
772 return getFileIDLoaded(SLocOffset
);
775 /// Return the FileID for a SourceLocation with a low offset.
777 /// This function knows that the SourceLocation is in a local buffer, not a
779 FileID
SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset
) const {
780 assert(SLocOffset
< NextLocalOffset
&& "Bad function choice");
782 // After the first and second level caches, I see two common sorts of
783 // behavior: 1) a lot of searched FileID's are "near" the cached file
784 // location or are "near" the cached expansion location. 2) others are just
785 // completely random and may be a very long way away.
787 // To handle this, we do a linear search for up to 8 steps to catch #1 quickly
788 // then we fall back to a less cache efficient, but more scalable, binary
789 // search to find the location.
791 // See if this is near the file point - worst case we start scanning from the
792 // most newly created FileID.
793 const SrcMgr::SLocEntry
*I
;
795 if (LastFileIDLookup
.ID
< 0 ||
796 LocalSLocEntryTable
[LastFileIDLookup
.ID
].getOffset() < SLocOffset
) {
797 // Neither loc prunes our search.
798 I
= LocalSLocEntryTable
.end();
800 // Perhaps it is near the file point.
801 I
= LocalSLocEntryTable
.begin()+LastFileIDLookup
.ID
;
804 // Find the FileID that contains this. "I" is an iterator that points to a
805 // FileID whose offset is known to be larger than SLocOffset.
806 unsigned NumProbes
= 0;
809 if (I
->getOffset() <= SLocOffset
) {
810 FileID Res
= FileID::get(int(I
- LocalSLocEntryTable
.begin()));
811 // Remember it. We have good locality across FileID lookups.
812 LastFileIDLookup
= Res
;
813 NumLinearScans
+= NumProbes
+1;
816 if (++NumProbes
== 8)
820 // Convert "I" back into an index. We know that it is an entry whose index is
821 // larger than the offset we are looking for.
822 unsigned GreaterIndex
= I
- LocalSLocEntryTable
.begin();
823 // LessIndex - This is the lower bound of the range that we're searching.
824 // We know that the offset corresponding to the FileID is is less than
826 unsigned LessIndex
= 0;
829 unsigned MiddleIndex
= (GreaterIndex
-LessIndex
)/2+LessIndex
;
830 SourceLocation::UIntTy MidOffset
=
831 getLocalSLocEntry(MiddleIndex
).getOffset();
835 // If the offset of the midpoint is too large, chop the high side of the
836 // range to the midpoint.
837 if (MidOffset
> SLocOffset
) {
838 GreaterIndex
= MiddleIndex
;
842 // If the middle index contains the value, succeed and return.
843 if (MiddleIndex
+ 1 == LocalSLocEntryTable
.size() ||
844 SLocOffset
< getLocalSLocEntry(MiddleIndex
+ 1).getOffset()) {
845 FileID Res
= FileID::get(MiddleIndex
);
847 // Remember it. We have good locality across FileID lookups.
848 LastFileIDLookup
= Res
;
849 NumBinaryProbes
+= NumProbes
;
853 // Otherwise, move the low-side up to the middle index.
854 LessIndex
= MiddleIndex
;
858 /// Return the FileID for a SourceLocation with a high offset.
860 /// This function knows that the SourceLocation is in a loaded buffer, not a
862 FileID
SourceManager::getFileIDLoaded(SourceLocation::UIntTy SLocOffset
) const {
863 if (SLocOffset
< CurrentLoadedOffset
) {
864 assert(0 && "Invalid SLocOffset or bad function choice");
868 // Essentially the same as the local case, but the loaded array is sorted
869 // in the other direction.
871 // First do a linear scan from the last lookup position, if possible.
873 int LastID
= LastFileIDLookup
.ID
;
874 if (LastID
>= 0 || getLoadedSLocEntryByID(LastID
).getOffset() < SLocOffset
)
877 I
= (-LastID
- 2) + 1;
880 bool Invalid
= false;
881 for (NumProbes
= 0; NumProbes
< 8; ++NumProbes
, ++I
) {
882 // Make sure the entry is loaded!
883 const SrcMgr::SLocEntry
&E
= getLoadedSLocEntry(I
, &Invalid
);
885 return FileID(); // invalid entry.
886 if (E
.getOffset() <= SLocOffset
) {
887 FileID Res
= FileID::get(-int(I
) - 2);
888 LastFileIDLookup
= Res
;
889 NumLinearScans
+= NumProbes
+ 1;
894 // Linear scan failed. Do the binary search. Note the reverse sorting of the
895 // table: GreaterIndex is the one where the offset is greater, which is
896 // actually a lower index!
897 unsigned GreaterIndex
= I
;
898 unsigned LessIndex
= LoadedSLocEntryTable
.size();
902 unsigned MiddleIndex
= (LessIndex
- GreaterIndex
) / 2 + GreaterIndex
;
903 const SrcMgr::SLocEntry
&E
= getLoadedSLocEntry(MiddleIndex
, &Invalid
);
905 return FileID(); // invalid entry.
909 if (E
.getOffset() > SLocOffset
) {
910 if (GreaterIndex
== MiddleIndex
) {
911 assert(0 && "binary search missed the entry");
914 GreaterIndex
= MiddleIndex
;
918 if (isOffsetInFileID(FileID::get(-int(MiddleIndex
) - 2), SLocOffset
)) {
919 FileID Res
= FileID::get(-int(MiddleIndex
) - 2);
920 LastFileIDLookup
= Res
;
921 NumBinaryProbes
+= NumProbes
;
925 if (LessIndex
== MiddleIndex
) {
926 assert(0 && "binary search missed the entry");
929 LessIndex
= MiddleIndex
;
933 SourceLocation
SourceManager::
934 getExpansionLocSlowCase(SourceLocation Loc
) const {
936 // Note: If Loc indicates an offset into a token that came from a macro
937 // expansion (e.g. the 5th character of the token) we do not want to add
938 // this offset when going to the expansion location. The expansion
939 // location is the macro invocation, which the offset has nothing to do
940 // with. This is unlike when we get the spelling loc, because the offset
941 // directly correspond to the token whose spelling we're inspecting.
942 Loc
= getSLocEntry(getFileID(Loc
)).getExpansion().getExpansionLocStart();
943 } while (!Loc
.isFileID());
948 SourceLocation
SourceManager::getSpellingLocSlowCase(SourceLocation Loc
) const {
950 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedLoc(Loc
);
951 Loc
= getSLocEntry(LocInfo
.first
).getExpansion().getSpellingLoc();
952 Loc
= Loc
.getLocWithOffset(LocInfo
.second
);
953 } while (!Loc
.isFileID());
957 SourceLocation
SourceManager::getFileLocSlowCase(SourceLocation Loc
) const {
959 if (isMacroArgExpansion(Loc
))
960 Loc
= getImmediateSpellingLoc(Loc
);
962 Loc
= getImmediateExpansionRange(Loc
).getBegin();
963 } while (!Loc
.isFileID());
968 std::pair
<FileID
, unsigned>
969 SourceManager::getDecomposedExpansionLocSlowCase(
970 const SrcMgr::SLocEntry
*E
) const {
971 // If this is an expansion record, walk through all the expansion points.
976 Loc
= E
->getExpansion().getExpansionLocStart();
978 FID
= getFileID(Loc
);
979 E
= &getSLocEntry(FID
);
980 Offset
= Loc
.getOffset()-E
->getOffset();
981 } while (!Loc
.isFileID());
983 return std::make_pair(FID
, Offset
);
986 std::pair
<FileID
, unsigned>
987 SourceManager::getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry
*E
,
988 unsigned Offset
) const {
989 // If this is an expansion record, walk through all the expansion points.
993 Loc
= E
->getExpansion().getSpellingLoc();
994 Loc
= Loc
.getLocWithOffset(Offset
);
996 FID
= getFileID(Loc
);
997 E
= &getSLocEntry(FID
);
998 Offset
= Loc
.getOffset()-E
->getOffset();
999 } while (!Loc
.isFileID());
1001 return std::make_pair(FID
, Offset
);
1004 /// getImmediateSpellingLoc - Given a SourceLocation object, return the
1005 /// spelling location referenced by the ID. This is the first level down
1006 /// towards the place where the characters that make up the lexed token can be
1007 /// found. This should not generally be used by clients.
1008 SourceLocation
SourceManager::getImmediateSpellingLoc(SourceLocation Loc
) const{
1009 if (Loc
.isFileID()) return Loc
;
1010 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedLoc(Loc
);
1011 Loc
= getSLocEntry(LocInfo
.first
).getExpansion().getSpellingLoc();
1012 return Loc
.getLocWithOffset(LocInfo
.second
);
1015 /// Return the filename of the file containing a SourceLocation.
1016 StringRef
SourceManager::getFilename(SourceLocation SpellingLoc
) const {
1017 if (const FileEntry
*F
= getFileEntryForID(getFileID(SpellingLoc
)))
1018 return F
->getName();
1022 /// getImmediateExpansionRange - Loc is required to be an expansion location.
1023 /// Return the start/end of the expansion information.
1025 SourceManager::getImmediateExpansionRange(SourceLocation Loc
) const {
1026 assert(Loc
.isMacroID() && "Not a macro expansion loc!");
1027 const ExpansionInfo
&Expansion
= getSLocEntry(getFileID(Loc
)).getExpansion();
1028 return Expansion
.getExpansionLocRange();
1031 SourceLocation
SourceManager::getTopMacroCallerLoc(SourceLocation Loc
) const {
1032 while (isMacroArgExpansion(Loc
))
1033 Loc
= getImmediateSpellingLoc(Loc
);
1037 /// getExpansionRange - Given a SourceLocation object, return the range of
1038 /// tokens covered by the expansion in the ultimate file.
1039 CharSourceRange
SourceManager::getExpansionRange(SourceLocation Loc
) const {
1041 return CharSourceRange(SourceRange(Loc
, Loc
), true);
1043 CharSourceRange Res
= getImmediateExpansionRange(Loc
);
1045 // Fully resolve the start and end locations to their ultimate expansion
1047 while (!Res
.getBegin().isFileID())
1048 Res
.setBegin(getImmediateExpansionRange(Res
.getBegin()).getBegin());
1049 while (!Res
.getEnd().isFileID()) {
1050 CharSourceRange EndRange
= getImmediateExpansionRange(Res
.getEnd());
1051 Res
.setEnd(EndRange
.getEnd());
1052 Res
.setTokenRange(EndRange
.isTokenRange());
1057 bool SourceManager::isMacroArgExpansion(SourceLocation Loc
,
1058 SourceLocation
*StartLoc
) const {
1059 if (!Loc
.isMacroID()) return false;
1061 FileID FID
= getFileID(Loc
);
1062 const SrcMgr::ExpansionInfo
&Expansion
= getSLocEntry(FID
).getExpansion();
1063 if (!Expansion
.isMacroArgExpansion()) return false;
1066 *StartLoc
= Expansion
.getExpansionLocStart();
1070 bool SourceManager::isMacroBodyExpansion(SourceLocation Loc
) const {
1071 if (!Loc
.isMacroID()) return false;
1073 FileID FID
= getFileID(Loc
);
1074 const SrcMgr::ExpansionInfo
&Expansion
= getSLocEntry(FID
).getExpansion();
1075 return Expansion
.isMacroBodyExpansion();
1078 bool SourceManager::isAtStartOfImmediateMacroExpansion(SourceLocation Loc
,
1079 SourceLocation
*MacroBegin
) const {
1080 assert(Loc
.isValid() && Loc
.isMacroID() && "Expected a valid macro loc");
1082 std::pair
<FileID
, unsigned> DecompLoc
= getDecomposedLoc(Loc
);
1083 if (DecompLoc
.second
> 0)
1084 return false; // Does not point at the start of expansion range.
1086 bool Invalid
= false;
1087 const SrcMgr::ExpansionInfo
&ExpInfo
=
1088 getSLocEntry(DecompLoc
.first
, &Invalid
).getExpansion();
1091 SourceLocation ExpLoc
= ExpInfo
.getExpansionLocStart();
1093 if (ExpInfo
.isMacroArgExpansion()) {
1094 // For macro argument expansions, check if the previous FileID is part of
1095 // the same argument expansion, in which case this Loc is not at the
1096 // beginning of the expansion.
1097 FileID PrevFID
= getPreviousFileID(DecompLoc
.first
);
1098 if (!PrevFID
.isInvalid()) {
1099 const SrcMgr::SLocEntry
&PrevEntry
= getSLocEntry(PrevFID
, &Invalid
);
1102 if (PrevEntry
.isExpansion() &&
1103 PrevEntry
.getExpansion().getExpansionLocStart() == ExpLoc
)
1109 *MacroBegin
= ExpLoc
;
1113 bool SourceManager::isAtEndOfImmediateMacroExpansion(SourceLocation Loc
,
1114 SourceLocation
*MacroEnd
) const {
1115 assert(Loc
.isValid() && Loc
.isMacroID() && "Expected a valid macro loc");
1117 FileID FID
= getFileID(Loc
);
1118 SourceLocation NextLoc
= Loc
.getLocWithOffset(1);
1119 if (isInFileID(NextLoc
, FID
))
1120 return false; // Does not point at the end of expansion range.
1122 bool Invalid
= false;
1123 const SrcMgr::ExpansionInfo
&ExpInfo
=
1124 getSLocEntry(FID
, &Invalid
).getExpansion();
1128 if (ExpInfo
.isMacroArgExpansion()) {
1129 // For macro argument expansions, check if the next FileID is part of the
1130 // same argument expansion, in which case this Loc is not at the end of the
1132 FileID NextFID
= getNextFileID(FID
);
1133 if (!NextFID
.isInvalid()) {
1134 const SrcMgr::SLocEntry
&NextEntry
= getSLocEntry(NextFID
, &Invalid
);
1137 if (NextEntry
.isExpansion() &&
1138 NextEntry
.getExpansion().getExpansionLocStart() ==
1139 ExpInfo
.getExpansionLocStart())
1145 *MacroEnd
= ExpInfo
.getExpansionLocEnd();
1149 //===----------------------------------------------------------------------===//
1150 // Queries about the code at a SourceLocation.
1151 //===----------------------------------------------------------------------===//
1153 /// getCharacterData - Return a pointer to the start of the specified location
1154 /// in the appropriate MemoryBuffer.
1155 const char *SourceManager::getCharacterData(SourceLocation SL
,
1156 bool *Invalid
) const {
1157 // Note that this is a hot function in the getSpelling() path, which is
1158 // heavily used by -E mode.
1159 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedSpellingLoc(SL
);
1161 // Note that calling 'getBuffer()' may lazily page in a source file.
1162 bool CharDataInvalid
= false;
1163 const SLocEntry
&Entry
= getSLocEntry(LocInfo
.first
, &CharDataInvalid
);
1164 if (CharDataInvalid
|| !Entry
.isFile()) {
1168 return "<<<<INVALID BUFFER>>>>";
1170 llvm::Optional
<llvm::MemoryBufferRef
> Buffer
=
1171 Entry
.getFile().getContentCache().getBufferOrNone(Diag
, getFileManager(),
1175 return Buffer
? Buffer
->getBufferStart() + LocInfo
.second
1176 : "<<<<INVALID BUFFER>>>>";
1179 /// getColumnNumber - Return the column # for the specified file position.
1180 /// this is significantly cheaper to compute than the line number.
1181 unsigned SourceManager::getColumnNumber(FileID FID
, unsigned FilePos
,
1182 bool *Invalid
) const {
1183 llvm::Optional
<llvm::MemoryBufferRef
> MemBuf
= getBufferOrNone(FID
);
1190 // It is okay to request a position just past the end of the buffer.
1191 if (FilePos
> MemBuf
->getBufferSize()) {
1197 const char *Buf
= MemBuf
->getBufferStart();
1198 // See if we just calculated the line number for this FilePos and can use
1199 // that to lookup the start of the line instead of searching for it.
1200 if (LastLineNoFileIDQuery
== FID
&& LastLineNoContentCache
->SourceLineCache
&&
1201 LastLineNoResult
< LastLineNoContentCache
->SourceLineCache
.size()) {
1202 const unsigned *SourceLineCache
=
1203 LastLineNoContentCache
->SourceLineCache
.begin();
1204 unsigned LineStart
= SourceLineCache
[LastLineNoResult
- 1];
1205 unsigned LineEnd
= SourceLineCache
[LastLineNoResult
];
1206 if (FilePos
>= LineStart
&& FilePos
< LineEnd
) {
1207 // LineEnd is the LineStart of the next line.
1208 // A line ends with separator LF or CR+LF on Windows.
1209 // FilePos might point to the last separator,
1210 // but we need a column number at most 1 + the last column.
1211 if (FilePos
+ 1 == LineEnd
&& FilePos
> LineStart
) {
1212 if (Buf
[FilePos
- 1] == '\r' || Buf
[FilePos
- 1] == '\n')
1215 return FilePos
- LineStart
+ 1;
1219 unsigned LineStart
= FilePos
;
1220 while (LineStart
&& Buf
[LineStart
-1] != '\n' && Buf
[LineStart
-1] != '\r')
1222 return FilePos
-LineStart
+1;
1225 // isInvalid - Return the result of calling loc.isInvalid(), and
1226 // if Invalid is not null, set its value to same.
1227 template<typename LocType
>
1228 static bool isInvalid(LocType Loc
, bool *Invalid
) {
1229 bool MyInvalid
= Loc
.isInvalid();
1231 *Invalid
= MyInvalid
;
1235 unsigned SourceManager::getSpellingColumnNumber(SourceLocation Loc
,
1236 bool *Invalid
) const {
1237 if (isInvalid(Loc
, Invalid
)) return 0;
1238 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedSpellingLoc(Loc
);
1239 return getColumnNumber(LocInfo
.first
, LocInfo
.second
, Invalid
);
1242 unsigned SourceManager::getExpansionColumnNumber(SourceLocation Loc
,
1243 bool *Invalid
) const {
1244 if (isInvalid(Loc
, Invalid
)) return 0;
1245 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
1246 return getColumnNumber(LocInfo
.first
, LocInfo
.second
, Invalid
);
1249 unsigned SourceManager::getPresumedColumnNumber(SourceLocation Loc
,
1250 bool *Invalid
) const {
1251 PresumedLoc PLoc
= getPresumedLoc(Loc
);
1252 if (isInvalid(PLoc
, Invalid
)) return 0;
1253 return PLoc
.getColumn();
1256 // Check if mutli-byte word x has bytes between m and n, included. This may also
1257 // catch bytes equal to n + 1.
1258 // The returned value holds a 0x80 at each byte position that holds a match.
1259 // see http://graphics.stanford.edu/~seander/bithacks.html#HasBetweenInWord
1261 static constexpr inline T
likelyhasbetween(T x
, unsigned char m
,
1263 return ((x
- ~static_cast<T
>(0) / 255 * (n
+ 1)) & ~x
&
1264 ((x
& ~static_cast<T
>(0) / 255 * 127) +
1265 (~static_cast<T
>(0) / 255 * (127 - (m
- 1))))) &
1266 ~static_cast<T
>(0) / 255 * 128;
1269 LineOffsetMapping
LineOffsetMapping::get(llvm::MemoryBufferRef Buffer
,
1270 llvm::BumpPtrAllocator
&Alloc
) {
1272 // Find the file offsets of all of the *physical* source lines. This does
1273 // not look at trigraphs, escaped newlines, or anything else tricky.
1274 SmallVector
<unsigned, 256> LineOffsets
;
1276 // Line #1 starts at char 0.
1277 LineOffsets
.push_back(0);
1279 const unsigned char *Buf
= (const unsigned char *)Buffer
.getBufferStart();
1280 const unsigned char *End
= (const unsigned char *)Buffer
.getBufferEnd();
1281 const std::size_t BufLen
= End
- Buf
;
1286 // scan sizeof(Word) bytes at a time for new lines.
1287 // This is much faster than scanning each byte independently.
1288 if (BufLen
> sizeof(Word
)) {
1290 Word
= llvm::support::endian::read64(Buf
+ I
, llvm::support::little
);
1291 // no new line => jump over sizeof(Word) bytes.
1292 auto Mask
= likelyhasbetween(Word
, '\n', '\r');
1298 // At that point, Mask contains 0x80 set at each byte that holds a value
1301 // Scan for the next newline - it's very likely there's one.
1303 llvm::countTrailingZeros(Mask
) - 7; // -7 because 0x80 is the marker
1306 unsigned char Byte
= Word
;
1308 LineOffsets
.push_back(I
);
1309 } else if (Byte
== '\r') {
1310 // If this is \r\n, skip both characters.
1313 LineOffsets
.push_back(I
);
1315 } while (I
< BufLen
- sizeof(Word
) - 1);
1318 // Handle tail using a regular check.
1319 while (I
< BufLen
) {
1320 if (Buf
[I
] == '\n') {
1321 LineOffsets
.push_back(I
+ 1);
1322 } else if (Buf
[I
] == '\r') {
1323 // If this is \r\n, skip both characters.
1324 if (I
+ 1 < BufLen
&& Buf
[I
+ 1] == '\n')
1326 LineOffsets
.push_back(I
+ 1);
1331 return LineOffsetMapping(LineOffsets
, Alloc
);
1334 LineOffsetMapping::LineOffsetMapping(ArrayRef
<unsigned> LineOffsets
,
1335 llvm::BumpPtrAllocator
&Alloc
)
1336 : Storage(Alloc
.Allocate
<unsigned>(LineOffsets
.size() + 1)) {
1337 Storage
[0] = LineOffsets
.size();
1338 std::copy(LineOffsets
.begin(), LineOffsets
.end(), Storage
+ 1);
1341 /// getLineNumber - Given a SourceLocation, return the spelling line number
1342 /// for the position indicated. This requires building and caching a table of
1343 /// line offsets for the MemoryBuffer, so this is not cheap: use only when
1344 /// about to emit a diagnostic.
1345 unsigned SourceManager::getLineNumber(FileID FID
, unsigned FilePos
,
1346 bool *Invalid
) const {
1347 if (FID
.isInvalid()) {
1353 const ContentCache
*Content
;
1354 if (LastLineNoFileIDQuery
== FID
)
1355 Content
= LastLineNoContentCache
;
1357 bool MyInvalid
= false;
1358 const SLocEntry
&Entry
= getSLocEntry(FID
, &MyInvalid
);
1359 if (MyInvalid
|| !Entry
.isFile()) {
1365 Content
= &Entry
.getFile().getContentCache();
1368 // If this is the first use of line information for this buffer, compute the
1369 /// SourceLineCache for it on demand.
1370 if (!Content
->SourceLineCache
) {
1371 llvm::Optional
<llvm::MemoryBufferRef
> Buffer
=
1372 Content
->getBufferOrNone(Diag
, getFileManager(), SourceLocation());
1378 Content
->SourceLineCache
=
1379 LineOffsetMapping::get(*Buffer
, ContentCacheAlloc
);
1383 // Okay, we know we have a line number table. Do a binary search to find the
1384 // line number that this character position lands on.
1385 const unsigned *SourceLineCache
= Content
->SourceLineCache
.begin();
1386 const unsigned *SourceLineCacheStart
= SourceLineCache
;
1387 const unsigned *SourceLineCacheEnd
= Content
->SourceLineCache
.end();
1389 unsigned QueriedFilePos
= FilePos
+1;
1391 // FIXME: I would like to be convinced that this code is worth being as
1392 // complicated as it is, binary search isn't that slow.
1394 // If it is worth being optimized, then in my opinion it could be more
1395 // performant, simpler, and more obviously correct by just "galloping" outward
1396 // from the queried file position. In fact, this could be incorporated into a
1397 // generic algorithm such as lower_bound_with_hint.
1399 // If someone gives me a test case where this matters, and I will do it! - DWD
1401 // If the previous query was to the same file, we know both the file pos from
1402 // that query and the line number returned. This allows us to narrow the
1403 // search space from the entire file to something near the match.
1404 if (LastLineNoFileIDQuery
== FID
) {
1405 if (QueriedFilePos
>= LastLineNoFilePos
) {
1406 // FIXME: Potential overflow?
1407 SourceLineCache
= SourceLineCache
+LastLineNoResult
-1;
1409 // The query is likely to be nearby the previous one. Here we check to
1410 // see if it is within 5, 10 or 20 lines. It can be far away in cases
1411 // where big comment blocks and vertical whitespace eat up lines but
1412 // contribute no tokens.
1413 if (SourceLineCache
+5 < SourceLineCacheEnd
) {
1414 if (SourceLineCache
[5] > QueriedFilePos
)
1415 SourceLineCacheEnd
= SourceLineCache
+5;
1416 else if (SourceLineCache
+10 < SourceLineCacheEnd
) {
1417 if (SourceLineCache
[10] > QueriedFilePos
)
1418 SourceLineCacheEnd
= SourceLineCache
+10;
1419 else if (SourceLineCache
+20 < SourceLineCacheEnd
) {
1420 if (SourceLineCache
[20] > QueriedFilePos
)
1421 SourceLineCacheEnd
= SourceLineCache
+20;
1426 if (LastLineNoResult
< Content
->SourceLineCache
.size())
1427 SourceLineCacheEnd
= SourceLineCache
+LastLineNoResult
+1;
1431 const unsigned *Pos
=
1432 std::lower_bound(SourceLineCache
, SourceLineCacheEnd
, QueriedFilePos
);
1433 unsigned LineNo
= Pos
-SourceLineCacheStart
;
1435 LastLineNoFileIDQuery
= FID
;
1436 LastLineNoContentCache
= Content
;
1437 LastLineNoFilePos
= QueriedFilePos
;
1438 LastLineNoResult
= LineNo
;
1442 unsigned SourceManager::getSpellingLineNumber(SourceLocation Loc
,
1443 bool *Invalid
) const {
1444 if (isInvalid(Loc
, Invalid
)) return 0;
1445 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedSpellingLoc(Loc
);
1446 return getLineNumber(LocInfo
.first
, LocInfo
.second
);
1448 unsigned SourceManager::getExpansionLineNumber(SourceLocation Loc
,
1449 bool *Invalid
) const {
1450 if (isInvalid(Loc
, Invalid
)) return 0;
1451 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
1452 return getLineNumber(LocInfo
.first
, LocInfo
.second
);
1454 unsigned SourceManager::getPresumedLineNumber(SourceLocation Loc
,
1455 bool *Invalid
) const {
1456 PresumedLoc PLoc
= getPresumedLoc(Loc
);
1457 if (isInvalid(PLoc
, Invalid
)) return 0;
1458 return PLoc
.getLine();
1461 /// getFileCharacteristic - return the file characteristic of the specified
1462 /// source location, indicating whether this is a normal file, a system
1463 /// header, or an "implicit extern C" system header.
1465 /// This state can be modified with flags on GNU linemarker directives like:
1467 /// which changes all source locations in the current file after that to be
1468 /// considered to be from a system header.
1469 SrcMgr::CharacteristicKind
1470 SourceManager::getFileCharacteristic(SourceLocation Loc
) const {
1471 assert(Loc
.isValid() && "Can't get file characteristic of invalid loc!");
1472 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
1473 const SLocEntry
*SEntry
= getSLocEntryForFile(LocInfo
.first
);
1477 const SrcMgr::FileInfo
&FI
= SEntry
->getFile();
1479 // If there are no #line directives in this file, just return the whole-file
1481 if (!FI
.hasLineDirectives())
1482 return FI
.getFileCharacteristic();
1484 assert(LineTable
&& "Can't have linetable entries without a LineTable!");
1485 // See if there is a #line directive before the location.
1486 const LineEntry
*Entry
=
1487 LineTable
->FindNearestLineEntry(LocInfo
.first
, LocInfo
.second
);
1489 // If this is before the first line marker, use the file characteristic.
1491 return FI
.getFileCharacteristic();
1493 return Entry
->FileKind
;
1496 /// Return the filename or buffer identifier of the buffer the location is in.
1497 /// Note that this name does not respect \#line directives. Use getPresumedLoc
1498 /// for normal clients.
1499 StringRef
SourceManager::getBufferName(SourceLocation Loc
,
1500 bool *Invalid
) const {
1501 if (isInvalid(Loc
, Invalid
)) return "<invalid loc>";
1503 auto B
= getBufferOrNone(getFileID(Loc
));
1506 return B
? B
->getBufferIdentifier() : "<invalid buffer>";
1509 /// getPresumedLoc - This method returns the "presumed" location of a
1510 /// SourceLocation specifies. A "presumed location" can be modified by \#line
1511 /// or GNU line marker directives. This provides a view on the data that a
1512 /// user should see in diagnostics, for example.
1514 /// Note that a presumed location is always given as the expansion point of an
1515 /// expansion location, not at the spelling location.
1516 PresumedLoc
SourceManager::getPresumedLoc(SourceLocation Loc
,
1517 bool UseLineDirectives
) const {
1518 if (Loc
.isInvalid()) return PresumedLoc();
1520 // Presumed locations are always for expansion points.
1521 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
1523 bool Invalid
= false;
1524 const SLocEntry
&Entry
= getSLocEntry(LocInfo
.first
, &Invalid
);
1525 if (Invalid
|| !Entry
.isFile())
1526 return PresumedLoc();
1528 const SrcMgr::FileInfo
&FI
= Entry
.getFile();
1529 const SrcMgr::ContentCache
*C
= &FI
.getContentCache();
1531 // To get the source name, first consult the FileEntry (if one exists)
1532 // before the MemBuffer as this will avoid unnecessarily paging in the
1534 FileID FID
= LocInfo
.first
;
1537 Filename
= C
->OrigEntry
->getName();
1538 else if (auto Buffer
= C
->getBufferOrNone(Diag
, getFileManager()))
1539 Filename
= Buffer
->getBufferIdentifier();
1541 unsigned LineNo
= getLineNumber(LocInfo
.first
, LocInfo
.second
, &Invalid
);
1543 return PresumedLoc();
1544 unsigned ColNo
= getColumnNumber(LocInfo
.first
, LocInfo
.second
, &Invalid
);
1546 return PresumedLoc();
1548 SourceLocation IncludeLoc
= FI
.getIncludeLoc();
1550 // If we have #line directives in this file, update and overwrite the physical
1551 // location info if appropriate.
1552 if (UseLineDirectives
&& FI
.hasLineDirectives()) {
1553 assert(LineTable
&& "Can't have linetable entries without a LineTable!");
1554 // See if there is a #line directive before this. If so, get it.
1555 if (const LineEntry
*Entry
=
1556 LineTable
->FindNearestLineEntry(LocInfo
.first
, LocInfo
.second
)) {
1557 // If the LineEntry indicates a filename, use it.
1558 if (Entry
->FilenameID
!= -1) {
1559 Filename
= LineTable
->getFilename(Entry
->FilenameID
);
1560 // The contents of files referenced by #line are not in the
1562 FID
= FileID::get(0);
1565 // Use the line number specified by the LineEntry. This line number may
1566 // be multiple lines down from the line entry. Add the difference in
1567 // physical line numbers from the query point and the line marker to the
1569 unsigned MarkerLineNo
= getLineNumber(LocInfo
.first
, Entry
->FileOffset
);
1570 LineNo
= Entry
->LineNo
+ (LineNo
-MarkerLineNo
-1);
1572 // Note that column numbers are not molested by line markers.
1574 // Handle virtual #include manipulation.
1575 if (Entry
->IncludeOffset
) {
1576 IncludeLoc
= getLocForStartOfFile(LocInfo
.first
);
1577 IncludeLoc
= IncludeLoc
.getLocWithOffset(Entry
->IncludeOffset
);
1582 return PresumedLoc(Filename
.data(), FID
, LineNo
, ColNo
, IncludeLoc
);
1585 /// Returns whether the PresumedLoc for a given SourceLocation is
1586 /// in the main file.
1588 /// This computes the "presumed" location for a SourceLocation, then checks
1589 /// whether it came from a file other than the main file. This is different
1590 /// from isWrittenInMainFile() because it takes line marker directives into
1592 bool SourceManager::isInMainFile(SourceLocation Loc
) const {
1593 if (Loc
.isInvalid()) return false;
1595 // Presumed locations are always for expansion points.
1596 std::pair
<FileID
, unsigned> LocInfo
= getDecomposedExpansionLoc(Loc
);
1598 const SLocEntry
*Entry
= getSLocEntryForFile(LocInfo
.first
);
1602 const SrcMgr::FileInfo
&FI
= Entry
->getFile();
1604 // Check if there is a line directive for this location.
1605 if (FI
.hasLineDirectives())
1606 if (const LineEntry
*Entry
=
1607 LineTable
->FindNearestLineEntry(LocInfo
.first
, LocInfo
.second
))
1608 if (Entry
->IncludeOffset
)
1611 return FI
.getIncludeLoc().isInvalid();
1614 /// The size of the SLocEntry that \p FID represents.
1615 unsigned SourceManager::getFileIDSize(FileID FID
) const {
1616 bool Invalid
= false;
1617 const SrcMgr::SLocEntry
&Entry
= getSLocEntry(FID
, &Invalid
);
1622 SourceLocation::UIntTy NextOffset
;
1623 if ((ID
> 0 && unsigned(ID
+1) == local_sloc_entry_size()))
1624 NextOffset
= getNextLocalOffset();
1625 else if (ID
+1 == -1)
1626 NextOffset
= MaxLoadedOffset
;
1628 NextOffset
= getSLocEntry(FileID::get(ID
+1)).getOffset();
1630 return NextOffset
- Entry
.getOffset() - 1;
1633 //===----------------------------------------------------------------------===//
1634 // Other miscellaneous methods.
1635 //===----------------------------------------------------------------------===//
1637 /// Get the source location for the given file:line:col triplet.
1639 /// If the source file is included multiple times, the source location will
1640 /// be based upon an arbitrary inclusion.
1641 SourceLocation
SourceManager::translateFileLineCol(const FileEntry
*SourceFile
,
1643 unsigned Col
) const {
1644 assert(SourceFile
&& "Null source file!");
1645 assert(Line
&& Col
&& "Line and column should start from 1!");
1647 FileID FirstFID
= translateFile(SourceFile
);
1648 return translateLineCol(FirstFID
, Line
, Col
);
1651 /// Get the FileID for the given file.
1653 /// If the source file is included multiple times, the FileID will be the
1654 /// first inclusion.
1655 FileID
SourceManager::translateFile(const FileEntry
*SourceFile
) const {
1656 assert(SourceFile
&& "Null source file!");
1658 // First, check the main file ID, since it is common to look for a
1659 // location in the main file.
1660 if (MainFileID
.isValid()) {
1661 bool Invalid
= false;
1662 const SLocEntry
&MainSLoc
= getSLocEntry(MainFileID
, &Invalid
);
1666 if (MainSLoc
.isFile()) {
1667 if (MainSLoc
.getFile().getContentCache().OrigEntry
== SourceFile
)
1672 // The location we're looking for isn't in the main file; look
1673 // through all of the local source locations.
1674 for (unsigned I
= 0, N
= local_sloc_entry_size(); I
!= N
; ++I
) {
1675 const SLocEntry
&SLoc
= getLocalSLocEntry(I
);
1676 if (SLoc
.isFile() &&
1677 SLoc
.getFile().getContentCache().OrigEntry
== SourceFile
)
1678 return FileID::get(I
);
1681 // If that still didn't help, try the modules.
1682 for (unsigned I
= 0, N
= loaded_sloc_entry_size(); I
!= N
; ++I
) {
1683 const SLocEntry
&SLoc
= getLoadedSLocEntry(I
);
1684 if (SLoc
.isFile() &&
1685 SLoc
.getFile().getContentCache().OrigEntry
== SourceFile
)
1686 return FileID::get(-int(I
) - 2);
1692 /// Get the source location in \arg FID for the given line:col.
1693 /// Returns null location if \arg FID is not a file SLocEntry.
1694 SourceLocation
SourceManager::translateLineCol(FileID FID
,
1696 unsigned Col
) const {
1697 // Lines are used as a one-based index into a zero-based array. This assert
1698 // checks for possible buffer underruns.
1699 assert(Line
&& Col
&& "Line and column should start from 1!");
1701 if (FID
.isInvalid())
1702 return SourceLocation();
1704 bool Invalid
= false;
1705 const SLocEntry
&Entry
= getSLocEntry(FID
, &Invalid
);
1707 return SourceLocation();
1709 if (!Entry
.isFile())
1710 return SourceLocation();
1712 SourceLocation FileLoc
= SourceLocation::getFileLoc(Entry
.getOffset());
1714 if (Line
== 1 && Col
== 1)
1717 const ContentCache
*Content
= &Entry
.getFile().getContentCache();
1719 // If this is the first use of line information for this buffer, compute the
1720 // SourceLineCache for it on demand.
1721 llvm::Optional
<llvm::MemoryBufferRef
> Buffer
=
1722 Content
->getBufferOrNone(Diag
, getFileManager());
1724 return SourceLocation();
1725 if (!Content
->SourceLineCache
)
1726 Content
->SourceLineCache
=
1727 LineOffsetMapping::get(*Buffer
, ContentCacheAlloc
);
1729 if (Line
> Content
->SourceLineCache
.size()) {
1730 unsigned Size
= Buffer
->getBufferSize();
1733 return FileLoc
.getLocWithOffset(Size
);
1736 unsigned FilePos
= Content
->SourceLineCache
[Line
- 1];
1737 const char *Buf
= Buffer
->getBufferStart() + FilePos
;
1738 unsigned BufLength
= Buffer
->getBufferSize() - FilePos
;
1740 return FileLoc
.getLocWithOffset(FilePos
);
1744 // Check that the given column is valid.
1745 while (i
< BufLength
-1 && i
< Col
-1 && Buf
[i
] != '\n' && Buf
[i
] != '\r')
1747 return FileLoc
.getLocWithOffset(FilePos
+ i
);
1750 /// Compute a map of macro argument chunks to their expanded source
1751 /// location. Chunks that are not part of a macro argument will map to an
1752 /// invalid source location. e.g. if a file contains one macro argument at
1753 /// offset 100 with length 10, this is how the map will be formed:
1754 /// 0 -> SourceLocation()
1755 /// 100 -> Expanded macro arg location
1756 /// 110 -> SourceLocation()
1757 void SourceManager::computeMacroArgsCache(MacroArgsMap
&MacroArgsCache
,
1759 assert(FID
.isValid());
1761 // Initially no macro argument chunk is present.
1762 MacroArgsCache
.insert(std::make_pair(0, SourceLocation()));
1767 // Stop if there are no more FileIDs to check.
1769 if (unsigned(ID
) >= local_sloc_entry_size())
1771 } else if (ID
== -1) {
1775 bool Invalid
= false;
1776 const SrcMgr::SLocEntry
&Entry
= getSLocEntryByID(ID
, &Invalid
);
1779 if (Entry
.isFile()) {
1780 auto& File
= Entry
.getFile();
1781 if (File
.getFileCharacteristic() == C_User_ModuleMap
||
1782 File
.getFileCharacteristic() == C_System_ModuleMap
)
1785 SourceLocation IncludeLoc
= File
.getIncludeLoc();
1786 bool IncludedInFID
=
1787 (IncludeLoc
.isValid() && isInFileID(IncludeLoc
, FID
)) ||
1788 // Predefined header doesn't have a valid include location in main
1789 // file, but any files created by it should still be skipped when
1790 // computing macro args expanded in the main file.
1791 (FID
== MainFileID
&& Entry
.getFile().getName() == "<built-in>");
1792 if (IncludedInFID
) {
1793 // Skip the files/macros of the #include'd file, we only care about
1794 // macros that lexed macro arguments from our file.
1795 if (Entry
.getFile().NumCreatedFIDs
)
1796 ID
+= Entry
.getFile().NumCreatedFIDs
- 1 /*because of next ++ID*/;
1799 // If file was included but not from FID, there is no more files/macros
1800 // that may be "contained" in this file.
1801 if (IncludeLoc
.isValid())
1806 const ExpansionInfo
&ExpInfo
= Entry
.getExpansion();
1808 if (ExpInfo
.getExpansionLocStart().isFileID()) {
1809 if (!isInFileID(ExpInfo
.getExpansionLocStart(), FID
))
1810 return; // No more files/macros that may be "contained" in this file.
1813 if (!ExpInfo
.isMacroArgExpansion())
1816 associateFileChunkWithMacroArgExp(MacroArgsCache
, FID
,
1817 ExpInfo
.getSpellingLoc(),
1818 SourceLocation::getMacroLoc(Entry
.getOffset()),
1819 getFileIDSize(FileID::get(ID
)));
1823 void SourceManager::associateFileChunkWithMacroArgExp(
1824 MacroArgsMap
&MacroArgsCache
,
1826 SourceLocation SpellLoc
,
1827 SourceLocation ExpansionLoc
,
1828 unsigned ExpansionLength
) const {
1829 if (!SpellLoc
.isFileID()) {
1830 SourceLocation::UIntTy SpellBeginOffs
= SpellLoc
.getOffset();
1831 SourceLocation::UIntTy SpellEndOffs
= SpellBeginOffs
+ ExpansionLength
;
1833 // The spelling range for this macro argument expansion can span multiple
1834 // consecutive FileID entries. Go through each entry contained in the
1835 // spelling range and if one is itself a macro argument expansion, recurse
1836 // and associate the file chunk that it represents.
1838 FileID SpellFID
; // Current FileID in the spelling range.
1839 unsigned SpellRelativeOffs
;
1840 std::tie(SpellFID
, SpellRelativeOffs
) = getDecomposedLoc(SpellLoc
);
1842 const SLocEntry
&Entry
= getSLocEntry(SpellFID
);
1843 SourceLocation::UIntTy SpellFIDBeginOffs
= Entry
.getOffset();
1844 unsigned SpellFIDSize
= getFileIDSize(SpellFID
);
1845 SourceLocation::UIntTy SpellFIDEndOffs
= SpellFIDBeginOffs
+ SpellFIDSize
;
1846 const ExpansionInfo
&Info
= Entry
.getExpansion();
1847 if (Info
.isMacroArgExpansion()) {
1848 unsigned CurrSpellLength
;
1849 if (SpellFIDEndOffs
< SpellEndOffs
)
1850 CurrSpellLength
= SpellFIDSize
- SpellRelativeOffs
;
1852 CurrSpellLength
= ExpansionLength
;
1853 associateFileChunkWithMacroArgExp(MacroArgsCache
, FID
,
1854 Info
.getSpellingLoc().getLocWithOffset(SpellRelativeOffs
),
1855 ExpansionLoc
, CurrSpellLength
);
1858 if (SpellFIDEndOffs
>= SpellEndOffs
)
1859 return; // we covered all FileID entries in the spelling range.
1861 // Move to the next FileID entry in the spelling range.
1862 unsigned advance
= SpellFIDSize
- SpellRelativeOffs
+ 1;
1863 ExpansionLoc
= ExpansionLoc
.getLocWithOffset(advance
);
1864 ExpansionLength
-= advance
;
1866 SpellRelativeOffs
= 0;
1870 assert(SpellLoc
.isFileID());
1873 if (!isInFileID(SpellLoc
, FID
, &BeginOffs
))
1876 unsigned EndOffs
= BeginOffs
+ ExpansionLength
;
1878 // Add a new chunk for this macro argument. A previous macro argument chunk
1879 // may have been lexed again, so e.g. if the map is
1880 // 0 -> SourceLocation()
1881 // 100 -> Expanded loc #1
1882 // 110 -> SourceLocation()
1883 // and we found a new macro FileID that lexed from offset 105 with length 3,
1884 // the new map will be:
1885 // 0 -> SourceLocation()
1886 // 100 -> Expanded loc #1
1887 // 105 -> Expanded loc #2
1888 // 108 -> Expanded loc #1
1889 // 110 -> SourceLocation()
1891 // Since re-lexed macro chunks will always be the same size or less of
1892 // previous chunks, we only need to find where the ending of the new macro
1893 // chunk is mapped to and update the map with new begin/end mappings.
1895 MacroArgsMap::iterator I
= MacroArgsCache
.upper_bound(EndOffs
);
1897 SourceLocation EndOffsMappedLoc
= I
->second
;
1898 MacroArgsCache
[BeginOffs
] = ExpansionLoc
;
1899 MacroArgsCache
[EndOffs
] = EndOffsMappedLoc
;
1902 /// If \arg Loc points inside a function macro argument, the returned
1903 /// location will be the macro location in which the argument was expanded.
1904 /// If a macro argument is used multiple times, the expanded location will
1905 /// be at the first expansion of the argument.
1909 /// Passing a file location pointing at 'foo', will yield a macro location
1910 /// where 'foo' was expanded into.
1912 SourceManager::getMacroArgExpandedLocation(SourceLocation Loc
) const {
1913 if (Loc
.isInvalid() || !Loc
.isFileID())
1918 std::tie(FID
, Offset
) = getDecomposedLoc(Loc
);
1919 if (FID
.isInvalid())
1922 std::unique_ptr
<MacroArgsMap
> &MacroArgsCache
= MacroArgsCacheMap
[FID
];
1923 if (!MacroArgsCache
) {
1924 MacroArgsCache
= std::make_unique
<MacroArgsMap
>();
1925 computeMacroArgsCache(*MacroArgsCache
, FID
);
1928 assert(!MacroArgsCache
->empty());
1929 MacroArgsMap::iterator I
= MacroArgsCache
->upper_bound(Offset
);
1930 // In case every element in MacroArgsCache is greater than Offset we can't
1931 // decrement the iterator.
1932 if (I
== MacroArgsCache
->begin())
1937 SourceLocation::UIntTy MacroArgBeginOffs
= I
->first
;
1938 SourceLocation MacroArgExpandedLoc
= I
->second
;
1939 if (MacroArgExpandedLoc
.isValid())
1940 return MacroArgExpandedLoc
.getLocWithOffset(Offset
- MacroArgBeginOffs
);
1945 std::pair
<FileID
, unsigned>
1946 SourceManager::getDecomposedIncludedLoc(FileID FID
) const {
1947 if (FID
.isInvalid())
1948 return std::make_pair(FileID(), 0);
1950 // Uses IncludedLocMap to retrieve/cache the decomposed loc.
1952 using DecompTy
= std::pair
<FileID
, unsigned>;
1953 auto InsertOp
= IncludedLocMap
.try_emplace(FID
);
1954 DecompTy
&DecompLoc
= InsertOp
.first
->second
;
1955 if (!InsertOp
.second
)
1956 return DecompLoc
; // already in map.
1958 SourceLocation UpperLoc
;
1959 bool Invalid
= false;
1960 const SrcMgr::SLocEntry
&Entry
= getSLocEntry(FID
, &Invalid
);
1962 if (Entry
.isExpansion())
1963 UpperLoc
= Entry
.getExpansion().getExpansionLocStart();
1965 UpperLoc
= Entry
.getFile().getIncludeLoc();
1968 if (UpperLoc
.isValid())
1969 DecompLoc
= getDecomposedLoc(UpperLoc
);
1974 /// Given a decomposed source location, move it up the include/expansion stack
1975 /// to the parent source location. If this is possible, return the decomposed
1976 /// version of the parent in Loc and return false. If Loc is the top-level
1977 /// entry, return true and don't modify it.
1978 static bool MoveUpIncludeHierarchy(std::pair
<FileID
, unsigned> &Loc
,
1979 const SourceManager
&SM
) {
1980 std::pair
<FileID
, unsigned> UpperLoc
= SM
.getDecomposedIncludedLoc(Loc
.first
);
1981 if (UpperLoc
.first
.isInvalid())
1982 return true; // We reached the top.
1988 /// Return the cache entry for comparing the given file IDs
1989 /// for isBeforeInTranslationUnit.
1990 InBeforeInTUCacheEntry
&SourceManager::getInBeforeInTUCache(FileID LFID
,
1991 FileID RFID
) const {
1992 // This is a magic number for limiting the cache size. It was experimentally
1993 // derived from a small Objective-C project (where the cache filled
1994 // out to ~250 items). We can make it larger if necessary.
1995 enum { MagicCacheSize
= 300 };
1996 IsBeforeInTUCacheKey
Key(LFID
, RFID
);
1998 // If the cache size isn't too large, do a lookup and if necessary default
1999 // construct an entry. We can then return it to the caller for direct
2000 // use. When they update the value, the cache will get automatically
2002 if (IBTUCache
.size() < MagicCacheSize
)
2003 return IBTUCache
[Key
];
2005 // Otherwise, do a lookup that will not construct a new value.
2006 InBeforeInTUCache::iterator I
= IBTUCache
.find(Key
);
2007 if (I
!= IBTUCache
.end())
2010 // Fall back to the overflow value.
2011 return IBTUCacheOverflow
;
2014 /// Determines the order of 2 source locations in the translation unit.
2016 /// \returns true if LHS source location comes before RHS, false otherwise.
2017 bool SourceManager::isBeforeInTranslationUnit(SourceLocation LHS
,
2018 SourceLocation RHS
) const {
2019 assert(LHS
.isValid() && RHS
.isValid() && "Passed invalid source location!");
2023 std::pair
<FileID
, unsigned> LOffs
= getDecomposedLoc(LHS
);
2024 std::pair
<FileID
, unsigned> ROffs
= getDecomposedLoc(RHS
);
2026 // getDecomposedLoc may have failed to return a valid FileID because, e.g. it
2027 // is a serialized one referring to a file that was removed after we loaded
2029 if (LOffs
.first
.isInvalid() || ROffs
.first
.isInvalid())
2030 return LOffs
.first
.isInvalid() && !ROffs
.first
.isInvalid();
2032 std::pair
<bool, bool> InSameTU
= isInTheSameTranslationUnit(LOffs
, ROffs
);
2034 return InSameTU
.second
;
2036 // If we arrived here, the location is either in a built-ins buffer or
2037 // associated with global inline asm. PR5662 and PR22576 are examples.
2039 StringRef LB
= getBufferOrFake(LOffs
.first
).getBufferIdentifier();
2040 StringRef RB
= getBufferOrFake(ROffs
.first
).getBufferIdentifier();
2041 bool LIsBuiltins
= LB
== "<built-in>";
2042 bool RIsBuiltins
= RB
== "<built-in>";
2043 // Sort built-in before non-built-in.
2044 if (LIsBuiltins
|| RIsBuiltins
) {
2045 if (LIsBuiltins
!= RIsBuiltins
)
2047 // Both are in built-in buffers, but from different files. We just claim that
2048 // lower IDs come first.
2049 return LOffs
.first
< ROffs
.first
;
2051 bool LIsAsm
= LB
== "<inline asm>";
2052 bool RIsAsm
= RB
== "<inline asm>";
2053 // Sort assembler after built-ins, but before the rest.
2054 if (LIsAsm
|| RIsAsm
) {
2055 if (LIsAsm
!= RIsAsm
)
2057 assert(LOffs
.first
== ROffs
.first
);
2060 bool LIsScratch
= LB
== "<scratch space>";
2061 bool RIsScratch
= RB
== "<scratch space>";
2062 // Sort scratch after inline asm, but before the rest.
2063 if (LIsScratch
|| RIsScratch
) {
2064 if (LIsScratch
!= RIsScratch
)
2066 return LOffs
.second
< ROffs
.second
;
2068 llvm_unreachable("Unsortable locations found");
2071 std::pair
<bool, bool> SourceManager::isInTheSameTranslationUnit(
2072 std::pair
<FileID
, unsigned> &LOffs
,
2073 std::pair
<FileID
, unsigned> &ROffs
) const {
2074 // If the source locations are in the same file, just compare offsets.
2075 if (LOffs
.first
== ROffs
.first
)
2076 return std::make_pair(true, LOffs
.second
< ROffs
.second
);
2078 // If we are comparing a source location with multiple locations in the same
2079 // file, we get a big win by caching the result.
2080 InBeforeInTUCacheEntry
&IsBeforeInTUCache
=
2081 getInBeforeInTUCache(LOffs
.first
, ROffs
.first
);
2083 // If we are comparing a source location with multiple locations in the same
2084 // file, we get a big win by caching the result.
2085 if (IsBeforeInTUCache
.isCacheValid(LOffs
.first
, ROffs
.first
))
2086 return std::make_pair(
2087 true, IsBeforeInTUCache
.getCachedResult(LOffs
.second
, ROffs
.second
));
2089 // Okay, we missed in the cache, start updating the cache for this query.
2090 IsBeforeInTUCache
.setQueryFIDs(LOffs
.first
, ROffs
.first
,
2091 /*isLFIDBeforeRFID=*/LOffs
.first
.ID
< ROffs
.first
.ID
);
2093 // We need to find the common ancestor. The only way of doing this is to
2094 // build the complete include chain for one and then walking up the chain
2095 // of the other looking for a match.
2096 // We use a map from FileID to Offset to store the chain. Easier than writing
2097 // a custom set hash info that only depends on the first part of a pair.
2098 using LocSet
= llvm::SmallDenseMap
<FileID
, unsigned, 16>;
2101 LChain
.insert(LOffs
);
2102 // We catch the case where LOffs is in a file included by ROffs and
2103 // quit early. The other way round unfortunately remains suboptimal.
2104 } while (LOffs
.first
!= ROffs
.first
&& !MoveUpIncludeHierarchy(LOffs
, *this));
2106 while((I
= LChain
.find(ROffs
.first
)) == LChain
.end()) {
2107 if (MoveUpIncludeHierarchy(ROffs
, *this))
2108 break; // Met at topmost file.
2110 if (I
!= LChain
.end())
2113 // If we exited because we found a nearest common ancestor, compare the
2114 // locations within the common file and cache them.
2115 if (LOffs
.first
== ROffs
.first
) {
2116 IsBeforeInTUCache
.setCommonLoc(LOffs
.first
, LOffs
.second
, ROffs
.second
);
2117 return std::make_pair(
2118 true, IsBeforeInTUCache
.getCachedResult(LOffs
.second
, ROffs
.second
));
2120 // Clear the lookup cache, it depends on a common location.
2121 IsBeforeInTUCache
.clear();
2122 return std::make_pair(false, false);
2125 void SourceManager::PrintStats() const {
2126 llvm::errs() << "\n*** Source Manager Stats:\n";
2127 llvm::errs() << FileInfos
.size() << " files mapped, " << MemBufferInfos
.size()
2128 << " mem buffers mapped.\n";
2129 llvm::errs() << LocalSLocEntryTable
.size() << " local SLocEntry's allocated ("
2130 << llvm::capacity_in_bytes(LocalSLocEntryTable
)
2131 << " bytes of capacity), "
2132 << NextLocalOffset
<< "B of Sloc address space used.\n";
2133 llvm::errs() << LoadedSLocEntryTable
.size()
2134 << " loaded SLocEntries allocated, "
2135 << MaxLoadedOffset
- CurrentLoadedOffset
2136 << "B of Sloc address space used.\n";
2138 unsigned NumLineNumsComputed
= 0;
2139 unsigned NumFileBytesMapped
= 0;
2140 for (fileinfo_iterator I
= fileinfo_begin(), E
= fileinfo_end(); I
!= E
; ++I
){
2141 NumLineNumsComputed
+= bool(I
->second
->SourceLineCache
);
2142 NumFileBytesMapped
+= I
->second
->getSizeBytesMapped();
2144 unsigned NumMacroArgsComputed
= MacroArgsCacheMap
.size();
2146 llvm::errs() << NumFileBytesMapped
<< " bytes of files mapped, "
2147 << NumLineNumsComputed
<< " files with line #'s computed, "
2148 << NumMacroArgsComputed
<< " files with macro args computed.\n";
2149 llvm::errs() << "FileID scans: " << NumLinearScans
<< " linear, "
2150 << NumBinaryProbes
<< " binary.\n";
2153 LLVM_DUMP_METHOD
void SourceManager::dump() const {
2154 llvm::raw_ostream
&out
= llvm::errs();
2156 auto DumpSLocEntry
= [&](int ID
, const SrcMgr::SLocEntry
&Entry
,
2157 llvm::Optional
<SourceLocation::UIntTy
> NextStart
) {
2158 out
<< "SLocEntry <FileID " << ID
<< "> " << (Entry
.isFile() ? "file" : "expansion")
2159 << " <SourceLocation " << Entry
.getOffset() << ":";
2161 out
<< *NextStart
<< ">\n";
2164 if (Entry
.isFile()) {
2165 auto &FI
= Entry
.getFile();
2166 if (FI
.NumCreatedFIDs
)
2167 out
<< " covers <FileID " << ID
<< ":" << int(ID
+ FI
.NumCreatedFIDs
)
2169 if (FI
.getIncludeLoc().isValid())
2170 out
<< " included from " << FI
.getIncludeLoc().getOffset() << "\n";
2171 auto &CC
= FI
.getContentCache();
2172 out
<< " for " << (CC
.OrigEntry
? CC
.OrigEntry
->getName() : "<none>")
2174 if (CC
.BufferOverridden
)
2175 out
<< " contents overridden\n";
2176 if (CC
.ContentsEntry
!= CC
.OrigEntry
) {
2177 out
<< " contents from "
2178 << (CC
.ContentsEntry
? CC
.ContentsEntry
->getName() : "<none>")
2182 auto &EI
= Entry
.getExpansion();
2183 out
<< " spelling from " << EI
.getSpellingLoc().getOffset() << "\n";
2184 out
<< " macro " << (EI
.isMacroArgExpansion() ? "arg" : "body")
2185 << " range <" << EI
.getExpansionLocStart().getOffset() << ":"
2186 << EI
.getExpansionLocEnd().getOffset() << ">\n";
2190 // Dump local SLocEntries.
2191 for (unsigned ID
= 0, NumIDs
= LocalSLocEntryTable
.size(); ID
!= NumIDs
; ++ID
) {
2192 DumpSLocEntry(ID
, LocalSLocEntryTable
[ID
],
2193 ID
== NumIDs
- 1 ? NextLocalOffset
2194 : LocalSLocEntryTable
[ID
+ 1].getOffset());
2196 // Dump loaded SLocEntries.
2197 llvm::Optional
<SourceLocation::UIntTy
> NextStart
;
2198 for (unsigned Index
= 0; Index
!= LoadedSLocEntryTable
.size(); ++Index
) {
2199 int ID
= -(int)Index
- 2;
2200 if (SLocEntryLoaded
[Index
]) {
2201 DumpSLocEntry(ID
, LoadedSLocEntryTable
[Index
], NextStart
);
2202 NextStart
= LoadedSLocEntryTable
[Index
].getOffset();
2209 ExternalSLocEntrySource::~ExternalSLocEntrySource() = default;
2211 /// Return the amount of memory used by memory buffers, breaking down
2212 /// by heap-backed versus mmap'ed memory.
2213 SourceManager::MemoryBufferSizes
SourceManager::getMemoryBufferSizes() const {
2214 size_t malloc_bytes
= 0;
2215 size_t mmap_bytes
= 0;
2217 for (unsigned i
= 0, e
= MemBufferInfos
.size(); i
!= e
; ++i
)
2218 if (size_t sized_mapped
= MemBufferInfos
[i
]->getSizeBytesMapped())
2219 switch (MemBufferInfos
[i
]->getMemoryBufferKind()) {
2220 case llvm::MemoryBuffer::MemoryBuffer_MMap
:
2221 mmap_bytes
+= sized_mapped
;
2223 case llvm::MemoryBuffer::MemoryBuffer_Malloc
:
2224 malloc_bytes
+= sized_mapped
;
2228 return MemoryBufferSizes(malloc_bytes
, mmap_bytes
);
2231 size_t SourceManager::getDataStructureSizes() const {
2232 size_t size
= llvm::capacity_in_bytes(MemBufferInfos
)
2233 + llvm::capacity_in_bytes(LocalSLocEntryTable
)
2234 + llvm::capacity_in_bytes(LoadedSLocEntryTable
)
2235 + llvm::capacity_in_bytes(SLocEntryLoaded
)
2236 + llvm::capacity_in_bytes(FileInfos
);
2238 if (OverriddenFilesInfo
)
2239 size
+= llvm::capacity_in_bytes(OverriddenFilesInfo
->OverriddenFiles
);
2244 SourceManagerForFile::SourceManagerForFile(StringRef FileName
,
2245 StringRef Content
) {
2246 // This is referenced by `FileMgr` and will be released by `FileMgr` when it
2248 IntrusiveRefCntPtr
<llvm::vfs::InMemoryFileSystem
> InMemoryFileSystem(
2249 new llvm::vfs::InMemoryFileSystem
);
2250 InMemoryFileSystem
->addFile(
2252 llvm::MemoryBuffer::getMemBuffer(Content
, FileName
,
2253 /*RequiresNullTerminator=*/false));
2254 // This is passed to `SM` as reference, so the pointer has to be referenced
2255 // in `Environment` so that `FileMgr` can out-live this function scope.
2257 std::make_unique
<FileManager
>(FileSystemOptions(), InMemoryFileSystem
);
2258 // This is passed to `SM` as reference, so the pointer has to be referenced
2259 // by `Environment` due to the same reason above.
2260 Diagnostics
= std::make_unique
<DiagnosticsEngine
>(
2261 IntrusiveRefCntPtr
<DiagnosticIDs
>(new DiagnosticIDs
),
2262 new DiagnosticOptions
);
2263 SourceMgr
= std::make_unique
<SourceManager
>(*Diagnostics
, *FileMgr
);
2264 FileID ID
= SourceMgr
->createFileID(*FileMgr
->getFile(FileName
),
2265 SourceLocation(), clang::SrcMgr::C_User
);
2266 assert(ID
.isValid());
2267 SourceMgr
->setMainFileID(ID
);