[cfe-commits] r132247 - in /cfe/trunk: include/clang/Basic/SourceManager.h lib/Basic/SourceManager.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Fri May 27 20:56:11 PDT 2011


Author: akirtzidis
Date: Fri May 27 22:56:11 2011
New Revision: 132247

URL: http://llvm.org/viewvc/llvm-project?rev=132247&view=rev
Log:
Add a couple of helper methods in the SourceManager API, isAtStartOfMacroInstantiation/isAtEndOfMacroInstantiation
useful only for source locations that point at a macro token.

Modified:
    cfe/trunk/include/clang/Basic/SourceManager.h
    cfe/trunk/lib/Basic/SourceManager.cpp

Modified: cfe/trunk/include/clang/Basic/SourceManager.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/SourceManager.h?rev=132247&r1=132246&r2=132247&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/SourceManager.h (original)
+++ cfe/trunk/include/clang/Basic/SourceManager.h Fri May 27 22:56:11 2011
@@ -831,6 +831,14 @@
     return getFileCharacteristic(Loc) == SrcMgr::C_ExternCSystem;
   }
 
+  /// \brief Returns true if the given MacroID location points at the first
+  /// token of the macro instantiation.
+  bool isAtStartOfMacroInstantiation(SourceLocation Loc) const;
+
+  /// \brief Returns true if the given MacroID location points at the last
+  /// token of the macro instantiation.
+  bool isAtEndOfMacroInstantiation(SourceLocation Loc) const;
+
   //===--------------------------------------------------------------------===//
   // Line Table Manipulation Routines
   //===--------------------------------------------------------------------===//

Modified: cfe/trunk/lib/Basic/SourceManager.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/SourceManager.cpp?rev=132247&r1=132246&r2=132247&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/SourceManager.cpp (original)
+++ cfe/trunk/lib/Basic/SourceManager.cpp Fri May 27 22:56:11 2011
@@ -1213,6 +1213,73 @@
   return PresumedLoc(Filename, LineNo, ColNo, IncludeLoc);
 }
 
+/// \brief Returns true if the given MacroID location points at the first
+/// token of the macro instantiation.
+bool SourceManager::isAtStartOfMacroInstantiation(SourceLocation loc) const {
+  assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
+
+  unsigned FID = getFileID(loc).ID;
+  assert(FID > 1);
+  std::pair<SourceLocation, SourceLocation>
+    instRange = getImmediateInstantiationRange(loc);
+
+  bool invalid = false;
+  const SrcMgr::SLocEntry &Entry = getSLocEntry(FID-1, &invalid);
+  if (invalid)
+    return false;
+
+  // If the FileID immediately before it is a file then this is the first token
+  // in the macro.
+  if (Entry.isFile())
+    return true;
+
+  // If the FileID immediately before it (which is a macro token) is the
+  // immediate instantiated macro, check this macro token's location.
+  if (getFileID(instRange.second).ID == FID-1)
+    return isAtStartOfMacroInstantiation(instRange.first);
+
+  // If the FileID immediately before it (which is a macro token) came from a
+  // different instantiation, then this is the first token in the macro.
+  if (getInstantiationLoc(Entry.getInstantiation().getInstantiationLocStart())
+        != getInstantiationLoc(loc))
+    return true;
+
+  // It is inside the macro or the last token in the macro.
+  return false;
+}
+
+/// \brief Returns true if the given MacroID location points at the last
+/// token of the macro instantiation.
+bool SourceManager::isAtEndOfMacroInstantiation(SourceLocation loc) const {
+  assert(loc.isValid() && loc.isMacroID() && "Expected a valid macro loc");
+
+  unsigned FID = getFileID(loc).ID;
+  assert(FID > 1);
+  std::pair<SourceLocation, SourceLocation>
+    instRange = getInstantiationRange(loc);
+
+  // If there's no FileID after it, it is the last token in the macro.
+  if (FID+1 == sloc_entry_size())
+    return true;
+
+  bool invalid = false;
+  const SrcMgr::SLocEntry &Entry = getSLocEntry(FID+1, &invalid);
+  if (invalid)
+    return false;
+
+  // If the FileID immediately after it is a file or a macro token which
+  // came from a different instantiation, then this is the last token in the
+  // macro.
+  if (Entry.isFile())
+    return true;
+  if (getInstantiationLoc(Entry.getInstantiation().getInstantiationLocStart())
+        != instRange.first)
+    return true;
+
+  // It is inside the macro or the first token in the macro.
+  return false;
+}
+
 //===----------------------------------------------------------------------===//
 // Other miscellaneous methods.
 //===----------------------------------------------------------------------===//





More information about the cfe-commits mailing list