diff --git a/Driver/DiagChecker.cpp b/Driver/DiagChecker.cpp
index 6f4cd7c..8fa827a 100644
--- a/Driver/DiagChecker.cpp
+++ b/Driver/DiagChecker.cpp
@@ -167,7 +167,7 @@
 
   for (const_diag_iterator I = diag_begin, E = diag_end; I != E; ++I)
     fprintf(stderr, "  Line %d: %s\n",
-            SourceMgr.getLogicalLineNumber(I->first),
+            SourceMgr.getInstantiationLineNumber(I->first),
             I->second.c_str());
 
   return true;
@@ -185,12 +185,12 @@
   DiagList DiffList;
 
   for (const_diag_iterator I = d1_begin, E = d1_end; I != E; ++I) {
-    unsigned LineNo1 = SourceMgr.getLogicalLineNumber(I->first);
+    unsigned LineNo1 = SourceMgr.getInstantiationLineNumber(I->first);
     const std::string &Diag1 = I->second;
     bool Found = false;
 
     for (const_diag_iterator II = d2_begin, IE = d2_end; II != IE; ++II) {
-      unsigned LineNo2 = SourceMgr.getLogicalLineNumber(II->first);
+      unsigned LineNo2 = SourceMgr.getInstantiationLineNumber(II->first);
       if (LineNo1 != LineNo2) continue;
 
       const std::string &Diag2 = II->second;
diff --git a/Driver/PrintPreprocessedOutput.cpp b/Driver/PrintPreprocessedOutput.cpp
index 8c2ea70..f5bde7c 100644
--- a/Driver/PrintPreprocessedOutput.cpp
+++ b/Driver/PrintPreprocessedOutput.cpp
@@ -103,7 +103,7 @@
 /// #line directive.  This returns false if already at the specified line, true
 /// if some newlines were emitted.
 bool PrintPPOutputPPCallbacks::MoveToLine(SourceLocation Loc) {
-  unsigned LineNo = PP.getSourceManager().getLogicalLineNumber(Loc);
+  unsigned LineNo = PP.getSourceManager().getInstantiationLineNumber(Loc);
 
   if (DisableLineMarkers) {
     if (LineNo == CurLine) return false;
@@ -124,7 +124,7 @@
     if (LineNo-CurLine == 1)
       OS << '\n';
     else if (LineNo == CurLine)
-      return false;    // Spelling line moved, but logical line didn't.
+      return false;    // Spelling line moved, but instantiation line didn't.
     else {
       const char *NewLines = "\n\n\n\n\n\n\n\n";
       OS.write(NewLines, LineNo-CurLine);
@@ -157,7 +157,7 @@
     // strange behavior.
   }
   
-  Loc = SourceMgr.getLogicalLoc(Loc);
+  Loc = SourceMgr.getInstantiationLoc(Loc);
   CurLine = SourceMgr.getLineNumber(Loc);
 
   if (DisableLineMarkers) return;
@@ -200,7 +200,7 @@
 /// is called for the first token on each new line.  If this really is the start
 /// of a new logical line, handle it and return true, otherwise return false.
 /// This may not be the start of a logical line because the "start of line"
-/// marker is set for spelling lines, not logical ones.
+/// marker is set for spelling lines, not instantiation ones.
 bool PrintPPOutputPPCallbacks::HandleFirstTokOnLine(Token &Tok) {
   // Figure out what line we went to and insert the appropriate number of
   // newline characters.
@@ -210,7 +210,7 @@
   // Print out space characters so that the first token on a line is
   // indented for easy reading.
   const SourceManager &SourceMgr = PP.getSourceManager();
-  unsigned ColNo = SourceMgr.getLogicalColumnNumber(Tok.getLocation());
+  unsigned ColNo = SourceMgr.getInstantiationColumnNumber(Tok.getLocation());
   
   // This hack prevents stuff like:
   // #define HASH #
diff --git a/Driver/RewriteBlocks.cpp b/Driver/RewriteBlocks.cpp
index 1e7a6af..e4e470a 100644
--- a/Driver/RewriteBlocks.cpp
+++ b/Driver/RewriteBlocks.cpp
@@ -341,7 +341,7 @@
   // #included file.  If the former, rewrite it now.  If the later, check to see
   // if we rewrote the #include/#import.
   SourceLocation Loc = D->getLocation();
-  Loc = SM->getLogicalLoc(Loc);
+  Loc = SM->getInstantiationLoc(Loc);
   
   // If this is for a builtin, ignore it.
   if (Loc.isInvalid()) return;
diff --git a/Driver/RewriteMacros.cpp b/Driver/RewriteMacros.cpp
index d10bf55..fb423c6 100644
--- a/Driver/RewriteMacros.cpp
+++ b/Driver/RewriteMacros.cpp
@@ -113,7 +113,7 @@
   // that aren't in the preprocessed view, we have macros that expand to no
   // tokens, or macro arguments etc.
   while (RawTok.isNot(tok::eof) || PPTok.isNot(tok::eof)) {
-    SourceLocation PPLoc = SM.getLogicalLoc(PPTok.getLocation());
+    SourceLocation PPLoc = SM.getInstantiationLoc(PPTok.getLocation());
 
     // If PPTok is from a different source file, ignore it.
     if (!SM.isFromMainFile(PPLoc)) {
@@ -198,7 +198,7 @@
     while (PPOffs < RawOffs) {
       Expansion += ' ' + PP.getSpelling(PPTok);
       PP.Lex(PPTok);
-      PPLoc = SM.getLogicalLoc(PPTok.getLocation());
+      PPLoc = SM.getInstantiationLoc(PPTok.getLocation());
       PPOffs = SM.getFullFilePos(PPLoc);
     }
     Expansion += ' ';
diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp
index ec0018a..cee66f7 100644
--- a/Driver/RewriteObjC.cpp
+++ b/Driver/RewriteObjC.cpp
@@ -557,7 +557,7 @@
   // #included file.  If the former, rewrite it now.  If the later, check to see
   // if we rewrote the #include/#import.
   SourceLocation Loc = D->getLocation();
-  Loc = SM->getLogicalLoc(Loc);
+  Loc = SM->getInstantiationLoc(Loc);
   
   // If this is for a builtin, ignore it.
   if (Loc.isInvalid()) return;
diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h
index 97080d7..a77eadd 100644
--- a/include/clang/Basic/SourceLocation.h
+++ b/include/clang/Basic/SourceLocation.h
@@ -236,15 +236,15 @@
     return *SrcMgr;
   }
   
-  FullSourceLoc getLogicalLoc() const;
+  FullSourceLoc getInstantiationLoc() const;
   FullSourceLoc getSpellingLoc() const;
   FullSourceLoc getIncludeLoc() const;
 
   unsigned getLineNumber() const;
   unsigned getColumnNumber() const;
   
-  unsigned getLogicalLineNumber() const;
-  unsigned getLogicalColumnNumber() const;
+  unsigned getInstantiationLineNumber() const;
+  unsigned getInstantiationColumnNumber() const;
 
   unsigned getSpellingLineNumber() const;
   unsigned getSpellingColumnNumber() const;
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h
index f7e160d..1eac4f1 100644
--- a/include/clang/Basic/SourceManager.h
+++ b/include/clang/Basic/SourceManager.h
@@ -121,9 +121,9 @@
   /// is a byte offset from the start of this.
   ///
   /// FileID's are used to compute the location of a character in memory as well
-  /// as the logical source location, which can be differ from the spelling
-  /// location.  It is different when #line's are active or when macros have
-  /// been expanded.
+  /// as the instantiation source location, which can be differ from the
+  /// spelling location.  It is different when #line's are active or when macros
+  /// have been expanded.
   ///
   /// Each FileID has include stack information, indicating where it came from.
   /// For the primary translation unit, it comes from SourceLocation() aka 0.
@@ -228,13 +228,12 @@
 /// files and assigns unique FileID's for each unique #include chain.
 ///
 /// The SourceManager can be queried for information about SourceLocation
-/// objects, turning them into either spelling or logical locations.  Spelling
-/// locations represent where the bytes corresponding to a token came from and
-/// logical locations represent where the location is in the user's view.  In
-/// the case of a macro expansion, for example, the spelling location indicates
-/// where the expanded token came from and the logical location specifies where
-/// it was expanded.  Logical locations are also influenced by #line directives,
-/// etc.
+/// objects, turning them into either spelling or instantiation locations.
+/// Spelling locations represent where the bytes corresponding to a token came
+/// from and instantiation locations represent where the location is in the
+/// user's view.  In the case of a macro expansion, for example, the spelling
+/// location indicates where the expanded token came from and the instantiation
+/// location specifies where it was expanded.
 class SourceManager {
   /// FileInfos - Memoized information about all of the files tracked by this
   /// SourceManager.  This set allows us to merge ContentCache entries based
@@ -338,7 +337,7 @@
   /// SourceLocation.  If this is a macro expansion, this transparently figures
   /// out which file includes the file being expanded into.
   SourceLocation getIncludeLoc(SourceLocation ID) const {
-    return getFIDInfo(getLogicalLoc(ID).getFileID())->getIncludeLoc();
+    return getFIDInfo(getInstantiationLoc(ID).getFileID())->getIncludeLoc();
   }
   
   /// getCharacterData - Return a pointer to the start of the specified location
@@ -348,15 +347,15 @@
   /// getColumnNumber - Return the column # for the specified file position.
   /// This is significantly cheaper to compute than the line number.  This
   /// returns zero if the column number isn't known.  This may only be called on
-  /// a file sloc, so you must choose a spelling or logical location before
-  /// calling this method.
+  /// a file sloc, so you must choose a spelling or instantiation location
+  /// before calling this method.
   unsigned getColumnNumber(SourceLocation Loc) const;
   
   unsigned getSpellingColumnNumber(SourceLocation Loc) const {
     return getColumnNumber(getSpellingLoc(Loc));
   }
-  unsigned getLogicalColumnNumber(SourceLocation Loc) const {
-    return getColumnNumber(getLogicalLoc(Loc));
+  unsigned getInstantiationColumnNumber(SourceLocation Loc) const {
+    return getColumnNumber(getInstantiationLoc(Loc));
   }
   
   
@@ -366,8 +365,8 @@
   /// about to emit a diagnostic.
   unsigned getLineNumber(SourceLocation Loc) const;
 
-  unsigned getLogicalLineNumber(SourceLocation Loc) const {
-    return getLineNumber(getLogicalLoc(Loc));
+  unsigned getInstantiationLineNumber(SourceLocation Loc) const {
+    return getLineNumber(getInstantiationLoc(Loc));
   }
   unsigned getSpellingLineNumber(SourceLocation Loc) const {
     return getLineNumber(getSpellingLoc(Loc));
@@ -378,9 +377,9 @@
   /// etc.
   const char *getSourceName(SourceLocation Loc) const;
 
-  /// Given a SourceLocation object, return the logical location referenced by
-  /// the ID.  This logical location is subject to #line directives, etc.
-  SourceLocation getLogicalLoc(SourceLocation Loc) const {
+  /// Given a SourceLocation object, return the instantiation location
+  /// referenced by the ID.
+  SourceLocation getInstantiationLoc(SourceLocation Loc) const {
     // File locations work.
     if (Loc.isFileID()) return Loc;
     
@@ -450,7 +449,7 @@
     
   /// getFullFilePos - This (efficient) method returns the offset from the start
   /// of the file that the specified spelling SourceLocation represents.  This
-  /// returns the location of the actual character data, not the logical file
+  /// returns the location of the actual character data, not the instantiation
   /// position.
   unsigned getFullFilePos(SourceLocation SpellingLoc) const {
     return getDecomposedFileLoc(SpellingLoc).second;
diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp
index e6840c3..adb3325 100644
--- a/lib/Analysis/BugReporter.cpp
+++ b/lib/Analysis/BugReporter.cpp
@@ -94,7 +94,7 @@
     os << ' ';
   
   os << "Execution continues on line "
-     << SMgr.getLogicalLineNumber(S->getLocStart()) << '.';
+     << SMgr.getInstantiationLineNumber(S->getLocStart()) << '.';
 }
 
 
@@ -534,7 +534,7 @@
           std::ostringstream os;
           
           os << "Control jumps to line "
-             << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
+             << SMgr.getInstantiationLineNumber(S->getLocStart()) << ".\n";
           
           PD.push_front(new PathDiagnosticPiece(L, os.str()));
           break;
@@ -548,23 +548,17 @@
 
           if (Stmt* S = Dst->getLabel())
             switch (S->getStmtClass()) {
-                
-            default: {
+            default:
               os << "No cases match in the switch statement. "
                     "Control jumps to line "
-                 << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
-                break;
-            }
-                
-            case Stmt::DefaultStmtClass: {                            
-              os << "Control jumps to the 'default' case at line "
-                 << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
-              
+                 << SMgr.getInstantiationLineNumber(S->getLocStart()) << ".\n";
               break;
-            }
+            case Stmt::DefaultStmtClass:
+              os << "Control jumps to the 'default' case at line "
+                 << SMgr.getInstantiationLineNumber(S->getLocStart()) << ".\n";
+              break;
               
             case Stmt::CaseStmtClass: {
-              
               os << "Control jumps to 'case ";
               
               CaseStmt* Case = cast<CaseStmt>(S);              
@@ -602,10 +596,9 @@
               }              
               
               os << ":'  at line " 
-                 << SMgr.getLogicalLineNumber(S->getLocStart()) << ".\n";
+                 << SMgr.getInstantiationLineNumber(S->getLocStart()) << ".\n";
               
               break;
-              
             }
           }
           else {
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index d2d7ab8..af96c06 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -2541,7 +2541,7 @@
   Stmt* FirstStmt = cast<PostStmt>(AllocNode->getLocation()).getStmt();
 
   SourceManager& SMgr = BR.getContext().getSourceManager();
-  unsigned AllocLine = SMgr.getLogicalLineNumber(FirstStmt->getLocStart());
+  unsigned AllocLine =SMgr.getInstantiationLineNumber(FirstStmt->getLocStart());
 
   // Get the leak site.  We may have multiple ExplodedNodes (one with the
   // leak) that occur on the same line number; if the node with the leak
@@ -2559,7 +2559,7 @@
   
   Stmt* S = getStmt(BR);  // This is the statement where the leak occured.
   assert (S);
-  unsigned EndLine = SMgr.getLogicalLineNumber(S->getLocStart());
+  unsigned EndLine = SMgr.getInstantiationLineNumber(S->getLocStart());
 
   // Look in the *trimmed* graph at the immediate predecessor of EndN.  Does
   // it occur on the same line?
@@ -2574,7 +2574,7 @@
     Stmt* SPred = PredPS->getStmt();
     
     // Predecessor at same line?
-    if (SMgr.getLogicalLineNumber(SPred->getLocStart()) != EndLine) {
+    if (SMgr.getInstantiationLineNumber(SPred->getLocStart()) != EndLine) {
       Hint = PathDiagnosticPiece::Below;
       S = SPred;
     }
diff --git a/lib/Analysis/GRExprEngineInternalChecks.cpp b/lib/Analysis/GRExprEngineInternalChecks.cpp
index d32318c..e7a644c 100644
--- a/lib/Analysis/GRExprEngineInternalChecks.cpp
+++ b/lib/Analysis/GRExprEngineInternalChecks.cpp
@@ -212,7 +212,8 @@
         const CompoundLiteralExpr* CL = CR->getLiteralExpr();
         os << "Address of stack memory associated with a compound literal "
               "declared on line "
-            << BR.getSourceManager().getLogicalLineNumber(CL->getLocStart())
+            << BR.getSourceManager()
+                    .getInstantiationLineNumber(CL->getLocStart())
             << " returned.";
         
         R = CL->getSourceRange();
@@ -223,7 +224,7 @@
         R = ARE->getSourceRange();
         
         os << "Address of stack memory allocated by call to alloca() on line "
-           << BR.getSourceManager().getLogicalLineNumber(L)
+           << BR.getSourceManager().getInstantiationLineNumber(L)
            << " returned.";
       }      
       else {        
diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp
index bb8cac2..a342931 100644
--- a/lib/Basic/SourceLocation.cpp
+++ b/lib/Basic/SourceLocation.cpp
@@ -37,9 +37,9 @@
   return SourceRange(A,B);
 }
 
-FullSourceLoc FullSourceLoc::getLogicalLoc() const {
+FullSourceLoc FullSourceLoc::getInstantiationLoc() const {
   assert (isValid());
-  return FullSourceLoc(SrcMgr->getLogicalLoc(Loc), *SrcMgr);
+  return FullSourceLoc(SrcMgr->getInstantiationLoc(Loc), *SrcMgr);
 }
 
 FullSourceLoc FullSourceLoc::getSpellingLoc() const {
@@ -63,14 +63,14 @@
 }
 
 
-unsigned FullSourceLoc::getLogicalLineNumber() const {
+unsigned FullSourceLoc::getInstantiationLineNumber() const {
   assert (isValid());
-  return SrcMgr->getLogicalLineNumber(Loc);
+  return SrcMgr->getInstantiationLineNumber(Loc);
 }
 
-unsigned FullSourceLoc::getLogicalColumnNumber() const {
+unsigned FullSourceLoc::getInstantiationColumnNumber() const {
   assert (isValid());
-  return SrcMgr->getLogicalColumnNumber(Loc);
+  return SrcMgr->getInstantiationColumnNumber(Loc);
 }
 
 unsigned FullSourceLoc::getSpellingLineNumber() const {
@@ -120,15 +120,15 @@
   }
   
   if (isFileID()) {
-    // The logical and spelling pos is identical for file locs.
+    // The instantiation and spelling pos is identical for file locs.
     fprintf(stderr, "File Loc from '%s': %d: %d\n",
-            getSourceName(), getLogicalLineNumber(),
-            getLogicalColumnNumber());
+            getSourceName(), getInstantiationLineNumber(),
+            getInstantiationColumnNumber());
   } else {
     fprintf(stderr, "Macro Loc (\n  Spelling: ");
     getSpellingLoc().dump();
-    fprintf(stderr, "  Logical: ");
-    getLogicalLoc().dump();
+    fprintf(stderr, "  Instantiation: ");
+    getInstantiationLoc().dump();
     fprintf(stderr, ")\n");
   }
 }
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 55e8c4a..fa0a9bb 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -155,8 +155,8 @@
   // where the characters are actually located.
   SpellingLoc = getSpellingLoc(SpellingLoc);
   
-  // Resolve InstantLoc down to a real logical location.
-  InstantLoc = getLogicalLoc(InstantLoc);
+  // Resolve InstantLoc down to a real instantiation location.
+  InstantLoc = getInstantiationLoc(InstantLoc);
   
   
   // If the last macro id is close to the currently requested location, try to
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp
index 6176b86..9cbefa3 100644
--- a/lib/CodeGen/CGDebugInfo.cpp
+++ b/lib/CodeGen/CGDebugInfo.cpp
@@ -41,7 +41,7 @@
 
 void CGDebugInfo::setLocation(SourceLocation Loc) {
   if (Loc.isValid())
-    CurLoc = M->getContext().getSourceManager().getLogicalLoc(Loc);
+    CurLoc = M->getContext().getSourceManager().getInstantiationLoc(Loc);
 }
 
 /// getOrCreateCompileUnit - Get the compile unit from the cache or create a new
@@ -157,7 +157,7 @@
   llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(DefLoc);
 
   SourceManager &SM = M->getContext().getSourceManager();
-  uint64_t Line = SM.getLogicalLineNumber(DefLoc);
+  uint64_t Line = SM.getInstantiationLineNumber(DefLoc);
 
   return DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_typedef, Unit,
                                         TyName, DefUnit, Line, 0, 0, 0, 0, Src);
@@ -209,7 +209,7 @@
   std::string Name = Decl->getNameAsString();
 
   llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(Decl->getLocation());
-  uint64_t Line = SM.getLogicalLineNumber(Decl->getLocation());
+  unsigned Line = SM.getInstantiationLineNumber(Decl->getLocation());
   
   
   // Records and classes and unions can all be recursive.  To handle them, we
@@ -247,11 +247,11 @@
     // Get the location for the field.
     SourceLocation FieldDefLoc = Field->getLocation();
     llvm::DICompileUnit FieldDefUnit = getOrCreateCompileUnit(FieldDefLoc);
-    uint64_t FieldLine = SM.getLogicalLineNumber(FieldDefLoc);
+    unsigned FieldLine = SM.getInstantiationLineNumber(FieldDefLoc);
     
     // Bit size, align and offset of the type.
     uint64_t FieldSize = M->getContext().getTypeSize(Ty);
-    uint64_t FieldAlign = M->getContext().getTypeAlign(Ty);
+    unsigned FieldAlign = M->getContext().getTypeAlign(Ty);
     uint64_t FieldOffset = RL.getFieldOffset(FieldNo);    
     
     // Create a DW_TAG_member node to remember the offset of this field in the
@@ -305,11 +305,11 @@
   SourceLocation DefLoc = Decl->getLocation();
   llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(DefLoc);
   SourceManager &SM = M->getContext().getSourceManager();
-  uint64_t Line = SM.getLogicalLineNumber(DefLoc);
+  unsigned Line = SM.getInstantiationLineNumber(DefLoc);
   
   // Size and align of the type.
   uint64_t Size = M->getContext().getTypeSize(Ty);
-  uint64_t Align = M->getContext().getTypeAlign(Ty);
+  unsigned Align = M->getContext().getTypeAlign(Ty);
   
   return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type,
                                           Unit, EnumName, DefUnit, Line,
@@ -428,7 +428,7 @@
   // FIXME: Why is this using CurLoc???
   llvm::DICompileUnit Unit = getOrCreateCompileUnit(CurLoc);
   SourceManager &SM = M->getContext().getSourceManager();
-  uint64_t LineNo = SM.getLogicalLineNumber(CurLoc);
+  unsigned LineNo = SM.getInstantiationLineNumber(CurLoc);
   
   llvm::DISubprogram SP =
     DebugFactory.CreateSubprogram(Unit, Name, Name, "", Unit, LineNo,
@@ -457,8 +457,8 @@
 
   // Get the appropriate compile unit.
   llvm::DICompileUnit Unit = getOrCreateCompileUnit(CurLoc);
-  DebugFactory.InsertStopPoint(Unit, SM.getLogicalLineNumber(CurLoc),
-                               SM.getLogicalColumnNumber(CurLoc),
+  DebugFactory.InsertStopPoint(Unit, SM.getInstantiationLineNumber(CurLoc),
+                               SM.getInstantiationColumnNumber(CurLoc),
                                Builder.GetInsertBlock()); 
 }
 
@@ -492,7 +492,7 @@
 
   // Get location information.
   SourceManager &SM = M->getContext().getSourceManager();
-  uint64_t Line = SM.getLogicalLineNumber(Decl->getLocation());
+  unsigned Line = SM.getInstantiationLineNumber(Decl->getLocation());
   llvm::DICompileUnit Unit = getOrCreateCompileUnit(Decl->getLocation());
   
   // Create the descriptor for the variable.
@@ -525,7 +525,7 @@
   // Create global variable debug descriptor.
   llvm::DICompileUnit Unit = getOrCreateCompileUnit(Decl->getLocation());
   SourceManager &SM = M->getContext().getSourceManager();
-  uint64_t LineNo = SM.getLogicalLineNumber(Decl->getLocation());
+  unsigned LineNo = SM.getInstantiationLineNumber(Decl->getLocation());
 
   std::string Name = Decl->getNameAsString();
 
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index db6aae6..1acebae 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -125,7 +125,8 @@
   if (const AnnotateAttr *AA = D.getAttr<AnnotateAttr>()) {
     SourceManager &SM = CGM.getContext().getSourceManager();
     llvm::Constant *Ann =
-      CGM.EmitAnnotateAttr(GV, AA, SM.getLogicalLineNumber(D.getLocation()));
+      CGM.EmitAnnotateAttr(GV, AA, 
+                           SM.getInstantiationLineNumber(D.getLocation()));
     CGM.AddAnnotation(Ann);
   }
 
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 39611a0..7856b07 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -591,7 +591,7 @@
   if (const AnnotateAttr *AA = D->getAttr<AnnotateAttr>()) {
     SourceManager &SM = Context.getSourceManager();
     AddAnnotation(EmitAnnotateAttr(GV, AA,
-                                   SM.getLogicalLineNumber(D->getLocation())));
+                              SM.getInstantiationLineNumber(D->getLocation())));
   }
 
   GV->setInitializer(Init);
diff --git a/lib/Driver/HTMLDiagnostics.cpp b/lib/Driver/HTMLDiagnostics.cpp
index 4fac41c..c067be9 100644
--- a/lib/Driver/HTMLDiagnostics.cpp
+++ b/lib/Driver/HTMLDiagnostics.cpp
@@ -130,9 +130,8 @@
   bool FileIDInitialized = false;
   
   // Verify that the entire path is from the same FileID.
-  for (PathDiagnostic::const_iterator I=D.begin(), E=D.end(); I != E; ++I) {
-    
-    FullSourceLoc L = I->getLocation().getLogicalLoc();
+  for (PathDiagnostic::const_iterator I = D.begin(), E = D.end(); I != E; ++I) {
+    FullSourceLoc L = I->getLocation().getInstantiationLoc();
     
     if (!L.isFileID())
       return; // FIXME: Emit a warning?
@@ -148,7 +147,7 @@
     for (PathDiagnosticPiece::range_iterator RI=I->ranges_begin(),
                                              RE=I->ranges_end(); RI!=RE; ++RI) {
       
-      SourceLocation L = SMgr.getLogicalLoc(RI->getBegin());
+      SourceLocation L = SMgr.getInstantiationLoc(RI->getBegin());
 
       if (!L.isFileID())
         return; // FIXME: Emit a warning?      
@@ -156,7 +155,7 @@
       if (SMgr.getCanonicalFileID(L) != FileID)
         return; // FIXME: Emit a warning?
       
-      L = SMgr.getLogicalLoc(RI->getEnd());
+      L = SMgr.getInstantiationLoc(RI->getEnd());
       
       if (!L.isFileID())
         return; // FIXME: Emit a warning?      
@@ -230,9 +229,9 @@
        << html::EscapeText(Entry->getName())
        << "</td></tr>\n<tr><td class=\"rowname\">Location:</td><td>"
           "<a href=\"#EndPath\">line "      
-       << (*D.rbegin()).getLocation().getLogicalLineNumber()
+       << (*D.rbegin()).getLocation().getInstantiationLineNumber()
        << ", column "
-       << (*D.rbegin()).getLocation().getLogicalColumnNumber()
+       << (*D.rbegin()).getLocation().getInstantiationColumnNumber()
        << "</a></td></tr>\n"
           "<tr><td class=\"rowname\">Description:</td><td>"
        << D.getDescription() << "</td></tr>\n";
@@ -280,8 +279,8 @@
   {
     std::string s;
     llvm::raw_string_ostream os(s);
-    os << "\n<!-- BUGLINE " << D.back()->getLocation().getLogicalLineNumber()
-       << " -->\n";
+    os << "\n<!-- BUGLINE "
+       << D.back()->getLocation().getInstantiationLineNumber() << " -->\n";
     R.InsertStrBefore(SourceLocation::getFileLoc(FileID, 0), os.str());
   }
   
@@ -344,7 +343,7 @@
     return;  
   
   SourceManager& SM = R.getSourceMgr();
-  FullSourceLoc LPos = Pos.getLogicalLoc();
+  FullSourceLoc LPos = Pos.getInstantiationLoc();
   unsigned FileID = SM.getCanonicalFileID(LPos.getLocation());
 
   assert (&LPos.getManager() == &SM && "SourceManagers are different!");
@@ -359,11 +358,11 @@
   // of the line.
   
   unsigned ColNo = LPos.getColumnNumber();
-  const char *TokLogicalPtr = LPos.getCharacterData();
-  const char *LineStart = TokLogicalPtr-ColNo;
+  const char *TokInstantiationPtr = LPos.getCharacterData();
+  const char *LineStart = TokInstantiationPtr-ColNo;
 
   // Only compute LineEnd if we display below a line.
-  const char *LineEnd = TokLogicalPtr;
+  const char *LineEnd = TokInstantiationPtr;
   
   if (P.getDisplayHint() == PathDiagnosticPiece::Below) {
     const char* FileEnd = Buf->getBufferEnd();
@@ -376,7 +375,7 @@
   
   unsigned PosNo = 0;
   
-  for (const char* c = LineStart; c != TokLogicalPtr; ++c)
+  for (const char* c = LineStart; c != TokInstantiationPtr; ++c)
     PosNo += *c == '\t' ? 8 : 1;
   
   // Create the html for the message.
@@ -471,21 +470,21 @@
   
   SourceManager& SM = R.getSourceMgr();
   
-  SourceLocation LogicalStart = SM.getLogicalLoc(Range.getBegin());
-  unsigned StartLineNo = SM.getLineNumber(LogicalStart);
+  SourceLocation InstantiationStart = SM.getInstantiationLoc(Range.getBegin());
+  unsigned StartLineNo = SM.getLineNumber(InstantiationStart);
   
-  SourceLocation LogicalEnd = SM.getLogicalLoc(Range.getEnd());
-  unsigned EndLineNo = SM.getLineNumber(LogicalEnd);
+  SourceLocation InstantiationEnd = SM.getInstantiationLoc(Range.getEnd());
+  unsigned EndLineNo = SM.getLineNumber(InstantiationEnd);
   
   if (EndLineNo < StartLineNo)
     return;
   
-  if (SM.getCanonicalFileID(LogicalStart) != BugFileID ||
-      SM.getCanonicalFileID(LogicalEnd) != BugFileID)
+  if (SM.getCanonicalFileID(InstantiationStart) != BugFileID ||
+      SM.getCanonicalFileID(InstantiationEnd) != BugFileID)
     return;
     
   // Compute the column number of the end.
-  unsigned EndColNo = SM.getColumnNumber(LogicalEnd);
+  unsigned EndColNo = SM.getColumnNumber(InstantiationEnd);
   unsigned OldEndColNo = EndColNo;
 
   if (EndColNo) {
@@ -496,8 +495,9 @@
   // Highlight the range.  Make the span tag the outermost tag for the
   // selected range.
     
-  SourceLocation E = LogicalEnd.getFileLocWithOffset(EndColNo - OldEndColNo);
+  SourceLocation E =
+    InstantiationEnd.getFileLocWithOffset(EndColNo - OldEndColNo);
   
-  html::HighlightRange(R, LogicalStart, E,
+  html::HighlightRange(R, InstantiationStart, E,
                        "<span class=\"mrange\">", "</span>");
 }
diff --git a/lib/Driver/PlistDiagnostics.cpp b/lib/Driver/PlistDiagnostics.cpp
index b9e35aa..7719930 100644
--- a/lib/Driver/PlistDiagnostics.cpp
+++ b/lib/Driver/PlistDiagnostics.cpp
@@ -55,7 +55,7 @@
                    llvm::SmallVectorImpl<unsigned>& V,
                    SourceManager& SM, SourceLocation L) {
 
-  unsigned fid = SM.getCanonicalFileID(SM.getLogicalLoc(L));
+  unsigned fid = SM.getCanonicalFileID(SM.getInstantiationLoc(L));
   FIDMap::iterator I = FIDs.find(fid);
   if (I != FIDs.end()) return;
   FIDs[fid] = V.size();
@@ -64,8 +64,7 @@
 
 static unsigned GetFID(const FIDMap& FIDs,
                        SourceManager& SM, SourceLocation L) {
-
-  unsigned fid = SM.getCanonicalFileID(SM.getLogicalLoc(L));
+  unsigned fid = SM.getCanonicalFileID(SM.getInstantiationLoc(L));
   FIDMap::const_iterator I = FIDs.find(fid);
   assert (I != FIDs.end());
   return I->second;
@@ -82,9 +81,9 @@
 
   Indent(o, indent) << "<dict>\n";
   Indent(o, indent) << " <key>line</key><integer>"
-                    << SM.getLogicalLineNumber(L) << "</integer>\n";
+                    << SM.getInstantiationLineNumber(L) << "</integer>\n";
   Indent(o, indent) << " <key>col</key><integer>"
-                    << SM.getLogicalColumnNumber(L) << "</integer>\n";
+                    << SM.getInstantiationColumnNumber(L) << "</integer>\n";
   Indent(o, indent) << " <key>file</key><integer>"
                     << GetFID(FM, SM, L) << "</integer>\n";
   Indent(o, indent) << "</dict>\n";
diff --git a/lib/Driver/TextDiagnosticPrinter.cpp b/lib/Driver/TextDiagnosticPrinter.cpp
index 719c611..1f98ef9 100644
--- a/lib/Driver/TextDiagnosticPrinter.cpp
+++ b/lib/Driver/TextDiagnosticPrinter.cpp
@@ -23,7 +23,7 @@
 PrintIncludeStack(FullSourceLoc Pos) {
   if (Pos.isInvalid()) return;
 
-  Pos = Pos.getLogicalLoc();
+  Pos = Pos.getInstantiationLoc();
 
   // Print out the other include frames first.
   PrintIncludeStack(Pos.getIncludeLoc());
@@ -44,20 +44,21 @@
          "Expect a correspondence between source and caret line!");
   if (!R.isValid()) return;
 
-  SourceLocation LogicalStart = SourceMgr.getLogicalLoc(R.getBegin());
-  unsigned StartLineNo = SourceMgr.getLineNumber(LogicalStart);
-  if (StartLineNo > LineNo || LogicalStart.getFileID() != FileID)
+  SourceLocation InstantiationStart =
+    SourceMgr.getInstantiationLoc(R.getBegin());
+  unsigned StartLineNo = SourceMgr.getLineNumber(InstantiationStart);
+  if (StartLineNo > LineNo || InstantiationStart.getFileID() != FileID)
     return;  // No intersection.
   
-  SourceLocation LogicalEnd = SourceMgr.getLogicalLoc(R.getEnd());
-  unsigned EndLineNo = SourceMgr.getLineNumber(LogicalEnd);
-  if (EndLineNo < LineNo || LogicalEnd.getFileID() != FileID)
+  SourceLocation InstantiationEnd = SourceMgr.getInstantiationLoc(R.getEnd());
+  unsigned EndLineNo = SourceMgr.getLineNumber(InstantiationEnd);
+  if (EndLineNo < LineNo || InstantiationEnd.getFileID() != FileID)
     return;  // No intersection.
   
   // Compute the column number of the start.
   unsigned StartColNo = 0;
   if (StartLineNo == LineNo) {
-    StartColNo = SourceMgr.getLogicalColumnNumber(R.getBegin());
+    StartColNo = SourceMgr.getInstantiationColumnNumber(R.getBegin());
     if (StartColNo) --StartColNo;  // Zero base the col #.
   }
 
@@ -69,7 +70,7 @@
   // Compute the column number of the end.
   unsigned EndColNo = CaretLine.size();
   if (EndLineNo == LineNo) {
-    EndColNo = SourceMgr.getLogicalColumnNumber(R.getEnd());
+    EndColNo = SourceMgr.getInstantiationColumnNumber(R.getEnd());
     if (EndColNo) {
       --EndColNo;  // Zero base the col #.
       
@@ -102,7 +103,7 @@
   const FullSourceLoc &Pos = Info.getLocation();
   
   if (Pos.isValid()) {
-    FullSourceLoc LPos = Pos.getLogicalLoc();
+    FullSourceLoc LPos = Pos.getInstantiationLoc();
     LineNo = LPos.getLineNumber();
     FileID = LPos.getLocation().getFileID();
     
@@ -116,14 +117,14 @@
     // Compute the column number.  Rewind from the current position to the start
     // of the line.
     ColNo = LPos.getColumnNumber();
-    const char *TokLogicalPtr = LPos.getCharacterData();
-    LineStart = TokLogicalPtr-ColNo+1;  // Column # is 1-based
+    const char *TokInstantiationPtr = LPos.getCharacterData();
+    LineStart = TokInstantiationPtr-ColNo+1;  // Column # is 1-based
 
     // Compute the line end.  Scan forward from the error position to the end of
     // the line.
     const llvm::MemoryBuffer *Buffer = LPos.getBuffer();
     const char *BufEnd = Buffer->getBufferEnd();
-    LineEnd = TokLogicalPtr;
+    LineEnd = TokInstantiationPtr;
     while (LineEnd != BufEnd && 
            *LineEnd != '\n' && *LineEnd != '\r')
       ++LineEnd;
diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp
index 96295d0..0eb439a 100644
--- a/lib/Lex/Lexer.cpp
+++ b/lib/Lex/Lexer.cpp
@@ -179,7 +179,7 @@
                                    const SourceManager &SM) {
   // If this comes from a macro expansion, we really do want the macro name, not
   // the token this macro expanded to.
-  Loc = SM.getLogicalLoc(Loc);
+  Loc = SM.getInstantiationLoc(Loc);
   
   const char *StrData = SM.getCharacterData(Loc);
   
@@ -284,12 +284,12 @@
   // spelling location.
   SourceManager &SourceMgr = PP.getSourceManager();
   
-  // Create a new SLoc which is expanded from logical(FileLoc) but whose
+  // Create a new SLoc which is expanded from Instantiation(FileLoc) but whose
   // characters come from spelling(FileLoc)+Offset.
-  SourceLocation VirtLoc = SourceMgr.getLogicalLoc(FileLoc);
+  SourceLocation InstLoc = SourceMgr.getInstantiationLoc(FileLoc);
   SourceLocation SpellingLoc = SourceMgr.getSpellingLoc(FileLoc);
   SpellingLoc = SourceLocation::getFileLoc(SpellingLoc.getFileID(), CharNo);
-  return SourceMgr.getInstantiationLoc(SpellingLoc, VirtLoc);
+  return SourceMgr.getInstantiationLoc(SpellingLoc, InstLoc);
 }
 
 /// getSourceLocation - Return a source location identifier for the specified
diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp
index 81e44f4..6c4096d 100644
--- a/lib/Lex/PPMacroExpansion.cpp
+++ b/lib/Lex/PPMacroExpansion.cpp
@@ -244,7 +244,7 @@
     Identifier.setFlagValue(Token::StartOfLine , isAtStartOfLine);
     Identifier.setFlagValue(Token::LeadingSpace, hasLeadingSpace);
     
-    // Update the tokens location to include both its logical and physical
+    // Update the tokens location to include both its instantiation and physical
     // locations.
     SourceLocation Loc =
       SourceMgr.getInstantiationLoc(Identifier.getLocation(), InstantiateLoc);
@@ -453,7 +453,7 @@
     // it will tokenize as a number (and not run into stuff after it in the temp
     // buffer).
     sprintf(TmpBuffer, "%u ",
-            SourceMgr.getLogicalLineNumber(Tok.getLocation()));
+            SourceMgr.getInstantiationLineNumber(Tok.getLocation()));
     unsigned Length = strlen(TmpBuffer)-1;
     Tok.setKind(tok::numeric_constant);
     Tok.setLength(Length);
@@ -470,7 +470,7 @@
     }
     
     // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
-    std::string FN = SourceMgr.getSourceName(SourceMgr.getLogicalLoc(Loc));
+    std::string FN =SourceMgr.getSourceName(SourceMgr.getInstantiationLoc(Loc));
     FN = '"' + Lexer::Stringify(FN) + '"';
     Tok.setKind(tok::string_literal);
     Tok.setLength(FN.size());
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index 59632ed..bbe0f5c 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -140,7 +140,7 @@
 }
 
 void Preprocessor::DumpLocation(SourceLocation Loc) const {
-  SourceLocation LogLoc = SourceMgr.getLogicalLoc(Loc);
+  SourceLocation LogLoc = SourceMgr.getInstantiationLoc(Loc);
   llvm::cerr << SourceMgr.getSourceName(LogLoc) << ':'
              << SourceMgr.getLineNumber(LogLoc) << ':'
              << SourceMgr.getColumnNumber(LogLoc);
@@ -314,7 +314,7 @@
   // confusing.
   if (CharNo == 0 || TokStart.isMacroID()) return TokStart;
   
-  // Figure out how many physical characters away the specified logical
+  // Figure out how many physical characters away the specified instantiation
   // character is.  This needs to take into consideration newlines and
   // trigraphs.
   const char *TokPtr = SourceMgr.getCharacterData(TokStart);
diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp
index d83e98d..153aeb8 100644
--- a/lib/Parse/ParseStmt.cpp
+++ b/lib/Parse/ParseStmt.cpp
@@ -1037,11 +1037,11 @@
     // that the rest of the line is an assembly-language statement.
     SourceManager &SrcMgr = PP.getSourceManager();
     SourceLocation TokLoc = Tok.getLocation();
-    unsigned lineNo = SrcMgr.getLogicalLineNumber(TokLoc);
+    unsigned LineNo = SrcMgr.getInstantiationLineNumber(TokLoc);
     do {
       ConsumeAnyToken();
       TokLoc = Tok.getLocation();
-    } while ((SrcMgr.getLogicalLineNumber(TokLoc) == lineNo) && 
+    } while ((SrcMgr.getInstantiationLineNumber(TokLoc) == LineNo) && 
              Tok.isNot(tok::r_brace) && Tok.isNot(tok::semi) && 
              Tok.isNot(tok::eof));
   }
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp
index 67afc08..a605a1e 100644
--- a/lib/Rewrite/HTMLRewrite.cpp
+++ b/lib/Rewrite/HTMLRewrite.cpp
@@ -31,8 +31,8 @@
 void html::HighlightRange(Rewriter &R, SourceLocation B, SourceLocation E,
                           const char *StartTag, const char *EndTag) {
   SourceManager &SM = R.getSourceMgr();
-  B = SM.getLogicalLoc(B);
-  E = SM.getLogicalLoc(E);
+  B = SM.getInstantiationLoc(B);
+  E = SM.getInstantiationLoc(E);
   unsigned FileID = SM.getCanonicalFileID(B);
   assert(SM.getCanonicalFileID(E) == FileID && "B/E not in the same file!");
 
@@ -442,8 +442,8 @@
       continue;
     }
     
-    // Ignore tokens whose logical location was not the main file.
-    SourceLocation LLoc = SourceMgr.getLogicalLoc(Tok.getLocation());
+    // Ignore tokens whose instantiation location was not the main file.
+    SourceLocation LLoc = SourceMgr.getInstantiationLoc(Tok.getLocation());
     std::pair<unsigned, unsigned> LLocInfo = 
       SourceMgr.getDecomposedFileLoc(LLoc);
     
@@ -476,7 +476,7 @@
     // instantiation.  It would be really nice to pop up a window with all the
     // spelling of the tokens or something.
     while (!Tok.is(tok::eof) &&
-           SourceMgr.getLogicalLoc(Tok.getLocation()) == LLoc) {
+           SourceMgr.getInstantiationLoc(Tok.getLocation()) == LLoc) {
       // Insert a newline if the macro expansion is getting large.
       if (LineLen > 60) {
         Expansion += "<br>";
