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)