SourceManager.h revision addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9
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" 19464c4b3fdd473c9722cc00e7ef5f9929578f9c46Chris Lattner#include "llvm/Support/DataTypes.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector> 2178d85f53b093867bbb0123f016956178eea7343eTed Kremenek#include <set> 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <list> 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 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SourceLineCache - A new[]'d array of offsets for each source line. This 65b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// is lazily computed. This is owned by the ContentCache object. 6605816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner unsigned *SourceLineCache; 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 68b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// NumLines - The number of lines in this ContentCache. This is only valid 69b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// if SourceLineCache is non-null. 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumLines; 71c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 72c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getBuffer - Returns the memory buffer for the associated content. 7305816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const llvm::MemoryBuffer *getBuffer() const; 74c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 75c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSize - Returns the size of the content encapsulated by this 76c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// ContentCache. This can be the size of the source file or the size of an 77c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// arbitrary scratch buffer. If the ContentCache encapsulates a source 78c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// file this size is retrieved from the file's FileEntry. 79c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSize() const; 80c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 81c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSizeBytesMapped - Returns the number of bytes actually mapped for 82c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// this ContentCache. This can be 0 if the MemBuffer was not actually 83c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// instantiated. 84c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSizeBytesMapped() const; 85c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 8605816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void setBuffer(const llvm::MemoryBuffer *B) { 87c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek assert(!Buffer && "MemoryBuffer already set."); 88c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek Buffer = B; 89c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek } 9078d85f53b093867bbb0123f016956178eea7343eTed Kremenek 9105816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache(const FileEntry *e = NULL) 92c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek : Buffer(NULL), Entry(e), SourceLineCache(NULL), NumLines(0) {} 9378d85f53b093867bbb0123f016956178eea7343eTed Kremenek 9478d85f53b093867bbb0123f016956178eea7343eTed Kremenek ~ContentCache(); 950d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 960d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// The copy ctor does not allow copies where source object has either 970d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory 980d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// is not transfered, so this is a logical error. 9905816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache(const ContentCache &RHS) : Buffer(NULL),SourceLineCache(NULL) { 1000d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek Entry = RHS.Entry; 1010d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1020d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek assert (RHS.Buffer == NULL && RHS.SourceLineCache == NULL 1030d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek && "Passed ContentCache object cannot own a buffer."); 1040d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1050d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek NumLines = RHS.NumLines; 1060d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek } 1070d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 108e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek /// Emit - Emit this ContentCache to Bitcode. 10905816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void Emit(llvm::Serializer &S) const; 110099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 111099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// ReadToSourceManager - Reconstitute a ContentCache from Bitcode 112099b4747042352f69184481a48508b599a8d3f73Ted Kremenek // and store it in the specified SourceManager. 11305816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner static void ReadToSourceManager(llvm::Deserializer &D, SourceManager &SM, 11405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner FileManager *FMgr, std::vector<char> &Buf); 115e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek 1160d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek private: 1170d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek // Disable assignments. 11805816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache &operator=(const ContentCache& RHS); 11978d85f53b093867bbb0123f016956178eea7343eTed Kremenek }; 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 121de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileInfo - Information about a FileID, basically just the logical file 122de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that it represents and include stack information. 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 124de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Each FileInfo has include stack information, indicating where it came 125de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// from. This information encodes the #include chain that a token was 126de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// instantiated from. The main include file has an invalid IncludeLoc. 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 128de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileInfos contain a "ContentCache *", with the contents of the file. 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 130de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class FileInfo { 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// IncludeLoc - The location of the #include that brought in this file. 132de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// This is an invalid SLOC for the main file (top of the #include chain). 133de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned IncludeLoc; // Really a SourceLocation 1349dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 1356e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// Data - This contains the ContentCache* and the bits indicating the 1366e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// characteristic of the file and whether it has #line info, all bitmangled 1376e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner /// together. 1386e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner uintptr_t Data; 13978d85f53b093867bbb0123f016956178eea7343eTed Kremenek public: 140de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// get - Return a FileInfo object. 141de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static FileInfo get(SourceLocation IL, const ContentCache *Con, 142de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner CharacteristicKind FileCharacter) { 143de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileInfo X; 144de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.IncludeLoc = IL.getRawEncoding(); 1456e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner X.Data = (uintptr_t)Con; 1466e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner assert((X.Data & 7) == 0 &&"ContentCache pointer insufficiently aligned"); 1476e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner assert((unsigned)FileCharacter < 4 && "invalid file character"); 1486e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner X.Data |= (unsigned)FileCharacter; 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return X; 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 152de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getIncludeLoc() const { 153de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(IncludeLoc); 154de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 1556e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner const ContentCache* getContentCache() const { 1566e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner return reinterpret_cast<const ContentCache*>(Data & ~7UL); 1576e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner } 158de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 1590b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// getCharacteristic - Return whether this is a system header or not. 1609d72851fec9e9c62570a027d42701562bbf29751Chris Lattner CharacteristicKind getFileCharacteristic() const { 1616e1aff2f586025f2d385ee49239f626b0fc63fd7Chris Lattner return (CharacteristicKind)(Data & 3); 1620b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner } 1639dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner }; 1649dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 165de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// InstantiationInfo - Each InstantiationInfo encodes the Instantiation 166de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// location - where the token was ultimately instantiated, and the 167de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SpellingLoc - where the actual character data for the token came from. 168de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class InstantiationInfo { 169de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned InstantiationLoc, SpellingLoc; // Really these are SourceLocations. 1709dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner public: 171de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getInstantiationLoc() const { 172de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(InstantiationLoc); 173de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 174de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc() const { 175de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(SpellingLoc); 176de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 178de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// get - Return a InstantiationInfo for an expansion. VL specifies 179df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// the instantiation location (where the macro is expanded), and SL 180df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// specifies the spelling location (where the characters from the token 18118807d2bfb9282a35b921b4feeda09ffaa110e6bChris Lattner /// come from). Both VL and PL refer to normal File SLocs. 182de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static InstantiationInfo get(SourceLocation IL, SourceLocation SL) { 183de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo X; 184de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.InstantiationLoc = IL.getRawEncoding(); 185de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.SpellingLoc = SL.getRawEncoding(); 1869dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner return X; 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 188de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 189de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 190de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntry - This is a discriminated union of FileInfo and 191de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// InstantiationInfo. SourceManager keeps an array of these objects, and 192de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// they are uniquely identified by the FileID datatype. 193de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class SLocEntry { 194de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset; // low bit is set for instantiation info. 195de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner union { 196de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileInfo File; 197de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo Instantiation; 198de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 199de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner public: 200de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned getOffset() const { return Offset >> 1; } 201099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 202de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isInstantiation() const { return Offset & 1; } 203de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isFile() const { return !isInstantiation(); } 204de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 205de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const FileInfo &getFile() const { 206de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isFile() && "Not a file SLocEntry!"); 207de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return File; 208de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 209de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 210de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const InstantiationInfo &getInstantiation() const { 211de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isInstantiation() && "Not an instantiation SLocEntry!"); 212de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return Instantiation; 213de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 214099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 215de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const FileInfo &FI) { 216de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 217de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = Offset << 1; 218de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.File = FI; 219de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 220de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 221de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 222de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const InstantiationInfo &II) { 223de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 224de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = (Offset << 1) | 1; 225de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Instantiation = II; 226de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 227de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end SrcMgr namespace. 23078d85f53b093867bbb0123f016956178eea7343eTed Kremenek} // end clang namespace 2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 23278d85f53b093867bbb0123f016956178eea7343eTed Kremeneknamespace std { 23378d85f53b093867bbb0123f016956178eea7343eTed Kremenektemplate <> struct less<clang::SrcMgr::ContentCache> { 23478d85f53b093867bbb0123f016956178eea7343eTed Kremenek inline bool operator()(const clang::SrcMgr::ContentCache& L, 23578d85f53b093867bbb0123f016956178eea7343eTed Kremenek const clang::SrcMgr::ContentCache& R) const { 23678d85f53b093867bbb0123f016956178eea7343eTed Kremenek return L.Entry < R.Entry; 23778d85f53b093867bbb0123f016956178eea7343eTed Kremenek } 23878d85f53b093867bbb0123f016956178eea7343eTed Kremenek}; 23978d85f53b093867bbb0123f016956178eea7343eTed Kremenek} // end std namespace 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24178d85f53b093867bbb0123f016956178eea7343eTed Kremeneknamespace clang { 24278d85f53b093867bbb0123f016956178eea7343eTed Kremenek 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SourceManager - This file handles loading and caching of source files into 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// memory. This object owns the MemoryBuffer objects for all of the loaded 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// files and assigns unique FileID's for each unique #include chain. 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// The SourceManager can be queried for information about SourceLocation 248f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// objects, turning them into either spelling or instantiation locations. 249f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// Spelling locations represent where the bytes corresponding to a token came 250f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// from and instantiation locations represent where the location is in the 251f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// user's view. In the case of a macro expansion, for example, the spelling 252f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location indicates where the expanded token came from and the instantiation 253f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location specifies where it was expanded. 2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager { 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileInfos - Memoized information about all of the files tracked by this 2560d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// SourceManager. This set allows us to merge ContentCache entries based 2570d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// on their FileEntry*. All ContentCache objects will thus have unique, 2580d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// non-null, FileEntry pointers. 25978d85f53b093867bbb0123f016956178eea7343eTed Kremenek std::set<SrcMgr::ContentCache> FileInfos; 2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// MemBufferInfos - Information about various memory buffers that we have 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// read in. This is a list, instead of a vector, because we need pointers to 263b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// the ContentCache objects to be stable. All FileEntry* within the 2640d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// stored ContentCache objects are NULL, as they do not refer to a file. 26578d85f53b093867bbb0123f016956178eea7343eTed Kremenek std::list<SrcMgr::ContentCache> MemBufferInfos; 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 267de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntryTable - This is an array of SLocEntry's that we have created. 268de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileID is an index into this vector. This array is sorted by the offset. 269de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::vector<SrcMgr::SLocEntry> SLocEntryTable; 270de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// NextOffset - This is the next available offset that a new SLocEntry can 271de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// start at. It is SLocEntryTable.back().getOffset()+size of back() entry. 272de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned NextOffset; 2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 274de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// LastFileIDLookup - This is a one-entry cache to speed up getFileID. 275de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// LastFileIDLookup records the last FileID looked up or created, because it 276de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// is very common to look up many tokens from the same file. 277de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner mutable FileID LastFileIDLookup; 2789dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 2795b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// LineTable - This holds information for #line directives. It is referenced 2805b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// by indices from SLocEntryTable. 2815b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner LineTableInfo *LineTable; 2825b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 2835e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// LastLineNo - These ivars serve as a cache used in the getLineNumber 2845e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// method which is used to speedup getLineNumber calls to nearby locations. 2852b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner mutable FileID LastLineNoFileIDQuery; 286f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable SrcMgr::ContentCache *LastLineNoContentCache; 287f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoFilePos; 288f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoResult; 28978d85f53b093867bbb0123f016956178eea7343eTed Kremenek 29076edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// MainFileID - The file ID for the main source file of the translation unit. 2912b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID MainFileID; 29249c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff 293de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Statistics for -print-stats. 294de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner mutable unsigned NumLinearScans, NumBinaryProbes; 295de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 29649c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff // SourceManager doesn't support copy construction. 29749c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff explicit SourceManager(const SourceManager&); 29849c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff void operator=(const SourceManager&); 2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 3005b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner SourceManager() : LineTable(0), NumLinearScans(0), NumBinaryProbes(0) { 301de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner clearIDTables(); 302de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 3035b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner ~SourceManager(); 3045b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 3055b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner void clearIDTables(); 3065b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 30706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 30806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // MainFileID creation and querying methods. 30906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 31006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 31176edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// getMainFileID - Returns the FileID of the main source file. 3122b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID getMainFileID() const { return MainFileID; } 31376edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek 31406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// createMainFileID - Create the FileID for the main source file. 31506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner FileID createMainFileID(const FileEntry *SourceFile, 31606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner SourceLocation IncludePos) { 31706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 31806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner MainFileID = createFileID(SourceFile, IncludePos, SrcMgr::C_User); 31906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner return MainFileID; 32006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 32106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 32206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 323de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Methods to create new FileID's and instantiations. 32406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 32506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileID - Create a new FileID that represents the specified file 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// being #included from the specified IncludePosition. This returns 0 on 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// error and translates NULL into standard input. 3292b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, 330a90a4d4a0a365f991b92e925436ec63ef4969839Chris Lattner SrcMgr::CharacteristicKind FileCharacter) { 331de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::ContentCache *IR = getOrCreateContentCache(SourceFile); 3322b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner if (IR == 0) return FileID(); // Error opening file? 3330b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return createFileID(IR, IncludePos, FileCharacter); 3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileIDForMemBuffer - Create a new FileID that represents the 3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// specified memory buffer. This does no caching of the buffer and takes 3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// ownership of the MemoryBuffer, so only pass a MemoryBuffer to this once. 3392b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3407bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber return createFileID(createMemBufferContentCache(Buffer), SourceLocation(), 3410b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner SrcMgr::C_User); 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3441036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// createMainFileIDForMembuffer - Create the FileID for a memory buffer 3451036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// that will represent the FileID for the main source. One example 3461036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// of when this would be used is when the main source is read from STDIN. 3472b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createMainFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3482b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 3497697b5c5a918729718da9ecd9e374bbd973a69e9Chris Lattner MainFileID = createFileIDForMemBuffer(Buffer); 3501036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek return MainFileID; 3511036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek } 35206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 353de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// createInstantiationLoc - Return a new SourceLocation that encodes the fact 354de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that a token at Loc should actually be referenced from InstantiationLoc. 355de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// TokLength is the length of the token being instantiated. 356de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation createInstantiationLoc(SourceLocation Loc, 357de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation InstantiationLoc, 358de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned TokLength); 359de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 36006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 36106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // FileID manipulation methods. 36206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 36306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 36406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBuffer - Return the buffer for the specified FileID. 36506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// 36606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const llvm::MemoryBuffer *getBuffer(FileID FID) const { 367de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getContentCache()->getBuffer(); 36806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 36906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 37006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getFileEntryForID - Returns the FileEntry record for the provided FileID. 37106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const FileEntry *getFileEntryForID(FileID FID) const { 372de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getContentCache()->Entry; 37306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 37406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 37506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBufferData - Return a pointer to the start and end of the source buffer 37606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// data for the specified FileID. 37706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner std::pair<const char*, const char*> getBufferData(FileID FID) const; 37806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 37906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 38006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 38106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // SourceLocation manipulation methods. 38206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 3831036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek 384de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getFileIDSlow - Return the FileID for a SourceLocation. This is a very 385de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// hot method that is used for all SourceManager queries that start with a 386de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SourceLocation object. It is responsible for finding the entry in 387de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntryTable which contains the specified location. 388de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// 389de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID getFileID(SourceLocation SpellingLoc) const { 390de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned SLocOffset = SpellingLoc.getOffset(); 391de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 392de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If our one-entry cache covers this offset, just return it. 393de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (isOffsetInFileID(LastFileIDLookup, SLocOffset)) 394de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return LastFileIDLookup; 395de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 396de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getFileIDSlow(SLocOffset); 397de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 398de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 3992b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// getLocForStartOfFile - Return the source location corresponding to the 4002b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// first byte of the specified file. 4012b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation getLocForStartOfFile(FileID FID) const { 402de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(FID.ID < SLocEntryTable.size() && SLocEntryTable[FID.ID].isFile()); 403de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned FileOffset = SLocEntryTable[FID.ID].getOffset(); 404de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFileLoc(FileOffset); 4052b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 4062b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 407de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getIncludeLoc - Return the location of the #include for the specified 4089dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// SourceLocation. If this is a macro expansion, this transparently figures 4099dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// out which file includes the file being expanded into. 4109dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner SourceLocation getIncludeLoc(SourceLocation ID) const { 411de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(getFileID(getInstantiationLoc(ID))) 412de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner .getFile().getIncludeLoc(); 413de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 414de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 415de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Given a SourceLocation object, return the instantiation location 416de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// referenced by the ID. 417de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getInstantiationLoc(SourceLocation Loc) const { 418addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 419addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 420de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 421addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getInstantiationLocSlowCase(Loc); 422de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 423de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 424de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getSpellingLoc - Given a SourceLocation object, return the spelling 425de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// location referenced by the ID. This is the place where the characters 426de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that make up the lexed token can be found. 427de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc(SourceLocation Loc) const { 428addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 429addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 430de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 431addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getSpellingLocSlowCase(Loc); 432de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 433de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 434de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedLoc - Decompose the specified location into a raw FileID + 435de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Offset pair. The first element is the FileID, the second is the 436de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// offset from the start of the buffer of the location. 437de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> getDecomposedLoc(SourceLocation Loc) const { 438de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 439de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Loc.getOffset()-getSLocEntry(FID).getOffset()); 440de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 441de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 442de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedInstantiationLoc - Decompose the specified location into a 443de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// raw FileID + Offset pair. If the location is an instantiation record, 444de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// walk through it until we find the final location instantiated. 445de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 446de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedInstantiationLoc(SourceLocation Loc) const { 447de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 448de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 449de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 450de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 451de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 452de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 453de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 454de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedInstantiationLocSlowCase(E, Offset); 455de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 456de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 457de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedSpellingLoc - Decompose the specified location into a raw 458de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileID + Offset pair. If the location is an instantiation record, walk 459de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// through it until we find its spelling record. 460de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 461de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedSpellingLoc(SourceLocation Loc) const { 462de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 463de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 464de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 465de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 466de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 467de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 468de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedSpellingLocSlowCase(E, Offset); 469de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 470de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 471de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getFullFilePos - This (efficient) method returns the offset from the start 472de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// of the file that the specified spelling SourceLocation represents. This 473de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// returns the location of the actual character data, not the instantiation 474de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// position. 475de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned getFullFilePos(SourceLocation SpellingLoc) const { 476de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedLoc(SpellingLoc).second; 4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 479de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 480de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 481de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Queries about the code at a SourceLocation. 482de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 483de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 4845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getCharacterData - Return a pointer to the start of the specified location 485de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// in the appropriate spelling MemoryBuffer. 4865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *getCharacterData(SourceLocation SL) const; 4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4889dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// getColumnNumber - Return the column # for the specified file position. 4899dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// This is significantly cheaper to compute than the line number. This 4909dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// returns zero if the column number isn't known. This may only be called on 491f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// a file sloc, so you must choose a spelling or instantiation location 492f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// before calling this method. 4935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getColumnNumber(SourceLocation Loc) const; 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 495df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingColumnNumber(SourceLocation Loc) const { 496df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getColumnNumber(getSpellingLoc(Loc)); 4979dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 498f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationColumnNumber(SourceLocation Loc) const { 499f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getColumnNumber(getInstantiationLoc(Loc)); 5009dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 5019dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 5029dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 503df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// getLineNumber - Given a SourceLocation, return the spelling line number 5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// for the position indicated. This requires building and caching a table of 5055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// line offsets for the MemoryBuffer, so this is not cheap: use only when 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// about to emit a diagnostic. 507f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner unsigned getLineNumber(SourceLocation Loc) const; 508de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 509f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationLineNumber(SourceLocation Loc) const { 510f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getLineNumber(getInstantiationLoc(Loc)); 5119dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 512df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingLineNumber(SourceLocation Loc) const { 513df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getLineNumber(getSpellingLoc(Loc)); 5149dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 516de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // FIXME: This should handle #line. 517de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const { 518de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(getSpellingLoc(Loc)); 519de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getFileCharacteristic(); 520de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 521de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 5225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getSourceName - This method returns the name of the file or buffer that 5235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the SourceLocation specifies. This can be modified with #line directives, 5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// etc. 5258b6ca8866f09fd8e018a329a0749d2dcf11b146aChris Lattner const char *getSourceName(SourceLocation Loc) const; 5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 527a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner 5283457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 5299fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromSameFile - Returns true if both SourceLocations correspond to 5309fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the same file. 5319fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromSameFile(SourceLocation Loc1, SourceLocation Loc2) const { 532a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc1) == getFileID(Loc2); 5339fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 5349fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek 5359fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromMainFile - Returns true if the file of provided SourceLocation is 5369fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the main file. 5379fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromMainFile(SourceLocation Loc) const { 538a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc) == getMainFileID(); 5399fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 540de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 5417bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber /// isInSystemHeader - Returns if a SourceLocation is in a system header. 5427bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber bool isInSystemHeader(SourceLocation Loc) const { 5430b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return getFileCharacteristic(Loc) != SrcMgr::C_User; 544721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner } 54506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 54606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 5475b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner // Line Table Manipulation Routines 5485b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 5495b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5505b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// getLineTableFilenameID - Return the uniqued ID for the specified filename. 5515b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// 5525b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner unsigned getLineTableFilenameID(const char *Ptr, unsigned Len); 5535b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5545b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5555b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 55606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // Other miscellaneous methods. 55706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 558e55f4ee4fd435e29015e2eea952744ee2a621030Ted Kremenek 559c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner // Iterators over FileInfos. 560c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner typedef std::set<SrcMgr::ContentCache>::const_iterator fileinfo_iterator; 561c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_begin() const { return FileInfos.begin(); } 562c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_end() const { return FileInfos.end(); } 563c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner 5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// PrintStats - Print statistics to stderr. 5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintStats() const; 56778d85f53b093867bbb0123f016956178eea7343eTed Kremenek 568099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Emit - Emit this SourceManager to Bitcode. 569099b4747042352f69184481a48508b599a8d3f73Ted Kremenek void Emit(llvm::Serializer& S) const; 570099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 571099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Read - Reconstitute a SourceManager from Bitcode. 5721f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek static SourceManager* CreateAndRegister(llvm::Deserializer& S, 5731f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek FileManager &FMgr); 574099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 5768429fca639bb4fbb6d589f85a2cc84513db4f748Cedric Venet friend struct SrcMgr::ContentCache; // Used for deserialization. 577099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 578de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// isOffsetInFileID - Return true if the specified FileID contains the 579de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// specified SourceLocation offset. This is a very hot method. 580de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner inline bool isOffsetInFileID(FileID FID, unsigned SLocOffset) const { 581de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry &Entry = getSLocEntry(FID); 582de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If the entry is after the offset, it can't contain it. 583de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (SLocOffset < Entry.getOffset()) return false; 584de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 585de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // If this is the last entry than it does. Otherwise, the entry after it 586de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // has to not include it. 587de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (FID.ID+1 == SLocEntryTable.size()) return true; 588de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SLocOffset < SLocEntryTable[FID.ID+1].getOffset(); 589de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 590de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 59178d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createFileID - Create a new fileID for the specified ContentCache and 59278d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// include position. This works regardless of whether the ContentCache 59378d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// corresponds to a file or some other input source. 5942b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const SrcMgr::ContentCache* File, 5952b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation IncludePos, 5962b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SrcMgr::CharacteristicKind DirCharacter); 5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 598de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::ContentCache * 599de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getOrCreateContentCache(const FileEntry *SourceFile); 600c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 60178d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createMemBufferContentCache - Create a new ContentCache for the specified 60278d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// memory buffer. 60378d85f53b093867bbb0123f016956178eea7343eTed Kremenek const SrcMgr::ContentCache* 6042b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner createMemBufferContentCache(const llvm::MemoryBuffer *Buf); 6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 606de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry &getSLocEntry(FileID FID) const { 607de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(FID.ID < SLocEntryTable.size() && "Invalid id"); 608de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SLocEntryTable[FID.ID]; 6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6109dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 611de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID getFileIDSlow(unsigned SLocOffset) const; 612de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 613addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner SourceLocation getInstantiationLocSlowCase(SourceLocation Loc) const; 614addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner SourceLocation getSpellingLocSlowCase(SourceLocation Loc) const; 615addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner 616de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 617de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E, 618de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset) const; 619de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 620de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, 621de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset) const; 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 628