diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp
index 88532a7..340ef28 100644
--- a/lib/Basic/Diagnostic.cpp
+++ b/lib/Basic/Diagnostic.cpp
@@ -244,7 +244,7 @@
       Info.getID() < diag::NUM_BUILTIN_DIAGNOSTICS &&
       getBuiltinDiagClass(Info.getID()) != ERROR &&
       Info.getLocation().isValid() &&
-      Info.getLocation().getPhysicalLoc().isInSystemHeader())
+      Info.getLocation().getSpellingLoc().isInSystemHeader())
     return;
   
   if (DiagLevel >= Diagnostic::Error) {
diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp
index 5236bfa..bb8cac2 100644
--- a/lib/Basic/SourceLocation.cpp
+++ b/lib/Basic/SourceLocation.cpp
@@ -42,9 +42,9 @@
   return FullSourceLoc(SrcMgr->getLogicalLoc(Loc), *SrcMgr);
 }
 
-FullSourceLoc FullSourceLoc::getPhysicalLoc() const {
-  assert (isValid());
-  return FullSourceLoc(SrcMgr->getPhysicalLoc(Loc), *SrcMgr);
+FullSourceLoc FullSourceLoc::getSpellingLoc() const {
+  assert(isValid());
+  return FullSourceLoc(SrcMgr->getSpellingLoc(Loc), *SrcMgr);
 }
 
 FullSourceLoc FullSourceLoc::getIncludeLoc() const {
@@ -73,14 +73,14 @@
   return SrcMgr->getLogicalColumnNumber(Loc);
 }
 
-unsigned FullSourceLoc::getPhysicalLineNumber() const {
+unsigned FullSourceLoc::getSpellingLineNumber() const {
   assert (isValid());
-  return SrcMgr->getPhysicalLineNumber(Loc);
+  return SrcMgr->getSpellingLineNumber(Loc);
 }
 
-unsigned FullSourceLoc::getPhysicalColumnNumber() const {
+unsigned FullSourceLoc::getSpellingColumnNumber() const {
   assert (isValid());
-  return SrcMgr->getPhysicalColumnNumber(Loc);
+  return SrcMgr->getSpellingColumnNumber(Loc);
 }
 
 const char* FullSourceLoc::getSourceName() const {
@@ -120,13 +120,13 @@
   }
   
   if (isFileID()) {
-    // The logical and physical pos is identical for file locs.
+    // The logical and spelling 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, "Macro Loc (\n  Spelling: ");
+    getSpellingLoc().dump();
     fprintf(stderr, "  Logical: ");
     getLogicalLoc().dump();
     fprintf(stderr, ")\n");
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 8691b53..719d29a 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -146,14 +146,14 @@
 }
 
 /// getInstantiationLoc - Return a new SourceLocation that encodes the fact
-/// that a token from physloc PhysLoc should actually be referenced from
+/// that a token from SpellingLoc should actually be referenced from
 /// InstantiationLoc.
-SourceLocation SourceManager::getInstantiationLoc(SourceLocation PhysLoc,
+SourceLocation SourceManager::getInstantiationLoc(SourceLocation SpellingLoc,
                                                   SourceLocation InstantLoc) {
   // The specified source location may be a mapped location, due to a macro
   // instantiation or #line directive.  Strip off this information to find out
   // where the characters are actually located.
-  PhysLoc = getPhysicalLoc(PhysLoc);
+  SpellingLoc = getSpellingLoc(SpellingLoc);
   
   // Resolve InstantLoc down to a real logical location.
   InstantLoc = getLogicalLoc(InstantLoc);
@@ -164,21 +164,21 @@
   for (int i = MacroIDs.size()-1, e = MacroIDs.size()-6; i >= 0 && i != e; --i){
     MacroIDInfo &LastOne = MacroIDs[i];
     
-    // The instanitation point and source physloc have to exactly match to reuse
-    // (for now).  We could allow "nearby" instantiations in the future.
+    // The instanitation point and source SpellingLoc have to exactly match to
+    // reuse (for now).  We could allow "nearby" instantiations in the future.
     if (LastOne.getVirtualLoc() != InstantLoc ||
-        LastOne.getPhysicalLoc().getFileID() != PhysLoc.getFileID())
+        LastOne.getSpellingLoc().getFileID() != SpellingLoc.getFileID())
       continue;
   
-    // Check to see if the physloc of the token came from near enough to reuse.
-    int PhysDelta = PhysLoc.getRawFilePos() -
-                    LastOne.getPhysicalLoc().getRawFilePos();
-    if (SourceLocation::isValidMacroPhysOffs(PhysDelta))
-      return SourceLocation::getMacroLoc(i, PhysDelta);
+    // Check to see if the spellloc of the token came from near enough to reuse.
+    int SpellDelta = SpellingLoc.getRawFilePos() -
+                     LastOne.getSpellingLoc().getRawFilePos();
+    if (SourceLocation::isValidMacroSpellingOffs(SpellDelta))
+      return SourceLocation::getMacroLoc(i, SpellDelta);
   }
   
  
-  MacroIDs.push_back(MacroIDInfo::get(InstantLoc, PhysLoc));
+  MacroIDs.push_back(MacroIDInfo::get(InstantLoc, SpellingLoc));
   return SourceLocation::getMacroLoc(MacroIDs.size()-1, 0);
 }
 
@@ -196,7 +196,7 @@
 const char *SourceManager::getCharacterData(SourceLocation SL) const {
   // Note that this is a hot function in the getSpelling() path, which is
   // heavily used by -E mode.
-  SL = getPhysicalLoc(SL);
+  SL = getSpellingLoc(SL);
   
   // Note that calling 'getBuffer()' may lazily page in a source file.
   return getContentCache(SL.getFileID())->getBuffer()->getBufferStart() + 
@@ -279,7 +279,7 @@
   std::copy(LineOffsets.begin(), LineOffsets.end(), FI->SourceLineCache);
 }
 
-/// getLineNumber - Given a SourceLocation, return the physical line number
+/// getLineNumber - Given a SourceLocation, return the spelling line number
 /// for the position indicated.  This requires building and caching a table of
 /// line offsets for the MemoryBuffer, so this is not cheap: use only when
 /// about to emit a diagnostic.
@@ -481,13 +481,13 @@
 
 void MacroIDInfo::Emit(llvm::Serializer& S) const {
   S.Emit(VirtualLoc);
-  S.Emit(PhysicalLoc);
+  S.Emit(SpellingLoc);
 }
 
 MacroIDInfo MacroIDInfo::ReadVal(llvm::Deserializer& D) {
   MacroIDInfo I;
   I.VirtualLoc = SourceLocation::ReadVal(D);
-  I.PhysicalLoc = SourceLocation::ReadVal(D);
+  I.SpellingLoc = SourceLocation::ReadVal(D);
   return I;
 }
 
