119a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek//==--- SourceLocation.cpp - Compact identifier for Source Files -*- C++ -*-==// 219a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// 319a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// The LLVM Compiler Infrastructure 419a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 719a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// 819a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek//===----------------------------------------------------------------------===// 919a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// 109c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek// This file defines accessor methods for the FullSourceLoc class. 1119a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek// 1219a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek//===----------------------------------------------------------------------===// 1319a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek 1419a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek#include "clang/Basic/SourceLocation.h" 15ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner#include "clang/Basic/PrettyStackTrace.h" 169c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek#include "clang/Basic/SourceManager.h" 173632a35e811096da86d957c3e6ba0e73d75782f5Ted Kremenek#include "llvm/Support/MemoryBuffer.h" 18ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner#include "llvm/Support/raw_ostream.h" 193daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 2019a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenekusing namespace clang; 2119a95bcf3561ed977c48d5f2a2793b60a8c8e573Ted Kremenek 22ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 23ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner// PrettyStackTraceLoc 24ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 25ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid PrettyStackTraceLoc::print(raw_ostream &OS) const { 27ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner if (Loc.isValid()) { 28ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner Loc.print(OS, SM); 29ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << ": "; 30ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner } 31ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << Message << '\n'; 32ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner} 33ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 34ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 35ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner// SourceLocation 36ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 37ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{ 39b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (!isValid()) { 40ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << "<invalid loc>"; 41b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner return; 42b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner if (isFileID()) { 45b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner PresumedLoc PLoc = SM.getPresumedLoc(*this); 46cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor 47cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor if (PLoc.isInvalid()) { 48cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor OS << "<invalid>"; 49cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor return; 50cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor } 513201f382956ed9beee9fb31229c2835c1208889cChandler Carruth // The macro expansion and spelling pos is identical for file locs. 52ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << PLoc.getFilename() << ':' << PLoc.getLine() 53ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner << ':' << PLoc.getColumn(); 54b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner return; 55b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner } 561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57402785357ab053dd53f4fdd858b9630a5e0f8badChandler Carruth SM.getExpansionLoc(*this).print(OS, SM); 58ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 59ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << " <Spelling="; 60ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner SM.getSpellingLoc(*this).print(OS, SM); 61ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner OS << '>'; 62b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner} 63b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 64ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattnervoid SourceLocation::dump(const SourceManager &SM) const { 65ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner print(llvm::errs(), SM); 66ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner} 67b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner 68ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 69ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner// FullSourceLoc 70ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner//===----------------------------------------------------------------------===// 71ae50fa0a9e7217b043ed4ffe175af4b26dc90f34Chris Lattner 723b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris LattnerFileID FullSourceLoc::getFileID() const { 733b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner assert(isValid()); 74a11d61793341fea195c29a0dab3fbd74f2b39a8cChris Lattner return SrcMgr->getFileID(*this); 753b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner} 763b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner 773b4d5e955e819dd3a4bed37ea2e47d6e4cb05274Chris Lattner 78402785357ab053dd53f4fdd858b9630a5e0f8badChandler CarruthFullSourceLoc FullSourceLoc::getExpansionLoc() const { 79a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 80402785357ab053dd53f4fdd858b9630a5e0f8badChandler Carruth return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr); 815c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner} 825c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner 83df7c17a8d02fe09a3466786bae3e40fc3252687aChris LattnerFullSourceLoc FullSourceLoc::getSpellingLoc() const { 84df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner assert(isValid()); 85a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); 869c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek} 879c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek 88642116259e8df6286063a17361c20e95b5017a0aChandler Carruthunsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const { 89a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 90642116259e8df6286063a17361c20e95b5017a0aChandler Carruth return SrcMgr->getExpansionLineNumber(*this, Invalid); 911758b07ef7c554b06c48a43df2edaba85e918031Ted Kremenek} 921758b07ef7c554b06c48a43df2edaba85e918031Ted Kremenek 93a77c031cb66f75d22672070052cc6e0205289ff8Chandler Carruthunsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const { 94a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 95a77c031cb66f75d22672070052cc6e0205289ff8Chandler Carruth return SrcMgr->getExpansionColumnNumber(*this, Invalid); 961758b07ef7c554b06c48a43df2edaba85e918031Ted Kremenek} 971758b07ef7c554b06c48a43df2edaba85e918031Ted Kremenek 9864e462dff03492c586be0349ec6aa3ad5cd92720Douglas Gregorunsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const { 99a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 10064e462dff03492c586be0349ec6aa3ad5cd92720Douglas Gregor return SrcMgr->getSpellingLineNumber(*this, Invalid); 1015c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner} 1025c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner 10364e462dff03492c586be0349ec6aa3ad5cd92720Douglas Gregorunsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const { 104a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 10564e462dff03492c586be0349ec6aa3ad5cd92720Douglas Gregor return SrcMgr->getSpellingColumnNumber(*this, Invalid); 1065c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner} 1075c38b6388dc44dcb8467a9e0f22d93db7221717eChris Lattner 1087bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weberbool FullSourceLoc::isInSystemHeader() const { 109a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 110a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner return SrcMgr->isInSystemHeader(*this); 1117bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber} 1127bfaaaecb3113f955db31e8d8a51acffd1bc0c27Nico Weber 1130827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidisbool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const { 1140827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis assert(isValid()); 1150827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis return SrcMgr->isBeforeInTranslationUnit(*this, Loc); 1160827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis} 1170827408865e32789e0ec4b8113a302ccdc531423Argyrios Kyrtzidis 118a6c10681e57c292e16a18bdb9891c8db6ebe5c83Benjamin Kramervoid FullSourceLoc::dump() const { 119a6c10681e57c292e16a18bdb9891c8db6ebe5c83Benjamin Kramer SourceLocation::dump(*SrcMgr); 120a6c10681e57c292e16a18bdb9891c8db6ebe5c83Benjamin Kramer} 121a6c10681e57c292e16a18bdb9891c8db6ebe5c83Benjamin Kramer 122a543016fe07030f695d6d56fd22c8c8da617e0d7Douglas Gregorconst char *FullSourceLoc::getCharacterData(bool *Invalid) const { 1234abb87ef149b98b5762eadaaf10c1ccf35dc7c41Chris Lattner assert(isValid()); 124a543016fe07030f695d6d56fd22c8c8da617e0d7Douglas Gregor return SrcMgr->getCharacterData(*this, Invalid); 1259c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek} 1269c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek 127aae58b0c3efb5fa9f97a3e4b1c1a2d31077efe5bDouglas Gregorconst llvm::MemoryBuffer* FullSourceLoc::getBuffer(bool *Invalid) const { 128a50bd54164393ca3cd08016e7099bdeb531b5014Chris Lattner assert(isValid()); 129aae58b0c3efb5fa9f97a3e4b1c1a2d31077efe5bDouglas Gregor return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid); 1309c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek} 1319fd87b1db485e2f31d0e5687f9168b370d546847Ted Kremenek 1325f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef FullSourceLoc::getBufferData(bool *Invalid) const { 133aae58b0c3efb5fa9f97a3e4b1c1a2d31077efe5bDouglas Gregor return getBuffer(Invalid)->getBuffer(); 1343632a35e811096da86d957c3e6ba0e73d75782f5Ted Kremenek} 135321abd4583dc02a254489132c5ccbe125d18ce4fTed Kremenek 136321abd4583dc02a254489132c5ccbe125d18ce4fTed Kremenekstd::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const { 137321abd4583dc02a254489132c5ccbe125d18ce4fTed Kremenek return SrcMgr->getDecomposedLoc(*this); 138321abd4583dc02a254489132c5ccbe125d18ce4fTed Kremenek} 139