aboutsummaryrefslogtreecommitdiff
path: root/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-01-27 07:57:44 +0000
committerChris Lattner <sabre@nondot.org>2009-01-27 07:57:44 +0000
commitb9c3f966b103f7cfe8e5e60007c4c8b38f7298eb (patch)
treed10a3e7c028ae1ae13bef1b61f7da4aff02ef207 /lib/Basic/SourceManager.cpp
parent52c29081281955d3db9e11d10573b2d38f709099 (diff)
Introduce a new PresumedLoc class to represent the concept of a location
as reported to the user and as manipulated by #line. This is what __FILE__, __INCLUDE_LEVEL__, diagnostics and other things should follow (but not dependency generation!). This patch also includes several cleanups along the way: - SourceLocation now has a dump method, and several other places that did similar things now use it. - I cleaned up some code in AnalysisConsumer, but it should probably be simplified further now that NamedDecl is better. - TextDiagnosticPrinter is now simplified and cleaned up a bit. This patch is a prerequisite for #line, but does not actually provide any #line functionality. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63098 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic/SourceManager.cpp')
-rw-r--r--lib/Basic/SourceManager.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 9b509a5684..88292cd42b 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -552,18 +552,31 @@ unsigned SourceManager::getLineNumber(SourceLocation Loc) const {
return LineNo;
}
-/// getSourceName - This method returns the name of the file or buffer that
-/// the SourceLocation specifies. This can be modified with #line directives,
-/// etc.
-const char *SourceManager::getSourceName(SourceLocation Loc) const {
- if (Loc.isInvalid()) return "";
+/// getPresumedLoc - This method returns the "presumed" location of a
+/// SourceLocation specifies. A "presumed location" can be modified by #line
+/// or GNU line marker directives. This provides a view on the data that a
+/// user should see in diagnostics, for example.
+///
+/// Note that a presumed location is always given as the instantiation point
+/// of an instantiation location, not at the spelling location.
+PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const {
+ if (Loc.isInvalid()) return PresumedLoc();
+
+ // Presumed locations are always for instantiation points.
+ Loc = getInstantiationLoc(Loc);
- const SrcMgr::ContentCache *C =
- getSLocEntry(getFileID(getSpellingLoc(Loc))).getFile().getContentCache();
+ // FIXME: Could just decompose Loc once!
+ const SrcMgr::FileInfo &FI = getSLocEntry(getFileID(Loc)).getFile();
+ const SrcMgr::ContentCache *C = FI.getContentCache();
+
// To get the source name, first consult the FileEntry (if one exists) before
// the MemBuffer as this will avoid unnecessarily paging in the MemBuffer.
- return C->Entry ? C->Entry->getName() : C->getBuffer()->getBufferIdentifier();
+ const char *Filename =
+ C->Entry ? C->Entry->getName() : C->getBuffer()->getBufferIdentifier();
+
+ return PresumedLoc(Filename, getLineNumber(Loc), getColumnNumber(Loc),
+ FI.getIncludeLoc());
}
//===----------------------------------------------------------------------===//