summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2009-06-20 08:09:57 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2009-06-20 08:09:57 +0000
commit88f663c04dd3fa867c3d89f9b88aaf177a8a0159 (patch)
treea8ebcc89d63dd0cf9d595272a7e06fc950be718b /clang/lib/Basic/SourceManager.cpp
parent1ead0b42dbb1417bf5bb89d5fa9f0c4182e7ce02 (diff)
downloadbcm5719-llvm-88f663c04dd3fa867c3d89f9b88aaf177a8a0159.tar.gz
bcm5719-llvm-88f663c04dd3fa867c3d89f9b88aaf177a8a0159.zip
Introduce SourceManager::getLocation() to get a source location out of a "file:line:column" triplet.
llvm-svn: 73823
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r--clang/lib/Basic/SourceManager.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index ed5eb46c284..867e1bdf553 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -358,7 +358,10 @@ FileID SourceManager::createFileID(const ContentCache *File,
SLocEntryTable[PreallocatedID]
= SLocEntry::get(Offset, FileInfo::get(IncludePos, File, FileCharacter));
SLocEntryLoaded[PreallocatedID] = true;
- return LastFileIDLookup = FileID::get(PreallocatedID);
+ FileID FID = FileID::get(PreallocatedID);
+ if (File->FirstFID.isInvalid())
+ File->FirstFID = FID;
+ return LastFileIDLookup = FID;
}
SLocEntryTable.push_back(SLocEntry::get(NextOffset,
@@ -914,6 +917,43 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
// Other miscellaneous methods.
//===----------------------------------------------------------------------===//
+/// \brief Get the source location for the given file:line:col triplet.
+///
+/// If the source file is included multiple times, the source location will
+/// be based upon the first inclusion.
+SourceLocation SourceManager::getLocation(const FileEntry *SourceFile,
+ unsigned Line, unsigned Col) const {
+ assert(SourceFile && "Null source file!");
+ assert(Line && Col && "Line and column should start from 1!");
+
+ fileinfo_iterator FI = FileInfos.find(SourceFile);
+ if (FI == FileInfos.end())
+ return SourceLocation();
+ ContentCache *Content = FI->second;
+
+ // If this is the first use of line information for this buffer, compute the
+ /// SourceLineCache for it on demand.
+ if (Content->SourceLineCache == 0)
+ ComputeLineNumbers(Content, ContentCacheAlloc);
+
+ if (Line > Content->NumLines)
+ return SourceLocation();
+
+ unsigned FilePos = Content->SourceLineCache[Line - 1];
+ const char *BufStart = Content->getBuffer()->getBufferStart();
+ const char *BufEnd = Content->getBuffer()->getBufferEnd();
+ const char *p = BufStart;
+
+ // Check that the given column is valid.
+ while (p < BufEnd && *p != '\n' && *p != '\r')
+ ++p;
+ if (Col > p-BufStart)
+ return SourceLocation();
+
+ return getLocForStartOfFile(Content->FirstFID).
+ getFileLocWithOffset(FilePos + Col - 1);
+}
+
/// PrintStats - Print statistics to stderr.
///
OpenPOWER on IntegriCloud