SourceManager.h revision 360784
1//===- SourceManager.h - Track and cache source files -----------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// Defines the SourceManager interface.
11///
12/// There are three different types of locations in a %file: a spelling
13/// location, an expansion location, and a presumed location.
14///
15/// Given an example of:
16/// \code
17/// #define min(x, y) x < y ? x : y
18/// \endcode
19///
20/// and then later on a use of min:
21/// \code
22/// #line 17
23/// return min(a, b);
24/// \endcode
25///
26/// The expansion location is the line in the source code where the macro
27/// was expanded (the return statement), the spelling location is the
28/// location in the source where the macro was originally defined,
29/// and the presumed location is where the line directive states that
30/// the line is 17, or any other line.
31//
32//===----------------------------------------------------------------------===//
33
34#ifndef LLVM_CLANG_BASIC_SOURCEMANAGER_H
35#define LLVM_CLANG_BASIC_SOURCEMANAGER_H
36
37#include "clang/Basic/Diagnostic.h"
38#include "clang/Basic/FileManager.h"
39#include "clang/Basic/SourceLocation.h"
40#include "llvm/ADT/ArrayRef.h"
41#include "llvm/ADT/BitVector.h"
42#include "llvm/ADT/DenseMap.h"
43#include "llvm/ADT/DenseSet.h"
44#include "llvm/ADT/IntrusiveRefCntPtr.h"
45#include "llvm/ADT/PointerIntPair.h"
46#include "llvm/ADT/SmallVector.h"
47#include "llvm/ADT/StringRef.h"
48#include "llvm/Support/Allocator.h"
49#include "llvm/Support/Compiler.h"
50#include "llvm/Support/MemoryBuffer.h"
51#include <cassert>
52#include <cstddef>
53#include <map>
54#include <memory>
55#include <string>
56#include <utility>
57#include <vector>
58
59namespace clang {
60
61class ASTReader;
62class ASTWriter;
63class LineTableInfo;
64class SourceManager;
65
66/// Public enums and private classes that are part of the
67/// SourceManager implementation.
68namespace SrcMgr {
69
70  /// Indicates whether a file or directory holds normal user code,
71  /// system code, or system code which is implicitly 'extern "C"' in C++ mode.
72  ///
73  /// Entire directories can be tagged with this (this is maintained by
74  /// DirectoryLookup and friends) as can specific FileInfos when a \#pragma
75  /// system_header is seen or in various other cases.
76  ///
77  enum CharacteristicKind {
78    C_User, C_System, C_ExternCSystem, C_User_ModuleMap, C_System_ModuleMap
79  };
80
81  /// Determine whether a file / directory characteristic is for system code.
82  inline bool isSystem(CharacteristicKind CK) {
83    return CK != C_User && CK != C_User_ModuleMap;
84  }
85
86  /// Determine whether a file characteristic is for a module map.
87  inline bool isModuleMap(CharacteristicKind CK) {
88    return CK == C_User_ModuleMap || CK == C_System_ModuleMap;
89  }
90
91  /// One instance of this struct is kept for every file loaded or used.
92  ///
93  /// This object owns the MemoryBuffer object.
94  class alignas(8) ContentCache {
95    enum CCFlags {
96      /// Whether the buffer is invalid.
97      InvalidFlag = 0x01,
98
99      /// Whether the buffer should not be freed on destruction.
100      DoNotFreeFlag = 0x02
101    };
102
103    /// The actual buffer containing the characters from the input
104    /// file.
105    ///
106    /// This is owned by the ContentCache object.  The bits indicate
107    /// whether the buffer is invalid.
108    mutable llvm::PointerIntPair<const llvm::MemoryBuffer *, 2> Buffer;
109
110  public:
111    /// Reference to the file entry representing this ContentCache.
112    ///
113    /// This reference does not own the FileEntry object.
114    ///
115    /// It is possible for this to be NULL if the ContentCache encapsulates
116    /// an imaginary text buffer.
117    const FileEntry *OrigEntry;
118
119    /// References the file which the contents were actually loaded from.
120    ///
121    /// Can be different from 'Entry' if we overridden the contents of one file
122    /// with the contents of another file.
123    const FileEntry *ContentsEntry;
124
125    /// A bump pointer allocated array of offsets for each source line.
126    ///
127    /// This is lazily computed.  This is owned by the SourceManager
128    /// BumpPointerAllocator object.
129    unsigned *SourceLineCache = nullptr;
130
131    /// The number of lines in this ContentCache.
132    ///
133    /// This is only valid if SourceLineCache is non-null.
134    unsigned NumLines = 0;
135
136    /// Indicates whether the buffer itself was provided to override
137    /// the actual file contents.
138    ///
139    /// When true, the original entry may be a virtual file that does not
140    /// exist.
141    unsigned BufferOverridden : 1;
142
143    /// True if this content cache was initially created for a source file
144    /// considered to be volatile (likely to change between stat and open).
145    unsigned IsFileVolatile : 1;
146
147    /// True if this file may be transient, that is, if it might not
148    /// exist at some later point in time when this content entry is used,
149    /// after serialization and deserialization.
150    unsigned IsTransient : 1;
151
152    ContentCache(const FileEntry *Ent = nullptr) : ContentCache(Ent, Ent) {}
153
154    ContentCache(const FileEntry *Ent, const FileEntry *contentEnt)
155        : Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(contentEnt),
156          BufferOverridden(false), IsFileVolatile(false), IsTransient(false) {}
157
158    /// The copy ctor does not allow copies where source object has either
159    /// a non-NULL Buffer or SourceLineCache.  Ownership of allocated memory
160    /// is not transferred, so this is a logical error.
161    ContentCache(const ContentCache &RHS)
162        : Buffer(nullptr, false), BufferOverridden(false),
163          IsFileVolatile(false), IsTransient(false) {
164      OrigEntry = RHS.OrigEntry;
165      ContentsEntry = RHS.ContentsEntry;
166
167      assert(RHS.Buffer.getPointer() == nullptr &&
168             RHS.SourceLineCache == nullptr &&
169             "Passed ContentCache object cannot own a buffer.");
170
171      NumLines = RHS.NumLines;
172    }
173
174    ContentCache &operator=(const ContentCache& RHS) = delete;
175
176    ~ContentCache();
177
178    /// Returns the memory buffer for the associated content.
179    ///
180    /// \param Diag Object through which diagnostics will be emitted if the
181    ///   buffer cannot be retrieved.
182    ///
183    /// \param Loc If specified, is the location that invalid file diagnostics
184    ///   will be emitted at.
185    ///
186    /// \param Invalid If non-NULL, will be set \c true if an error occurred.
187    const llvm::MemoryBuffer *getBuffer(DiagnosticsEngine &Diag,
188                                        FileManager &FM,
189                                        SourceLocation Loc = SourceLocation(),
190                                        bool *Invalid = nullptr) const;
191
192    /// Returns the size of the content encapsulated by this
193    /// ContentCache.
194    ///
195    /// This can be the size of the source file or the size of an
196    /// arbitrary scratch buffer.  If the ContentCache encapsulates a source
197    /// file this size is retrieved from the file's FileEntry.
198    unsigned getSize() const;
199
200    /// Returns the number of bytes actually mapped for this
201    /// ContentCache.
202    ///
203    /// This can be 0 if the MemBuffer was not actually expanded.
204    unsigned getSizeBytesMapped() const;
205
206    /// Returns the kind of memory used to back the memory buffer for
207    /// this content cache.  This is used for performance analysis.
208    llvm::MemoryBuffer::BufferKind getMemoryBufferKind() const;
209
210    /// Get the underlying buffer, returning NULL if the buffer is not
211    /// yet available.
212    const llvm::MemoryBuffer *getRawBuffer() const {
213      return Buffer.getPointer();
214    }
215
216    /// Replace the existing buffer (which will be deleted)
217    /// with the given buffer.
218    void replaceBuffer(const llvm::MemoryBuffer *B, bool DoNotFree = false);
219
220    /// Determine whether the buffer itself is invalid.
221    bool isBufferInvalid() const {
222      return Buffer.getInt() & InvalidFlag;
223    }
224
225    /// Determine whether the buffer should be freed.
226    bool shouldFreeBuffer() const {
227      return (Buffer.getInt() & DoNotFreeFlag) == 0;
228    }
229
230    // If BufStr has an invalid BOM, returns the BOM name; otherwise, returns
231    // nullptr
232    static const char *getInvalidBOM(StringRef BufStr);
233  };
234
235  // Assert that the \c ContentCache objects will always be 8-byte aligned so
236  // that we can pack 3 bits of integer into pointers to such objects.
237  static_assert(alignof(ContentCache) >= 8,
238                "ContentCache must be 8-byte aligned.");
239
240  /// Information about a FileID, basically just the logical file
241  /// that it represents and include stack information.
242  ///
243  /// Each FileInfo has include stack information, indicating where it came
244  /// from. This information encodes the \#include chain that a token was
245  /// expanded from. The main include file has an invalid IncludeLoc.
246  ///
247  /// FileInfos contain a "ContentCache *", with the contents of the file.
248  ///
249  class FileInfo {
250    friend class clang::SourceManager;
251    friend class clang::ASTWriter;
252    friend class clang::ASTReader;
253
254    /// The location of the \#include that brought in this file.
255    ///
256    /// This is an invalid SLOC for the main file (top of the \#include chain).
257    unsigned IncludeLoc;  // Really a SourceLocation
258
259    /// Number of FileIDs (files and macros) that were created during
260    /// preprocessing of this \#include, including this SLocEntry.
261    ///
262    /// Zero means the preprocessor didn't provide such info for this SLocEntry.
263    unsigned NumCreatedFIDs : 31;
264
265    /// Whether this FileInfo has any \#line directives.
266    unsigned HasLineDirectives : 1;
267
268    /// The content cache and the characteristic of the file.
269    llvm::PointerIntPair<const ContentCache*, 3, CharacteristicKind>
270        ContentAndKind;
271
272    /// The filename that is used to access the file entry represented by the
273    /// content cache.
274    StringRef Filename;
275
276  public:
277    /// Return a FileInfo object.
278    static FileInfo get(SourceLocation IL, const ContentCache *Con,
279                        CharacteristicKind FileCharacter, StringRef Filename) {
280      FileInfo X;
281      X.IncludeLoc = IL.getRawEncoding();
282      X.NumCreatedFIDs = 0;
283      X.HasLineDirectives = false;
284      X.ContentAndKind.setPointer(Con);
285      X.ContentAndKind.setInt(FileCharacter);
286      X.Filename = Filename;
287      return X;
288    }
289
290    SourceLocation getIncludeLoc() const {
291      return SourceLocation::getFromRawEncoding(IncludeLoc);
292    }
293
294    const ContentCache *getContentCache() const {
295      return ContentAndKind.getPointer();
296    }
297
298    /// Return whether this is a system header or not.
299    CharacteristicKind getFileCharacteristic() const {
300      return ContentAndKind.getInt();
301    }
302
303    /// Return true if this FileID has \#line directives in it.
304    bool hasLineDirectives() const { return HasLineDirectives; }
305
306    /// Set the flag that indicates that this FileID has
307    /// line table entries associated with it.
308    void setHasLineDirectives() {
309      HasLineDirectives = true;
310    }
311
312    /// Returns the name of the file that was used when the file was loaded from
313    /// the underlying file system.
314    StringRef getName() const { return Filename; }
315  };
316
317  /// Each ExpansionInfo encodes the expansion location - where
318  /// the token was ultimately expanded, and the SpellingLoc - where the actual
319  /// character data for the token came from.
320  class ExpansionInfo {
321    // Really these are all SourceLocations.
322
323    /// Where the spelling for the token can be found.
324    unsigned SpellingLoc;
325
326    /// In a macro expansion, ExpansionLocStart and ExpansionLocEnd
327    /// indicate the start and end of the expansion. In object-like macros,
328    /// they will be the same. In a function-like macro expansion, the start
329    /// will be the identifier and the end will be the ')'. Finally, in
330    /// macro-argument instantiations, the end will be 'SourceLocation()', an
331    /// invalid location.
332    unsigned ExpansionLocStart, ExpansionLocEnd;
333
334    /// Whether the expansion range is a token range.
335    bool ExpansionIsTokenRange;
336
337  public:
338    SourceLocation getSpellingLoc() const {
339      SourceLocation SpellLoc = SourceLocation::getFromRawEncoding(SpellingLoc);
340      return SpellLoc.isInvalid() ? getExpansionLocStart() : SpellLoc;
341    }
342
343    SourceLocation getExpansionLocStart() const {
344      return SourceLocation::getFromRawEncoding(ExpansionLocStart);
345    }
346
347    SourceLocation getExpansionLocEnd() const {
348      SourceLocation EndLoc =
349        SourceLocation::getFromRawEncoding(ExpansionLocEnd);
350      return EndLoc.isInvalid() ? getExpansionLocStart() : EndLoc;
351    }
352
353    bool isExpansionTokenRange() const {
354      return ExpansionIsTokenRange;
355    }
356
357    CharSourceRange getExpansionLocRange() const {
358      return CharSourceRange(
359          SourceRange(getExpansionLocStart(), getExpansionLocEnd()),
360          isExpansionTokenRange());
361    }
362
363    bool isMacroArgExpansion() const {
364      // Note that this needs to return false for default constructed objects.
365      return getExpansionLocStart().isValid() &&
366        SourceLocation::getFromRawEncoding(ExpansionLocEnd).isInvalid();
367    }
368
369    bool isMacroBodyExpansion() const {
370      return getExpansionLocStart().isValid() &&
371        SourceLocation::getFromRawEncoding(ExpansionLocEnd).isValid();
372    }
373
374    bool isFunctionMacroExpansion() const {
375      return getExpansionLocStart().isValid() &&
376          getExpansionLocStart() != getExpansionLocEnd();
377    }
378
379    /// Return a ExpansionInfo for an expansion.
380    ///
381    /// Start and End specify the expansion range (where the macro is
382    /// expanded), and SpellingLoc specifies the spelling location (where
383    /// the characters from the token come from). All three can refer to
384    /// normal File SLocs or expansion locations.
385    static ExpansionInfo create(SourceLocation SpellingLoc,
386                                SourceLocation Start, SourceLocation End,
387                                bool ExpansionIsTokenRange = true) {
388      ExpansionInfo X;
389      X.SpellingLoc = SpellingLoc.getRawEncoding();
390      X.ExpansionLocStart = Start.getRawEncoding();
391      X.ExpansionLocEnd = End.getRawEncoding();
392      X.ExpansionIsTokenRange = ExpansionIsTokenRange;
393      return X;
394    }
395
396    /// Return a special ExpansionInfo for the expansion of
397    /// a macro argument into a function-like macro's body.
398    ///
399    /// ExpansionLoc specifies the expansion location (where the macro is
400    /// expanded). This doesn't need to be a range because a macro is always
401    /// expanded at a macro parameter reference, and macro parameters are
402    /// always exactly one token. SpellingLoc specifies the spelling location
403    /// (where the characters from the token come from). ExpansionLoc and
404    /// SpellingLoc can both refer to normal File SLocs or expansion locations.
405    ///
406    /// Given the code:
407    /// \code
408    ///   #define F(x) f(x)
409    ///   F(42);
410    /// \endcode
411    ///
412    /// When expanding '\c F(42)', the '\c x' would call this with an
413    /// SpellingLoc pointing at '\c 42' and an ExpansionLoc pointing at its
414    /// location in the definition of '\c F'.
415    static ExpansionInfo createForMacroArg(SourceLocation SpellingLoc,
416                                           SourceLocation ExpansionLoc) {
417      // We store an intentionally invalid source location for the end of the
418      // expansion range to mark that this is a macro argument location rather
419      // than a normal one.
420      return create(SpellingLoc, ExpansionLoc, SourceLocation());
421    }
422
423    /// Return a special ExpansionInfo representing a token that ends
424    /// prematurely. This is used to model a '>>' token that has been split
425    /// into '>' tokens and similar cases. Unlike for the other forms of
426    /// expansion, the expansion range in this case is a character range, not
427    /// a token range.
428    static ExpansionInfo createForTokenSplit(SourceLocation SpellingLoc,
429                                             SourceLocation Start,
430                                             SourceLocation End) {
431      return create(SpellingLoc, Start, End, false);
432    }
433  };
434
435  /// This is a discriminated union of FileInfo and ExpansionInfo.
436  ///
437  /// SourceManager keeps an array of these objects, and they are uniquely
438  /// identified by the FileID datatype.
439  class SLocEntry {
440    unsigned Offset : 31;
441    unsigned IsExpansion : 1;
442    union {
443      FileInfo File;
444      ExpansionInfo Expansion;
445    };
446
447  public:
448    SLocEntry() : Offset(), IsExpansion(), File() {}
449
450    unsigned getOffset() const { return Offset; }
451
452    bool isExpansion() const { return IsExpansion; }
453    bool isFile() const { return !isExpansion(); }
454
455    const FileInfo &getFile() const {
456      assert(isFile() && "Not a file SLocEntry!");
457      return File;
458    }
459
460    const ExpansionInfo &getExpansion() const {
461      assert(isExpansion() && "Not a macro expansion SLocEntry!");
462      return Expansion;
463    }
464
465    static SLocEntry get(unsigned Offset, const FileInfo &FI) {
466      assert(!(Offset & (1u << 31)) && "Offset is too large");
467      SLocEntry E;
468      E.Offset = Offset;
469      E.IsExpansion = false;
470      E.File = FI;
471      return E;
472    }
473
474    static SLocEntry get(unsigned Offset, const ExpansionInfo &Expansion) {
475      assert(!(Offset & (1u << 31)) && "Offset is too large");
476      SLocEntry E;
477      E.Offset = Offset;
478      E.IsExpansion = true;
479      E.Expansion = Expansion;
480      return E;
481    }
482  };
483
484} // namespace SrcMgr
485
486/// External source of source location entries.
487class ExternalSLocEntrySource {
488public:
489  virtual ~ExternalSLocEntrySource();
490
491  /// Read the source location entry with index ID, which will always be
492  /// less than -1.
493  ///
494  /// \returns true if an error occurred that prevented the source-location
495  /// entry from being loaded.
496  virtual bool ReadSLocEntry(int ID) = 0;
497
498  /// Retrieve the module import location and name for the given ID, if
499  /// in fact it was loaded from a module (rather than, say, a precompiled
500  /// header).
501  virtual std::pair<SourceLocation, StringRef> getModuleImportLoc(int ID) = 0;
502};
503
504/// Holds the cache used by isBeforeInTranslationUnit.
505///
506/// The cache structure is complex enough to be worth breaking out of
507/// SourceManager.
508class InBeforeInTUCacheEntry {
509  /// The FileID's of the cached query.
510  ///
511  /// If these match up with a subsequent query, the result can be reused.
512  FileID LQueryFID, RQueryFID;
513
514  /// True if LQueryFID was created before RQueryFID.
515  ///
516  /// This is used to compare macro expansion locations.
517  bool IsLQFIDBeforeRQFID;
518
519  /// The file found in common between the two \#include traces, i.e.,
520  /// the nearest common ancestor of the \#include tree.
521  FileID CommonFID;
522
523  /// The offset of the previous query in CommonFID.
524  ///
525  /// Usually, this represents the location of the \#include for QueryFID, but
526  /// if LQueryFID is a parent of RQueryFID (or vice versa) then these can be a
527  /// random token in the parent.
528  unsigned LCommonOffset, RCommonOffset;
529
530public:
531  /// Return true if the currently cached values match up with
532  /// the specified LHS/RHS query.
533  ///
534  /// If not, we can't use the cache.
535  bool isCacheValid(FileID LHS, FileID RHS) const {
536    return LQueryFID == LHS && RQueryFID == RHS;
537  }
538
539  /// If the cache is valid, compute the result given the
540  /// specified offsets in the LHS/RHS FileID's.
541  bool getCachedResult(unsigned LOffset, unsigned ROffset) const {
542    // If one of the query files is the common file, use the offset.  Otherwise,
543    // use the #include loc in the common file.
544    if (LQueryFID != CommonFID) LOffset = LCommonOffset;
545    if (RQueryFID != CommonFID) ROffset = RCommonOffset;
546
547    // It is common for multiple macro expansions to be "included" from the same
548    // location (expansion location), in which case use the order of the FileIDs
549    // to determine which came first. This will also take care the case where
550    // one of the locations points at the inclusion/expansion point of the other
551    // in which case its FileID will come before the other.
552    if (LOffset == ROffset)
553      return IsLQFIDBeforeRQFID;
554
555    return LOffset < ROffset;
556  }
557
558  /// Set up a new query.
559  void setQueryFIDs(FileID LHS, FileID RHS, bool isLFIDBeforeRFID) {
560    assert(LHS != RHS);
561    LQueryFID = LHS;
562    RQueryFID = RHS;
563    IsLQFIDBeforeRQFID = isLFIDBeforeRFID;
564  }
565
566  void clear() {
567    LQueryFID = RQueryFID = FileID();
568    IsLQFIDBeforeRQFID = false;
569  }
570
571  void setCommonLoc(FileID commonFID, unsigned lCommonOffset,
572                    unsigned rCommonOffset) {
573    CommonFID = commonFID;
574    LCommonOffset = lCommonOffset;
575    RCommonOffset = rCommonOffset;
576  }
577};
578
579/// The stack used when building modules on demand, which is used
580/// to provide a link between the source managers of the different compiler
581/// instances.
582using ModuleBuildStack = ArrayRef<std::pair<std::string, FullSourceLoc>>;
583
584/// This class handles loading and caching of source files into memory.
585///
586/// This object owns the MemoryBuffer objects for all of the loaded
587/// files and assigns unique FileID's for each unique \#include chain.
588///
589/// The SourceManager can be queried for information about SourceLocation
590/// objects, turning them into either spelling or expansion locations. Spelling
591/// locations represent where the bytes corresponding to a token came from and
592/// expansion locations represent where the location is in the user's view. In
593/// the case of a macro expansion, for example, the spelling location indicates
594/// where the expanded token came from and the expansion location specifies
595/// where it was expanded.
596class SourceManager : public RefCountedBase<SourceManager> {
597  /// DiagnosticsEngine object.
598  DiagnosticsEngine &Diag;
599
600  FileManager &FileMgr;
601
602  mutable llvm::BumpPtrAllocator ContentCacheAlloc;
603
604  /// Memoized information about all of the files tracked by this
605  /// SourceManager.
606  ///
607  /// This map allows us to merge ContentCache entries based
608  /// on their FileEntry*.  All ContentCache objects will thus have unique,
609  /// non-null, FileEntry pointers.
610  llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> FileInfos;
611
612  /// True if the ContentCache for files that are overridden by other
613  /// files, should report the original file name. Defaults to true.
614  bool OverridenFilesKeepOriginalName = true;
615
616  /// True if non-system source files should be treated as volatile
617  /// (likely to change while trying to use them). Defaults to false.
618  bool UserFilesAreVolatile;
619
620  /// True if all files read during this compilation should be treated
621  /// as transient (may not be present in later compilations using a module
622  /// file created from this compilation). Defaults to false.
623  bool FilesAreTransient = false;
624
625  struct OverriddenFilesInfoTy {
626    /// Files that have been overridden with the contents from another
627    /// file.
628    llvm::DenseMap<const FileEntry *, const FileEntry *> OverriddenFiles;
629
630    /// Files that were overridden with a memory buffer.
631    llvm::DenseSet<const FileEntry *> OverriddenFilesWithBuffer;
632  };
633
634  /// Lazily create the object keeping overridden files info, since
635  /// it is uncommonly used.
636  std::unique_ptr<OverriddenFilesInfoTy> OverriddenFilesInfo;
637
638  OverriddenFilesInfoTy &getOverriddenFilesInfo() {
639    if (!OverriddenFilesInfo)
640      OverriddenFilesInfo.reset(new OverriddenFilesInfoTy);
641    return *OverriddenFilesInfo;
642  }
643
644  /// Information about various memory buffers that we have read in.
645  ///
646  /// All FileEntry* within the stored ContentCache objects are NULL,
647  /// as they do not refer to a file.
648  std::vector<SrcMgr::ContentCache*> MemBufferInfos;
649
650  /// The table of SLocEntries that are local to this module.
651  ///
652  /// Positive FileIDs are indexes into this table. Entry 0 indicates an invalid
653  /// expansion.
654  SmallVector<SrcMgr::SLocEntry, 0> LocalSLocEntryTable;
655
656  /// The table of SLocEntries that are loaded from other modules.
657  ///
658  /// Negative FileIDs are indexes into this table. To get from ID to an index,
659  /// use (-ID - 2).
660  mutable SmallVector<SrcMgr::SLocEntry, 0> LoadedSLocEntryTable;
661
662  /// The starting offset of the next local SLocEntry.
663  ///
664  /// This is LocalSLocEntryTable.back().Offset + the size of that entry.
665  unsigned NextLocalOffset;
666
667  /// The starting offset of the latest batch of loaded SLocEntries.
668  ///
669  /// This is LoadedSLocEntryTable.back().Offset, except that that entry might
670  /// not have been loaded, so that value would be unknown.
671  unsigned CurrentLoadedOffset;
672
673  /// The highest possible offset is 2^31-1, so CurrentLoadedOffset
674  /// starts at 2^31.
675  static const unsigned MaxLoadedOffset = 1U << 31U;
676
677  /// A bitmap that indicates whether the entries of LoadedSLocEntryTable
678  /// have already been loaded from the external source.
679  ///
680  /// Same indexing as LoadedSLocEntryTable.
681  llvm::BitVector SLocEntryLoaded;
682
683  /// An external source for source location entries.
684  ExternalSLocEntrySource *ExternalSLocEntries = nullptr;
685
686  /// A one-entry cache to speed up getFileID.
687  ///
688  /// LastFileIDLookup records the last FileID looked up or created, because it
689  /// is very common to look up many tokens from the same file.
690  mutable FileID LastFileIDLookup;
691
692  /// Holds information for \#line directives.
693  ///
694  /// This is referenced by indices from SLocEntryTable.
695  std::unique_ptr<LineTableInfo> LineTable;
696
697  /// These ivars serve as a cache used in the getLineNumber
698  /// method which is used to speedup getLineNumber calls to nearby locations.
699  mutable FileID LastLineNoFileIDQuery;
700  mutable SrcMgr::ContentCache *LastLineNoContentCache;
701  mutable unsigned LastLineNoFilePos;
702  mutable unsigned LastLineNoResult;
703
704  /// The file ID for the main source file of the translation unit.
705  FileID MainFileID;
706
707  /// The file ID for the precompiled preamble there is one.
708  FileID PreambleFileID;
709
710  // Statistics for -print-stats.
711  mutable unsigned NumLinearScans = 0;
712  mutable unsigned NumBinaryProbes = 0;
713
714  /// Associates a FileID with its "included/expanded in" decomposed
715  /// location.
716  ///
717  /// Used to cache results from and speed-up \c getDecomposedIncludedLoc
718  /// function.
719  mutable llvm::DenseMap<FileID, std::pair<FileID, unsigned>> IncludedLocMap;
720
721  /// The key value into the IsBeforeInTUCache table.
722  using IsBeforeInTUCacheKey = std::pair<FileID, FileID>;
723
724  /// The IsBeforeInTranslationUnitCache is a mapping from FileID pairs
725  /// to cache results.
726  using InBeforeInTUCache =
727      llvm::DenseMap<IsBeforeInTUCacheKey, InBeforeInTUCacheEntry>;
728
729  /// Cache results for the isBeforeInTranslationUnit method.
730  mutable InBeforeInTUCache IBTUCache;
731  mutable InBeforeInTUCacheEntry IBTUCacheOverflow;
732
733  /// Return the cache entry for comparing the given file IDs
734  /// for isBeforeInTranslationUnit.
735  InBeforeInTUCacheEntry &getInBeforeInTUCache(FileID LFID, FileID RFID) const;
736
737  // Cache for the "fake" buffer used for error-recovery purposes.
738  mutable std::unique_ptr<llvm::MemoryBuffer> FakeBufferForRecovery;
739
740  mutable std::unique_ptr<SrcMgr::ContentCache> FakeContentCacheForRecovery;
741
742  /// Lazily computed map of macro argument chunks to their expanded
743  /// source location.
744  using MacroArgsMap = std::map<unsigned, SourceLocation>;
745
746  mutable llvm::DenseMap<FileID, std::unique_ptr<MacroArgsMap>>
747      MacroArgsCacheMap;
748
749  /// The stack of modules being built, which is used to detect
750  /// cycles in the module dependency graph as modules are being built, as
751  /// well as to describe why we're rebuilding a particular module.
752  ///
753  /// There is no way to set this value from the command line. If we ever need
754  /// to do so (e.g., if on-demand module construction moves out-of-process),
755  /// we can add a cc1-level option to do so.
756  SmallVector<std::pair<std::string, FullSourceLoc>, 2> StoredModuleBuildStack;
757
758public:
759  SourceManager(DiagnosticsEngine &Diag, FileManager &FileMgr,
760                bool UserFilesAreVolatile = false);
761  explicit SourceManager(const SourceManager &) = delete;
762  SourceManager &operator=(const SourceManager &) = delete;
763  ~SourceManager();
764
765  void clearIDTables();
766
767  /// Initialize this source manager suitably to replay the compilation
768  /// described by \p Old. Requires that \p Old outlive \p *this.
769  void initializeForReplay(const SourceManager &Old);
770
771  DiagnosticsEngine &getDiagnostics() const { return Diag; }
772
773  FileManager &getFileManager() const { return FileMgr; }
774
775  /// Set true if the SourceManager should report the original file name
776  /// for contents of files that were overridden by other files. Defaults to
777  /// true.
778  void setOverridenFilesKeepOriginalName(bool value) {
779    OverridenFilesKeepOriginalName = value;
780  }
781
782  /// True if non-system source files should be treated as volatile
783  /// (likely to change while trying to use them).
784  bool userFilesAreVolatile() const { return UserFilesAreVolatile; }
785
786  /// Retrieve the module build stack.
787  ModuleBuildStack getModuleBuildStack() const {
788    return StoredModuleBuildStack;
789  }
790
791  /// Set the module build stack.
792  void setModuleBuildStack(ModuleBuildStack stack) {
793    StoredModuleBuildStack.clear();
794    StoredModuleBuildStack.append(stack.begin(), stack.end());
795  }
796
797  /// Push an entry to the module build stack.
798  void pushModuleBuildStack(StringRef moduleName, FullSourceLoc importLoc) {
799    StoredModuleBuildStack.push_back(std::make_pair(moduleName.str(),importLoc));
800  }
801
802  //===--------------------------------------------------------------------===//
803  // MainFileID creation and querying methods.
804  //===--------------------------------------------------------------------===//
805
806  /// Returns the FileID of the main source file.
807  FileID getMainFileID() const { return MainFileID; }
808
809  /// Set the file ID for the main source file.
810  void setMainFileID(FileID FID) {
811    MainFileID = FID;
812  }
813
814  /// Set the file ID for the precompiled preamble.
815  void setPreambleFileID(FileID Preamble) {
816    assert(PreambleFileID.isInvalid() && "PreambleFileID already set!");
817    PreambleFileID = Preamble;
818  }
819
820  /// Get the file ID for the precompiled preamble if there is one.
821  FileID getPreambleFileID() const { return PreambleFileID; }
822
823  //===--------------------------------------------------------------------===//
824  // Methods to create new FileID's and macro expansions.
825  //===--------------------------------------------------------------------===//
826
827  /// Create a new FileID that represents the specified file
828  /// being \#included from the specified IncludePosition.
829  ///
830  /// This translates NULL into standard input.
831  FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos,
832                      SrcMgr::CharacteristicKind FileCharacter,
833                      int LoadedID = 0, unsigned LoadedOffset = 0) {
834    assert(SourceFile && "Null source file!");
835    const SrcMgr::ContentCache *IR =
836        getOrCreateContentCache(SourceFile, isSystem(FileCharacter));
837    assert(IR && "getOrCreateContentCache() cannot return NULL");
838    return createFileID(IR, SourceFile->getName(), IncludePos, FileCharacter,
839                        LoadedID, LoadedOffset);
840  }
841
842  FileID createFileID(FileEntryRef SourceFile, SourceLocation IncludePos,
843                      SrcMgr::CharacteristicKind FileCharacter,
844                      int LoadedID = 0, unsigned LoadedOffset = 0) {
845    const SrcMgr::ContentCache *IR = getOrCreateContentCache(
846        &SourceFile.getFileEntry(), isSystem(FileCharacter));
847    assert(IR && "getOrCreateContentCache() cannot return NULL");
848    return createFileID(IR, SourceFile.getName(), IncludePos, FileCharacter,
849                        LoadedID, LoadedOffset);
850  }
851
852  /// Create a new FileID that represents the specified memory buffer.
853  ///
854  /// This does no caching of the buffer and takes ownership of the
855  /// MemoryBuffer, so only pass a MemoryBuffer to this once.
856  FileID createFileID(std::unique_ptr<llvm::MemoryBuffer> Buffer,
857                      SrcMgr::CharacteristicKind FileCharacter = SrcMgr::C_User,
858                      int LoadedID = 0, unsigned LoadedOffset = 0,
859                      SourceLocation IncludeLoc = SourceLocation()) {
860    StringRef Name = Buffer->getBufferIdentifier();
861    return createFileID(
862        createMemBufferContentCache(Buffer.release(), /*DoNotFree*/ false),
863        Name, IncludeLoc, FileCharacter, LoadedID, LoadedOffset);
864  }
865
866  enum UnownedTag { Unowned };
867
868  /// Create a new FileID that represents the specified memory buffer.
869  ///
870  /// This does not take ownership of the MemoryBuffer. The memory buffer must
871  /// outlive the SourceManager.
872  FileID createFileID(UnownedTag, const llvm::MemoryBuffer *Buffer,
873                      SrcMgr::CharacteristicKind FileCharacter = SrcMgr::C_User,
874                      int LoadedID = 0, unsigned LoadedOffset = 0,
875                      SourceLocation IncludeLoc = SourceLocation()) {
876    return createFileID(createMemBufferContentCache(Buffer, /*DoNotFree*/ true),
877                        Buffer->getBufferIdentifier(), IncludeLoc,
878                        FileCharacter, LoadedID, LoadedOffset);
879  }
880
881  /// Get the FileID for \p SourceFile if it exists. Otherwise, create a
882  /// new FileID for the \p SourceFile.
883  FileID getOrCreateFileID(const FileEntry *SourceFile,
884                           SrcMgr::CharacteristicKind FileCharacter) {
885    FileID ID = translateFile(SourceFile);
886    return ID.isValid() ? ID : createFileID(SourceFile, SourceLocation(),
887                                            FileCharacter);
888  }
889
890  /// Return a new SourceLocation that encodes the
891  /// fact that a token from SpellingLoc should actually be referenced from
892  /// ExpansionLoc, and that it represents the expansion of a macro argument
893  /// into the function-like macro body.
894  SourceLocation createMacroArgExpansionLoc(SourceLocation Loc,
895                                            SourceLocation ExpansionLoc,
896                                            unsigned TokLength);
897
898  /// Return a new SourceLocation that encodes the fact
899  /// that a token from SpellingLoc should actually be referenced from
900  /// ExpansionLoc.
901  SourceLocation createExpansionLoc(SourceLocation Loc,
902                                    SourceLocation ExpansionLocStart,
903                                    SourceLocation ExpansionLocEnd,
904                                    unsigned TokLength,
905                                    bool ExpansionIsTokenRange = true,
906                                    int LoadedID = 0,
907                                    unsigned LoadedOffset = 0);
908
909  /// Return a new SourceLocation that encodes that the token starting
910  /// at \p TokenStart ends prematurely at \p TokenEnd.
911  SourceLocation createTokenSplitLoc(SourceLocation SpellingLoc,
912                                     SourceLocation TokenStart,
913                                     SourceLocation TokenEnd);
914
915  /// Retrieve the memory buffer associated with the given file.
916  ///
917  /// \param Invalid If non-NULL, will be set \c true if an error
918  /// occurs while retrieving the memory buffer.
919  const llvm::MemoryBuffer *getMemoryBufferForFile(const FileEntry *File,
920                                                   bool *Invalid = nullptr);
921
922  /// Override the contents of the given source file by providing an
923  /// already-allocated buffer.
924  ///
925  /// \param SourceFile the source file whose contents will be overridden.
926  ///
927  /// \param Buffer the memory buffer whose contents will be used as the
928  /// data in the given source file.
929  ///
930  /// \param DoNotFree If true, then the buffer will not be freed when the
931  /// source manager is destroyed.
932  void overrideFileContents(const FileEntry *SourceFile,
933                            llvm::MemoryBuffer *Buffer, bool DoNotFree);
934  void overrideFileContents(const FileEntry *SourceFile,
935                            std::unique_ptr<llvm::MemoryBuffer> Buffer) {
936    overrideFileContents(SourceFile, Buffer.release(), /*DoNotFree*/ false);
937  }
938
939  /// Override the given source file with another one.
940  ///
941  /// \param SourceFile the source file which will be overridden.
942  ///
943  /// \param NewFile the file whose contents will be used as the
944  /// data instead of the contents of the given source file.
945  void overrideFileContents(const FileEntry *SourceFile,
946                            const FileEntry *NewFile);
947
948  /// Returns true if the file contents have been overridden.
949  bool isFileOverridden(const FileEntry *File) const {
950    if (OverriddenFilesInfo) {
951      if (OverriddenFilesInfo->OverriddenFilesWithBuffer.count(File))
952        return true;
953      if (OverriddenFilesInfo->OverriddenFiles.find(File) !=
954          OverriddenFilesInfo->OverriddenFiles.end())
955        return true;
956    }
957    return false;
958  }
959
960  /// Bypass the overridden contents of a file.  This creates a new FileEntry
961  /// and initializes the content cache for it.  Returns nullptr if there is no
962  /// such file in the filesystem.
963  ///
964  /// This should be called before parsing has begun.
965  const FileEntry *bypassFileContentsOverride(const FileEntry &File);
966
967  /// Specify that a file is transient.
968  void setFileIsTransient(const FileEntry *SourceFile);
969
970  /// Specify that all files that are read during this compilation are
971  /// transient.
972  void setAllFilesAreTransient(bool Transient) {
973    FilesAreTransient = Transient;
974  }
975
976  //===--------------------------------------------------------------------===//
977  // FileID manipulation methods.
978  //===--------------------------------------------------------------------===//
979
980  /// Return the buffer for the specified FileID.
981  ///
982  /// If there is an error opening this buffer the first time, this
983  /// manufactures a temporary buffer and returns a non-empty error string.
984  const llvm::MemoryBuffer *getBuffer(FileID FID, SourceLocation Loc,
985                                      bool *Invalid = nullptr) const {
986    bool MyInvalid = false;
987    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &MyInvalid);
988    if (MyInvalid || !Entry.isFile()) {
989      if (Invalid)
990        *Invalid = true;
991
992      return getFakeBufferForRecovery();
993    }
994
995    return Entry.getFile().getContentCache()->getBuffer(Diag, getFileManager(),
996                                                        Loc, Invalid);
997  }
998
999  const llvm::MemoryBuffer *getBuffer(FileID FID,
1000                                      bool *Invalid = nullptr) const {
1001    bool MyInvalid = false;
1002    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &MyInvalid);
1003    if (MyInvalid || !Entry.isFile()) {
1004      if (Invalid)
1005        *Invalid = true;
1006
1007      return getFakeBufferForRecovery();
1008    }
1009
1010    return Entry.getFile().getContentCache()->getBuffer(
1011        Diag, getFileManager(), SourceLocation(), Invalid);
1012  }
1013
1014  /// Returns the FileEntry record for the provided FileID.
1015  const FileEntry *getFileEntryForID(FileID FID) const {
1016    bool MyInvalid = false;
1017    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &MyInvalid);
1018    if (MyInvalid || !Entry.isFile())
1019      return nullptr;
1020
1021    const SrcMgr::ContentCache *Content = Entry.getFile().getContentCache();
1022    if (!Content)
1023      return nullptr;
1024    return Content->OrigEntry;
1025  }
1026
1027  /// Returns the FileEntryRef for the provided FileID.
1028  Optional<FileEntryRef> getFileEntryRefForID(FileID FID) const {
1029    bool Invalid = false;
1030    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1031    if (Invalid || !Entry.isFile())
1032      return None;
1033
1034    const SrcMgr::ContentCache *Content = Entry.getFile().getContentCache();
1035    if (!Content || !Content->OrigEntry)
1036      return None;
1037    return FileEntryRef(Entry.getFile().getName(), *Content->OrigEntry);
1038  }
1039
1040  /// Returns the FileEntry record for the provided SLocEntry.
1041  const FileEntry *getFileEntryForSLocEntry(const SrcMgr::SLocEntry &sloc) const
1042  {
1043    const SrcMgr::ContentCache *Content = sloc.getFile().getContentCache();
1044    if (!Content)
1045      return nullptr;
1046    return Content->OrigEntry;
1047  }
1048
1049  /// Return a StringRef to the source buffer data for the
1050  /// specified FileID.
1051  ///
1052  /// \param FID The file ID whose contents will be returned.
1053  /// \param Invalid If non-NULL, will be set true if an error occurred.
1054  StringRef getBufferData(FileID FID, bool *Invalid = nullptr) const;
1055
1056  /// Get the number of FileIDs (files and macros) that were created
1057  /// during preprocessing of \p FID, including it.
1058  unsigned getNumCreatedFIDsForFileID(FileID FID) const {
1059    bool Invalid = false;
1060    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1061    if (Invalid || !Entry.isFile())
1062      return 0;
1063
1064    return Entry.getFile().NumCreatedFIDs;
1065  }
1066
1067  /// Set the number of FileIDs (files and macros) that were created
1068  /// during preprocessing of \p FID, including it.
1069  void setNumCreatedFIDsForFileID(FileID FID, unsigned NumFIDs,
1070                                  bool Force = false) const {
1071    bool Invalid = false;
1072    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1073    if (Invalid || !Entry.isFile())
1074      return;
1075
1076    assert((Force || Entry.getFile().NumCreatedFIDs == 0) && "Already set!");
1077    const_cast<SrcMgr::FileInfo &>(Entry.getFile()).NumCreatedFIDs = NumFIDs;
1078  }
1079
1080  //===--------------------------------------------------------------------===//
1081  // SourceLocation manipulation methods.
1082  //===--------------------------------------------------------------------===//
1083
1084  /// Return the FileID for a SourceLocation.
1085  ///
1086  /// This is a very hot method that is used for all SourceManager queries
1087  /// that start with a SourceLocation object.  It is responsible for finding
1088  /// the entry in SLocEntryTable which contains the specified location.
1089  ///
1090  FileID getFileID(SourceLocation SpellingLoc) const {
1091    unsigned SLocOffset = SpellingLoc.getOffset();
1092
1093    // If our one-entry cache covers this offset, just return it.
1094    if (isOffsetInFileID(LastFileIDLookup, SLocOffset))
1095      return LastFileIDLookup;
1096
1097    return getFileIDSlow(SLocOffset);
1098  }
1099
1100  /// Return the filename of the file containing a SourceLocation.
1101  StringRef getFilename(SourceLocation SpellingLoc) const {
1102    if (const FileEntry *F = getFileEntryForID(getFileID(SpellingLoc)))
1103      return F->getName();
1104    return StringRef();
1105  }
1106
1107  /// Return the source location corresponding to the first byte of
1108  /// the specified file.
1109  SourceLocation getLocForStartOfFile(FileID FID) const {
1110    bool Invalid = false;
1111    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1112    if (Invalid || !Entry.isFile())
1113      return SourceLocation();
1114
1115    unsigned FileOffset = Entry.getOffset();
1116    return SourceLocation::getFileLoc(FileOffset);
1117  }
1118
1119  /// Return the source location corresponding to the last byte of the
1120  /// specified file.
1121  SourceLocation getLocForEndOfFile(FileID FID) const {
1122    bool Invalid = false;
1123    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1124    if (Invalid || !Entry.isFile())
1125      return SourceLocation();
1126
1127    unsigned FileOffset = Entry.getOffset();
1128    return SourceLocation::getFileLoc(FileOffset + getFileIDSize(FID));
1129  }
1130
1131  /// Returns the include location if \p FID is a \#include'd file
1132  /// otherwise it returns an invalid location.
1133  SourceLocation getIncludeLoc(FileID FID) const {
1134    bool Invalid = false;
1135    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1136    if (Invalid || !Entry.isFile())
1137      return SourceLocation();
1138
1139    return Entry.getFile().getIncludeLoc();
1140  }
1141
1142  // Returns the import location if the given source location is
1143  // located within a module, or an invalid location if the source location
1144  // is within the current translation unit.
1145  std::pair<SourceLocation, StringRef>
1146  getModuleImportLoc(SourceLocation Loc) const {
1147    FileID FID = getFileID(Loc);
1148
1149    // Positive file IDs are in the current translation unit, and -1 is a
1150    // placeholder.
1151    if (FID.ID >= -1)
1152      return std::make_pair(SourceLocation(), "");
1153
1154    return ExternalSLocEntries->getModuleImportLoc(FID.ID);
1155  }
1156
1157  /// Given a SourceLocation object \p Loc, return the expansion
1158  /// location referenced by the ID.
1159  SourceLocation getExpansionLoc(SourceLocation Loc) const {
1160    // Handle the non-mapped case inline, defer to out of line code to handle
1161    // expansions.
1162    if (Loc.isFileID()) return Loc;
1163    return getExpansionLocSlowCase(Loc);
1164  }
1165
1166  /// Given \p Loc, if it is a macro location return the expansion
1167  /// location or the spelling location, depending on if it comes from a
1168  /// macro argument or not.
1169  SourceLocation getFileLoc(SourceLocation Loc) const {
1170    if (Loc.isFileID()) return Loc;
1171    return getFileLocSlowCase(Loc);
1172  }
1173
1174  /// Return the start/end of the expansion information for an
1175  /// expansion location.
1176  ///
1177  /// \pre \p Loc is required to be an expansion location.
1178  CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const;
1179
1180  /// Given a SourceLocation object, return the range of
1181  /// tokens covered by the expansion in the ultimate file.
1182  CharSourceRange getExpansionRange(SourceLocation Loc) const;
1183
1184  /// Given a SourceRange object, return the range of
1185  /// tokens or characters covered by the expansion in the ultimate file.
1186  CharSourceRange getExpansionRange(SourceRange Range) const {
1187    SourceLocation Begin = getExpansionRange(Range.getBegin()).getBegin();
1188    CharSourceRange End = getExpansionRange(Range.getEnd());
1189    return CharSourceRange(SourceRange(Begin, End.getEnd()),
1190                           End.isTokenRange());
1191  }
1192
1193  /// Given a CharSourceRange object, return the range of
1194  /// tokens or characters covered by the expansion in the ultimate file.
1195  CharSourceRange getExpansionRange(CharSourceRange Range) const {
1196    CharSourceRange Expansion = getExpansionRange(Range.getAsRange());
1197    if (Expansion.getEnd() == Range.getEnd())
1198      Expansion.setTokenRange(Range.isTokenRange());
1199    return Expansion;
1200  }
1201
1202  /// Given a SourceLocation object, return the spelling
1203  /// location referenced by the ID.
1204  ///
1205  /// This is the place where the characters that make up the lexed token
1206  /// can be found.
1207  SourceLocation getSpellingLoc(SourceLocation Loc) const {
1208    // Handle the non-mapped case inline, defer to out of line code to handle
1209    // expansions.
1210    if (Loc.isFileID()) return Loc;
1211    return getSpellingLocSlowCase(Loc);
1212  }
1213
1214  /// Given a SourceLocation object, return the spelling location
1215  /// referenced by the ID.
1216  ///
1217  /// This is the first level down towards the place where the characters
1218  /// that make up the lexed token can be found.  This should not generally
1219  /// be used by clients.
1220  SourceLocation getImmediateSpellingLoc(SourceLocation Loc) const;
1221
1222  /// Form a SourceLocation from a FileID and Offset pair.
1223  SourceLocation getComposedLoc(FileID FID, unsigned Offset) const {
1224    bool Invalid = false;
1225    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID, &Invalid);
1226    if (Invalid)
1227      return SourceLocation();
1228
1229    unsigned GlobalOffset = Entry.getOffset() + Offset;
1230    return Entry.isFile() ? SourceLocation::getFileLoc(GlobalOffset)
1231                          : SourceLocation::getMacroLoc(GlobalOffset);
1232  }
1233
1234  /// Decompose the specified location into a raw FileID + Offset pair.
1235  ///
1236  /// The first element is the FileID, the second is the offset from the
1237  /// start of the buffer of the location.
1238  std::pair<FileID, unsigned> getDecomposedLoc(SourceLocation Loc) const {
1239    FileID FID = getFileID(Loc);
1240    bool Invalid = false;
1241    const SrcMgr::SLocEntry &E = getSLocEntry(FID, &Invalid);
1242    if (Invalid)
1243      return std::make_pair(FileID(), 0);
1244    return std::make_pair(FID, Loc.getOffset()-E.getOffset());
1245  }
1246
1247  /// Decompose the specified location into a raw FileID + Offset pair.
1248  ///
1249  /// If the location is an expansion record, walk through it until we find
1250  /// the final location expanded.
1251  std::pair<FileID, unsigned>
1252  getDecomposedExpansionLoc(SourceLocation Loc) const {
1253    FileID FID = getFileID(Loc);
1254    bool Invalid = false;
1255    const SrcMgr::SLocEntry *E = &getSLocEntry(FID, &Invalid);
1256    if (Invalid)
1257      return std::make_pair(FileID(), 0);
1258
1259    unsigned Offset = Loc.getOffset()-E->getOffset();
1260    if (Loc.isFileID())
1261      return std::make_pair(FID, Offset);
1262
1263    return getDecomposedExpansionLocSlowCase(E);
1264  }
1265
1266  /// Decompose the specified location into a raw FileID + Offset pair.
1267  ///
1268  /// If the location is an expansion record, walk through it until we find
1269  /// its spelling record.
1270  std::pair<FileID, unsigned>
1271  getDecomposedSpellingLoc(SourceLocation Loc) const {
1272    FileID FID = getFileID(Loc);
1273    bool Invalid = false;
1274    const SrcMgr::SLocEntry *E = &getSLocEntry(FID, &Invalid);
1275    if (Invalid)
1276      return std::make_pair(FileID(), 0);
1277
1278    unsigned Offset = Loc.getOffset()-E->getOffset();
1279    if (Loc.isFileID())
1280      return std::make_pair(FID, Offset);
1281    return getDecomposedSpellingLocSlowCase(E, Offset);
1282  }
1283
1284  /// Returns the "included/expanded in" decomposed location of the given
1285  /// FileID.
1286  std::pair<FileID, unsigned> getDecomposedIncludedLoc(FileID FID) const;
1287
1288  /// Returns the offset from the start of the file that the
1289  /// specified SourceLocation represents.
1290  ///
1291  /// This is not very meaningful for a macro ID.
1292  unsigned getFileOffset(SourceLocation SpellingLoc) const {
1293    return getDecomposedLoc(SpellingLoc).second;
1294  }
1295
1296  /// Tests whether the given source location represents a macro
1297  /// argument's expansion into the function-like macro definition.
1298  ///
1299  /// \param StartLoc If non-null and function returns true, it is set to the
1300  /// start location of the macro argument expansion.
1301  ///
1302  /// Such source locations only appear inside of the expansion
1303  /// locations representing where a particular function-like macro was
1304  /// expanded.
1305  bool isMacroArgExpansion(SourceLocation Loc,
1306                           SourceLocation *StartLoc = nullptr) const;
1307
1308  /// Tests whether the given source location represents the expansion of
1309  /// a macro body.
1310  ///
1311  /// This is equivalent to testing whether the location is part of a macro
1312  /// expansion but not the expansion of an argument to a function-like macro.
1313  bool isMacroBodyExpansion(SourceLocation Loc) const;
1314
1315  /// Returns true if the given MacroID location points at the beginning
1316  /// of the immediate macro expansion.
1317  ///
1318  /// \param MacroBegin If non-null and function returns true, it is set to the
1319  /// begin location of the immediate macro expansion.
1320  bool isAtStartOfImmediateMacroExpansion(SourceLocation Loc,
1321                                    SourceLocation *MacroBegin = nullptr) const;
1322
1323  /// Returns true if the given MacroID location points at the character
1324  /// end of the immediate macro expansion.
1325  ///
1326  /// \param MacroEnd If non-null and function returns true, it is set to the
1327  /// character end location of the immediate macro expansion.
1328  bool
1329  isAtEndOfImmediateMacroExpansion(SourceLocation Loc,
1330                                   SourceLocation *MacroEnd = nullptr) const;
1331
1332  /// Returns true if \p Loc is inside the [\p Start, +\p Length)
1333  /// chunk of the source location address space.
1334  ///
1335  /// If it's true and \p RelativeOffset is non-null, it will be set to the
1336  /// relative offset of \p Loc inside the chunk.
1337  bool isInSLocAddrSpace(SourceLocation Loc,
1338                         SourceLocation Start, unsigned Length,
1339                         unsigned *RelativeOffset = nullptr) const {
1340    assert(((Start.getOffset() < NextLocalOffset &&
1341               Start.getOffset()+Length <= NextLocalOffset) ||
1342            (Start.getOffset() >= CurrentLoadedOffset &&
1343                Start.getOffset()+Length < MaxLoadedOffset)) &&
1344           "Chunk is not valid SLoc address space");
1345    unsigned LocOffs = Loc.getOffset();
1346    unsigned BeginOffs = Start.getOffset();
1347    unsigned EndOffs = BeginOffs + Length;
1348    if (LocOffs >= BeginOffs && LocOffs < EndOffs) {
1349      if (RelativeOffset)
1350        *RelativeOffset = LocOffs - BeginOffs;
1351      return true;
1352    }
1353
1354    return false;
1355  }
1356
1357  /// Return true if both \p LHS and \p RHS are in the local source
1358  /// location address space or the loaded one.
1359  ///
1360  /// If it's true and \p RelativeOffset is non-null, it will be set to the
1361  /// offset of \p RHS relative to \p LHS.
1362  bool isInSameSLocAddrSpace(SourceLocation LHS, SourceLocation RHS,
1363                             int *RelativeOffset) const {
1364    unsigned LHSOffs = LHS.getOffset(), RHSOffs = RHS.getOffset();
1365    bool LHSLoaded = LHSOffs >= CurrentLoadedOffset;
1366    bool RHSLoaded = RHSOffs >= CurrentLoadedOffset;
1367
1368    if (LHSLoaded == RHSLoaded) {
1369      if (RelativeOffset)
1370        *RelativeOffset = RHSOffs - LHSOffs;
1371      return true;
1372    }
1373
1374    return false;
1375  }
1376
1377  //===--------------------------------------------------------------------===//
1378  // Queries about the code at a SourceLocation.
1379  //===--------------------------------------------------------------------===//
1380
1381  /// Return a pointer to the start of the specified location
1382  /// in the appropriate spelling MemoryBuffer.
1383  ///
1384  /// \param Invalid If non-NULL, will be set \c true if an error occurs.
1385  const char *getCharacterData(SourceLocation SL,
1386                               bool *Invalid = nullptr) const;
1387
1388  /// Return the column # for the specified file position.
1389  ///
1390  /// This is significantly cheaper to compute than the line number.  This
1391  /// returns zero if the column number isn't known.  This may only be called
1392  /// on a file sloc, so you must choose a spelling or expansion location
1393  /// before calling this method.
1394  unsigned getColumnNumber(FileID FID, unsigned FilePos,
1395                           bool *Invalid = nullptr) const;
1396  unsigned getSpellingColumnNumber(SourceLocation Loc,
1397                                   bool *Invalid = nullptr) const;
1398  unsigned getExpansionColumnNumber(SourceLocation Loc,
1399                                    bool *Invalid = nullptr) const;
1400  unsigned getPresumedColumnNumber(SourceLocation Loc,
1401                                   bool *Invalid = nullptr) const;
1402
1403  /// Given a SourceLocation, return the spelling line number
1404  /// for the position indicated.
1405  ///
1406  /// This requires building and caching a table of line offsets for the
1407  /// MemoryBuffer, so this is not cheap: use only when about to emit a
1408  /// diagnostic.
1409  unsigned getLineNumber(FileID FID, unsigned FilePos, bool *Invalid = nullptr) const;
1410  unsigned getSpellingLineNumber(SourceLocation Loc, bool *Invalid = nullptr) const;
1411  unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid = nullptr) const;
1412  unsigned getPresumedLineNumber(SourceLocation Loc, bool *Invalid = nullptr) const;
1413
1414  /// Return the filename or buffer identifier of the buffer the
1415  /// location is in.
1416  ///
1417  /// Note that this name does not respect \#line directives.  Use
1418  /// getPresumedLoc for normal clients.
1419  StringRef getBufferName(SourceLocation Loc, bool *Invalid = nullptr) const;
1420
1421  /// Return the file characteristic of the specified source
1422  /// location, indicating whether this is a normal file, a system
1423  /// header, or an "implicit extern C" system header.
1424  ///
1425  /// This state can be modified with flags on GNU linemarker directives like:
1426  /// \code
1427  ///   # 4 "foo.h" 3
1428  /// \endcode
1429  /// which changes all source locations in the current file after that to be
1430  /// considered to be from a system header.
1431  SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const;
1432
1433  /// Returns the "presumed" location of a SourceLocation specifies.
1434  ///
1435  /// A "presumed location" can be modified by \#line or GNU line marker
1436  /// directives.  This provides a view on the data that a user should see
1437  /// in diagnostics, for example.
1438  ///
1439  /// Note that a presumed location is always given as the expansion point of
1440  /// an expansion location, not at the spelling location.
1441  ///
1442  /// \returns The presumed location of the specified SourceLocation. If the
1443  /// presumed location cannot be calculated (e.g., because \p Loc is invalid
1444  /// or the file containing \p Loc has changed on disk), returns an invalid
1445  /// presumed location.
1446  PresumedLoc getPresumedLoc(SourceLocation Loc,
1447                             bool UseLineDirectives = true) const;
1448
1449  /// Returns whether the PresumedLoc for a given SourceLocation is
1450  /// in the main file.
1451  ///
1452  /// This computes the "presumed" location for a SourceLocation, then checks
1453  /// whether it came from a file other than the main file. This is different
1454  /// from isWrittenInMainFile() because it takes line marker directives into
1455  /// account.
1456  bool isInMainFile(SourceLocation Loc) const;
1457
1458  /// Returns true if the spelling locations for both SourceLocations
1459  /// are part of the same file buffer.
1460  ///
1461  /// This check ignores line marker directives.
1462  bool isWrittenInSameFile(SourceLocation Loc1, SourceLocation Loc2) const {
1463    return getFileID(Loc1) == getFileID(Loc2);
1464  }
1465
1466  /// Returns true if the spelling location for the given location
1467  /// is in the main file buffer.
1468  ///
1469  /// This check ignores line marker directives.
1470  bool isWrittenInMainFile(SourceLocation Loc) const {
1471    return getFileID(Loc) == getMainFileID();
1472  }
1473
1474  /// Returns whether \p Loc is located in a <built-in> file.
1475  bool isWrittenInBuiltinFile(SourceLocation Loc) const {
1476    StringRef Filename(getPresumedLoc(Loc).getFilename());
1477    return Filename.equals("<built-in>");
1478  }
1479
1480  /// Returns whether \p Loc is located in a <command line> file.
1481  bool isWrittenInCommandLineFile(SourceLocation Loc) const {
1482    StringRef Filename(getPresumedLoc(Loc).getFilename());
1483    return Filename.equals("<command line>");
1484  }
1485
1486  /// Returns whether \p Loc is located in a <scratch space> file.
1487  bool isWrittenInScratchSpace(SourceLocation Loc) const {
1488    StringRef Filename(getPresumedLoc(Loc).getFilename());
1489    return Filename.equals("<scratch space>");
1490  }
1491
1492  /// Returns if a SourceLocation is in a system header.
1493  bool isInSystemHeader(SourceLocation Loc) const {
1494    return isSystem(getFileCharacteristic(Loc));
1495  }
1496
1497  /// Returns if a SourceLocation is in an "extern C" system header.
1498  bool isInExternCSystemHeader(SourceLocation Loc) const {
1499    return getFileCharacteristic(Loc) == SrcMgr::C_ExternCSystem;
1500  }
1501
1502  /// Returns whether \p Loc is expanded from a macro in a system header.
1503  bool isInSystemMacro(SourceLocation loc) const {
1504    if (!loc.isMacroID())
1505      return false;
1506
1507    // This happens when the macro is the result of a paste, in that case
1508    // its spelling is the scratch memory, so we take the parent context.
1509    // There can be several level of token pasting.
1510    if (isWrittenInScratchSpace(getSpellingLoc(loc))) {
1511      do {
1512        loc = getImmediateMacroCallerLoc(loc);
1513      } while (isWrittenInScratchSpace(getSpellingLoc(loc)));
1514      return isInSystemMacro(loc);
1515    }
1516
1517    return isInSystemHeader(getSpellingLoc(loc));
1518  }
1519
1520  /// The size of the SLocEntry that \p FID represents.
1521  unsigned getFileIDSize(FileID FID) const;
1522
1523  /// Given a specific FileID, returns true if \p Loc is inside that
1524  /// FileID chunk and sets relative offset (offset of \p Loc from beginning
1525  /// of FileID) to \p relativeOffset.
1526  bool isInFileID(SourceLocation Loc, FileID FID,
1527                  unsigned *RelativeOffset = nullptr) const {
1528    unsigned Offs = Loc.getOffset();
1529    if (isOffsetInFileID(FID, Offs)) {
1530      if (RelativeOffset)
1531        *RelativeOffset = Offs - getSLocEntry(FID).getOffset();
1532      return true;
1533    }
1534
1535    return false;
1536  }
1537
1538  //===--------------------------------------------------------------------===//
1539  // Line Table Manipulation Routines
1540  //===--------------------------------------------------------------------===//
1541
1542  /// Return the uniqued ID for the specified filename.
1543  unsigned getLineTableFilenameID(StringRef Str);
1544
1545  /// Add a line note to the line table for the FileID and offset
1546  /// specified by Loc.
1547  ///
1548  /// If FilenameID is -1, it is considered to be unspecified.
1549  void AddLineNote(SourceLocation Loc, unsigned LineNo, int FilenameID,
1550                   bool IsFileEntry, bool IsFileExit,
1551                   SrcMgr::CharacteristicKind FileKind);
1552
1553  /// Determine if the source manager has a line table.
1554  bool hasLineTable() const { return LineTable != nullptr; }
1555
1556  /// Retrieve the stored line table.
1557  LineTableInfo &getLineTable();
1558
1559  //===--------------------------------------------------------------------===//
1560  // Queries for performance analysis.
1561  //===--------------------------------------------------------------------===//
1562
1563  /// Return the total amount of physical memory allocated by the
1564  /// ContentCache allocator.
1565  size_t getContentCacheSize() const {
1566    return ContentCacheAlloc.getTotalMemory();
1567  }
1568
1569  struct MemoryBufferSizes {
1570    const size_t malloc_bytes;
1571    const size_t mmap_bytes;
1572
1573    MemoryBufferSizes(size_t malloc_bytes, size_t mmap_bytes)
1574      : malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
1575  };
1576
1577  /// Return the amount of memory used by memory buffers, breaking down
1578  /// by heap-backed versus mmap'ed memory.
1579  MemoryBufferSizes getMemoryBufferSizes() const;
1580
1581  /// Return the amount of memory used for various side tables and
1582  /// data structures in the SourceManager.
1583  size_t getDataStructureSizes() const;
1584
1585  //===--------------------------------------------------------------------===//
1586  // Other miscellaneous methods.
1587  //===--------------------------------------------------------------------===//
1588
1589  /// Get the source location for the given file:line:col triplet.
1590  ///
1591  /// If the source file is included multiple times, the source location will
1592  /// be based upon the first inclusion.
1593  SourceLocation translateFileLineCol(const FileEntry *SourceFile,
1594                                      unsigned Line, unsigned Col) const;
1595
1596  /// Get the FileID for the given file.
1597  ///
1598  /// If the source file is included multiple times, the FileID will be the
1599  /// first inclusion.
1600  FileID translateFile(const FileEntry *SourceFile) const;
1601
1602  /// Get the source location in \p FID for the given line:col.
1603  /// Returns null location if \p FID is not a file SLocEntry.
1604  SourceLocation translateLineCol(FileID FID,
1605                                  unsigned Line, unsigned Col) const;
1606
1607  /// If \p Loc points inside a function macro argument, the returned
1608  /// location will be the macro location in which the argument was expanded.
1609  /// If a macro argument is used multiple times, the expanded location will
1610  /// be at the first expansion of the argument.
1611  /// e.g.
1612  ///   MY_MACRO(foo);
1613  ///             ^
1614  /// Passing a file location pointing at 'foo', will yield a macro location
1615  /// where 'foo' was expanded into.
1616  SourceLocation getMacroArgExpandedLocation(SourceLocation Loc) const;
1617
1618  /// Determines the order of 2 source locations in the translation unit.
1619  ///
1620  /// \returns true if LHS source location comes before RHS, false otherwise.
1621  bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const;
1622
1623  /// Determines whether the two decomposed source location is in the
1624  ///        same translation unit. As a byproduct, it also calculates the order
1625  ///        of the source locations in case they are in the same TU.
1626  ///
1627  /// \returns Pair of bools the first component is true if the two locations
1628  ///          are in the same TU. The second bool is true if the first is true
1629  ///          and \p LOffs is before \p ROffs.
1630  std::pair<bool, bool>
1631  isInTheSameTranslationUnit(std::pair<FileID, unsigned> &LOffs,
1632                             std::pair<FileID, unsigned> &ROffs) const;
1633
1634  /// Determines the order of 2 source locations in the "source location
1635  /// address space".
1636  bool isBeforeInSLocAddrSpace(SourceLocation LHS, SourceLocation RHS) const {
1637    return isBeforeInSLocAddrSpace(LHS, RHS.getOffset());
1638  }
1639
1640  /// Determines the order of a source location and a source location
1641  /// offset in the "source location address space".
1642  ///
1643  /// Note that we always consider source locations loaded from
1644  bool isBeforeInSLocAddrSpace(SourceLocation LHS, unsigned RHS) const {
1645    unsigned LHSOffset = LHS.getOffset();
1646    bool LHSLoaded = LHSOffset >= CurrentLoadedOffset;
1647    bool RHSLoaded = RHS >= CurrentLoadedOffset;
1648    if (LHSLoaded == RHSLoaded)
1649      return LHSOffset < RHS;
1650
1651    return LHSLoaded;
1652  }
1653
1654  /// Return true if the Point is within Start and End.
1655  bool isPointWithin(SourceLocation Location, SourceLocation Start,
1656                     SourceLocation End) const {
1657    return Location == Start || Location == End ||
1658           (isBeforeInTranslationUnit(Start, Location) &&
1659            isBeforeInTranslationUnit(Location, End));
1660  }
1661
1662  // Iterators over FileInfos.
1663  using fileinfo_iterator =
1664      llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*>::const_iterator;
1665
1666  fileinfo_iterator fileinfo_begin() const { return FileInfos.begin(); }
1667  fileinfo_iterator fileinfo_end() const { return FileInfos.end(); }
1668  bool hasFileInfo(const FileEntry *File) const {
1669    return FileInfos.find(File) != FileInfos.end();
1670  }
1671
1672  /// Print statistics to stderr.
1673  void PrintStats() const;
1674
1675  void dump() const;
1676
1677  /// Get the number of local SLocEntries we have.
1678  unsigned local_sloc_entry_size() const { return LocalSLocEntryTable.size(); }
1679
1680  /// Get a local SLocEntry. This is exposed for indexing.
1681  const SrcMgr::SLocEntry &getLocalSLocEntry(unsigned Index,
1682                                             bool *Invalid = nullptr) const {
1683    assert(Index < LocalSLocEntryTable.size() && "Invalid index");
1684    return LocalSLocEntryTable[Index];
1685  }
1686
1687  /// Get the number of loaded SLocEntries we have.
1688  unsigned loaded_sloc_entry_size() const { return LoadedSLocEntryTable.size();}
1689
1690  /// Get a loaded SLocEntry. This is exposed for indexing.
1691  const SrcMgr::SLocEntry &getLoadedSLocEntry(unsigned Index,
1692                                              bool *Invalid = nullptr) const {
1693    assert(Index < LoadedSLocEntryTable.size() && "Invalid index");
1694    if (SLocEntryLoaded[Index])
1695      return LoadedSLocEntryTable[Index];
1696    return loadSLocEntry(Index, Invalid);
1697  }
1698
1699  const SrcMgr::SLocEntry &getSLocEntry(FileID FID,
1700                                        bool *Invalid = nullptr) const {
1701    if (FID.ID == 0 || FID.ID == -1) {
1702      if (Invalid) *Invalid = true;
1703      return LocalSLocEntryTable[0];
1704    }
1705    return getSLocEntryByID(FID.ID, Invalid);
1706  }
1707
1708  unsigned getNextLocalOffset() const { return NextLocalOffset; }
1709
1710  void setExternalSLocEntrySource(ExternalSLocEntrySource *Source) {
1711    assert(LoadedSLocEntryTable.empty() &&
1712           "Invalidating existing loaded entries");
1713    ExternalSLocEntries = Source;
1714  }
1715
1716  /// Allocate a number of loaded SLocEntries, which will be actually
1717  /// loaded on demand from the external source.
1718  ///
1719  /// NumSLocEntries will be allocated, which occupy a total of TotalSize space
1720  /// in the global source view. The lowest ID and the base offset of the
1721  /// entries will be returned.
1722  std::pair<int, unsigned>
1723  AllocateLoadedSLocEntries(unsigned NumSLocEntries, unsigned TotalSize);
1724
1725  /// Returns true if \p Loc came from a PCH/Module.
1726  bool isLoadedSourceLocation(SourceLocation Loc) const {
1727    return Loc.getOffset() >= CurrentLoadedOffset;
1728  }
1729
1730  /// Returns true if \p Loc did not come from a PCH/Module.
1731  bool isLocalSourceLocation(SourceLocation Loc) const {
1732    return Loc.getOffset() < NextLocalOffset;
1733  }
1734
1735  /// Returns true if \p FID came from a PCH/Module.
1736  bool isLoadedFileID(FileID FID) const {
1737    assert(FID.ID != -1 && "Using FileID sentinel value");
1738    return FID.ID < 0;
1739  }
1740
1741  /// Returns true if \p FID did not come from a PCH/Module.
1742  bool isLocalFileID(FileID FID) const {
1743    return !isLoadedFileID(FID);
1744  }
1745
1746  /// Gets the location of the immediate macro caller, one level up the stack
1747  /// toward the initial macro typed into the source.
1748  SourceLocation getImmediateMacroCallerLoc(SourceLocation Loc) const {
1749    if (!Loc.isMacroID()) return Loc;
1750
1751    // When we have the location of (part of) an expanded parameter, its
1752    // spelling location points to the argument as expanded in the macro call,
1753    // and therefore is used to locate the macro caller.
1754    if (isMacroArgExpansion(Loc))
1755      return getImmediateSpellingLoc(Loc);
1756
1757    // Otherwise, the caller of the macro is located where this macro is
1758    // expanded (while the spelling is part of the macro definition).
1759    return getImmediateExpansionRange(Loc).getBegin();
1760  }
1761
1762  /// \return Location of the top-level macro caller.
1763  SourceLocation getTopMacroCallerLoc(SourceLocation Loc) const;
1764
1765private:
1766  friend class ASTReader;
1767  friend class ASTWriter;
1768
1769  llvm::MemoryBuffer *getFakeBufferForRecovery() const;
1770  const SrcMgr::ContentCache *getFakeContentCacheForRecovery() const;
1771
1772  const SrcMgr::SLocEntry &loadSLocEntry(unsigned Index, bool *Invalid) const;
1773
1774  /// Get the entry with the given unwrapped FileID.
1775  const SrcMgr::SLocEntry &getSLocEntryByID(int ID,
1776                                            bool *Invalid = nullptr) const {
1777    assert(ID != -1 && "Using FileID sentinel value");
1778    if (ID < 0)
1779      return getLoadedSLocEntryByID(ID, Invalid);
1780    return getLocalSLocEntry(static_cast<unsigned>(ID), Invalid);
1781  }
1782
1783  const SrcMgr::SLocEntry &
1784  getLoadedSLocEntryByID(int ID, bool *Invalid = nullptr) const {
1785    return getLoadedSLocEntry(static_cast<unsigned>(-ID - 2), Invalid);
1786  }
1787
1788  /// Implements the common elements of storing an expansion info struct into
1789  /// the SLocEntry table and producing a source location that refers to it.
1790  SourceLocation createExpansionLocImpl(const SrcMgr::ExpansionInfo &Expansion,
1791                                        unsigned TokLength,
1792                                        int LoadedID = 0,
1793                                        unsigned LoadedOffset = 0);
1794
1795  /// Return true if the specified FileID contains the
1796  /// specified SourceLocation offset.  This is a very hot method.
1797  inline bool isOffsetInFileID(FileID FID, unsigned SLocOffset) const {
1798    const SrcMgr::SLocEntry &Entry = getSLocEntry(FID);
1799    // If the entry is after the offset, it can't contain it.
1800    if (SLocOffset < Entry.getOffset()) return false;
1801
1802    // If this is the very last entry then it does.
1803    if (FID.ID == -2)
1804      return true;
1805
1806    // If it is the last local entry, then it does if the location is local.
1807    if (FID.ID+1 == static_cast<int>(LocalSLocEntryTable.size()))
1808      return SLocOffset < NextLocalOffset;
1809
1810    // Otherwise, the entry after it has to not include it. This works for both
1811    // local and loaded entries.
1812    return SLocOffset < getSLocEntryByID(FID.ID+1).getOffset();
1813  }
1814
1815  /// Returns the previous in-order FileID or an invalid FileID if there
1816  /// is no previous one.
1817  FileID getPreviousFileID(FileID FID) const;
1818
1819  /// Returns the next in-order FileID or an invalid FileID if there is
1820  /// no next one.
1821  FileID getNextFileID(FileID FID) const;
1822
1823  /// Create a new fileID for the specified ContentCache and
1824  /// include position.
1825  ///
1826  /// This works regardless of whether the ContentCache corresponds to a
1827  /// file or some other input source.
1828  FileID createFileID(const SrcMgr::ContentCache *File, StringRef Filename,
1829                      SourceLocation IncludePos,
1830                      SrcMgr::CharacteristicKind DirCharacter, int LoadedID,
1831                      unsigned LoadedOffset);
1832
1833  const SrcMgr::ContentCache *
1834    getOrCreateContentCache(const FileEntry *SourceFile,
1835                            bool isSystemFile = false);
1836
1837  /// Create a new ContentCache for the specified  memory buffer.
1838  const SrcMgr::ContentCache *
1839  createMemBufferContentCache(const llvm::MemoryBuffer *Buf, bool DoNotFree);
1840
1841  FileID getFileIDSlow(unsigned SLocOffset) const;
1842  FileID getFileIDLocal(unsigned SLocOffset) const;
1843  FileID getFileIDLoaded(unsigned SLocOffset) const;
1844
1845  SourceLocation getExpansionLocSlowCase(SourceLocation Loc) const;
1846  SourceLocation getSpellingLocSlowCase(SourceLocation Loc) const;
1847  SourceLocation getFileLocSlowCase(SourceLocation Loc) const;
1848
1849  std::pair<FileID, unsigned>
1850  getDecomposedExpansionLocSlowCase(const SrcMgr::SLocEntry *E) const;
1851  std::pair<FileID, unsigned>
1852  getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E,
1853                                   unsigned Offset) const;
1854  void computeMacroArgsCache(MacroArgsMap &MacroArgsCache, FileID FID) const;
1855  void associateFileChunkWithMacroArgExp(MacroArgsMap &MacroArgsCache,
1856                                         FileID FID,
1857                                         SourceLocation SpellLoc,
1858                                         SourceLocation ExpansionLoc,
1859                                         unsigned ExpansionLength) const;
1860};
1861
1862/// Comparison function object.
1863template<typename T>
1864class BeforeThanCompare;
1865
1866/// Compare two source locations.
1867template<>
1868class BeforeThanCompare<SourceLocation> {
1869  SourceManager &SM;
1870
1871public:
1872  explicit BeforeThanCompare(SourceManager &SM) : SM(SM) {}
1873
1874  bool operator()(SourceLocation LHS, SourceLocation RHS) const {
1875    return SM.isBeforeInTranslationUnit(LHS, RHS);
1876  }
1877};
1878
1879/// Compare two non-overlapping source ranges.
1880template<>
1881class BeforeThanCompare<SourceRange> {
1882  SourceManager &SM;
1883
1884public:
1885  explicit BeforeThanCompare(SourceManager &SM) : SM(SM) {}
1886
1887  bool operator()(SourceRange LHS, SourceRange RHS) const {
1888    return SM.isBeforeInTranslationUnit(LHS.getBegin(), RHS.getBegin());
1889  }
1890};
1891
1892/// SourceManager and necessary depdencies (e.g. VFS, FileManager) for a single
1893/// in-memorty file.
1894class SourceManagerForFile {
1895public:
1896  /// Creates SourceManager and necessary depdencies (e.g. VFS, FileManager).
1897  /// The main file in the SourceManager will be \p FileName with \p Content.
1898  SourceManagerForFile(StringRef FileName, StringRef Content);
1899
1900  SourceManager &get() {
1901    assert(SourceMgr);
1902    return *SourceMgr;
1903  }
1904
1905private:
1906  // The order of these fields are important - they should be in the same order
1907  // as they are created in `createSourceManagerForFile` so that they can be
1908  // deleted in the reverse order as they are created.
1909  std::unique_ptr<FileManager> FileMgr;
1910  std::unique_ptr<DiagnosticsEngine> Diagnostics;
1911  std::unique_ptr<SourceManager> SourceMgr;
1912};
1913
1914} // namespace clang
1915
1916#endif // LLVM_CLANG_BASIC_SOURCEMANAGER_H
1917