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/AST | |
| 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/AST')
| -rw-r--r-- | clang/lib/AST/StmtDumper.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/clang/lib/AST/StmtDumper.cpp b/clang/lib/AST/StmtDumper.cpp index 0a7de350d08..83313ed9be9 100644 --- a/clang/lib/AST/StmtDumper.cpp +++ b/clang/lib/AST/StmtDumper.cpp @@ -153,21 +153,26 @@ namespace { void StmtDumper::DumpLocation(SourceLocation Loc) { SourceLocation SpellingLoc = SM->getSpellingLoc(Loc); + + if (SpellingLoc.isInvalid()) { + fprintf(stderr, "<invalid sloc>"); + return; + } // The general format we print out is filename:line:col, but we drop pieces // that haven't changed since the last loc printed. - const char *Filename = SM->getSourceName(SpellingLoc); - unsigned LineNo = SM->getLineNumber(SpellingLoc); - unsigned ColNo = SM->getColumnNumber(SpellingLoc); - if (strcmp(Filename, LastLocFilename) != 0) { - fprintf(stderr, "%s:%u:%u", Filename, LineNo, ColNo); - LastLocFilename = Filename; - LastLocLine = LineNo; - } else if (LineNo != LastLocLine) { - fprintf(stderr, "line:%u:%u", LineNo, ColNo); - LastLocLine = LineNo; + PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc); + + if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) { + fprintf(stderr, "%s:%u:%u", PLoc.getFilename(), PLoc.getLine(), + PLoc.getColumn()); + LastLocFilename = PLoc.getFilename(); + LastLocLine = PLoc.getLine(); + } else if (PLoc.getLine() != LastLocLine) { + fprintf(stderr, "line:%u:%u", PLoc.getLine(), PLoc.getColumn()); + LastLocLine = PLoc.getLine(); } else { - fprintf(stderr, "col:%u", ColNo); + fprintf(stderr, "col:%u", PLoc.getColumn()); } } |

