blob: 2d60404ee9eb71e827555f1ff2c022b0a56386cb [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- SourceManager.h - Track and cache source files ---------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the SourceManager interface.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SOURCEMANAGER_H
15#define LLVM_CLANG_SOURCEMANAGER_H
16
17#include "clang/Basic/SourceLocation.h"
Ted Kremenek78d85f52007-10-30 21:08:08 +000018#include "llvm/Bitcode/SerializationFwd.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000019#include <vector>
Ted Kremenek78d85f52007-10-30 21:08:08 +000020#include <set>
Reid Spencer5f016e22007-07-11 17:01:13 +000021#include <list>
Chris Lattner9dc62f02007-07-12 15:32:57 +000022#include <cassert>
Reid Spencer5f016e22007-07-11 17:01:13 +000023
24namespace llvm {
25class MemoryBuffer;
26}
27
28namespace clang {
29
30class SourceManager;
Ted Kremenek099b4742007-12-05 00:14:18 +000031class FileManager;
Reid Spencer5f016e22007-07-11 17:01:13 +000032class FileEntry;
33class IdentifierTokenInfo;
34
35/// SrcMgr - Private classes that are part of the SourceManager implementation.
36///
37namespace SrcMgr {
Ted Kremenek78d85f52007-10-30 21:08:08 +000038 /// ContentCache - Once instance of this struct is kept for every file
39 /// loaded or used. This object owns the MemoryBuffer object.
40 struct ContentCache {
41 /// Reference to the file entry. This reference does not own
42 /// the FileEntry object. It is possible for this to be NULL if
43 /// the ContentCache encapsulates an imaginary text buffer.
44 const FileEntry* Entry;
45
Reid Spencer5f016e22007-07-11 17:01:13 +000046 /// Buffer - The actual buffer containing the characters from the input
Ted Kremenekb6427f82007-12-04 18:59:28 +000047 /// file. This is owned by the ContentCache object.
Ted Kremenek78d85f52007-10-30 21:08:08 +000048 const llvm::MemoryBuffer* Buffer;
Reid Spencer5f016e22007-07-11 17:01:13 +000049
50 /// SourceLineCache - A new[]'d array of offsets for each source line. This
Ted Kremenekb6427f82007-12-04 18:59:28 +000051 /// is lazily computed. This is owned by the ContentCache object.
Ted Kremenek78d85f52007-10-30 21:08:08 +000052 unsigned* SourceLineCache;
Reid Spencer5f016e22007-07-11 17:01:13 +000053
Ted Kremenekb6427f82007-12-04 18:59:28 +000054 /// NumLines - The number of lines in this ContentCache. This is only valid
55 /// if SourceLineCache is non-null.
Reid Spencer5f016e22007-07-11 17:01:13 +000056 unsigned NumLines;
Ted Kremenek78d85f52007-10-30 21:08:08 +000057
58 ContentCache(const FileEntry* e = NULL)
59 : Entry(e), Buffer(NULL), SourceLineCache(NULL), NumLines(0) {}
60
61 ~ContentCache();
Ted Kremenek0d892d82007-10-30 22:57:35 +000062
63 /// The copy ctor does not allow copies where source object has either
64 /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory
65 /// is not transfered, so this is a logical error.
66 ContentCache(const ContentCache& RHS) : Buffer(NULL),SourceLineCache(NULL) {
67 Entry = RHS.Entry;
68
69 assert (RHS.Buffer == NULL && RHS.SourceLineCache == NULL
70 && "Passed ContentCache object cannot own a buffer.");
71
72 NumLines = RHS.NumLines;
73 }
74
Ted Kremeneke21272f2007-12-04 19:39:02 +000075 /// Emit - Emit this ContentCache to Bitcode.
Ted Kremenek099b4742007-12-05 00:14:18 +000076 void Emit(llvm::Serializer& S) const;
Ted Kremeneke21272f2007-12-04 19:39:02 +000077
Ted Kremenek099b4742007-12-05 00:14:18 +000078 /// ReadToSourceManager - Reconstitute a ContentCache from Bitcode
79 // and store it in the specified SourceManager.
80 static void ReadToSourceManager(llvm::Deserializer& D, SourceManager& SMgr,
81 FileManager* FMgr, std::vector<char>& Buf);
82
Ted Kremenek0d892d82007-10-30 22:57:35 +000083 private:
84 // Disable assignments.
85 ContentCache& operator=(const ContentCache& RHS);
Ted Kremenek78d85f52007-10-30 21:08:08 +000086 };
Reid Spencer5f016e22007-07-11 17:01:13 +000087
88 /// FileIDInfo - Information about a FileID, basically just the logical file
Chris Lattner31bb8be2007-07-20 18:00:12 +000089 /// that it represents and include stack information. A File SourceLocation
90 /// is a byte offset from the start of this.
Reid Spencer5f016e22007-07-11 17:01:13 +000091 ///
92 /// FileID's are used to compute the location of a character in memory as well
93 /// as the logical source location, which can be differ from the physical
94 /// location. It is different when #line's are active or when macros have
95 /// been expanded.
96 ///
97 /// Each FileID has include stack information, indicating where it came from.
98 /// For the primary translation unit, it comes from SourceLocation() aka 0.
Chris Lattner31bb8be2007-07-20 18:00:12 +000099 /// This information encodes the #include chain that a token was instantiated
100 /// from.
Reid Spencer5f016e22007-07-11 17:01:13 +0000101 ///
Ted Kremenek0d892d82007-10-30 22:57:35 +0000102 /// FileIDInfos contain a "ContentCache *", describing the source file,
103 /// and a Chunk number, which allows a SourceLocation to index into very
104 /// large files (those which there are not enough FilePosBits to address).
Reid Spencer5f016e22007-07-11 17:01:13 +0000105 ///
106 struct FileIDInfo {
Chris Lattner9dc1f532007-07-20 16:37:10 +0000107 private:
Reid Spencer5f016e22007-07-11 17:01:13 +0000108 /// IncludeLoc - The location of the #include that brought in this file.
Chris Lattner9dc1f532007-07-20 16:37:10 +0000109 /// This SourceLocation object has an invalid SLOC for the main file.
Reid Spencer5f016e22007-07-11 17:01:13 +0000110 SourceLocation IncludeLoc;
111
Chris Lattner9dc1f532007-07-20 16:37:10 +0000112 /// ChunkNo - Really large buffers are broken up into chunks that are
113 /// each (1 << SourceLocation::FilePosBits) in size. This specifies the
114 /// chunk number of this FileID.
115 unsigned ChunkNo;
116
Ted Kremenek78d85f52007-10-30 21:08:08 +0000117 /// Content - Information about the source buffer itself.
118 const ContentCache* Content;
Reid Spencer5f016e22007-07-11 17:01:13 +0000119
Ted Kremenek78d85f52007-10-30 21:08:08 +0000120 public:
Chris Lattner9dc1f532007-07-20 16:37:10 +0000121 /// get - Return a FileIDInfo object.
Ted Kremenek78d85f52007-10-30 21:08:08 +0000122 static FileIDInfo get(SourceLocation IL, unsigned CN,
123 const ContentCache *Con) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000124 FileIDInfo X;
Reid Spencer5f016e22007-07-11 17:01:13 +0000125 X.IncludeLoc = IL;
Chris Lattner9dc1f532007-07-20 16:37:10 +0000126 X.ChunkNo = CN;
Ted Kremenek78d85f52007-10-30 21:08:08 +0000127 X.Content = Con;
Reid Spencer5f016e22007-07-11 17:01:13 +0000128 return X;
129 }
130
Chris Lattner9dc1f532007-07-20 16:37:10 +0000131 SourceLocation getIncludeLoc() const { return IncludeLoc; }
132 unsigned getChunkNo() const { return ChunkNo; }
Ted Kremenek78d85f52007-10-30 21:08:08 +0000133 const ContentCache* getContentCache() const { return Content; }
Ted Kremenek099b4742007-12-05 00:14:18 +0000134
135 /// Emit - Emit this FileIDInfo to Bitcode.
136 void Emit(llvm::Serializer& S) const;
137
138 /// ReadVal - Reconstitute a FileIDInfo from Bitcode.
139 static FileIDInfo ReadVal(llvm::Deserializer& S);
Chris Lattner9dc1f532007-07-20 16:37:10 +0000140 };
141
Chris Lattner31bb8be2007-07-20 18:00:12 +0000142 /// MacroIDInfo - Macro SourceLocations refer to these records by their ID.
143 /// Each MacroIDInfo encodes the Instantiation location - where the macro was
144 /// instantiated, and the PhysicalLoc - where the actual character data for
145 /// the token came from. An actual macro SourceLocation stores deltas from
146 /// these positions.
Chris Lattner9dc1f532007-07-20 16:37:10 +0000147 class MacroIDInfo {
Chris Lattner18807d22007-11-09 23:59:17 +0000148 SourceLocation VirtualLoc, PhysicalLoc;
Chris Lattner9dc1f532007-07-20 16:37:10 +0000149 public:
Chris Lattner18807d22007-11-09 23:59:17 +0000150 SourceLocation getVirtualLoc() const { return VirtualLoc; }
Chris Lattner9dc1f532007-07-20 16:37:10 +0000151 SourceLocation getPhysicalLoc() const { return PhysicalLoc; }
Reid Spencer5f016e22007-07-11 17:01:13 +0000152
Chris Lattner18807d22007-11-09 23:59:17 +0000153 /// get - Return a MacroID for a macro expansion. VL specifies
154 /// the instantiation location (where the macro is expanded), and PL
155 /// specifies the physical location (where the characters from the token
156 /// come from). Both VL and PL refer to normal File SLocs.
157 static MacroIDInfo get(SourceLocation VL, SourceLocation PL) {
Chris Lattner9dc1f532007-07-20 16:37:10 +0000158 MacroIDInfo X;
Chris Lattner18807d22007-11-09 23:59:17 +0000159 X.VirtualLoc = VL;
Chris Lattner9dc1f532007-07-20 16:37:10 +0000160 X.PhysicalLoc = PL;
161 return X;
Reid Spencer5f016e22007-07-11 17:01:13 +0000162 }
Ted Kremenek099b4742007-12-05 00:14:18 +0000163
164 /// Emit - Emit this MacroIDInfo to Bitcode.
165 void Emit(llvm::Serializer& S) const;
166
167 /// ReadVal - Reconstitute a MacroIDInfo from Bitcode.
168 static MacroIDInfo ReadVal(llvm::Deserializer& S);
Reid Spencer5f016e22007-07-11 17:01:13 +0000169 };
170} // end SrcMgr namespace.
Ted Kremenek78d85f52007-10-30 21:08:08 +0000171} // end clang namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000172
Ted Kremenek78d85f52007-10-30 21:08:08 +0000173namespace std {
174template <> struct less<clang::SrcMgr::ContentCache> {
175 inline bool operator()(const clang::SrcMgr::ContentCache& L,
176 const clang::SrcMgr::ContentCache& R) const {
177 return L.Entry < R.Entry;
178 }
179};
180} // end std namespace
Reid Spencer5f016e22007-07-11 17:01:13 +0000181
Ted Kremenek78d85f52007-10-30 21:08:08 +0000182namespace clang {
183
Reid Spencer5f016e22007-07-11 17:01:13 +0000184/// SourceManager - This file handles loading and caching of source files into
185/// memory. This object owns the MemoryBuffer objects for all of the loaded
186/// files and assigns unique FileID's for each unique #include chain.
187///
188/// The SourceManager can be queried for information about SourceLocation
189/// objects, turning them into either physical or logical locations. Physical
190/// locations represent where the bytes corresponding to a token came from and
191/// logical locations represent where the location is in the user's view. In
192/// the case of a macro expansion, for example, the physical location indicates
193/// where the expanded token came from and the logical location specifies where
194/// it was expanded. Logical locations are also influenced by #line directives,
195/// etc.
196class SourceManager {
197 /// FileInfos - Memoized information about all of the files tracked by this
Ted Kremenek0d892d82007-10-30 22:57:35 +0000198 /// SourceManager. This set allows us to merge ContentCache entries based
199 /// on their FileEntry*. All ContentCache objects will thus have unique,
200 /// non-null, FileEntry pointers.
Ted Kremenek78d85f52007-10-30 21:08:08 +0000201 std::set<SrcMgr::ContentCache> FileInfos;
Reid Spencer5f016e22007-07-11 17:01:13 +0000202
203 /// MemBufferInfos - Information about various memory buffers that we have
204 /// read in. This is a list, instead of a vector, because we need pointers to
Ted Kremenekb6427f82007-12-04 18:59:28 +0000205 /// the ContentCache objects to be stable. All FileEntry* within the
Ted Kremenek0d892d82007-10-30 22:57:35 +0000206 /// stored ContentCache objects are NULL, as they do not refer to a file.
Ted Kremenek78d85f52007-10-30 21:08:08 +0000207 std::list<SrcMgr::ContentCache> MemBufferInfos;
Reid Spencer5f016e22007-07-11 17:01:13 +0000208
209 /// FileIDs - Information about each FileID. FileID #0 is not valid, so all
210 /// entries are off by one.
211 std::vector<SrcMgr::FileIDInfo> FileIDs;
212
Chris Lattner9dc1f532007-07-20 16:37:10 +0000213 /// MacroIDs - Information about each MacroID.
214 std::vector<SrcMgr::MacroIDInfo> MacroIDs;
215
Chris Lattner5e36a7a2007-07-24 05:57:19 +0000216 /// LastLineNo - These ivars serve as a cache used in the getLineNumber
217 /// method which is used to speedup getLineNumber calls to nearby locations.
218 unsigned LastLineNoFileIDQuery;
Ted Kremenek78d85f52007-10-30 21:08:08 +0000219 SrcMgr::ContentCache *LastLineNoContentCache;
Chris Lattner5e36a7a2007-07-24 05:57:19 +0000220 unsigned LastLineNoFilePos;
221 unsigned LastLineNoResult;
Ted Kremenek78d85f52007-10-30 21:08:08 +0000222
Ted Kremenek76edd0e2007-12-19 22:29:55 +0000223 /// MainFileID - The file ID for the main source file of the translation unit.
224 unsigned MainFileID;
225
Reid Spencer5f016e22007-07-11 17:01:13 +0000226public:
Ted Kremenek76edd0e2007-12-19 22:29:55 +0000227 SourceManager() : LastLineNoFileIDQuery(~0U), MainFileID(0) {}
Ted Kremenek78d85f52007-10-30 21:08:08 +0000228 ~SourceManager() {}
Reid Spencer5f016e22007-07-11 17:01:13 +0000229
Chris Lattnerbd247762007-07-22 06:05:44 +0000230 void clearIDTables() {
231 FileIDs.clear();
232 MacroIDs.clear();
Chris Lattner5e36a7a2007-07-24 05:57:19 +0000233 LastLineNoFileIDQuery = ~0U;
Ted Kremenek78d85f52007-10-30 21:08:08 +0000234 LastLineNoContentCache = 0;
Chris Lattnerbd247762007-07-22 06:05:44 +0000235 }
236
Ted Kremenek76edd0e2007-12-19 22:29:55 +0000237 /// getMainFileID - Returns the FileID of the main source file.
238 unsigned getMainFileID() const { return MainFileID; }
239
Reid Spencer5f016e22007-07-11 17:01:13 +0000240 /// createFileID - Create a new FileID that represents the specified file
241 /// being #included from the specified IncludePosition. This returns 0 on
242 /// error and translates NULL into standard input.
243 unsigned createFileID(const FileEntry *SourceFile, SourceLocation IncludePos){
Ted Kremenek78d85f52007-10-30 21:08:08 +0000244 const SrcMgr::ContentCache *IR = getContentCache(SourceFile);
Reid Spencer5f016e22007-07-11 17:01:13 +0000245 if (IR == 0) return 0; // Error opening file?
246 return createFileID(IR, IncludePos);
247 }
248
Ted Kremenek1036b682007-12-19 23:48:45 +0000249 /// createMainFileID - Create the FileID for the main source file.
250 unsigned createMainFileID(const FileEntry *SourceFile,
251 SourceLocation IncludePos) {
252
253 assert (MainFileID == 0 && "MainFileID already set!");
254 MainFileID = createFileID(SourceFile,IncludePos);
255 return MainFileID;
256 }
257
Reid Spencer5f016e22007-07-11 17:01:13 +0000258 /// createFileIDForMemBuffer - Create a new FileID that represents the
259 /// specified memory buffer. This does no caching of the buffer and takes
260 /// ownership of the MemoryBuffer, so only pass a MemoryBuffer to this once.
261 unsigned createFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) {
Ted Kremenek78d85f52007-10-30 21:08:08 +0000262 return createFileID(createMemBufferContentCache(Buffer), SourceLocation());
Reid Spencer5f016e22007-07-11 17:01:13 +0000263 }
264
Ted Kremenek1036b682007-12-19 23:48:45 +0000265 /// createMainFileIDForMembuffer - Create the FileID for a memory buffer
266 /// that will represent the FileID for the main source. One example
267 /// of when this would be used is when the main source is read from STDIN.
268 unsigned createMainFileIDForMemBuffer(const llvm::MemoryBuffer *Buffer) {
269 assert (MainFileID == 0 && "MainFileID already set!");
270 MainFileID = createMainFileIDForMemBuffer(Buffer);
271 return MainFileID;
272 }
273
Reid Spencer5f016e22007-07-11 17:01:13 +0000274 /// getInstantiationLoc - Return a new SourceLocation that encodes the fact
Chris Lattnerabca2bb2007-07-15 06:35:27 +0000275 /// that a token at Loc should actually be referenced from InstantiationLoc.
276 SourceLocation getInstantiationLoc(SourceLocation Loc,
Reid Spencer5f016e22007-07-11 17:01:13 +0000277 SourceLocation InstantiationLoc);
278
279 /// getBuffer - Return the buffer for the specified FileID.
280 ///
281 const llvm::MemoryBuffer *getBuffer(unsigned FileID) const {
Ted Kremenek78d85f52007-10-30 21:08:08 +0000282 return getContentCache(FileID)->Buffer;
Reid Spencer5f016e22007-07-11 17:01:13 +0000283 }
284
Chris Lattner8a12c272007-10-11 18:38:32 +0000285 /// getBufferData - Return a pointer to the start and end of the character
286 /// data for the specified FileID.
287 std::pair<const char*, const char*> getBufferData(unsigned FileID) const;
288
Reid Spencer5f016e22007-07-11 17:01:13 +0000289 /// getIncludeLoc - Return the location of the #include for the specified
Chris Lattner9dc1f532007-07-20 16:37:10 +0000290 /// SourceLocation. If this is a macro expansion, this transparently figures
291 /// out which file includes the file being expanded into.
292 SourceLocation getIncludeLoc(SourceLocation ID) const {
293 return getFIDInfo(getLogicalLoc(ID).getFileID())->getIncludeLoc();
Reid Spencer5f016e22007-07-11 17:01:13 +0000294 }
295
296 /// getCharacterData - Return a pointer to the start of the specified location
297 /// in the appropriate MemoryBuffer.
298 const char *getCharacterData(SourceLocation SL) const;
299
Chris Lattner9dc1f532007-07-20 16:37:10 +0000300 /// getColumnNumber - Return the column # for the specified file position.
301 /// This is significantly cheaper to compute than the line number. This
302 /// returns zero if the column number isn't known. This may only be called on
303 /// a file sloc, so you must choose a physical or logical location before
304 /// calling this method.
Reid Spencer5f016e22007-07-11 17:01:13 +0000305 unsigned getColumnNumber(SourceLocation Loc) const;
306
Chris Lattner9dc1f532007-07-20 16:37:10 +0000307 unsigned getPhysicalColumnNumber(SourceLocation Loc) const {
308 return getColumnNumber(getPhysicalLoc(Loc));
309 }
310 unsigned getLogicalColumnNumber(SourceLocation Loc) const {
311 return getColumnNumber(getLogicalLoc(Loc));
312 }
313
314
Reid Spencer5f016e22007-07-11 17:01:13 +0000315 /// getLineNumber - Given a SourceLocation, return the physical line number
316 /// for the position indicated. This requires building and caching a table of
317 /// line offsets for the MemoryBuffer, so this is not cheap: use only when
318 /// about to emit a diagnostic.
319 unsigned getLineNumber(SourceLocation Loc);
Chris Lattner9dc1f532007-07-20 16:37:10 +0000320
321 unsigned getLogicalLineNumber(SourceLocation Loc) {
322 return getLineNumber(getLogicalLoc(Loc));
323 }
324 unsigned getPhysicalLineNumber(SourceLocation Loc) {
325 return getLineNumber(getPhysicalLoc(Loc));
326 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000327
Reid Spencer5f016e22007-07-11 17:01:13 +0000328 /// getSourceName - This method returns the name of the file or buffer that
329 /// the SourceLocation specifies. This can be modified with #line directives,
330 /// etc.
Chris Lattner8b6ca882007-08-30 05:59:30 +0000331 const char *getSourceName(SourceLocation Loc) const;
Reid Spencer5f016e22007-07-11 17:01:13 +0000332
Reid Spencer5f016e22007-07-11 17:01:13 +0000333 /// Given a SourceLocation object, return the logical location referenced by
334 /// the ID. This logical location is subject to #line directives, etc.
335 SourceLocation getLogicalLoc(SourceLocation Loc) const {
Chris Lattner9dc1f532007-07-20 16:37:10 +0000336 // File locations are both physical and logical.
337 if (Loc.isFileID()) return Loc;
338
Chris Lattner18807d22007-11-09 23:59:17 +0000339 return MacroIDs[Loc.getMacroID()].getVirtualLoc();
Reid Spencer5f016e22007-07-11 17:01:13 +0000340 }
341
342 /// getPhysicalLoc - Given a SourceLocation object, return the physical
343 /// location referenced by the ID.
344 SourceLocation getPhysicalLoc(SourceLocation Loc) const {
Chris Lattner9dc1f532007-07-20 16:37:10 +0000345 // File locations are both physical and logical.
346 if (Loc.isFileID()) return Loc;
Reid Spencer5f016e22007-07-11 17:01:13 +0000347
Chris Lattner31bb8be2007-07-20 18:00:12 +0000348 SourceLocation PLoc = MacroIDs[Loc.getMacroID()].getPhysicalLoc();
349 return PLoc.getFileLocWithOffset(Loc.getMacroPhysOffs());
Chris Lattner9dc1f532007-07-20 16:37:10 +0000350 }
351
Ted Kremenek78d85f52007-10-30 21:08:08 +0000352 /// getContentCacheForLoc - Return the ContentCache for the physloc of the
Chris Lattner9dc1f532007-07-20 16:37:10 +0000353 /// specified SourceLocation, if one exists.
Ted Kremenek78d85f52007-10-30 21:08:08 +0000354 const SrcMgr::ContentCache* getContentCacheForLoc(SourceLocation Loc) const {
Chris Lattner9dc1f532007-07-20 16:37:10 +0000355 Loc = getPhysicalLoc(Loc);
356 unsigned FileID = Loc.getFileID();
357 assert(FileID-1 < FileIDs.size() && "Invalid FileID!");
Ted Kremenek78d85f52007-10-30 21:08:08 +0000358 return FileIDs[FileID-1].getContentCache();
359 }
360
361 /// getFileEntryForLoc - Return the FileEntry record for the physloc of the
362 /// specified SourceLocation, if one exists.
363 const FileEntry* getFileEntryForLoc(SourceLocation Loc) const {
364 return getContentCacheForLoc(Loc)->Entry;
Reid Spencer5f016e22007-07-11 17:01:13 +0000365 }
366
Chris Lattner3457e8c2007-10-12 20:24:19 +0000367 /// getDecomposedFileLoc - Decompose the specified file location into a raw
368 /// FileID + Offset pair. The first element is the FileID, the second is the
369 /// offset from the start of the buffer of the location.
370 std::pair<unsigned, unsigned> getDecomposedFileLoc(SourceLocation Loc) const {
371 assert(Loc.isFileID() && "Isn't a File SourceLocation");
372
373 // TODO: Add a flag "is first chunk" to SLOC.
374 const SrcMgr::FileIDInfo *FIDInfo = getFIDInfo(Loc.getFileID());
375
376 // If this file has been split up into chunks, factor in the chunk number
377 // that the FileID references.
378 unsigned ChunkNo = FIDInfo->getChunkNo();
379 unsigned Offset = Loc.getRawFilePos();
380 Offset += (ChunkNo << SourceLocation::FilePosBits);
381
382 return std::pair<unsigned,unsigned>(Loc.getFileID()-ChunkNo, Offset);
383 }
384
Reid Spencer5f016e22007-07-11 17:01:13 +0000385 /// PrintStats - Print statistics to stderr.
386 ///
387 void PrintStats() const;
Reid Spencer5f016e22007-07-11 17:01:13 +0000388
Ted Kremenek099b4742007-12-05 00:14:18 +0000389 /// Emit - Emit this SourceManager to Bitcode.
390 void Emit(llvm::Serializer& S) const;
391
392 /// Read - Reconstitute a SourceManager from Bitcode.
Ted Kremenek1f941002007-12-05 00:19:51 +0000393 static SourceManager* CreateAndRegister(llvm::Deserializer& S,
394 FileManager &FMgr);
Ted Kremenek099b4742007-12-05 00:14:18 +0000395
Ted Kremenek78d85f52007-10-30 21:08:08 +0000396private:
Ted Kremenek099b4742007-12-05 00:14:18 +0000397 friend class SrcMgr::ContentCache; // Used for deserialization.
398
Ted Kremenek78d85f52007-10-30 21:08:08 +0000399 /// createFileID - Create a new fileID for the specified ContentCache and
400 /// include position. This works regardless of whether the ContentCache
401 /// corresponds to a file or some other input source.
402 unsigned createFileID(const SrcMgr::ContentCache* File,
403 SourceLocation IncludePos);
404
405 /// getContentCache - Create or return a cached ContentCache for the specified
406 /// file. This returns null on failure.
407 const SrcMgr::ContentCache* getContentCache(const FileEntry* SourceFile);
408
409 /// createMemBufferContentCache - Create a new ContentCache for the specified
410 /// memory buffer.
411 const SrcMgr::ContentCache*
412 createMemBufferContentCache(const llvm::MemoryBuffer* Buf);
413
414 const SrcMgr::FileIDInfo* getFIDInfo(unsigned FileID) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000415 assert(FileID-1 < FileIDs.size() && "Invalid FileID!");
416 return &FileIDs[FileID-1];
417 }
Chris Lattner9dc1f532007-07-20 16:37:10 +0000418
Ted Kremenek78d85f52007-10-30 21:08:08 +0000419 const SrcMgr::ContentCache *getContentCache(unsigned FileID) const {
420 return getContentCache(getFIDInfo(FileID));
Reid Spencer5f016e22007-07-11 17:01:13 +0000421 }
422
Ted Kremenek78d85f52007-10-30 21:08:08 +0000423 /// Return the ContentCache structure for the specified FileID.
424 /// This is always the physical reference for the ID.
425 const SrcMgr::ContentCache*
426 getContentCache(const SrcMgr::FileIDInfo* FIDInfo) const {
427 return FIDInfo->getContentCache();
428 }
Chris Lattner9dc1f532007-07-20 16:37:10 +0000429
430 /// getFullFilePos - This (efficient) method returns the offset from the start
431 /// of the file that the specified physical SourceLocation represents. This
432 /// returns the location of the physical character data, not the logical file
433 /// position.
434 unsigned getFullFilePos(SourceLocation PhysLoc) const {
Chris Lattner3457e8c2007-10-12 20:24:19 +0000435 return getDecomposedFileLoc(PhysLoc).second;
Reid Spencer5f016e22007-07-11 17:01:13 +0000436 }
437};
438
439
440} // end namespace clang
441
442#endif