diff options
-rw-r--r-- | include/clang/Basic/SourceLocation.h | 14 | ||||
-rw-r--r-- | lib/Basic/SourceLocation.cpp | 44 |
2 files changed, 50 insertions, 8 deletions
diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h index 145e1c8487..ee6cc145fe 100644 --- a/include/clang/Basic/SourceLocation.h +++ b/include/clang/Basic/SourceLocation.h @@ -87,7 +87,7 @@ public: static bool isValidMacroPhysOffs(int Val) { if (Val >= 0) return Val < (1 << (MacroPhysOffsBits-1)); - return -Val < (1 << (MacroPhysOffsBits-1)); + return -Val <= (1 << (MacroPhysOffsBits-1)); } static SourceLocation getMacroLoc(unsigned MacroID, int PhysOffs){ @@ -231,8 +231,9 @@ public: return *SrcMgr; } - FullSourceLoc getLogicalLoc(); - FullSourceLoc getIncludeLoc(); + FullSourceLoc getLogicalLoc() const; + FullSourceLoc getPhysicalLoc() const; + FullSourceLoc getIncludeLoc() const; unsigned getLineNumber() const; unsigned getColumnNumber() const; @@ -240,6 +241,9 @@ public: unsigned getLogicalLineNumber() const; unsigned getLogicalColumnNumber() const; + unsigned getPhysicalLineNumber() const; + unsigned getPhysicalColumnNumber() const; + const char *getCharacterData() const; const llvm::MemoryBuffer* getBuffer() const; @@ -260,6 +264,10 @@ public: bool operator!=(const FullSourceLoc& RHS) const { return SrcMgr != RHS.SrcMgr || Loc != RHS.Loc; } + + /// Prints information about this FullSourceLoc to stderr. Useful for + /// debugging. + void dump() const; }; } // end namespace clang diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp index 12a49623c6..5236bfaffb 100644 --- a/lib/Basic/SourceLocation.cpp +++ b/lib/Basic/SourceLocation.cpp @@ -16,7 +16,6 @@ #include "clang/Basic/SourceManager.h" #include "llvm/Bitcode/Serialize.h" #include "llvm/Bitcode/Deserialize.h" - using namespace clang; void SourceLocation::Emit(llvm::Serializer& S) const { @@ -38,14 +37,19 @@ SourceRange SourceRange::ReadVal(llvm::Deserializer& D) { return SourceRange(A,B); } -FullSourceLoc FullSourceLoc::getLogicalLoc() { +FullSourceLoc FullSourceLoc::getLogicalLoc() const { + assert (isValid()); + return FullSourceLoc(SrcMgr->getLogicalLoc(Loc), *SrcMgr); +} + +FullSourceLoc FullSourceLoc::getPhysicalLoc() const { assert (isValid()); - return FullSourceLoc(SrcMgr->getLogicalLoc(Loc),*SrcMgr); + return FullSourceLoc(SrcMgr->getPhysicalLoc(Loc), *SrcMgr); } -FullSourceLoc FullSourceLoc::getIncludeLoc() { +FullSourceLoc FullSourceLoc::getIncludeLoc() const { assert (isValid()); - return FullSourceLoc(SrcMgr->getIncludeLoc(Loc),*SrcMgr); + return FullSourceLoc(SrcMgr->getIncludeLoc(Loc), *SrcMgr); } unsigned FullSourceLoc::getLineNumber() const { @@ -69,6 +73,16 @@ unsigned FullSourceLoc::getLogicalColumnNumber() const { return SrcMgr->getLogicalColumnNumber(Loc); } +unsigned FullSourceLoc::getPhysicalLineNumber() const { + assert (isValid()); + return SrcMgr->getPhysicalLineNumber(Loc); +} + +unsigned FullSourceLoc::getPhysicalColumnNumber() const { + assert (isValid()); + return SrcMgr->getPhysicalColumnNumber(Loc); +} + const char* FullSourceLoc::getSourceName() const { assert (isValid()); return SrcMgr->getSourceName(Loc); @@ -98,3 +112,23 @@ const llvm::MemoryBuffer* FullSourceLoc::getBuffer() const { unsigned FullSourceLoc::getCanonicalFileID() const { return SrcMgr->getCanonicalFileID(Loc); } + +void FullSourceLoc::dump() const { + if (!isValid()) { + fprintf(stderr, "Invalid Loc\n"); + return; + } + + if (isFileID()) { + // The logical and physical pos is identical for file locs. + fprintf(stderr, "File Loc from '%s': %d: %d\n", + getSourceName(), getLogicalLineNumber(), + getLogicalColumnNumber()); + } else { + fprintf(stderr, "Macro Loc (\n Physical: "); + getPhysicalLoc().dump(); + fprintf(stderr, " Logical: "); + getLogicalLoc().dump(); + fprintf(stderr, ")\n"); + } +} |