SourceManager.h revision ac50e3427cb9eb3dc9f13f29a78f00ef3122433d
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 { 180de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned InstantiationLoc, SpellingLoc; // Really these are SourceLocations. 1819dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner public: 182de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getInstantiationLoc() const { 183de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(InstantiationLoc); 184de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 185de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc() const { 186de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return SourceLocation::getFromRawEncoding(SpellingLoc); 187de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 189de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// get - Return a InstantiationInfo for an expansion. VL specifies 190df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// the instantiation location (where the macro is expanded), and SL 191df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// specifies the spelling location (where the characters from the token 19218807d2bfb9282a35b921b4feeda09ffaa110e6bChris Lattner /// come from). Both VL and PL refer to normal File SLocs. 193de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static InstantiationInfo get(SourceLocation IL, SourceLocation SL) { 194de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo X; 195de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.InstantiationLoc = IL.getRawEncoding(); 196de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner X.SpellingLoc = SL.getRawEncoding(); 1979dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner return X; 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 199de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 200de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 201de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// SLocEntry - This is a discriminated union of FileInfo and 202de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// InstantiationInfo. SourceManager keeps an array of these objects, and 203de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// they are uniquely identified by the FileID datatype. 204de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner class SLocEntry { 205de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset; // low bit is set for instantiation info. 206de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner union { 207de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileInfo File; 208de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner InstantiationInfo Instantiation; 209de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner }; 210de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner public: 211de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned getOffset() const { return Offset >> 1; } 212099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 213de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isInstantiation() const { return Offset & 1; } 214de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner bool isFile() const { return !isInstantiation(); } 215de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 216de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const FileInfo &getFile() const { 217de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isFile() && "Not a file SLocEntry!"); 218de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return File; 219de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 220de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 221de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const InstantiationInfo &getInstantiation() const { 222de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner assert(isInstantiation() && "Not an instantiation SLocEntry!"); 223de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return Instantiation; 224de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 225099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 226de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const FileInfo &FI) { 227de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 228de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = Offset << 1; 229de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.File = FI; 230de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 231de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 232de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 233de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner static SLocEntry get(unsigned Offset, const InstantiationInfo &II) { 234de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SLocEntry E; 235de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Offset = (Offset << 1) | 1; 236de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner E.Instantiation = II; 237de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return E; 238de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end SrcMgr namespace. 24178d85f53b093867bbb0123f016956178eea7343eTed Kremenek 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SourceManager - This file handles loading and caching of source files into 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// memory. This object owns the MemoryBuffer objects for all of the loaded 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// files and assigns unique FileID's for each unique #include chain. 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// The SourceManager can be queried for information about SourceLocation 247f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// objects, turning them into either spelling or instantiation locations. 248f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// Spelling locations represent where the bytes corresponding to a token came 249f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// from and instantiation locations represent where the location is in the 250f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// user's view. In the case of a macro expansion, for example, the spelling 251f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location indicates where the expanded token came from and the instantiation 252f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location specifies where it was expanded. 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager { 2540d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner mutable llvm::BumpPtrAllocator ContentCacheAlloc; 2550d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileInfos - Memoized information about all of the files tracked by this 2570d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// SourceManager. This set allows us to merge ContentCache entries based 2580d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// on their FileEntry*. All ContentCache objects will thus have unique, 2590d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// non-null, FileEntry pointers. 2600d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> FileInfos; 2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// MemBufferInfos - Information about various memory buffers that we have 2630d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// read in. All FileEntry* within the stored ContentCache objects are NULL, 2640d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner /// as they do not refer to a file. 2650d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner std::vector<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 /// Given a SourceLocation object, return the instantiation location 408de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// referenced by the ID. 409de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getInstantiationLoc(SourceLocation Loc) const { 410addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 411addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 412de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 413addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getInstantiationLocSlowCase(Loc); 414de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 415de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 416de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getSpellingLoc - Given a SourceLocation object, return the spelling 417de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// location referenced by the ID. This is the place where the characters 418de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// that make up the lexed token can be found. 419de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SourceLocation getSpellingLoc(SourceLocation Loc) const { 420addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // Handle the non-mapped case inline, defer to out of line code to handle 421addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner // instantiations. 422de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) return Loc; 423addb797ca2b5afc1a1e82fd8d5d6eb2a592e75a9Chris Lattner return getSpellingLocSlowCase(Loc); 424de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 425de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 426de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedLoc - Decompose the specified location into a raw FileID + 427de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// Offset pair. The first element is the FileID, the second is the 428de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// offset from the start of the buffer of the location. 429de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> getDecomposedLoc(SourceLocation Loc) const { 430de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 431de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Loc.getOffset()-getSLocEntry(FID).getOffset()); 432de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 433de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 434de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedInstantiationLoc - Decompose the specified location into a 435de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// raw FileID + Offset pair. If the location is an instantiation record, 436de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// walk through it until we find the final location instantiated. 437de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 438de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedInstantiationLoc(SourceLocation Loc) const { 439de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 440de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 441de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 442de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 443de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 444de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 445de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 446de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedInstantiationLocSlowCase(E, Offset); 447de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 448de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 449de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// getDecomposedSpellingLoc - Decompose the specified location into a raw 450de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// FileID + Offset pair. If the location is an instantiation record, walk 451de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// through it until we find its spelling record. 452de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner std::pair<FileID, unsigned> 453de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner getDecomposedSpellingLoc(SourceLocation Loc) const { 454de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(Loc); 455de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner const SrcMgr::SLocEntry *E = &getSLocEntry(FID); 456de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 457de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner unsigned Offset = Loc.getOffset()-E->getOffset(); 458de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner if (Loc.isFileID()) 459de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return std::make_pair(FID, Offset); 460de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedSpellingLocSlowCase(E, Offset); 461de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 462de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 46352c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// getFileOffset - This method returns the offset from the start 46452c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// of the file that the specified SourceLocation represents. This is not very 46552c29081281955d3db9e11d10573b2d38f709099Chris Lattner /// meaningful for a macro ID. 46652c29081281955d3db9e11d10573b2d38f709099Chris Lattner unsigned getFileOffset(SourceLocation SpellingLoc) const { 467de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getDecomposedLoc(SpellingLoc).second; 4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 470de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 471de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 472de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // Queries about the code at a SourceLocation. 473de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner //===--------------------------------------------------------------------===// 474de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getCharacterData - Return a pointer to the start of the specified location 476de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner /// in the appropriate spelling MemoryBuffer. 4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *getCharacterData(SourceLocation SL) const; 4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4799dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// getColumnNumber - Return the column # for the specified file position. 4809dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// This is significantly cheaper to compute than the line number. This 4819dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// returns zero if the column number isn't known. This may only be called on 482f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// a file sloc, so you must choose a spelling or instantiation location 483f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// before calling this method. 4845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getColumnNumber(SourceLocation Loc) const; 4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 486df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingColumnNumber(SourceLocation Loc) const { 487df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getColumnNumber(getSpellingLoc(Loc)); 4889dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 489f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationColumnNumber(SourceLocation Loc) const { 490f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getColumnNumber(getInstantiationLoc(Loc)); 4919dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 4929dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 4939dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 494df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// getLineNumber - Given a SourceLocation, return the spelling line number 4955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// for the position indicated. This requires building and caching a table of 4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// line offsets for the MemoryBuffer, so this is not cheap: use only when 4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// about to emit a diagnostic. 498f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner unsigned getLineNumber(SourceLocation Loc) const; 499de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 500f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationLineNumber(SourceLocation Loc) const { 501f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getLineNumber(getInstantiationLoc(Loc)); 5029dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 503df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingLineNumber(SourceLocation Loc) const { 504df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getLineNumber(getSpellingLoc(Loc)); 5059dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 507de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner // FIXME: This should handle #line. 508de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const { 509de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner FileID FID = getFileID(getSpellingLoc(Loc)); 510de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner return getSLocEntry(FID).getFile().getFileCharacteristic(); 511de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner } 512de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 513b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// getPresumedLoc - This method returns the "presumed" location of a 514b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// SourceLocation specifies. A "presumed location" can be modified by #line 515b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// or GNU line marker directives. This provides a view on the data that a 516b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// user should see in diagnostics, for example. 517b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// 518b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// Note that a presumed location is always given as the instantiation point 519b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner /// of an instantiation location, not at the spelling location. 520b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc getPresumedLoc(SourceLocation Loc) const; 5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 522a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner 5233457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 5249fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromSameFile - Returns true if both SourceLocations correspond to 5259fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the same file. 5269fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromSameFile(SourceLocation Loc1, SourceLocation Loc2) const { 527a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc1) == getFileID(Loc2); 5289fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 5299fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek 5309fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromMainFile - Returns true if the file of provided SourceLocation is 5319fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the main file. 5329fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromMainFile(SourceLocation Loc) const { 533a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc) == getMainFileID(); 5349fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 535de7aeefc5573d669ed476d7bda7a8940d3bcadb7Chris Lattner 5367bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber /// isInSystemHeader - Returns if a SourceLocation is in a system header. 5377bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber bool isInSystemHeader(SourceLocation Loc) const { 5380b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return getFileCharacteristic(Loc) != SrcMgr::C_User; 539721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner } 54006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 54106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 5425b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner // Line Table Manipulation Routines 5435b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 5445b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5455b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// getLineTableFilenameID - Return the uniqued ID for the specified filename. 5465b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner /// 5475b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner unsigned getLineTableFilenameID(const char *Ptr, unsigned Len); 5485b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5494c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// AddLineNote - Add a line note to the line table for the FileID and offset 5504c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// specified by Loc. If FilenameID is -1, it is considered to be 5514c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner /// unspecified. 5524c4ea17d7f991516c37a871dfa4bbe5723fa85f0Chris Lattner void AddLineNote(SourceLocation Loc, unsigned LineNo, int FilenameID); 5535b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner 5545b9a504720fb52594ca3686e10eb6c0cfa2e7d62Chris Lattner //===--------------------------------------------------------------------===// 55506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // Other miscellaneous methods. 55606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 557e55f4ee4fd435e29015e2eea952744ee2a621030Ted Kremenek 558c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner // Iterators over FileInfos. 5590d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner typedef llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*> 5600d0bf8cf58b35302312cc155287fde3e81eb25a7Chris Lattner ::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