SourceManager.h revision bd94500d3aa60092fb0f1e90f53fb0d03fa502a8
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- SourceManager.h - Track and cache source files ---------*- C++ -*-===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the SourceManager interface. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_SOURCEMANAGER_H 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_SOURCEMANAGER_H 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceLocation.h" 1878d85f53b093867bbb0123f016956178eea7343eTed Kremenek#include "llvm/Bitcode/SerializationFwd.h" 190d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner#include "llvm/Support/Allocator.h" 20464c4b3fdd473c9722cc00e7ef5f9929578f9c46Chris Lattner#include "llvm/Support/DataTypes.h" 210d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner#include "llvm/ADT/DenseMap.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector> 239dc62f044a6ba21f503bd56607d94b32704e7945Chris Lattner#include <cassert> 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace llvm { 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MemoryBuffer; 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager; 32099b4747042352f69184481a48508b599a8d3f73Ted Kremenekclass FileManager; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileEntry; 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IdentifierTokenInfo; 355b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattnerclass LineTableInfo; 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 370b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner/// SrcMgr - Public enums and private classes that are part of the 380b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner/// SourceManager implementation. 395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace SrcMgr { 419d72851fec9e9c62570a027d42701562bbf29751Chris Lattner /// CharacteristicKind - This is used to represent whether a file or directory 420b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// holds normal user code, system code, or system code which is implicitly 430b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// 'extern "C"' in C++ mode. Entire directories can be tagged with this 440b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// (this is maintained by DirectoryLookup and friends) as can specific 450b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// FileIDInfos when a #pragma system_header is seen or various other cases. 460b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// 479d72851fec9e9c62570a027d42701562bbf29751Chris Lattner enum CharacteristicKind { 480b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner C_User, C_System, C_ExternCSystem 490b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner }; 500b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner 5178d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// ContentCache - Once instance of this struct is kept for every file 5206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// loaded or used. This object owns the MemoryBuffer object. 53c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek class ContentCache { 54c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// Buffer - The actual buffer containing the characters from the input 55c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// file. This is owned by the ContentCache object. 5605816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner mutable const llvm::MemoryBuffer *Buffer; 57c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 58c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek public: 5978d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// Reference to the file entry. This reference does not own 6078d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// the FileEntry object. It is possible for this to be NULL if 6178d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// the ContentCache encapsulates an imaginary text buffer. 6205816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const FileEntry *Entry; 6378d85f53b093867bbb0123f016956178eea7343eTed Kremenek 640d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// SourceLineCache - A bump pointer allocated array of offsets for each 650d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// source line. This is lazily computed. This is owned by the 660d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// SourceManager BumpPointerAllocator object. 6705816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner unsigned *SourceLineCache; 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 69b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// NumLines - The number of lines in this ContentCache. This is only valid 70b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// if SourceLineCache is non-null. 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumLines; 72c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 73c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getBuffer - Returns the memory buffer for the associated content. 7405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const llvm::MemoryBuffer *getBuffer() const; 75c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 76c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSize - Returns the size of the content encapsulated by this 77c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// ContentCache. This can be the size of the source file or the size of an 78c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// arbitrary scratch buffer. If the ContentCache encapsulates a source 79c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// file this size is retrieved from the file's FileEntry. 80c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSize() const; 81c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 82c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSizeBytesMapped - Returns the number of bytes actually mapped for 83c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// this ContentCache. This can be 0 if the MemBuffer was not actually 84c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// instantiated. 85c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSizeBytesMapped() const; 86c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 8705816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void setBuffer(const llvm::MemoryBuffer *B) { 88c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek assert(!Buffer && "MemoryBuffer already set."); 89c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek Buffer = B; 90c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek } 9178d85f53b093867bbb0123f016956178eea7343eTed Kremenek 920d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner ContentCache(const FileEntry *Ent = 0) 930d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner : Buffer(0), Entry(Ent), SourceLineCache(0), NumLines(0) {} 9478d85f53b093867bbb0123f016956178eea7343eTed Kremenek 9578d85f53b093867bbb0123f016956178eea7343eTed Kremenek ~ContentCache(); 960d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 970d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// The copy ctor does not allow copies where source object has either 980d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory 990d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// is not transfered, so this is a logical error. 1000d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner ContentCache(const ContentCache &RHS) : Buffer(0), SourceLineCache(0) { 1010d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek Entry = RHS.Entry; 1020d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1030d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner assert (RHS.Buffer == 0 && RHS.SourceLineCache == 0 1040d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek && "Passed ContentCache object cannot own a buffer."); 1050d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1060d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek NumLines = RHS.NumLines; 1070d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek } 1080d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 109e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek /// Emit - Emit this ContentCache to Bitcode. 11005816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void Emit(llvm::Serializer &S) const; 111099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 112099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// ReadToSourceManager - Reconstitute a ContentCache from Bitcode 113099b4747042352f69184481a48508b599a8d3f73Ted Kremenek // and store it in the specified SourceManager. 11405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner static void ReadToSourceManager(llvm::Deserializer &D, SourceManager &SM, 11505816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner FileManager *FMgr, std::vector<char> &Buf); 116e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek 1170d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek private: 1180d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek // Disable assignments. 11905816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache &operator=(const ContentCache& RHS); 12078d85f53b093867bbb0123f016956178eea7343eTed Kremenek }; 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 122de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileInfo - Information about a FileID, basically just the logical file 123de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that it represents and include stack information. 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 125de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Each FileInfo has include stack information, indicating where it came 126de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// from. This information encodes the #include chain that a token was 127de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// instantiated from. The main include file has an invalid IncludeLoc. 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 129de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileInfos contain a "ContentCache *", with the contents of the file. 1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 131de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class FileInfo { 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// IncludeLoc - The location of the #include that brought in this file. 133de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// This is an invalid SLOC for the main file (top of the #include chain). 134de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned IncludeLoc; // Really a SourceLocation 1359dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 1366e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// Data - This contains the ContentCache* and the bits indicating the 1376e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// characteristic of the file and whether it has #line info, all bitmangled 1386e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// together. 1396e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner uintptr_t Data; 14078d85f53b093867bbb0123f016956178eea7343eTed Kremenek public: 141de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// get - Return a FileInfo object. 142de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static FileInfo get(SourceLocation IL, const ContentCache *Con, 143de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner CharacteristicKind FileCharacter) { 144de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileInfo X; 145de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.IncludeLoc = IL.getRawEncoding(); 1466e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner X.Data = (uintptr_t)Con; 14700282d6e1194655a2e89f940bd6fa8484b52e666Chris Lattner assert((X.Data & 7) == 0 &&"ContentCache pointer insufficiently aligned"); 1486e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner assert((unsigned)FileCharacter < 4 && "invalid file character"); 1496e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner X.Data |= (unsigned)FileCharacter; 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return X; 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 153de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getIncludeLoc() const { 154de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(IncludeLoc); 155de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 1566e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner const ContentCache* getContentCache() const { 15700282d6e1194655a2e89f940bd6fa8484b52e666Chris Lattner return reinterpret_cast<const ContentCache*>(Data & ~7UL); 1586e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner } 159de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 1600b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// getCharacteristic - Return whether this is a system header or not. 1619d72851fec9e9c62570a027d42701562bbf29751Chris Lattner CharacteristicKind getFileCharacteristic() const { 1626e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner return (CharacteristicKind)(Data & 3); 1630b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner } 164ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner 165ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner /// hasLineDirectives - Return true if this FileID has #line directives in 166ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner /// it. 167ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner bool hasLineDirectives() const { return (Data & 4) != 0; } 168ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner 169ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner /// setHasLineDirectives - Set the flag that indicates that this FileID has 170ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner /// line table entries associated with it. 171ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner void setHasLineDirectives() { 172ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner Data |= 4; 173ac50e3427cb9eb3dc9f13f29a78f00ef3122433dChris Lattner } 1749dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner }; 1759dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 176de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// InstantiationInfo - Each InstantiationInfo encodes the Instantiation 177de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// location - where the token was ultimately instantiated, and the 178de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SpellingLoc - where the actual character data for the token came from. 179de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class InstantiationInfo { 180e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner // Really these are all SourceLocations. 181e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 182e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// SpellingLoc - Where the spelling for the token can be found. 183e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner unsigned SpellingLoc; 184e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 185e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// InstantiationLocStart/InstantiationLocEnd - In a macro expansion, these 18614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /// indicate the start and end of the instantiation. In object-like macros, 187e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// these will be the same. In a function-like macro instantiation, the 188e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// start will be the identifier and the end will be the ')'. 189e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner unsigned InstantiationLocStart, InstantiationLocEnd; 1909dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner public: 191de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc() const { 192de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(SpellingLoc); 193de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 194e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation getInstantiationLocStart() const { 195e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner return SourceLocation::getFromRawEncoding(InstantiationLocStart); 196e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 197e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation getInstantiationLocEnd() const { 198e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner return SourceLocation::getFromRawEncoding(InstantiationLocEnd); 199e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 200e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 201e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner std::pair<SourceLocation,SourceLocation> getInstantiationLocRange() const { 202e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner return std::make_pair(getInstantiationLocStart(), 203e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner getInstantiationLocEnd()); 204e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner } 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 206e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// get - Return a InstantiationInfo for an expansion. IL specifies 207df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// the instantiation location (where the macro is expanded), and SL 208df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// specifies the spelling location (where the characters from the token 209e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// come from). IL and PL can both refer to normal File SLocs or 210e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// instantiation locations. 211e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner static InstantiationInfo get(SourceLocation ILStart, SourceLocation ILEnd, 212e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation SL) { 213de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo X; 214de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.SpellingLoc = SL.getRawEncoding(); 215e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner X.InstantiationLocStart = ILStart.getRawEncoding(); 216e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner X.InstantiationLocEnd = ILEnd.getRawEncoding(); 2179dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner return X; 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 219de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 220de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 221de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntry - This is a discriminated union of FileInfo and 222de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// InstantiationInfo. SourceManager keeps an array of these objects, and 223de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// they are uniquely identified by the FileID datatype. 224de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class SLocEntry { 225de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset; // low bit is set for instantiation info. 226de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner union { 227de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileInfo File; 228de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo Instantiation; 229de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 230de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner public: 231de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned getOffset() const { return Offset >> 1; } 232099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 233de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isInstantiation() const { return Offset & 1; } 234de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isFile() const { return !isInstantiation(); } 235de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 236de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const FileInfo &getFile() const { 237de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isFile() && "Not a file SLocEntry!"); 238de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return File; 239de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 240de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 241de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const InstantiationInfo &getInstantiation() const { 242de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isInstantiation() && "Not an instantiation SLocEntry!"); 243de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return Instantiation; 244de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 245099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 246de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const FileInfo &FI) { 247de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 248de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = Offset << 1; 249de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.File = FI; 250de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 251de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 252de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 253de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const InstantiationInfo &II) { 254de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 255de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = (Offset << 1) | 1; 256de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Instantiation = II; 257de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 258de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end SrcMgr namespace. 26178d85f53b093867bbb0123f016956178eea7343eTed Kremenek 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SourceManager - This file handles loading and caching of source files into 2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// memory. This object owns the MemoryBuffer objects for all of the loaded 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// files and assigns unique FileID's for each unique #include chain. 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// The SourceManager can be queried for information about SourceLocation 267f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// objects, turning them into either spelling or instantiation locations. 268f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// Spelling locations represent where the bytes corresponding to a token came 269f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// from and instantiation locations represent where the location is in the 270f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// user's view. In the case of a macro expansion, for example, the spelling 271f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location indicates where the expanded token came from and the instantiation 272f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location specifies where it was expanded. 2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager { 2740d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner mutable llvm::BumpPtrAllocator ContentCacheAlloc; 2750d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner 2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileInfos - Memoized information about all of the files tracked by this 2770d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// SourceManager. This set allows us to merge ContentCache entries based 2780d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// on their FileEntry*. All ContentCache objects will thus have unique, 2790d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// non-null, FileEntry pointers. 2800d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> FileInfos; 2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// MemBufferInfos - Information about various memory buffers that we have 2830d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// read in. All FileEntry* within the stored ContentCache objects are NULL, 2840d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// as they do not refer to a file. 2850d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner std::vector<SrcMgr::ContentCache*> MemBufferInfos; 2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 287de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntryTable - This is an array of SLocEntry's that we have created. 288de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileID is an index into this vector. This array is sorted by the offset. 289de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::vector<SrcMgr::SLocEntry> SLocEntryTable; 290de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// NextOffset - This is the next available offset that a new SLocEntry can 291de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// start at. It is SLocEntryTable.back().getOffset()+size of back() entry. 292de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned NextOffset; 2935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 294de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// LastFileIDLookup - This is a one-entry cache to speed up getFileID. 295de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// LastFileIDLookup records the last FileID looked up or created, because it 296de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// is very common to look up many tokens from the same file. 297de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner mutable FileID LastFileIDLookup; 2989dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 2995b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// LineTable - This holds information for #line directives. It is referenced 3005b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// by indices from SLocEntryTable. 3015b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner LineTableInfo *LineTable; 3025b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 3035e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// LastLineNo - These ivars serve as a cache used in the getLineNumber 3045e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// method which is used to speedup getLineNumber calls to nearby locations. 3052b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner mutable FileID LastLineNoFileIDQuery; 306f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable SrcMgr::ContentCache *LastLineNoContentCache; 307f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoFilePos; 308f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoResult; 30978d85f53b093867bbb0123f016956178eea7343eTed Kremenek 31076edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// MainFileID - The file ID for the main source file of the translation unit. 3112b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID MainFileID; 31249c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff 313de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Statistics for -print-stats. 314de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner mutable unsigned NumLinearScans, NumBinaryProbes; 315de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 31649c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff // SourceManager doesn't support copy construction. 31749c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff explicit SourceManager(const SourceManager&); 31849c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff void operator=(const SourceManager&); 3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 3205b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner SourceManager() : LineTable(0), NumLinearScans(0), NumBinaryProbes(0) { 321de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner clearIDTables(); 322de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 3235b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner ~SourceManager(); 3245b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 3255b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner void clearIDTables(); 3265b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 32706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 32806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // MainFileID creation and querying methods. 32906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 33006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 33176edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// getMainFileID - Returns the FileID of the main source file. 3322b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID getMainFileID() const { return MainFileID; } 33376edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek 33406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// createMainFileID - Create the FileID for the main source file. 33506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner FileID createMainFileID(const FileEntry *SourceFile, 33606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner SourceLocation IncludePos) { 33706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 33806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner MainFileID = createFileID(SourceFile, IncludePos, SrcMgr::C_User); 33906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner return MainFileID; 34006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 34106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 34206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 343de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Methods to create new FileID's and instantiations. 34406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 34506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileID - Create a new FileID that represents the specified file 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// being #included from the specified IncludePosition. This returns 0 on 3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// error and translates NULL into standard input. 3492b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, 350a90a4d4a0a365f991b92e925436ec63ef4969839Chris Lattner SrcMgr::CharacteristicKind FileCharacter) { 351de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::ContentCache *IR = getOrCreateContentCache(SourceFile); 3522b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner if (IR == 0) return FileID(); // Error opening file? 3530b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return createFileID(IR, IncludePos, FileCharacter); 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileIDForMemBuffer - Create a new FileID that represents the 3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// specified memory buffer. This does no caching of the buffer and takes 3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// ownership of the MemoryBuffer, so only pass a MemoryBuffer to this once. 3592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3607bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber return createFileID(createMemBufferContentCache(Buffer), SourceLocation(), 3610b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner SrcMgr::C_User); 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3641036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// createMainFileIDForMembuffer - Create the FileID for a memory buffer 3651036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// that will represent the FileID for the main source. One example 3661036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// of when this would be used is when the main source is read from STDIN. 3672b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createMainFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3682b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 3697697b5c5a918729718da9ecd9e374bbd973a69e9Chris Lattner MainFileID = createFileIDForMemBuffer(Buffer); 3701036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek return MainFileID; 3711036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek } 37206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 373de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// createInstantiationLoc - Return a new SourceLocation that encodes the fact 374de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that a token at Loc should actually be referenced from InstantiationLoc. 375de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// TokLength is the length of the token being instantiated. 376de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation createInstantiationLoc(SourceLocation Loc, 377e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation InstantiationLocStart, 378e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner SourceLocation InstantiationLocEnd, 379de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned TokLength); 380de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 38106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 38206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // FileID manipulation methods. 38306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 38406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 38506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBuffer - Return the buffer for the specified FileID. 38606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// 38706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const llvm::MemoryBuffer *getBuffer(FileID FID) const { 388de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getContentCache()->getBuffer(); 38906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 39006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 39106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getFileEntryForID - Returns the FileEntry record for the provided FileID. 39206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const FileEntry *getFileEntryForID(FileID FID) const { 393de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getContentCache()->Entry; 39406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 39506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 39606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBufferData - Return a pointer to the start and end of the source buffer 39706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// data for the specified FileID. 39806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner std::pair<const char*, const char*> getBufferData(FileID FID) const; 39906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 40006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 40106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 40206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // SourceLocation manipulation methods. 40306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 4041036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek 405668ab1a36d6a5731c71a75a5f388ecafd538a896Chris Lattner /// getFileID - Return the FileID for a SourceLocation. This is a very 406de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// hot method that is used for all SourceManager queries that start with a 407de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SourceLocation object. It is responsible for finding the entry in 408de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntryTable which contains the specified location. 409de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// 410de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID getFileID(SourceLocation SpellingLoc) const { 411de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned SLocOffset = SpellingLoc.getOffset(); 412de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 413de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If our one-entry cache covers this offset, just return it. 414de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (isOffsetInFileID(LastFileIDLookup, SLocOffset)) 415de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return LastFileIDLookup; 416de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 417de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getFileIDSlow(SLocOffset); 418de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 419de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 4202b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// getLocForStartOfFile - Return the source location corresponding to the 4212b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// first byte of the specified file. 4222b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation getLocForStartOfFile(FileID FID) const { 423de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(FID.ID < SLocEntryTable.size() && SLocEntryTable[FID.ID].isFile()); 424de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned FileOffset = SLocEntryTable[FID.ID].getOffset(); 425de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFileLoc(FileOffset); 4262b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 4272b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 4286678133b8ce642f93e5141f056fa643112041ad0Chris Lattner /// getInstantiationLoc - Given a SourceLocation object, return the 4296678133b8ce642f93e5141f056fa643112041ad0Chris Lattner /// instantiation location referenced by the ID. 430de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getInstantiationLoc(SourceLocation Loc) const { 431addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 432addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 433de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 434addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getInstantiationLocSlowCase(Loc); 435de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 436de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 437e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// getImmediateInstantiationRange - Loc is required to be an instantiation 438e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner /// location. Return the start/end of the instantiation information. 439e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner std::pair<SourceLocation,SourceLocation> 440e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner getImmediateInstantiationRange(SourceLocation Loc) const; 441e7fb48466afcbf2c4ccdfa658824282fdc3c512cChris Lattner 4426678133b8ce642f93e5141f056fa643112041ad0Chris Lattner /// getInstantiationRange - Given a SourceLocation object, return the 4436678133b8ce642f93e5141f056fa643112041ad0Chris Lattner /// range of tokens covered by the instantiation in the ultimate file. 4446678133b8ce642f93e5141f056fa643112041ad0Chris Lattner std::pair<SourceLocation,SourceLocation> 4456678133b8ce642f93e5141f056fa643112041ad0Chris Lattner getInstantiationRange(SourceLocation Loc) const; 4466678133b8ce642f93e5141f056fa643112041ad0Chris Lattner 4476678133b8ce642f93e5141f056fa643112041ad0Chris Lattner 448de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getSpellingLoc - Given a SourceLocation object, return the spelling 449de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// location referenced by the ID. This is the place where the characters 450de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that make up the lexed token can be found. 451de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc(SourceLocation Loc) const { 452addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 453addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 454de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 455addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getSpellingLocSlowCase(Loc); 456de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 457387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner 458387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner /// getImmediateSpellingLoc - Given a SourceLocation object, return the 459387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner /// spelling location referenced by the ID. This is the first level down 460387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner /// towards the place where the characters that make up the lexed token can be 461387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner /// found. This should not generally be used by clients. 462387616edf98739f4a0dd234c907e2b913e6a535dChris Lattner SourceLocation getImmediateSpellingLoc(SourceLocation Loc) const; 463de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 464de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedLoc - Decompose the specified location into a raw FileID + 465de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Offset pair. The first element is the FileID, the second is the 466de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// offset from the start of the buffer of the location. 467de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> getDecomposedLoc(SourceLocation Loc) const { 468de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 469de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Loc.getOffset()-getSLocEntry(FID).getOffset()); 470de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 471de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 472de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedInstantiationLoc - Decompose the specified location into a 473de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// raw FileID + Offset pair. If the location is an instantiation record, 474de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// walk through it until we find the final location instantiated. 475de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 476de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedInstantiationLoc(SourceLocation Loc) const { 477de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 478de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 479de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 480de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 481de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 482de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 483de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 484de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedInstantiationLocSlowCase(E, Offset); 485de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 486de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 487de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedSpellingLoc - Decompose the specified location into a raw 488de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileID + Offset pair. If the location is an instantiation record, walk 489de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// through it until we find its spelling record. 490de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 491de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedSpellingLoc(SourceLocation Loc) const { 492de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 493de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 494de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 495de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 496de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 497de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 498de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedSpellingLocSlowCase(E, Offset); 499de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 500de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 50152c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// getFileOffset - This method returns the offset from the start 50252c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// of the file that the specified SourceLocation represents. This is not very 50352c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// meaningful for a macro ID. 50452c29081281955d3db9e11d10573b2d38f709099Chris Lattner unsigned getFileOffset(SourceLocation SpellingLoc) const { 505de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedLoc(SpellingLoc).second; 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 508de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 509de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 510de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Queries about the code at a SourceLocation. 511de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 512de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getCharacterData - Return a pointer to the start of the specified location 514de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// in the appropriate spelling MemoryBuffer. 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *getCharacterData(SourceLocation SL) const; 5165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5179dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// getColumnNumber - Return the column # for the specified file position. 5189dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// This is significantly cheaper to compute than the line number. This 5199dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// returns zero if the column number isn't known. This may only be called on 520f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// a file sloc, so you must choose a spelling or instantiation location 521f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// before calling this method. 5227da5aea7669e6db3e593162b8a123aef06a04d07Chris Lattner unsigned getColumnNumber(FileID FID, unsigned FilePos) const; 5237da5aea7669e6db3e593162b8a123aef06a04d07Chris Lattner unsigned getSpellingColumnNumber(SourceLocation Loc) const; 5247da5aea7669e6db3e593162b8a123aef06a04d07Chris Lattner unsigned getInstantiationColumnNumber(SourceLocation Loc) const; 5259dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 5269dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 527df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// getLineNumber - Given a SourceLocation, return the spelling line number 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// for the position indicated. This requires building and caching a table of 5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// line offsets for the MemoryBuffer, so this is not cheap: use only when 5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// about to emit a diagnostic. 53130fc933e5fbbb5f0ea60c47976d435254e378536Chris Lattner unsigned getLineNumber(FileID FID, unsigned FilePos) const; 532de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 53330fc933e5fbbb5f0ea60c47976d435254e378536Chris Lattner unsigned getInstantiationLineNumber(SourceLocation Loc) const; 53430fc933e5fbbb5f0ea60c47976d435254e378536Chris Lattner unsigned getSpellingLineNumber(SourceLocation Loc) const; 5355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 536bff5c512af8ca7ac92e974e04c06ff4f820e4ee1Chris Lattner /// Return the filename or buffer identifier of the buffer the location is in. 537bff5c512af8ca7ac92e974e04c06ff4f820e4ee1Chris Lattner /// Note that this name does not respect #line directives. Use getPresumedLoc 538bff5c512af8ca7ac92e974e04c06ff4f820e4ee1Chris Lattner /// for normal clients. 539bff5c512af8ca7ac92e974e04c06ff4f820e4ee1Chris Lattner const char *getBufferName(SourceLocation Loc) const; 540bff5c512af8ca7ac92e974e04c06ff4f820e4ee1Chris Lattner 5416b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// getFileCharacteristic - return the file characteristic of the specified 5426b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// source location, indicating whether this is a normal file, a system 5436b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// header, or an "implicit extern C" system header. 5446b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// 5456b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// This state can be modified with flags on GNU linemarker directives like: 5466b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// # 4 "foo.h" 3 5476b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// which changes all source locations in the current file after that to be 5486b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner /// considered to be from a system header. 5496b3066780bda02e3117d71a18ca2f430ed1454afChris Lattner SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const; 550de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 551b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// getPresumedLoc - This method returns the "presumed" location of a 552b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// SourceLocation specifies. A "presumed location" can be modified by #line 553b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// or GNU line marker directives. This provides a view on the data that a 554b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// user should see in diagnostics, for example. 555b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// 556b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// Note that a presumed location is always given as the instantiation point 557b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// of an instantiation location, not at the spelling location. 558b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc getPresumedLoc(SourceLocation Loc) const; 5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5609fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromSameFile - Returns true if both SourceLocations correspond to 5619fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the same file. 5629fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromSameFile(SourceLocation Loc1, SourceLocation Loc2) const { 563a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc1) == getFileID(Loc2); 5649fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 5659fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek 5669fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromMainFile - Returns true if the file of provided SourceLocation is 5679fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the main file. 5689fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromMainFile(SourceLocation Loc) const { 569a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc) == getMainFileID(); 5709fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 571de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 5727bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber /// isInSystemHeader - Returns if a SourceLocation is in a system header. 5737bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber bool isInSystemHeader(SourceLocation Loc) const { 5740b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return getFileCharacteristic(Loc) != SrcMgr::C_User; 575721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner } 57606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 57706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 5785b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner // Line Table Manipulation Routines 5795b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 5805b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5815b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// getLineTableFilenameID - Return the uniqued ID for the specified filename. 5825b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// 5835b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner unsigned getLineTableFilenameID(const char *Ptr, unsigned Len); 5845b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5854c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// AddLineNote - Add a line note to the line table for the FileID and offset 5864c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// specified by Loc. If FilenameID is -1, it is considered to be 5874c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// unspecified. 5884c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner void AddLineNote(SourceLocation Loc, unsigned LineNo, int FilenameID); 5899d79ebac47ffde6a1cb312f4c09b66b1b9a397fbChris Lattner void AddLineNote(SourceLocation Loc, unsigned LineNo, int FilenameID, 5909d79ebac47ffde6a1cb312f4c09b66b1b9a397fbChris Lattner bool IsFileEntry, bool IsFileExit, 5919d79ebac47ffde6a1cb312f4c09b66b1b9a397fbChris Lattner bool IsSystemHeader, bool IsExternCHeader); 592bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 593bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor /// \brief Determine if the source manager has a line table. 594bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor bool hasLineTable() const { return LineTable != 0; } 595bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 596bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor /// \brief Retrieve the stored line table. 597bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor LineTableInfo &getLineTable(); 598bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 5995b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 60006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // Other miscellaneous methods. 60106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 602e55f4ee4fd435e29015e2eea952744ee2a621030Ted Kremenek 603c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner // Iterators over FileInfos. 6040d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner typedef llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> 6050d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner ::const_iterator fileinfo_iterator; 606c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_begin() const { return FileInfos.begin(); } 607c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_end() const { return FileInfos.end(); } 608c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner 6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// PrintStats - Print statistics to stderr. 6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintStats() const; 61278d85f53b093867bbb0123f016956178eea7343eTed Kremenek 613099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Emit - Emit this SourceManager to Bitcode. 614099b4747042352f69184481a48508b599a8d3f73Ted Kremenek void Emit(llvm::Serializer& S) const; 615099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 616099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Read - Reconstitute a SourceManager from Bitcode. 6171f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek static SourceManager* CreateAndRegister(llvm::Deserializer& S, 6181f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek FileManager &FMgr); 61914f79002e58556798e86168c63e48d533287eda5Douglas Gregor 62014f79002e58556798e86168c63e48d533287eda5Douglas Gregor // Iteration over the source location entry table. 62114f79002e58556798e86168c63e48d533287eda5Douglas Gregor typedef std::vector<SrcMgr::SLocEntry>::const_iterator sloc_entry_iterator; 62214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 62314f79002e58556798e86168c63e48d533287eda5Douglas Gregor sloc_entry_iterator sloc_entry_begin() const { 62414f79002e58556798e86168c63e48d533287eda5Douglas Gregor return SLocEntryTable.begin(); 62514f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 62614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 62714f79002e58556798e86168c63e48d533287eda5Douglas Gregor sloc_entry_iterator sloc_entry_end() const { 62814f79002e58556798e86168c63e48d533287eda5Douglas Gregor return SLocEntryTable.end(); 62914f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 63014f79002e58556798e86168c63e48d533287eda5Douglas Gregor 63114f79002e58556798e86168c63e48d533287eda5Douglas Gregor unsigned sloc_entry_size() const { return SLocEntryTable.size(); } 63214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 633bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor const SrcMgr::SLocEntry &getSLocEntry(FileID FID) const { 634bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor assert(FID.ID < SLocEntryTable.size() && "Invalid id"); 635bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor return SLocEntryTable[FID.ID]; 636bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor } 637bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 639ea684e699ea84e61711e279f5fa7a1b9f3d46bc2Cedric Venet friend class SrcMgr::ContentCache; // Used for deserialization. 640099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 641de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// isOffsetInFileID - Return true if the specified FileID contains the 642de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// specified SourceLocation offset. This is a very hot method. 643de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner inline bool isOffsetInFileID(FileID FID, unsigned SLocOffset) const { 644de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry &Entry = getSLocEntry(FID); 645de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If the entry is after the offset, it can't contain it. 646de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (SLocOffset < Entry.getOffset()) return false; 647de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 648de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If this is the last entry than it does. Otherwise, the entry after it 649de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // has to not include it. 650de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (FID.ID+1 == SLocEntryTable.size()) return true; 651de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SLocOffset < SLocEntryTable[FID.ID+1].getOffset(); 652de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 653de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 65478d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createFileID - Create a new fileID for the specified ContentCache and 65578d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// include position. This works regardless of whether the ContentCache 65678d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// corresponds to a file or some other input source. 6572b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const SrcMgr::ContentCache* File, 6582b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation IncludePos, 6592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SrcMgr::CharacteristicKind DirCharacter); 6605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 661de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::ContentCache * 662de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getOrCreateContentCache(const FileEntry *SourceFile); 663c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 66478d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createMemBufferContentCache - Create a new ContentCache for the specified 66578d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// memory buffer. 66678d85f53b093867bbb0123f016956178eea7343eTed Kremenek const SrcMgr::ContentCache* 6672b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner createMemBufferContentCache(const llvm::MemoryBuffer *Buf); 6689dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 669de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID getFileIDSlow(unsigned SLocOffset) const; 670de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 671addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner SourceLocation getInstantiationLocSlowCase(SourceLocation Loc) const; 672addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner SourceLocation getSpellingLocSlowCase(SourceLocation Loc) const; 673addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner 674de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 675de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E, 676de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset) const; 677de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 678de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, 679de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset) const; 6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 686