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