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