diff options
author | Chris Lattner <sabre@nondot.org> | 2009-01-27 07:57:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-01-27 07:57:44 +0000 |
commit | f1ca7d3e02e0fb4d5fa6ed56459a31776e82a605 (patch) | |
tree | 872fc3a12f4820197ea23bf6e061c048bdce7b14 /clang/lib/Basic/SourceManager.cpp | |
parent | c360bf2e4868ec6455cea10e26764456098adc5e (diff) | |
download | bcm5719-llvm-f1ca7d3e02e0fb4d5fa6ed56459a31776e82a605.tar.gz bcm5719-llvm-f1ca7d3e02e0fb4d5fa6ed56459a31776e82a605.zip |
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.
llvm-svn: 63098
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r-- | clang/lib/Basic/SourceManager.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 9b509a56845..88292cd42bd 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/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()); } //===----------------------------------------------------------------------===// |