SourceLocation.h revision ec5d81b73fc8b7bceaf7a8ad3c7a1ffd6dca78b8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- SourceLocation.h - Compact identifier for Source Files -*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  This file defines the SourceLocation class.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_SOURCELOCATION_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_SOURCELOCATION_H
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Bitcode/SerializationFwd.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryBuffer;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SourceManager;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileEntry;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// SourceLocation - This is a carefully crafted 32-bit identifier that encodes
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// a full include stack, line and column number information for a position in
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// an input translation unit.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SourceLocation {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned ID;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FileID Layout:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // bit 31: 0 -> FileID, 1 -> MacroID (invalid for FileID)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //     30...17 -> FileID of source location, index into SourceManager table.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FileIDBits  = 14,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //      0...16 -> Index into the chunk of the specified FileID.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FilePosBits = 32-1-FileIDBits,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // MacroID Layout:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // bit 31: 1 -> MacroID, 0 -> FileID (invalid for MacroID)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // bit 29,30: unused.
473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // bits 28...9 -> MacroID number.
493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    MacroIDBits       = 20,
503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // bits 8...0  -> Macro Physical offset
513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    MacroPhysOffsBits = 9,
523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // Useful constants.
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    ChunkSize = (1 << FilePosBits)
563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  };
573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  SourceLocation() : ID(0) {}  // 0 is an invalid FileID.
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool isFileID() const { return (ID >> 31) == 0; }
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool isMacroID() const { return (ID >> 31) != 0; }
623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  /// isValid - Return true if this is a valid SourceLocation object.  Invalid
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  /// SourceLocations are often used when events have no corresponding location
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  /// in the source (e.g. a diagnostic is required for a command line option).
663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ///
673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool isValid() const { return ID != 0; }
683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  bool isInvalid() const { return ID == 0; }
693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  static SourceLocation getFileLoc(unsigned FileID, unsigned FilePos) {
713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    SourceLocation L;
723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // If a FilePos is larger than (1<<FilePosBits), the SourceManager makes
733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // enough consequtive FileIDs that we have one for each chunk.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (FilePos >= ChunkSize) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileID += FilePos >> FilePosBits;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FilePos &= ChunkSize-1;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: Find a way to handle out of FileID bits!  Maybe MaxFileID is an
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // escape of some sort?
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(FileID < (1 << FileIDBits) && "Out of fileid's");
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L.ID = (FileID << FilePosBits) | FilePos;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return L;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool isValidMacroPhysOffs(int Val) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Val >= 0)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return Val < (1 << (MacroPhysOffsBits-1));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -Val < (1 << (MacroPhysOffsBits-1));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SourceLocation getMacroLoc(unsigned MacroID, int PhysOffs){
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(MacroID < (1 << MacroIDBits) && "Too many macros!");
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    assert(isValidMacroPhysOffs(PhysOffs) && "Physoffs too large!");
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mask off sign bits.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PhysOffs &= (1 << MacroPhysOffsBits)-1;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SourceLocation L;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    L.ID = (1 << 31) |
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           (MacroID << MacroPhysOffsBits) |
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           PhysOffs;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return L;
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// getFileID - Return the file identifier for this SourceLocation.  This
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// FileID can be used with the SourceManager object to obtain an entire
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// include stack for a file position reference.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned getFileID() const {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(isFileID() && "can't get the file id of a non-file sloc!");
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return ID >> FilePosBits;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getRawFilePos - Return the byte offset from the start of the file-chunk
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// referred to by FileID.  This method should not be used to get the offset
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// from the start of the file, instead you should use
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// SourceManager::getDecomposedFileLoc.  This method will be
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  incorrect for large files.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned getRawFilePos() const {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(isFileID() && "can't get the file id of a non-file sloc!");
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ID & (ChunkSize-1);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned getMacroID() const {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(isMacroID() && "Is not a macro id!");
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return (ID >> MacroPhysOffsBits) & ((1 << MacroIDBits)-1);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int getMacroPhysOffs() const {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(isMacroID() && "Is not a macro id!");
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int Val = ID & ((1 << MacroPhysOffsBits)-1);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Sign extend it properly.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned ShAmt = sizeof(int)*8 - MacroPhysOffsBits;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (Val << ShAmt) >> ShAmt;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// getFileLocWithOffset - Return a source location with the specified offset
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// from this file SourceLocation.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation getFileLocWithOffset(int Offset) const {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned FileID = getFileID();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Offset += getRawFilePos();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Handle negative offsets correctly.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (Offset < 0) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      --FileID;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Offset += ChunkSize;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getFileLoc(FileID, Offset);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getRawEncoding - When a SourceLocation itself cannot be used, this returns
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// an (opaque) 32-bit integer encoding for it.  This should only be passed
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// to SourceLocation::getFromRawEncoding, it should not be inspected
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// directly.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned getRawEncoding() const { return ID; }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getFromRawEncoding - Turn a raw encoding of a SourceLocation object into
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// a real SourceLocation.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SourceLocation getFromRawEncoding(unsigned Encoding) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SourceLocation X;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    X.ID = Encoding;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return X;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Emit - Emit this SourceLocation object to Bitcode.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Emit(llvm::Serializer& S) const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ReadVal - Read a SourceLocation object from Bitcode.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SourceLocation ReadVal(llvm::Deserializer& D);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline bool operator==(const SourceLocation &LHS, const SourceLocation &RHS) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return LHS.getRawEncoding() == RHS.getRawEncoding();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline bool operator!=(const SourceLocation &LHS, const SourceLocation &RHS) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !(LHS == RHS);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// SourceRange - a trival tuple used to represent a source range.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SourceRange {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation B;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation E;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceRange(): B(SourceLocation()), E(SourceLocation()) {}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceRange(SourceLocation loc) : B(loc), E(loc) {}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceRange(SourceLocation begin, SourceLocation end) : B(begin), E(end) {}
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation getBegin() const { return B; }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation getEnd() const { return E; }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setBegin(SourceLocation b) { B = b; }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setEnd(SourceLocation e) { E = e; }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isValid() const { return B.isValid() && E.isValid(); }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// Emit - Emit this SourceRange object to Bitcode.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Emit(llvm::Serializer& S) const;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// ReadVal - Read a SourceRange object from Bitcode.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static SourceRange ReadVal(llvm::Deserializer& D);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// FullSourceLoc - A tuple containing both a SourceLocation
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///  and its associated SourceManager.  Useful for argument passing to functions
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)///  that expect both objects.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FullSourceLoc {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation Loc;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceManager* SrcMgr;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a FullSourceLoc where isValid() returns false.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FullSourceLoc()
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Loc(SourceLocation()), SrcMgr((SourceManager*) 0) {}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FullSourceLoc(SourceLocation loc, SourceManager& smgr)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Loc(loc), SrcMgr(&smgr) {}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isValid() const { return Loc.isValid(); }
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isInvalid() const { return Loc.isInvalid(); }
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceLocation getLocation() const { return Loc; }
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SourceManager& getManager() {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert (SrcMgr && "SourceManager is NULL.");
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *SrcMgr;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SourceManager& getManager() const {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert (SrcMgr && "SourceManager is NULL.");
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *SrcMgr;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FullSourceLoc getLogicalLoc();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FullSourceLoc getIncludeLoc();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned getLineNumber();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned getColumnNumber();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *getCharacterData() const;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const llvm::MemoryBuffer* getBuffer() const;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* getSourceName() const;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileEntry* getFileEntryForLoc() const;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isFileID() const { return Loc.isFileID(); }
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const FullSourceLoc& RHS) const {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SrcMgr == RHS.SrcMgr && Loc == RHS.Loc;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool operator!=(const FullSourceLoc& RHS) const {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SrcMgr != RHS.SrcMgr || Loc != RHS.Loc;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // end namespace clang
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)