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