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