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
diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp
index f0c8274..5d48472 100644
--- a/lib/Basic/SourceLocation.cpp
+++ b/lib/Basic/SourceLocation.cpp
@@ -26,6 +26,29 @@
return SourceLocation::getFromRawEncoding(D.ReadInt());
}
+void SourceLocation::dump(const SourceManager &SM) const {
+ if (!isValid()) {
+ fprintf(stderr, "<invalid loc>");
+ return;
+ }
+
+ if (isFileID()) {
+ PresumedLoc PLoc = SM.getPresumedLoc(*this);
+
+ // The instantiation and spelling pos is identical for file locs.
+ fprintf(stderr, "%s:%d:%d",
+ PLoc.getFilename(), PLoc.getLine(), PLoc.getColumn());
+ return;
+ }
+
+ SM.getInstantiationLoc(*this).dump(SM);
+
+ fprintf(stderr, " <Spelling=");
+ SM.getSpellingLoc(*this).dump(SM);
+ fprintf(stderr, ">");
+}
+
+
void SourceRange::Emit(llvm::Serializer& S) const {
B.Emit(S);
E.Emit(S);
@@ -53,11 +76,6 @@
return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);
}
-FullSourceLoc FullSourceLoc::getIncludeLoc() const {
- assert(isValid());
- return FullSourceLoc(SrcMgr->getIncludeLoc(*this), *SrcMgr);
-}
-
unsigned FullSourceLoc::getLineNumber() const {
assert(isValid());
return SrcMgr->getLineNumber(*this);
@@ -89,11 +107,6 @@
return SrcMgr->getSpellingColumnNumber(*this);
}
-const char* FullSourceLoc::getSourceName() const {
- assert(isValid());
- return SrcMgr->getSourceName(*this);
-}
-
bool FullSourceLoc::isInSystemHeader() const {
assert(isValid());
return SrcMgr->isInSystemHeader(*this);
@@ -109,22 +122,3 @@
return SrcMgr->getBuffer(SrcMgr->getFileID(*this));
}
-void FullSourceLoc::dump() const {
- if (!isValid()) {
- fprintf(stderr, "Invalid Loc\n");
- return;
- }
-
- if (isFileID()) {
- // The instantiation and spelling pos is identical for file locs.
- fprintf(stderr, "File Loc from '%s': %d: %d\n",
- getSourceName(), getInstantiationLineNumber(),
- getInstantiationColumnNumber());
- } else {
- fprintf(stderr, "Macro Loc (\n Spelling: ");
- getSpellingLoc().dump();
- fprintf(stderr, " Instantiation: ");
- getInstantiationLoc().dump();
- fprintf(stderr, ")\n");
- }
-}