SourceLocation.h revision 9fd87b1db485e2f31d0e5687f9168b370d546847
1ce99120084f549a523213064648662a704e8b789Chris Lattner//===--- SourceLocation.h - Compact identifier for Source Files -*- C++ -*-===// 2ce99120084f549a523213064648662a704e8b789Chris Lattner// 3ce99120084f549a523213064648662a704e8b789Chris Lattner// The LLVM Compiler Infrastructure 4ce99120084f549a523213064648662a704e8b789Chris Lattner// 5ce99120084f549a523213064648662a704e8b789Chris Lattner// This file is distributed under the University of Illinois Open Source 6ce99120084f549a523213064648662a704e8b789Chris Lattner// License. See LICENSE.TXT for details. 7ce99120084f549a523213064648662a704e8b789Chris Lattner// 8ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===// 9ce99120084f549a523213064648662a704e8b789Chris Lattner// 10ce99120084f549a523213064648662a704e8b789Chris Lattner// This file defines the SourceLocation class. 11ce99120084f549a523213064648662a704e8b789Chris Lattner// 12ce99120084f549a523213064648662a704e8b789Chris Lattner//===----------------------------------------------------------------------===// 139d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman 14255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#ifndef LLVM_CLANG_SOURCELOCATION_H 15ce99120084f549a523213064648662a704e8b789Chris Lattner#define LLVM_CLANG_SOURCELOCATION_H 16ce99120084f549a523213064648662a704e8b789Chris Lattner 17ce99120084f549a523213064648662a704e8b789Chris Lattner#include <cassert> 18ce99120084f549a523213064648662a704e8b789Chris Lattner#include "llvm/Bitcode/SerializationFwd.h" 19ce99120084f549a523213064648662a704e8b789Chris Lattner 20ce99120084f549a523213064648662a704e8b789Chris Lattnernamespace llvm { 21cf70590c38ef580758c8a255519959fc7160fdb2Meador Ingeclass MemoryBuffer; 22cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge} 23cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 24cf70590c38ef580758c8a255519959fc7160fdb2Meador Ingenamespace clang { 258e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer 268e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramerclass SourceManager; 2772c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smithclass FileEntry; 2872c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smith 298e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer/// SourceLocation - This is a carefully crafted 32-bit identifier that encodes 308e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer/// a full include stack, line and column number information for a position in 3172c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smith/// an input translation unit. 3272c8331ec1437f8c33fff1dac1ea0ebb11009411Richard Smithclass SourceLocation { 338e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer unsigned ID; 348e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramerpublic: 358e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer enum { 368e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // FileID Layout: 378e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // bit 31: 0 -> FileID, 1 -> MacroID (invalid for FileID) 388e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // 30...17 -> FileID of source location, index into SourceManager table. 398e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer FileIDBits = 14, 408e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // 0...16 -> Index into the chunk of the specified FileID. 418e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer FilePosBits = 32-1-FileIDBits, 428e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer 438e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // MacroID Layout: 448e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // bit 31: 1 -> MacroID, 0 -> FileID (invalid for MacroID) 458e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer 468e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // bit 29,30: unused. 478e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer 488e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer // bits 28...9 -> MacroID number. 49208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson MacroIDBits = 20, 50208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson // bits 8...0 -> Macro Physical offset 51208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson MacroPhysOffsBits = 9, 52208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson 53d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 54d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson // Useful constants. 55d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson ChunkSize = (1 << FilePosBits) 56d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson }; 57d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 58d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson SourceLocation() : ID(0) {} // 0 is an invalid FileID. 59d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 60d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool isFileID() const { return (ID >> 31) == 0; } 61d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool isMacroID() const { return (ID >> 31) != 0; } 62cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 63cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// isValid - Return true if this is a valid SourceLocation object. Invalid 64cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// SourceLocations are often used when events have no corresponding location 65cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// in the source (e.g. a diagnostic is required for a command line option). 66d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson /// 67d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool isValid() const { return ID != 0; } 68208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson bool isInvalid() const { return ID == 0; } 69208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson 70208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson static SourceLocation getFileLoc(unsigned FileID, unsigned FilePos) { 71208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson SourceLocation L; 72208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson // If a FilePos is larger than (1<<FilePosBits), the SourceManager makes 73208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson // enough consequtive FileIDs that we have one for each chunk. 74208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson if (FilePos >= ChunkSize) { 75208130f11331eccab26c0a6f3146cd1891e53e33Bob Wilson FileID += FilePos >> FilePosBits; 76b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd FilePos &= ChunkSize-1; 77b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd } 78b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd 79b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd // FIXME: Find a way to handle out of FileID bits! Maybe MaxFileID is an 80b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd // escape of some sort? 81b704d23062aa78b00999b75dcdcb628d4d84ee3fPreston Gurd assert(FileID < (1 << FileIDBits) && "Out of fileid's"); 82cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 83cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge L.ID = (FileID << FilePosBits) | FilePos; 84cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge return L; 85cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 86cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 87cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge static bool isValidMacroPhysOffs(int Val) { 886098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge if (Val >= 0) 896098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge return Val < (1 << (MacroPhysOffsBits-1)); 90cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge return -Val < (1 << (MacroPhysOffsBits-1)); 91cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 928ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 938ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier static SourceLocation getMacroLoc(unsigned MacroID, int PhysOffs){ 948ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier assert(MacroID < (1 << MacroIDBits) && "Too many macros!"); 958ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier assert(isValidMacroPhysOffs(PhysOffs) && "Physoffs too large!"); 966871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 976871d1eceba0455707de29708c36ae3c2778c160Chad Rosier // Mask off sign bits. 986871d1eceba0455707de29708c36ae3c2778c160Chad Rosier PhysOffs &= (1 << MacroPhysOffsBits)-1; 996871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1006871d1eceba0455707de29708c36ae3c2778c160Chad Rosier SourceLocation L; 1016871d1eceba0455707de29708c36ae3c2778c160Chad Rosier L.ID = (1 << 31) | 102d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson (MacroID << MacroPhysOffsBits) | 103d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson PhysOffs; 1048ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier return L; 1058ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier } 1068ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 1078ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 1086871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// getFileID - Return the file identifier for this SourceLocation. This 1096871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// FileID can be used with the SourceManager object to obtain an entire 1106871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// include stack for a file position reference. 1116871d1eceba0455707de29708c36ae3c2778c160Chad Rosier unsigned getFileID() const { 1126871d1eceba0455707de29708c36ae3c2778c160Chad Rosier assert(isFileID() && "can't get the file id of a non-file sloc!"); 1136871d1eceba0455707de29708c36ae3c2778c160Chad Rosier return ID >> FilePosBits; 114d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson } 115d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 1168ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// getRawFilePos - Return the byte offset from the start of the file-chunk 1178ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// referred to by FileID. This method should not be used to get the offset 11832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// from the start of the file, instead you should use 11932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier /// SourceManager::getDecomposedFileLoc. This method will be 12032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier // incorrect for large files. 12132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier unsigned getRawFilePos() const { 122d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson assert(isFileID() && "can't get the file id of a non-file sloc!"); 123d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson return ID & (ChunkSize-1); 124d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson } 125d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 1266871d1eceba0455707de29708c36ae3c2778c160Chad Rosier unsigned getMacroID() const { 1276871d1eceba0455707de29708c36ae3c2778c160Chad Rosier assert(isMacroID() && "Is not a macro id!"); 1286871d1eceba0455707de29708c36ae3c2778c160Chad Rosier return (ID >> MacroPhysOffsBits) & ((1 << MacroIDBits)-1); 1296871d1eceba0455707de29708c36ae3c2778c160Chad Rosier } 1306871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1316871d1eceba0455707de29708c36ae3c2778c160Chad Rosier int getMacroPhysOffs() const { 132d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson assert(isMacroID() && "Is not a macro id!"); 133d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson int Val = ID & ((1 << MacroPhysOffsBits)-1); 134cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge // Sign extend it properly. 135cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned ShAmt = sizeof(int)*8 - MacroPhysOffsBits; 136cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge return (Val << ShAmt) >> ShAmt; 137cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 138cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 139cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// getFileLocWithOffset - Return a source location with the specified offset 140cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// from this file SourceLocation. 141cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge SourceLocation getFileLocWithOffset(int Offset) const { 142cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned FileID = getFileID(); 143cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge Offset += getRawFilePos(); 144cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge // Handle negative offsets correctly. 145cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge while (Offset < 0) { 146cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge --FileID; 147cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge Offset += ChunkSize; 1488e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer } 1498e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer return getFileLoc(FileID, Offset); 1506871d1eceba0455707de29708c36ae3c2778c160Chad Rosier } 1516871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1526871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// getRawEncoding - When a SourceLocation itself cannot be used, this returns 1536871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// an (opaque) 32-bit integer encoding for it. This should only be passed 1546871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// to SourceLocation::getFromRawEncoding, it should not be inspected 1556871d1eceba0455707de29708c36ae3c2778c160Chad Rosier /// directly. 1568ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier unsigned getRawEncoding() const { return ID; } 1578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 1588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// getFromRawEncoding - Turn a raw encoding of a SourceLocation object into 1598ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// a real SourceLocation. 160d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson static SourceLocation getFromRawEncoding(unsigned Encoding) { 161d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson SourceLocation X; 162cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge X.ID = Encoding; 163cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge return X; 164cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 165cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 166cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// Emit - Emit this SourceLocation object to Bitcode. 167cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge void Emit(llvm::Serializer& S) const; 168cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 169cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge /// ReadVal - Read a SourceLocation object from Bitcode. 170243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson static SourceLocation ReadVal(llvm::Deserializer& D); 171243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson}; 172243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson 173243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Andersoninline bool operator==(const SourceLocation &LHS, const SourceLocation &RHS) { 174243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson return LHS.getRawEncoding() == RHS.getRawEncoding(); 175243eb9ecbbc6775e346e94025bd255bbceac9fcaOwen Anderson} 1768ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 1778ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosierinline bool operator!=(const SourceLocation &LHS, const SourceLocation &RHS) { 1788ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier return !(LHS == RHS); 1798ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier} 1808ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 1818ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier/// SourceRange - a trival tuple used to represent a source range. 1828ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosierclass SourceRange { 1838ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier SourceLocation B; 184d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson SourceLocation E; 185d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilsonpublic: 186d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson SourceRange(): B(SourceLocation()), E(SourceLocation()) {} 187d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson SourceRange(SourceLocation loc) : B(loc), E(loc) {} 188cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge SourceRange(SourceLocation begin, SourceLocation end) : B(begin), E(end) {} 189cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 1908ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier SourceLocation getBegin() const { return B; } 1918ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier SourceLocation getEnd() const { return E; } 1926871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1936871d1eceba0455707de29708c36ae3c2778c160Chad Rosier void setBegin(SourceLocation b) { B = b; } 1946871d1eceba0455707de29708c36ae3c2778c160Chad Rosier void setEnd(SourceLocation e) { E = e; } 1956871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1966871d1eceba0455707de29708c36ae3c2778c160Chad Rosier bool isValid() const { return B.isValid() && E.isValid(); } 1976871d1eceba0455707de29708c36ae3c2778c160Chad Rosier 1988ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// Emit - Emit this SourceRange object to Bitcode. 1998ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier void Emit(llvm::Serializer& S) const; 2008ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 2018ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier /// ReadVal - Read a SourceRange object from Bitcode. 202d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson static SourceRange ReadVal(llvm::Deserializer& D); 203d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson}; 204d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 205d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson/// FullSourceLoc - A tuple containing both a SourceLocation 206d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson/// and its associated SourceManager. Useful for argument passing to functions 207d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson/// that expect both objects. 2088ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosierclass FullSourceLoc { 2098ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier SourceLocation Loc; 2108ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier SourceManager* SrcMgr; 211d5bda5ec663f43710fe462f44b77ddbcf8fe9d9eJoe Groffpublic: 212d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson // Creates a FullSourceLoc where isValid() returns false. 213d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson explicit FullSourceLoc() 2148ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier : Loc(SourceLocation()), SrcMgr((SourceManager*) 0) {} 2158ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 2168ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier explicit FullSourceLoc(SourceLocation loc, SourceManager& smgr) 2178ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier : Loc(loc), SrcMgr(&smgr) {} 218d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 219d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool isValid() const { return Loc.isValid(); } 220cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge bool isInvalid() const { return Loc.isInvalid(); } 221cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 222cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge SourceLocation getLocation() const { return Loc; } 223cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 224cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge SourceManager& getManager() { 225cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge assert (SrcMgr && "SourceManager is NULL."); 226cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge return *SrcMgr; 227cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 228cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 229cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge const SourceManager& getManager() const { 2306098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge assert (SrcMgr && "SourceManager is NULL."); 2316098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge return *SrcMgr; 2326098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge } 2336098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge 2346098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge FullSourceLoc getLogicalLoc(); 2356098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge FullSourceLoc getIncludeLoc(); 236cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 237cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned getLineNumber() const; 238cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned getColumnNumber() const; 239cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 240cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned getLogicalLineNumber() const; 241cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge unsigned getLogicalColumnNumber() const; 242cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 243cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge const char *getCharacterData() const; 244d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 245d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson const llvm::MemoryBuffer* getBuffer() const; 246cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 247cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge const char* getSourceName() const; 2488ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier const FileEntry* getFileEntryForLoc() const; 2498ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 2508ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier bool isFileID() const { return Loc.isFileID(); } 2518ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier 252d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson unsigned getCanonicalFileID() const; 253d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson 25432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier bool operator==(const FullSourceLoc& RHS) const { 25532b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier return SrcMgr == RHS.SrcMgr && Loc == RHS.Loc; 25632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier } 25732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier 258d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson bool operator!=(const FullSourceLoc& RHS) const { 259d1e672e0234b99dbff78baed0e47d033cf963abeBob Wilson return SrcMgr != RHS.SrcMgr || Loc != RHS.Loc; 260cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge } 261cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge}; 262cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge 263cf70590c38ef580758c8a255519959fc7160fdb2Meador Inge} // end namespace clang 2646098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge 2656098c6b56be5a8e3c7ac5273110589f251b03573Meador Inge#endif 2668d32463a9fa2aba9de552350a5019099edf0b90dNuno Lopes