diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index b38e517..ab7e55b 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -373,6 +373,24 @@
                                                    unsigned *column);
 
 /**
+ * \brief Retrieve the file and offset within that file represented by
+ * the given source location.
+ *
+ * \param location the location within a source file that will be decomposed
+ * into its parts.
+ *
+ * \param file [out] if non-NULL, will be set to the file to which the
+ * given source location points.
+ *
+ * \param offset [out] if non-NULL, will be set to the offset into the
+ * \p file to which the given source location points.
+ */
+CINDEX_LINKAGE void clang_getInstantiationLocationOffset(
+                                                     CXSourceLocation location,
+                                                     CXFile *File,
+                                                     unsigned *Offset);
+
+/**
  * \brief Retrieve a source location representing the first character within a
  * source range.
  */
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index fee5b74..03519ad 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -1108,24 +1108,11 @@
   return Result;
 }
 
-void clang_getInstantiationLocation(CXSourceLocation location,
-                                    CXFile *file,
-                                    unsigned *line,
-                                    unsigned *column) {
+static SourceLocation getAdjustedSourceLocation(CXSourceLocation location) {
   cxloc::CXSourceLocationPtr Ptr
     = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data);
   SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
 
-  if (!Ptr.getPointer() || Loc.isInvalid()) {
-    if (file)
-      *file = 0;
-    if (line)
-      *line = 0;
-    if (column)
-      *column = 0;
-    return;
-  }
-
   // FIXME: This is largely copy-paste from
   ///TextDiagnosticPrinter::HighlightRange.  When it is clear that this is
   // what we want the two routines should be refactored.  
@@ -1157,6 +1144,30 @@
       InstLoc = InstLoc.getFileLocWithOffset(Length - 1);
   }
 
+  return InstLoc;
+}
+
+void clang_getInstantiationLocation(CXSourceLocation location,
+                                    CXFile *file,
+                                    unsigned *line,
+                                    unsigned *column) {
+  cxloc::CXSourceLocationPtr Ptr
+    = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data);
+  SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
+
+  if (!Ptr.getPointer() || Loc.isInvalid()) {
+    if (file)
+      *file = 0;
+    if (line)
+      *line = 0;
+    if (column)
+      *column = 0;
+    return;
+  }
+
+  SourceLocation InstLoc = getAdjustedSourceLocation(location);
+  ASTContext &Context = *Ptr.getPointer();
+  SourceManager &SM = Context.getSourceManager();
   if (file)
     *file = (void *)SM.getFileEntryForID(SM.getFileID(InstLoc));
   if (line)
@@ -1165,6 +1176,23 @@
     *column = SM.getInstantiationColumnNumber(InstLoc);
 }
 
+void clang_getInstantiationLocationOffset(CXSourceLocation location,
+                                          CXFile *file,
+                                          unsigned *offset) {
+  cxloc::CXSourceLocationPtr Ptr
+    = cxloc::CXSourceLocationPtr::getFromOpaqueValue(location.ptr_data);
+  SourceLocation Loc = SourceLocation::getFromRawEncoding(location.int_data);
+
+  ASTContext &Context = *Ptr.getPointer();
+  SourceManager &SM = Context.getSourceManager();
+  SourceLocation InstLoc = getAdjustedSourceLocation(location);
+  std::pair<FileID, unsigned> Decomposed = SM.getDecomposedLoc(InstLoc);
+  if (file)
+    *file = (void *)SM.getFileEntryForID(Decomposed.first);
+  if (offset)
+    *offset = Decomposed.second;
+}
+
 CXSourceLocation clang_getRangeStart(CXSourceRange range) {
   CXSourceLocation Result = { range.ptr_data, range.begin_int_data };
   return Result;
diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports
index d349086..b2ec58e 100644
--- a/tools/CIndex/CIndex.exports
+++ b/tools/CIndex/CIndex.exports
@@ -27,6 +27,7 @@
 _clang_getFileName
 _clang_getFileTime
 _clang_getInstantiationLocation
+_clang_getInstantiationLocationOffset
 _clang_getLocation
 _clang_getNullCursor
 _clang_getNullLocation
