SourceManager.h revision 06a062dc784c609b75dca15fd97f468d0d846596
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" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector> 2078d85f53b093867bbb0123f016956178eea7343eTed Kremenek#include <set> 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <list> 229dc62f044a6ba21f503bd56607d94b32704e7945Chris Lattner#include <cassert> 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace llvm { 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass MemoryBuffer; 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang { 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager; 31099b4747042352f69184481a48508b599a8d3f73Ted Kremenekclass FileManager; 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass FileEntry; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass IdentifierTokenInfo; 345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 350b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner/// SrcMgr - Public enums and private classes that are part of the 360b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner/// SourceManager implementation. 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace SrcMgr { 399d72851fec9e9c62570a027d42701562bbf29751Chris Lattner /// CharacteristicKind - This is used to represent whether a file or directory 400b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// holds normal user code, system code, or system code which is implicitly 410b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// 'extern "C"' in C++ mode. Entire directories can be tagged with this 420b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// (this is maintained by DirectoryLookup and friends) as can specific 430b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// FileIDInfos when a #pragma system_header is seen or various other cases. 440b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// 459d72851fec9e9c62570a027d42701562bbf29751Chris Lattner enum CharacteristicKind { 460b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner C_User, C_System, C_ExternCSystem 470b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner }; 480b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner 4978d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// ContentCache - Once instance of this struct is kept for every file 5006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// loaded or used. This object owns the MemoryBuffer object. 51c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek class ContentCache { 52c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// Buffer - The actual buffer containing the characters from the input 53c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// file. This is owned by the ContentCache object. 5405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner mutable const llvm::MemoryBuffer *Buffer; 55c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 56c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek public: 5778d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// Reference to the file entry. This reference does not own 5878d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// the FileEntry object. It is possible for this to be NULL if 5978d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// the ContentCache encapsulates an imaginary text buffer. 6005816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const FileEntry *Entry; 6178d85f53b093867bbb0123f016956178eea7343eTed Kremenek 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// SourceLineCache - A new[]'d array of offsets for each source line. This 63b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// is lazily computed. This is owned by the ContentCache object. 6405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner unsigned *SourceLineCache; 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 66b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// NumLines - The number of lines in this ContentCache. This is only valid 67b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// if SourceLineCache is non-null. 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned NumLines; 69c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 70c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getBuffer - Returns the memory buffer for the associated content. 7105816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const llvm::MemoryBuffer *getBuffer() const; 72c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 73c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSize - Returns the size of the content encapsulated by this 74c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// ContentCache. This can be the size of the source file or the size of an 75c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// arbitrary scratch buffer. If the ContentCache encapsulates a source 76c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// file this size is retrieved from the file's FileEntry. 77c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSize() const; 78c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 79c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// getSizeBytesMapped - Returns the number of bytes actually mapped for 80c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// this ContentCache. This can be 0 if the MemBuffer was not actually 81c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek /// instantiated. 82c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek unsigned getSizeBytesMapped() const; 83c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 8405816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void setBuffer(const llvm::MemoryBuffer *B) { 85c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek assert(!Buffer && "MemoryBuffer already set."); 86c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek Buffer = B; 87c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek } 8878d85f53b093867bbb0123f016956178eea7343eTed Kremenek 8905816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache(const FileEntry *e = NULL) 90c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek : Buffer(NULL), Entry(e), SourceLineCache(NULL), NumLines(0) {} 9178d85f53b093867bbb0123f016956178eea7343eTed Kremenek 9278d85f53b093867bbb0123f016956178eea7343eTed Kremenek ~ContentCache(); 930d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 940d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// The copy ctor does not allow copies where source object has either 950d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory 960d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// is not transfered, so this is a logical error. 9705816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache(const ContentCache &RHS) : Buffer(NULL),SourceLineCache(NULL) { 980d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek Entry = RHS.Entry; 990d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1000d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek assert (RHS.Buffer == NULL && RHS.SourceLineCache == NULL 1010d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek && "Passed ContentCache object cannot own a buffer."); 1020d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 1030d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek NumLines = RHS.NumLines; 1040d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek } 1050d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek 106e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek /// Emit - Emit this ContentCache to Bitcode. 10705816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner void Emit(llvm::Serializer &S) const; 108099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 109099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// ReadToSourceManager - Reconstitute a ContentCache from Bitcode 110099b4747042352f69184481a48508b599a8d3f73Ted Kremenek // and store it in the specified SourceManager. 11105816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner static void ReadToSourceManager(llvm::Deserializer &D, SourceManager &SM, 11205816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner FileManager *FMgr, std::vector<char> &Buf); 113e21272fbdbfbf5bf3461d3e9b42279f4d47caa42Ted Kremenek 1140d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek private: 1150d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek // Disable assignments. 11605816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner ContentCache &operator=(const ContentCache& RHS); 11778d85f53b093867bbb0123f016956178eea7343eTed Kremenek }; 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileIDInfo - Information about a FileID, basically just the logical file 12031bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// that it represents and include stack information. A File SourceLocation 12131bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// is a byte offset from the start of this. 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileID's are used to compute the location of a character in memory as well 124f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// as the instantiation source location, which can be differ from the 125f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// spelling location. It is different when #line's are active or when macros 126f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// have been expanded. 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// Each FileID has include stack information, indicating where it came from. 1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// For the primary translation unit, it comes from SourceLocation() aka 0. 13031bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// This information encodes the #include chain that a token was instantiated 13131bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// from. 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1330d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// FileIDInfos contain a "ContentCache *", describing the source file, 1340d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// and a Chunk number, which allows a SourceLocation to index into very 1350d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// large files (those which there are not enough FilePosBits to address). 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer struct FileIDInfo { 1389dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner private: 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// IncludeLoc - The location of the #include that brought in this file. 1409dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// This SourceLocation object has an invalid SLOC for the main file. 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation IncludeLoc; 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1439dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// ChunkNo - Really large buffers are broken up into chunks that are 1449dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// each (1 << SourceLocation::FilePosBits) in size. This specifies the 1459dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// chunk number of this FileID. 146721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner unsigned ChunkNo : 30; 1477bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber 1489d72851fec9e9c62570a027d42701562bbf29751Chris Lattner /// FileCharacteristic - This is an instance of CharacteristicKind, 149721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner /// indicating whether this is a system header dir or not. 1500b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner unsigned FileCharacteristic : 2; 1519dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 15278d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// Content - Information about the source buffer itself. 15305816591ec488a933dfecc9ff9f3cbf3c32767c2Chris Lattner const ContentCache *Content; 1547bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber 15578d85f53b093867bbb0123f016956178eea7343eTed Kremenek public: 1569dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// get - Return a FileIDInfo object. 15778d85f53b093867bbb0123f016956178eea7343eTed Kremenek static FileIDInfo get(SourceLocation IL, unsigned CN, 1580b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner const ContentCache *Con, 1599d72851fec9e9c62570a027d42701562bbf29751Chris Lattner CharacteristicKind FileCharacter) { 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FileIDInfo X; 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer X.IncludeLoc = IL; 1629dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner X.ChunkNo = CN; 16378d85f53b093867bbb0123f016956178eea7343eTed Kremenek X.Content = Con; 1640b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner X.FileCharacteristic = FileCharacter; 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return X; 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1689dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner SourceLocation getIncludeLoc() const { return IncludeLoc; } 1699dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner unsigned getChunkNo() const { return ChunkNo; } 17078d85f53b093867bbb0123f016956178eea7343eTed Kremenek const ContentCache* getContentCache() const { return Content; } 171721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner 1720b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner /// getCharacteristic - Return whether this is a system header or not. 1739d72851fec9e9c62570a027d42701562bbf29751Chris Lattner CharacteristicKind getFileCharacteristic() const { 1749d72851fec9e9c62570a027d42701562bbf29751Chris Lattner return (CharacteristicKind)FileCharacteristic; 1750b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner } 176099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 177099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Emit - Emit this FileIDInfo to Bitcode. 178099b4747042352f69184481a48508b599a8d3f73Ted Kremenek void Emit(llvm::Serializer& S) const; 179099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 180099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// ReadVal - Reconstitute a FileIDInfo from Bitcode. 181099b4747042352f69184481a48508b599a8d3f73Ted Kremenek static FileIDInfo ReadVal(llvm::Deserializer& S); 1829dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner }; 1839dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 18431bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// MacroIDInfo - Macro SourceLocations refer to these records by their ID. 18531bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// Each MacroIDInfo encodes the Instantiation location - where the macro was 186df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// instantiated, and the SpellingLoc - where the actual character data for 18731bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// the token came from. An actual macro SourceLocation stores deltas from 18831bb8be680ee2facf7fbb3c6c87b9bbd20248328Chris Lattner /// these positions. 1899dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner class MacroIDInfo { 19088054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner SourceLocation InstantiationLoc, SpellingLoc; 1919dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner public: 19288054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner SourceLocation getInstantiationLoc() const { return InstantiationLoc; } 193df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation getSpellingLoc() const { return SpellingLoc; } 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 19518807d2bfb9282a35b921b4feeda09ffaa110e6bChris Lattner /// get - Return a MacroID for a macro expansion. VL specifies 196df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// the instantiation location (where the macro is expanded), and SL 197df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// specifies the spelling location (where the characters from the token 19818807d2bfb9282a35b921b4feeda09ffaa110e6bChris Lattner /// come from). Both VL and PL refer to normal File SLocs. 199df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner static MacroIDInfo get(SourceLocation VL, SourceLocation SL) { 2009dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner MacroIDInfo X; 20188054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner X.InstantiationLoc = VL; 202df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner X.SpellingLoc = SL; 2039dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner return X; 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 205099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 206099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Emit - Emit this MacroIDInfo to Bitcode. 207099b4747042352f69184481a48508b599a8d3f73Ted Kremenek void Emit(llvm::Serializer& S) const; 208099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 209099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// ReadVal - Reconstitute a MacroIDInfo from Bitcode. 210099b4747042352f69184481a48508b599a8d3f73Ted Kremenek static MacroIDInfo ReadVal(llvm::Deserializer& S); 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end SrcMgr namespace. 21378d85f53b093867bbb0123f016956178eea7343eTed Kremenek} // end clang namespace 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 21578d85f53b093867bbb0123f016956178eea7343eTed Kremeneknamespace std { 21678d85f53b093867bbb0123f016956178eea7343eTed Kremenektemplate <> struct less<clang::SrcMgr::ContentCache> { 21778d85f53b093867bbb0123f016956178eea7343eTed Kremenek inline bool operator()(const clang::SrcMgr::ContentCache& L, 21878d85f53b093867bbb0123f016956178eea7343eTed Kremenek const clang::SrcMgr::ContentCache& R) const { 21978d85f53b093867bbb0123f016956178eea7343eTed Kremenek return L.Entry < R.Entry; 22078d85f53b093867bbb0123f016956178eea7343eTed Kremenek } 22178d85f53b093867bbb0123f016956178eea7343eTed Kremenek}; 22278d85f53b093867bbb0123f016956178eea7343eTed Kremenek} // end std namespace 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22478d85f53b093867bbb0123f016956178eea7343eTed Kremeneknamespace clang { 22578d85f53b093867bbb0123f016956178eea7343eTed Kremenek 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// SourceManager - This file handles loading and caching of source files into 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// memory. This object owns the MemoryBuffer objects for all of the loaded 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// files and assigns unique FileID's for each unique #include chain. 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// The SourceManager can be queried for information about SourceLocation 231f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// objects, turning them into either spelling or instantiation locations. 232f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// Spelling locations represent where the bytes corresponding to a token came 233f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// from and instantiation locations represent where the location is in the 234f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// user's view. In the case of a macro expansion, for example, the spelling 235f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location indicates where the expanded token came from and the instantiation 236f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner/// location specifies where it was expanded. 2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceManager { 2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileInfos - Memoized information about all of the files tracked by this 2390d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// SourceManager. This set allows us to merge ContentCache entries based 2400d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// on their FileEntry*. All ContentCache objects will thus have unique, 2410d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// non-null, FileEntry pointers. 24278d85f53b093867bbb0123f016956178eea7343eTed Kremenek std::set<SrcMgr::ContentCache> FileInfos; 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// MemBufferInfos - Information about various memory buffers that we have 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// read in. This is a list, instead of a vector, because we need pointers to 246b6427f821de8cce1566fb6e755143ea0918d5543Ted Kremenek /// the ContentCache objects to be stable. All FileEntry* within the 2470d892d8bfddd4916cc4f3467e1184a623d0716daTed Kremenek /// stored ContentCache objects are NULL, as they do not refer to a file. 24878d85f53b093867bbb0123f016956178eea7343eTed Kremenek std::list<SrcMgr::ContentCache> MemBufferInfos; 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// FileIDs - Information about each FileID. FileID #0 is not valid, so all 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// entries are off by one. 2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::vector<SrcMgr::FileIDInfo> FileIDs; 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2549dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// MacroIDs - Information about each MacroID. 2559dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner std::vector<SrcMgr::MacroIDInfo> MacroIDs; 2569dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 2575e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// LastLineNo - These ivars serve as a cache used in the getLineNumber 2585e36a7a89da5d69ece23fc8228624a053f75c645Chris Lattner /// method which is used to speedup getLineNumber calls to nearby locations. 2592b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner mutable FileID LastLineNoFileIDQuery; 260f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable SrcMgr::ContentCache *LastLineNoContentCache; 261f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoFilePos; 262f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner mutable unsigned LastLineNoResult; 26378d85f53b093867bbb0123f016956178eea7343eTed Kremenek 26476edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// MainFileID - The file ID for the main source file of the translation unit. 2652b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID MainFileID; 26649c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff 26749c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff // SourceManager doesn't support copy construction. 26849c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff explicit SourceManager(const SourceManager&); 26949c1f4aa2a6c360d25d605004ec3c4affd62db77Steve Naroff void operator=(const SourceManager&); 2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic: 2712b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceManager() {} 27278d85f53b093867bbb0123f016956178eea7343eTed Kremenek ~SourceManager() {} 2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 274bd24776a825a18a59067c68a9d32f2d22e4cbf79Chris Lattner void clearIDTables() { 2752b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner MainFileID = FileID(); 276bd24776a825a18a59067c68a9d32f2d22e4cbf79Chris Lattner FileIDs.clear(); 277bd24776a825a18a59067c68a9d32f2d22e4cbf79Chris Lattner MacroIDs.clear(); 2782b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner LastLineNoFileIDQuery = FileID(); 27978d85f53b093867bbb0123f016956178eea7343eTed Kremenek LastLineNoContentCache = 0; 280bd24776a825a18a59067c68a9d32f2d22e4cbf79Chris Lattner } 28106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 28206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 28306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // MainFileID creation and querying methods. 28406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 28506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 28676edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek /// getMainFileID - Returns the FileID of the main source file. 2872b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID getMainFileID() const { return MainFileID; } 28876edd0e4ae0592a7225d50d0bad6732ac64dca2aTed Kremenek 28906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// createMainFileID - Create the FileID for the main source file. 29006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner FileID createMainFileID(const FileEntry *SourceFile, 29106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner SourceLocation IncludePos) { 29206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 29306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner MainFileID = createFileID(SourceFile, IncludePos, SrcMgr::C_User); 29406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner return MainFileID; 29506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 29606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 29706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 29806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // Methods to create new FileID's. 29906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 30006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileID - Create a new FileID that represents the specified file 3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// being #included from the specified IncludePosition. This returns 0 on 3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// error and translates NULL into standard input. 3042b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, 305a90a4d4a0a365f991b92e925436ec63ef4969839Chris Lattner SrcMgr::CharacteristicKind FileCharacter) { 30678d85f53b093867bbb0123f016956178eea7343eTed Kremenek const SrcMgr::ContentCache *IR = getContentCache(SourceFile); 3072b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner if (IR == 0) return FileID(); // Error opening file? 3080b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return createFileID(IR, IncludePos, FileCharacter); 3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// createFileIDForMemBuffer - Create a new FileID that represents the 3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// specified memory buffer. This does no caching of the buffer and takes 3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// ownership of the MemoryBuffer, so only pass a MemoryBuffer to this once. 3142b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3157bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber return createFileID(createMemBufferContentCache(Buffer), SourceLocation(), 3160b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner SrcMgr::C_User); 3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3191036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// createMainFileIDForMembuffer - Create the FileID for a memory buffer 3201036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// that will represent the FileID for the main source. One example 3211036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek /// of when this would be used is when the main source is read from STDIN. 3222b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createMainFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) { 3232b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner assert(MainFileID.isInvalid() && "MainFileID already set!"); 3247697b5c5a918729718da9ecd9e374bbd973a69e9Chris Lattner MainFileID = createFileIDForMemBuffer(Buffer); 3251036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek return MainFileID; 3261036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek } 32706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 32806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 32906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // FileID manipulation methods. 33006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 33106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 33206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBuffer - Return the buffer for the specified FileID. 33306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// 33406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const llvm::MemoryBuffer *getBuffer(FileID FID) const { 33506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner return getContentCache(FID)->getBuffer(); 33606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 33706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 33806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getFileEntryForID - Returns the FileEntry record for the provided FileID. 33906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner const FileEntry *getFileEntryForID(FileID FID) const { 34006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner return getContentCache(FID)->Entry; 34106a062dc784c609b75dca15fd97f468d0d846596Chris Lattner } 34206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 34306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getBufferData - Return a pointer to the start and end of the source buffer 34406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// data for the specified FileID. 34506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner std::pair<const char*, const char*> getBufferData(FileID FID) const; 34606a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 34706a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 34806a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 34906a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // SourceLocation manipulation methods. 35006a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 3511036b68525f39cb69ac22c679ed440acd8392a16Ted Kremenek 3522b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// getLocForStartOfFile - Return the source location corresponding to the 3532b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner /// first byte of the specified file. 3542b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation getLocForStartOfFile(FileID FID) const { 3552b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return SourceLocation::getFileLoc(FID.ID, 0); 3562b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 3572b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getInstantiationLoc - Return a new SourceLocation that encodes the fact 359abca2bba54197256f2830f757218cfbea2ed9cd1Chris Lattner /// that a token at Loc should actually be referenced from InstantiationLoc. 360abca2bba54197256f2830f757218cfbea2ed9cd1Chris Lattner SourceLocation getInstantiationLoc(SourceLocation Loc, 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceLocation InstantiationLoc); 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 36306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner /// getIncludeLoc - Return the location of the #include for the specified 3649dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// SourceLocation. If this is a macro expansion, this transparently figures 3659dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// out which file includes the file being expanded into. 3669dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner SourceLocation getIncludeLoc(SourceLocation ID) const { 3673b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner return getFIDInfo(getInstantiationLoc(ID).getChunkID())->getIncludeLoc(); 3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getCharacterData - Return a pointer to the start of the specified location 3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// in the appropriate MemoryBuffer. 3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const char *getCharacterData(SourceLocation SL) const; 3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3749dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// getColumnNumber - Return the column # for the specified file position. 3759dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// This is significantly cheaper to compute than the line number. This 3769dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner /// returns zero if the column number isn't known. This may only be called on 377f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// a file sloc, so you must choose a spelling or instantiation location 378f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// before calling this method. 3795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned getColumnNumber(SourceLocation Loc) const; 3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 381df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingColumnNumber(SourceLocation Loc) const { 382df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getColumnNumber(getSpellingLoc(Loc)); 3839dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 384f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationColumnNumber(SourceLocation Loc) const { 385f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getColumnNumber(getInstantiationLoc(Loc)); 3869dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 3879dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 3889dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 389df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// getLineNumber - Given a SourceLocation, return the spelling line number 3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// for the position indicated. This requires building and caching a table of 3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// line offsets for the MemoryBuffer, so this is not cheap: use only when 3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// about to emit a diagnostic. 393f812a45dd93634c9300ed5533bd26b56374714a1Chris Lattner unsigned getLineNumber(SourceLocation Loc) const; 3949dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 395f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner unsigned getInstantiationLineNumber(SourceLocation Loc) const { 396f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner return getLineNumber(getInstantiationLoc(Loc)); 3979dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 398df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getSpellingLineNumber(SourceLocation Loc) const { 399df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getLineNumber(getSpellingLoc(Loc)); 4009dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// getSourceName - This method returns the name of the file or buffer that 4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// the SourceLocation specifies. This can be modified with #line directives, 4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// etc. 4058b6ca8866f09fd8e018a329a0749d2dcf11b146aChris Lattner const char *getSourceName(SourceLocation Loc) const; 4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 407f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// Given a SourceLocation object, return the instantiation location 408f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// referenced by the ID. 409f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner SourceLocation getInstantiationLoc(SourceLocation Loc) const { 410df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner // File locations work. 4119dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner if (Loc.isFileID()) return Loc; 412df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner 41388054dee0402e4d3c1f64e6b697acc47195c0d72Chris Lattner return MacroIDs[Loc.getMacroID()].getInstantiationLoc(); 4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 416df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// getSpellingLoc - Given a SourceLocation object, return the spelling 417df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// location referenced by the ID. This is the place where the characters 418df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// that make up the lexed token can be found. 419df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation getSpellingLoc(SourceLocation Loc) const { 420df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner // File locations work! 4219dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner if (Loc.isFileID()) return Loc; 4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 423df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner // Look up the macro token's spelling location. 424df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner SourceLocation PLoc = MacroIDs[Loc.getMacroID()].getSpellingLoc(); 425df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return PLoc.getFileLocWithOffset(Loc.getMacroSpellingOffs()); 4269dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 4279dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 4283457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner /// getDecomposedFileLoc - Decompose the specified file location into a raw 4293457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner /// FileID + Offset pair. The first element is the FileID, the second is the 4303457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner /// offset from the start of the buffer of the location. 4312b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner std::pair<FileID, unsigned> getDecomposedFileLoc(SourceLocation Loc) const { 4323457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner assert(Loc.isFileID() && "Isn't a File SourceLocation"); 4333457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 4343457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner // TODO: Add a flag "is first chunk" to SLOC. 4353b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner const SrcMgr::FileIDInfo *FIDInfo = getFIDInfo(Loc.getChunkID()); 4363457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 4373457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner // If this file has been split up into chunks, factor in the chunk number 4383457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner // that the FileID references. 4393457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner unsigned ChunkNo = FIDInfo->getChunkNo(); 4403457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner unsigned Offset = Loc.getRawFilePos(); 4413457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner Offset += (ChunkNo << SourceLocation::FilePosBits); 442b243fe5a812faddf9ec39525727739a85f603ae6Nico Weber 4433b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner assert(Loc.getChunkID() >= ChunkNo && "Unexpected offset"); 4443457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 4453b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner return std::make_pair(FileID::Create(Loc.getChunkID()-ChunkNo), Offset); 4463457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner } 447a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner 448a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner /// getFileID - Return the FileID for a SourceLocation. 449a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner /// 450a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner FileID getFileID(SourceLocation SpellingLoc) const { 451a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getDecomposedFileLoc(SpellingLoc).first; 452a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner } 453a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner 45425ba02630820a798ace3f71a212c7bff00236748Ted Kremenek /// getFullFilePos - This (efficient) method returns the offset from the start 455df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner /// of the file that the specified spelling SourceLocation represents. This 456f7cf85b330bedd2877e1371fb0a83e99751ae162Chris Lattner /// returns the location of the actual character data, not the instantiation 45725ba02630820a798ace3f71a212c7bff00236748Ted Kremenek /// position. 458df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner unsigned getFullFilePos(SourceLocation SpellingLoc) const { 459df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner return getDecomposedFileLoc(SpellingLoc).second; 46025ba02630820a798ace3f71a212c7bff00236748Ted Kremenek } 4613457e8cbaa8a6fec5d69173450655fe0bc38634bChris Lattner 4629fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromSameFile - Returns true if both SourceLocations correspond to 4639fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the same file. 4649fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromSameFile(SourceLocation Loc1, SourceLocation Loc2) const { 465a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc1) == getFileID(Loc2); 4669fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 4679fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek 4689fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// isFromMainFile - Returns true if the file of provided SourceLocation is 4699fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek /// the main file. 4709fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek bool isFromMainFile(SourceLocation Loc) const { 471a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return getFileID(Loc) == getMainFileID(); 4729fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek } 4737bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber 4747bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber /// isInSystemHeader - Returns if a SourceLocation is in a system header. 4757bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber bool isInSystemHeader(SourceLocation Loc) const { 4760b9e736308af5397f558ffc8e780c438c2fdb563Chris Lattner return getFileCharacteristic(Loc) != SrcMgr::C_User; 477721818304ac462d8c6ce05eecd02884033db78f1Chris Lattner } 4789d72851fec9e9c62570a027d42701562bbf29751Chris Lattner SrcMgr::CharacteristicKind getFileCharacteristic(SourceLocation Loc) const { 4793b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner return getFIDInfo(getSpellingLoc(Loc).getChunkID()) 4803b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner ->getFileCharacteristic(); 4817bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber } 48206a062dc784c609b75dca15fd97f468d0d846596Chris Lattner 48306a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 48406a062dc784c609b75dca15fd97f468d0d846596Chris Lattner // Other miscellaneous methods. 48506a062dc784c609b75dca15fd97f468d0d846596Chris Lattner //===--------------------------------------------------------------------===// 486e55f4ee4fd435e29015e2eea952744ee2a621030Ted Kremenek 487c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner // Iterators over FileInfos. 488c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner typedef std::set<SrcMgr::ContentCache>::const_iterator fileinfo_iterator; 489c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_begin() const { return FileInfos.begin(); } 490c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner fileinfo_iterator fileinfo_end() const { return FileInfos.end(); } 491c6fe32a91c7372caf09152ee31a24c4b5d24deedChris Lattner 4925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// PrintStats - Print statistics to stderr. 4935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /// 4945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintStats() const; 49578d85f53b093867bbb0123f016956178eea7343eTed Kremenek 496099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Emit - Emit this SourceManager to Bitcode. 497099b4747042352f69184481a48508b599a8d3f73Ted Kremenek void Emit(llvm::Serializer& S) const; 498099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 499099b4747042352f69184481a48508b599a8d3f73Ted Kremenek /// Read - Reconstitute a SourceManager from Bitcode. 5001f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek static SourceManager* CreateAndRegister(llvm::Deserializer& S, 5011f94100e53a7d45cea706c09ac0f35cf723a8d83Ted Kremenek FileManager &FMgr); 502099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 5035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate: 5048429fca639bb4fbb6d589f85a2cc84513db4f748Cedric Venet friend struct SrcMgr::ContentCache; // Used for deserialization. 505099b4747042352f69184481a48508b599a8d3f73Ted Kremenek 50678d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createFileID - Create a new fileID for the specified ContentCache and 50778d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// include position. This works regardless of whether the ContentCache 50878d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// corresponds to a file or some other input source. 5092b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner FileID createFileID(const SrcMgr::ContentCache* File, 5102b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SourceLocation IncludePos, 5112b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner SrcMgr::CharacteristicKind DirCharacter); 5125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 51378d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// getContentCache - Create or return a cached ContentCache for the specified 51478d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// file. This returns null on failure. 5152b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner const SrcMgr::ContentCache* getContentCache(const FileEntry *SourceFile); 516c16c208e8519476d838ad11fffc8e0ecea50550dTed Kremenek 51778d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// createMemBufferContentCache - Create a new ContentCache for the specified 51878d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// memory buffer. 51978d85f53b093867bbb0123f016956178eea7343eTed Kremenek const SrcMgr::ContentCache* 5202b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner createMemBufferContentCache(const llvm::MemoryBuffer *Buf); 5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5222b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner const SrcMgr::FileIDInfo *getFIDInfo(unsigned FID) const { 5232b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner assert(FID-1 < FileIDs.size() && "Invalid FileID!"); 5242b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return &FileIDs[FID-1]; 5252b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner } 5262b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner const SrcMgr::FileIDInfo *getFIDInfo(FileID FID) const { 5272b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return getFIDInfo(FID.ID); 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5299dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 5302b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner const SrcMgr::ContentCache *getContentCache(FileID FID) const { 5312b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner return getContentCache(getFIDInfo(FID.ID)); 5329dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner } 5339dc1f530c086d2c16f8cba758b0f59a5bf41323aChris Lattner 53478d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// Return the ContentCache structure for the specified FileID. 53578d85f53b093867bbb0123f016956178eea7343eTed Kremenek /// This is always the physical reference for the ID. 53678d85f53b093867bbb0123f016956178eea7343eTed Kremenek const SrcMgr::ContentCache* 53778d85f53b093867bbb0123f016956178eea7343eTed Kremenek getContentCache(const SrcMgr::FileIDInfo* FIDInfo) const { 53878d85f53b093867bbb0123f016956178eea7343eTed Kremenek return FIDInfo->getContentCache(); 53978d85f53b093867bbb0123f016956178eea7343eTed Kremenek } 5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}; 5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} // end namespace clang 5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 546