[clang] Emit debug info with original source location for tokens from macros … (PR #163190)

via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 17 09:17:53 PDT 2025


https://github.com/SergejSalnikov updated https://github.com/llvm/llvm-project/pull/163190

>From aabe21c59d9feca85cc08e22720452970b0700ab Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Mon, 13 Oct 2025 14:12:09 +0200
Subject: [PATCH 01/11] Emit debug info with original source location for
 tokens from macros arguments.

---
 clang/lib/CodeGen/CGDebugInfo.cpp | 42 ++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 9fe9a13610296..4b1c299eb99d5 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -110,6 +110,34 @@ static bool IsArtificial(VarDecl const *VD) {
                               cast<Decl>(VD->getDeclContext())->isImplicit());
 }
 
+/// If the given source location resides in a macro argument, this function
+/// recursively resolves through macro argument expansions to return a source
+/// location that points to where the argument was spelled in the macro
+/// invocation. This is necessary for generating correct debug information for
+/// code inside macro arguments, as we want to point to user-written code.
+static SourceLocation resolveSpellingLocation(SourceManager &SM,
+                                              SourceLocation Loc) {
+  SourceLocation ParentLoc = Loc;
+
+  while (SM.isMacroArgExpansion(ParentLoc)) {
+    ParentLoc = SM.getImmediateMacroCallerLoc(ParentLoc);
+  }
+
+  if (ParentLoc.isMacroID()) {
+    return ParentLoc;
+  }
+  return SM.getSpellingLoc(Loc);
+}
+
+/// Returns the presumed location for a given source location, resolving
+/// through macro arguments first. This ensures that file, line, and column
+/// information points to where a macro argument was spelled, rather than where
+/// it was expanded.
+static PresumedLoc getPresumedSpellingLoc(SourceManager &SM,
+                                          SourceLocation Loc) {
+  return SM.getPresumedLoc(resolveSpellingLocation(SM, Loc));
+}
+
 CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
     : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()),
       DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs),
@@ -318,7 +346,8 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {
   if (Loc.isInvalid())
     return;
 
-  CurLoc = CGM.getContext().getSourceManager().getExpansionLoc(Loc);
+  SourceManager &SM = CGM.getContext().getSourceManager();
+  CurLoc = SM.getExpansionLoc(resolveSpellingLocation(SM, Loc));
 
   // If we've changed files in the middle of a lexical scope go ahead
   // and create a new lexical scope with file node if it's different
@@ -326,7 +355,6 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {
   if (LexicalBlockStack.empty())
     return;
 
-  SourceManager &SM = CGM.getContext().getSourceManager();
   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
   PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc);
   if (PCLoc.isInvalid() || Scope->getFile() == getOrCreateFile(CurLoc))
@@ -545,7 +573,7 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
     FileName = TheCU->getFile()->getFilename();
     CSInfo = TheCU->getFile()->getChecksum();
   } else {
-    PresumedLoc PLoc = SM.getPresumedLoc(Loc);
+    PresumedLoc PLoc = getPresumedSpellingLoc(SM, Loc);
     FileName = PLoc.getFilename();
 
     if (FileName.empty()) {
@@ -627,7 +655,7 @@ unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
   if (Loc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  return SM.getPresumedLoc(Loc).getLine();
+  return getPresumedSpellingLoc(SM, Loc).getLine();
 }
 
 unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
@@ -639,7 +667,8 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
   if (Loc.isInvalid() && CurLoc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
+  PresumedLoc PLoc = Loc.isValid() ? getPresumedSpellingLoc(SM, Loc)
+                                   : SM.getPresumedLoc(CurLoc);
   return PLoc.isValid() ? PLoc.getColumn() : 0;
 }
 
@@ -6183,7 +6212,8 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
 void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
                                             const StringLiteral *S) {
   SourceLocation Loc = S->getStrTokenLoc(0);
-  PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc);
+  PresumedLoc PLoc =
+      getPresumedSpellingLoc(CGM.getContext().getSourceManager(), Loc);
   if (!PLoc.isValid())
     return;
 

>From cf8a150a49970895a6efae45e7b65a16360ddf2f Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 12:03:12 +0200
Subject: [PATCH 02/11] Add getRefinedSpellingLoc to SourceManager.

The method preserves source locations for macro arguments.
---
 clang/include/clang/Basic/SourceManager.h | 16 +++++++++
 clang/lib/Basic/SourceManager.cpp         | 14 ++++++++
 clang/lib/CodeGen/CGDebugInfo.cpp         | 42 ++++-------------------
 3 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index ed967fd47dc83..5e8ca172a89c0 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -1250,6 +1250,21 @@ class SourceManager : public RefCountedBase<SourceManager> {
     return getSpellingLocSlowCase(Loc);
   }
 
+  /// Given a SourceLocation object, return the refined spelling
+  /// location referenced by the ID.
+  ///
+  /// The key difference to \ref getSpellingLoc is that the source location
+  /// for macro body is resolved to the expansion site.
+  ///
+  /// This is the place where the characters that make up the lexed token
+  /// can be found.
+  SourceLocation getRefinedSpellingLoc(SourceLocation Loc) const {
+    // Handle the non-mapped case inline, defer to out of line code to handle
+    // expansions.
+    if (Loc.isFileID()) return Loc;
+    return getRefinedSpellingLocSlowCase(Loc);
+  }
+
   /// Given a SourceLocation object, return the spelling location
   /// referenced by the ID.
   ///
@@ -1977,6 +1992,7 @@ class SourceManager : public RefCountedBase<SourceManager> {
 
   SourceLocation getExpansionLocSlowCase(SourceLocation Loc) const;
   SourceLocation getSpellingLocSlowCase(SourceLocation Loc) const;
+  SourceLocation getRefinedSpellingLocSlowCase(SourceLocation Loc) const;
   SourceLocation getFileLocSlowCase(SourceLocation Loc) const;
 
   FileIDAndOffset
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index d8ec837f0f7b9..d71580763af69 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -915,6 +915,20 @@ SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
   return Loc;
 }
 
+SourceLocation
+SourceManager::getRefinedSpellingLocSlowCase(SourceLocation Loc) const {
+  do {
+    FileIDAndOffset LocInfo = getDecomposedLoc(Loc);
+    const ExpansionInfo &Expansion = getSLocEntry(LocInfo.first).getExpansion();
+    if (Expansion.isMacroArgExpansion()) {
+      Loc = Expansion.getSpellingLoc().getLocWithOffset(LocInfo.second);
+    } else {
+      Loc = Expansion.getExpansionLocStart();
+    }
+  } while (!Loc.isFileID());
+  return Loc;
+}
+
 SourceLocation SourceManager::getFileLocSlowCase(SourceLocation Loc) const {
   do {
     if (isMacroArgExpansion(Loc))
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 4b1c299eb99d5..618aca7fa9304 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -110,34 +110,6 @@ static bool IsArtificial(VarDecl const *VD) {
                               cast<Decl>(VD->getDeclContext())->isImplicit());
 }
 
-/// If the given source location resides in a macro argument, this function
-/// recursively resolves through macro argument expansions to return a source
-/// location that points to where the argument was spelled in the macro
-/// invocation. This is necessary for generating correct debug information for
-/// code inside macro arguments, as we want to point to user-written code.
-static SourceLocation resolveSpellingLocation(SourceManager &SM,
-                                              SourceLocation Loc) {
-  SourceLocation ParentLoc = Loc;
-
-  while (SM.isMacroArgExpansion(ParentLoc)) {
-    ParentLoc = SM.getImmediateMacroCallerLoc(ParentLoc);
-  }
-
-  if (ParentLoc.isMacroID()) {
-    return ParentLoc;
-  }
-  return SM.getSpellingLoc(Loc);
-}
-
-/// Returns the presumed location for a given source location, resolving
-/// through macro arguments first. This ensures that file, line, and column
-/// information points to where a macro argument was spelled, rather than where
-/// it was expanded.
-static PresumedLoc getPresumedSpellingLoc(SourceManager &SM,
-                                          SourceLocation Loc) {
-  return SM.getPresumedLoc(resolveSpellingLocation(SM, Loc));
-}
-
 CGDebugInfo::CGDebugInfo(CodeGenModule &CGM)
     : CGM(CGM), DebugKind(CGM.getCodeGenOpts().getDebugInfo()),
       DebugTypeExtRefs(CGM.getCodeGenOpts().DebugTypeExtRefs),
@@ -347,7 +319,7 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {
     return;
 
   SourceManager &SM = CGM.getContext().getSourceManager();
-  CurLoc = SM.getExpansionLoc(resolveSpellingLocation(SM, Loc));
+  CurLoc = SM.getRefinedSpellingLoc(Loc);
 
   // If we've changed files in the middle of a lexical scope go ahead
   // and create a new lexical scope with file node if it's different
@@ -573,7 +545,7 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
     FileName = TheCU->getFile()->getFilename();
     CSInfo = TheCU->getFile()->getChecksum();
   } else {
-    PresumedLoc PLoc = getPresumedSpellingLoc(SM, Loc);
+    PresumedLoc PLoc = SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc));
     FileName = PLoc.getFilename();
 
     if (FileName.empty()) {
@@ -655,7 +627,7 @@ unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
   if (Loc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  return getPresumedSpellingLoc(SM, Loc).getLine();
+  return SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc)).getLine();
 }
 
 unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
@@ -667,8 +639,8 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
   if (Loc.isInvalid() && CurLoc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  PresumedLoc PLoc = Loc.isValid() ? getPresumedSpellingLoc(SM, Loc)
-                                   : SM.getPresumedLoc(CurLoc);
+  PresumedLoc PLoc =
+      SM.getPresumedLoc(Loc.isValid() ? SM.getRefinedSpellingLoc(Loc) : CurLoc);
   return PLoc.isValid() ? PLoc.getColumn() : 0;
 }
 
@@ -6212,8 +6184,8 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
 void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
                                             const StringLiteral *S) {
   SourceLocation Loc = S->getStrTokenLoc(0);
-  PresumedLoc PLoc =
-      getPresumedSpellingLoc(CGM.getContext().getSourceManager(), Loc);
+  SourceManager &SM = CGM.getContext().getSourceManager();
+  PresumedLoc PLoc = SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc));
   if (!PLoc.isValid())
     return;
 

>From 3afd854b9cb3cd00a8f262add70d71f824f68f90 Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 14:55:29 +0200
Subject: [PATCH 03/11] Minimize the amount of location expansions inside
 CGDebugInfo.

* Add unit test.
---
 clang/lib/CodeGen/CGDebugInfo.cpp         | 184 +++++++++++++---------
 clang/test/DebugInfo/Generic/macro-info.c |  21 +++
 2 files changed, 131 insertions(+), 74 deletions(-)
 create mode 100644 clang/test/DebugInfo/Generic/macro-info.c

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 618aca7fa9304..80812e6415e95 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -545,7 +545,8 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
     FileName = TheCU->getFile()->getFilename();
     CSInfo = TheCU->getFile()->getChecksum();
   } else {
-    PresumedLoc PLoc = SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc));
+    assert(Loc.isFileID());
+    PresumedLoc PLoc = SM.getPresumedLoc(Loc);
     FileName = PLoc.getFilename();
 
     if (FileName.empty()) {
@@ -627,7 +628,8 @@ unsigned CGDebugInfo::getLineNumber(SourceLocation Loc) {
   if (Loc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  return SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc)).getLine();
+  assert(Loc.isFileID());
+  return SM.getPresumedLoc(Loc).getLine();
 }
 
 unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
@@ -639,8 +641,8 @@ unsigned CGDebugInfo::getColumnNumber(SourceLocation Loc, bool Force) {
   if (Loc.isInvalid() && CurLoc.isInvalid())
     return 0;
   SourceManager &SM = CGM.getContext().getSourceManager();
-  PresumedLoc PLoc =
-      SM.getPresumedLoc(Loc.isValid() ? SM.getRefinedSpellingLoc(Loc) : CurLoc);
+  assert(Loc.isFileID());
+  PresumedLoc PLoc = SM.getPresumedLoc(Loc.isValid() ? Loc : CurLoc);
   return PLoc.isValid() ? PLoc.getColumn() : 0;
 }
 
@@ -1330,9 +1332,9 @@ CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
   const RecordDecl *RD = Ty->getOriginalDecl()->getDefinitionOrSelf();
   if (llvm::DIType *T = getTypeOrNull(QualType(Ty, 0)))
     return cast<llvm::DICompositeType>(T);
-  llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
-  const unsigned Line =
-      getLineNumber(RD->getLocation().isValid() ? RD->getLocation() : CurLoc);
+  SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+  llvm::DIFile *DefUnit = getOrCreateFile(Loc);
+  const unsigned Line = getLineNumber(Loc.isValid() ? Loc : CurLoc);
   StringRef RDName = getClassName(RD);
 
   uint64_t Size = 0;
@@ -1559,7 +1561,7 @@ llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
   auto PP = getPrintingPolicy();
   Ty->getTemplateName().print(OS, PP, TemplateName::Qualified::None);
 
-  SourceLocation Loc = AliasDecl->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(AliasDecl->getLocation());
 
   if (CGM.getCodeGenOpts().DebugTemplateAlias) {
     auto ArgVector = ::GetTemplateArgs(TD, Ty);
@@ -1628,7 +1630,7 @@ llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,
 
   // We don't set size information, but do specify where the typedef was
   // declared.
-  SourceLocation Loc = Ty->getDecl()->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(Ty->getDecl()->getLocation());
 
   uint32_t Align = getDeclAlignIfRequired(Ty->getDecl(), CGM.getContext());
   // Typedefs are derived from some other type.
@@ -1762,7 +1764,7 @@ CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl,
   QualType Ty = BitFieldDecl->getType();
   if (BitFieldDecl->hasAttr<PreferredTypeAttr>())
     Ty = BitFieldDecl->getAttr<PreferredTypeAttr>()->getType();
-  SourceLocation Loc = BitFieldDecl->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(BitFieldDecl->getLocation());
   llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
 
@@ -1840,7 +1842,8 @@ llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded(
     return nullptr;
 
   QualType Ty = PreviousBitfield->getType();
-  SourceLocation Loc = PreviousBitfield->getLocation();
+  SourceLocation Loc =
+      getRefinedSpellingLocation(PreviousBitfield->getLocation());
   llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
   llvm::DIScope *RecordTy = BitFieldDI->getScope();
@@ -1959,6 +1962,7 @@ void CGDebugInfo::CollectRecordLambdaFields(
       continue;
     }
 
+    Loc = getRefinedSpellingLocation(Loc);
     llvm::DIFile *VUnit = getOrCreateFile(Loc);
 
     elements.push_back(createFieldType(
@@ -1973,10 +1977,11 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
   // Create the descriptor for the static variable, with or without
   // constant initializers.
   Var = Var->getCanonicalDecl();
-  llvm::DIFile *VUnit = getOrCreateFile(Var->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(Var->getLocation());
+  llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit);
 
-  unsigned LineNumber = getLineNumber(Var->getLocation());
+  unsigned LineNumber = getLineNumber(Loc);
   StringRef VName = Var->getName();
 
   // FIXME: to avoid complications with type merging we should
@@ -2024,9 +2029,10 @@ void CGDebugInfo::CollectRecordNormalField(
   } else {
     auto Align = getDeclAlignIfRequired(field, CGM.getContext());
     llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field);
-    FieldType =
-        createFieldType(name, type, field->getLocation(), field->getAccess(),
-                        OffsetInBits, Align, tunit, RecordTy, RD, Annotations);
+    FieldType = createFieldType(
+        name, type, getRefinedSpellingLocation(field->getLocation()),
+        field->getAccess(), OffsetInBits, Align, tunit, RecordTy, RD,
+        Annotations);
   }
 
   elements.push_back(FieldType);
@@ -2040,7 +2046,7 @@ void CGDebugInfo::CollectRecordNestedType(
   // instead?
   if (isa<InjectedClassNameType>(Ty))
     return;
-  SourceLocation Loc = TD->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(TD->getLocation());
   if (llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc)))
     elements.push_back(nestedType);
 }
@@ -2244,8 +2250,9 @@ llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
   llvm::DIFile *MethodDefUnit = nullptr;
   unsigned MethodLine = 0;
   if (!Method->isImplicit()) {
-    MethodDefUnit = getOrCreateFile(Method->getLocation());
-    MethodLine = getLineNumber(Method->getLocation());
+    SourceLocation Loc = getRefinedSpellingLocation(Method->getLocation());
+    MethodDefUnit = getOrCreateFile(Loc);
+    MethodLine = getLineNumber(Loc);
   }
 
   // Collect virtual method info.
@@ -2696,7 +2703,7 @@ void CGDebugInfo::emitVTableSymbol(llvm::GlobalVariable *VTable,
 
   ASTContext &Context = CGM.getContext();
   StringRef SymbolName = "_vtable$";
-  SourceLocation Loc;
+  SourceLocation InvalidLoc;
   QualType VoidPtr = Context.getPointerType(Context.VoidTy);
 
   // We deal with two different contexts:
@@ -2708,7 +2715,7 @@ void CGDebugInfo::emitVTableSymbol(llvm::GlobalVariable *VTable,
   // placed inside the scope of the C++ class/structure.
   llvm::DIScope *DContext = getContextDescriptor(RD, TheCU);
   auto *Ctxt = cast<llvm::DICompositeType>(DContext);
-  llvm::DIFile *Unit = getOrCreateFile(Loc);
+  llvm::DIFile *Unit = getOrCreateFile(InvalidLoc);
   llvm::DIType *VTy = getOrCreateType(VoidPtr, Unit);
   llvm::DINode::DIFlags Flags = getAccessFlag(AccessSpecifier::AS_private, RD) |
                                 llvm::DINode::FlagArtificial;
@@ -2845,6 +2852,7 @@ void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
 llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy,
                                                  SourceLocation Loc) {
   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
+  Loc = getRefinedSpellingLocation(Loc);
   llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
   return T;
 }
@@ -2858,6 +2866,7 @@ llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
                                                      SourceLocation Loc) {
   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
   assert(!D.isNull() && "null type");
+  Loc = getRefinedSpellingLocation(Loc);
   llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
   assert(T && "could not create debug info for type");
 
@@ -2875,7 +2884,8 @@ void CGDebugInfo::addHeapAllocSiteMetadata(llvm::CallBase *CI,
   if (AllocatedTy->isVoidType())
     node = llvm::MDNode::get(CGM.getLLVMContext(), {});
   else
-    node = getOrCreateType(AllocatedTy, getOrCreateFile(Loc));
+    node = getOrCreateType(AllocatedTy,
+                           getOrCreateFile(getRefinedSpellingLocation(Loc)));
 
   CI->setMetadata("heapallocsite", node);
 }
@@ -3108,8 +3118,9 @@ std::pair<llvm::DIType *, llvm::DIType *>
 CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
   RecordDecl *RD = Ty->getOriginalDecl()->getDefinitionOrSelf();
 
+  SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
   // Get overall information about the record type for the debug info.
-  llvm::DIFile *DefUnit = getOrCreateFile(RD->getLocation());
+  llvm::DIFile *DefUnit = getOrCreateFile(Loc);
 
   // Records and classes and unions can all be recursive.  To handle them, we
   // first generate a debug descriptor for the struct as a forward declaration.
@@ -3177,7 +3188,7 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty,
 llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty,
                                       llvm::DIFile *Unit) {
   // Ignore protocols.
-  SourceLocation Loc = Ty->getDecl()->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(Ty->getDecl()->getLocation());
 
   // Use Typedefs to represent ObjCTypeParamType.
   return DBuilder.createTypedef(
@@ -3228,9 +3239,10 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
         llvm::dwarf::DW_TAG_structure_type, ID->getName(),
         getDeclContextDescriptor(ID), Unit, 0, RuntimeLang);
 
+  SourceLocation Loc = getRefinedSpellingLocation(ID->getLocation());
   // Get overall information about the record type for the debug info.
-  llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
-  unsigned Line = getLineNumber(ID->getLocation());
+  llvm::DIFile *DefUnit = getOrCreateFile(Loc);
+  unsigned Line = getLineNumber(Loc);
 
   // If this is just a forward declaration return a special forward-declaration
   // debug type since we won't be able to lay out the entire type.
@@ -3351,8 +3363,9 @@ llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod,
 llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
                                                 llvm::DIFile *Unit) {
   ObjCInterfaceDecl *ID = Ty->getDecl();
-  llvm::DIFile *DefUnit = getOrCreateFile(ID->getLocation());
-  unsigned Line = getLineNumber(ID->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(ID->getLocation());
+  llvm::DIFile *DefUnit = getOrCreateFile(Loc);
+  unsigned Line = getLineNumber(Loc);
 
   unsigned RuntimeLang = TheCU->getSourceLanguage().getUnversionedName();
 
@@ -3447,9 +3460,10 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
     if (FieldName.empty())
       continue;
 
+    SourceLocation Loc = getRefinedSpellingLocation(Field->getLocation());
     // Get the location for the field.
-    llvm::DIFile *FieldDefUnit = getOrCreateFile(Field->getLocation());
-    unsigned FieldLine = getLineNumber(Field->getLocation());
+    llvm::DIFile *FieldDefUnit = getOrCreateFile(Loc);
+    unsigned FieldLine = getLineNumber(Loc);
     QualType FType = Field->getType();
     uint64_t FieldSize = 0;
     uint32_t FieldAlign = 0;
@@ -3494,7 +3508,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
       if (ObjCPropertyImplDecl *PImpD =
               ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) {
         if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) {
-          SourceLocation Loc = PD->getLocation();
+          SourceLocation Loc = getRefinedSpellingLocation(PD->getLocation());
           llvm::DIFile *PUnit = getOrCreateFile(Loc);
           unsigned PLine = getLineNumber(Loc);
           ObjCMethodDecl *Getter = PImpD->getGetterMethodDecl();
@@ -3776,11 +3790,12 @@ llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) {
     // FwdDecl with the second and then replace the second with
     // complete type.
     llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
-    llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
+    SourceLocation Loc = getRefinedSpellingLocation(ED->getLocation());
+    llvm::DIFile *DefUnit = getOrCreateFile(Loc);
     llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
         llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0));
 
-    unsigned Line = getLineNumber(ED->getLocation());
+    unsigned Line = getLineNumber(Loc);
     StringRef EDName = ED->getName();
     llvm::DIType *RetTy = DBuilder.createReplaceableCompositeType(
         llvm::dwarf::DW_TAG_enumeration_type, EDName, EDContext, DefUnit, Line,
@@ -3813,8 +3828,9 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
   // Return a CompositeType for the enum itself.
   llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
 
-  llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
-  unsigned Line = getLineNumber(ED->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(ED->getLocation());
+  llvm::DIFile *DefUnit = getOrCreateFile(Loc);
+  unsigned Line = getLineNumber(Loc);
   llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
   llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
   return DBuilder.createEnumerationType(
@@ -3832,8 +3848,10 @@ llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
 llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent,
                                                     SourceLocation LineLoc,
                                                     SourceLocation FileLoc) {
-  llvm::DIFile *FName = getOrCreateFile(FileLoc);
-  unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
+  llvm::DIFile *FName = getOrCreateFile(getRefinedSpellingLocation(FileLoc));
+  unsigned Line = LineLoc.isInvalid()
+                      ? 0
+                      : getLineNumber(getRefinedSpellingLocation(LineLoc));
   return DBuilder.createTempMacroFile(Parent, Line, FName);
 }
 
@@ -4156,7 +4174,7 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
 
   // Get overall information about the record type for the debug info.
   StringRef RDName = getClassName(RD);
-  const SourceLocation Loc = RD->getLocation();
+  const SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
   llvm::DIFile *DefUnit = nullptr;
   unsigned Line = 0;
   if (Loc.isValid()) {
@@ -4271,7 +4289,8 @@ void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD,
         break;
     }
     CanQualType T = CGM.getContext().getCanonicalTagType(PBase);
-    ContainingType = getOrCreateType(T, getOrCreateFile(RD->getLocation()));
+    SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+    ContainingType = getOrCreateType(T, getOrCreateFile(Loc));
   } else if (RD->isDynamicClass())
     ContainingType = RealDecl;
 
@@ -4342,10 +4361,11 @@ void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,
                                       StringRef &Name, StringRef &LinkageName,
                                       llvm::MDTuple *&TemplateParameters,
                                       llvm::DIScope *&VDContext) {
-  Unit = getOrCreateFile(VD->getLocation());
-  LineNo = getLineNumber(VD->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  Unit = getOrCreateFile(Loc);
+  LineNo = getLineNumber(Loc);
 
-  setLocation(VD->getLocation());
+  setLocation(Loc);
 
   T = VD->getType();
   if (T->isIncompleteArrayType()) {
@@ -4398,7 +4418,7 @@ llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
   StringRef Name, LinkageName;
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
-  SourceLocation Loc = GD.getDecl()->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(GD.getDecl()->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIScope *DContext = Unit;
   unsigned Line = getLineNumber(Loc);
@@ -4453,7 +4473,7 @@ llvm::DIGlobalVariable *
 CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
   QualType T;
   StringRef Name, LinkageName;
-  SourceLocation Loc = VD->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIScope *DContext = Unit;
   unsigned Line = getLineNumber(Loc);
@@ -4479,7 +4499,8 @@ llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
   // in unlimited debug info)
   if (const auto *TD = dyn_cast<TypeDecl>(D)) {
     QualType Ty = CGM.getContext().getTypeDeclType(TD);
-    return getOrCreateType(Ty, getOrCreateFile(TD->getLocation()));
+    SourceLocation Loc = getRefinedSpellingLocation(TD->getLocation());
+    return getOrCreateType(Ty, getOrCreateFile(Loc));
   }
   auto I = DeclCache.find(D->getCanonicalDecl());
 
@@ -4525,7 +4546,8 @@ llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
   auto MI = SPCache.find(FD->getCanonicalDecl());
   if (MI == SPCache.end()) {
     if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
-      return CreateCXXMemberFunction(MD, getOrCreateFile(MD->getLocation()),
+      SourceLocation Loc = getRefinedSpellingLocation(MD->getLocation());
+      return CreateCXXMemberFunction(MD, getOrCreateFile(Loc),
                                      cast<llvm::DICompositeType>(S));
     }
   }
@@ -4687,6 +4709,7 @@ void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
 
   const Decl *D = GD.getDecl();
   bool HasDecl = (D != nullptr);
+  Loc = getRefinedSpellingLocation(Loc);
 
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
@@ -4755,7 +4778,7 @@ void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
       SPFlags | llvm::DISubprogram::SPFlagDefinition;
 
   const unsigned LineNo = getLineNumber(Loc.isValid() ? Loc : CurLoc);
-  unsigned ScopeLine = getLineNumber(ScopeLoc);
+  unsigned ScopeLine = getLineNumber(getRefinedSpellingLocation(ScopeLoc));
   llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit);
   llvm::DISubprogram *Decl = nullptr;
   llvm::DINodeArray Annotations = nullptr;
@@ -4803,6 +4826,7 @@ void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
     return GetName(D, true);
   });
 
+  Loc = getRefinedSpellingLocation(Loc);
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   bool IsDeclForCallSite = Fn ? true : false;
@@ -4930,6 +4954,10 @@ void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
       getColumnNumber(CurLoc)));
 }
 
+SourceLocation CGDebugInfo::getRefinedSpellingLocation(SourceLocation Loc) const {
+  return CGM.getContext().getSourceManager().getRefinedSpellingLoc(Loc);
+}
+
 void CGDebugInfo::AppendAddressSpaceXDeref(
     unsigned AddressSpace, SmallVectorImpl<uint64_t> &Expr) const {
   std::optional<unsigned> DWARFAddressSpace =
@@ -4946,6 +4974,7 @@ void CGDebugInfo::AppendAddressSpaceXDeref(
 void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder,
                                         SourceLocation Loc) {
   // Set our current location.
+  Loc = getRefinedSpellingLocation(Loc);
   setLocation(Loc);
 
   // Emit a line table change for the current location inside the new scope.
@@ -4998,7 +5027,8 @@ CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
   uint64_t FieldSize, FieldOffset;
   uint32_t FieldAlign;
 
-  llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
   QualType Type = VD->getType();
 
   FieldOffset = 0;
@@ -5074,8 +5104,9 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
   const bool VarIsArtificial = IsArtificial(VD);
 
   llvm::DIFile *Unit = nullptr;
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
   if (!VarIsArtificial)
-    Unit = getOrCreateFile(VD->getLocation());
+    Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty;
   uint64_t XOffset = 0;
   if (VD->hasAttr<BlocksAttr>())
@@ -5092,8 +5123,8 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
   unsigned Line = 0;
   unsigned Column = 0;
   if (!VarIsArtificial) {
-    Line = getLineNumber(VD->getLocation());
-    Column = getColumnNumber(VD->getLocation());
+    Line = getLineNumber(Loc);
+    Column = getColumnNumber(Loc);
   }
   SmallVector<uint64_t, 13> Expr;
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
@@ -5259,7 +5290,8 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD,
   if (isa<DeclRefExpr>(BD->getBinding()))
     return nullptr;
 
-  llvm::DIFile *Unit = getOrCreateFile(BD->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(BD->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty = getOrCreateType(BD->getType(), Unit);
 
   // If there is no debug info for this type then do not emit debug info
@@ -5282,8 +5314,8 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD,
     Expr.push_back(llvm::dwarf::DW_OP_deref);
   }
 
-  unsigned Line = getLineNumber(BD->getLocation());
-  unsigned Column = getColumnNumber(BD->getLocation());
+  unsigned Line = getLineNumber(Loc);
+  unsigned Column = getColumnNumber(Loc);
   StringRef Name = BD->getName();
   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
   // Create the descriptor for the variable.
@@ -5377,11 +5409,12 @@ void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
     return;
 
   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
-  llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
 
   // Get location information.
-  unsigned Line = getLineNumber(D->getLocation());
-  unsigned Column = getColumnNumber(D->getLocation());
+  unsigned Line = getLineNumber(Loc);
+  unsigned Column = getColumnNumber(Loc);
 
   StringRef Name = D->getName();
 
@@ -5420,7 +5453,8 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
   bool isByRef = VD->hasAttr<BlocksAttr>();
 
   uint64_t XOffset = 0;
-  llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty;
   if (isByRef)
     Ty = EmitTypeForVarWithBlocksAttr(VD, &XOffset).WrappedType;
@@ -5435,8 +5469,8 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
 
   // Get location information.
   const unsigned Line =
-      getLineNumber(VD->getLocation().isValid() ? VD->getLocation() : CurLoc);
-  unsigned Column = getColumnNumber(VD->getLocation());
+      getLineNumber(Loc.isValid() ? Loc : CurLoc);
+  unsigned Column = getColumnNumber(Loc);
 
   const llvm::DataLayout &target = CGM.getDataLayout();
 
@@ -5544,7 +5578,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
   const BlockDecl *blockDecl = block.getBlockDecl();
 
   // Collect some general information about the block's location.
-  SourceLocation loc = blockDecl->getCaretLocation();
+  SourceLocation loc = getRefinedSpellingLocation(blockDecl->getCaretLocation());
   llvm::DIFile *tunit = getOrCreateFile(loc);
   unsigned line = getLineNumber(loc);
   unsigned column = getColumnNumber(loc);
@@ -6016,8 +6050,9 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
   });
 
   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
+  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
   // Create the descriptor for the variable.
-  llvm::DIFile *Unit = getOrCreateFile(VD->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
   StringRef Name = VD->getName();
   llvm::DIType *Ty = getOrCreateType(VD->getType(), Unit);
 
@@ -6075,7 +6110,7 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
     }
 
   GV.reset(DBuilder.createGlobalVariableExpression(
-      DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty,
+      DContext, Name, StringRef(), Unit, getLineNumber(Loc), Ty,
       true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
       TemplateParameters, Align));
 }
@@ -6087,14 +6122,15 @@ void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
     return;
 
   auto Align = getDeclAlignIfRequired(D, CGM.getContext());
-  llvm::DIFile *Unit = getOrCreateFile(D->getLocation());
+  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
+  llvm::DIFile *Unit = getOrCreateFile(Loc);
   StringRef Name = D->getName();
   llvm::DIType *Ty = getOrCreateType(D->getType(), Unit);
 
   llvm::DIScope *DContext = getDeclContextDescriptor(D);
   llvm::DIGlobalVariableExpression *GVE =
       DBuilder.createGlobalVariableExpression(
-          DContext, Name, StringRef(), Unit, getLineNumber(D->getLocation()),
+          DContext, Name, StringRef(), Unit, getLineNumber(Loc),
           Ty, false, false, nullptr, nullptr, nullptr, Align);
   Var->addDebugInfo(GVE);
 }
@@ -6172,7 +6208,7 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
     return;
 
   llvm::DIScope *DContext = getDeclContextDescriptor(D);
-  auto Loc = D->getLocation();
+  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
 
   llvm::DIImportedEntity *ImportDI = DBuilder.createImportedDeclaration(
       DContext, DI, getOrCreateFile(Loc), getLineNumber(Loc), D->getName());
@@ -6183,16 +6219,15 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
 
 void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
                                             const StringLiteral *S) {
-  SourceLocation Loc = S->getStrTokenLoc(0);
-  SourceManager &SM = CGM.getContext().getSourceManager();
-  PresumedLoc PLoc = SM.getPresumedLoc(SM.getRefinedSpellingLoc(Loc));
+  SourceLocation Loc = getRefinedSpellingLocation(S->getStrTokenLoc(0));
+  PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc);
   if (!PLoc.isValid())
     return;
 
   llvm::DIFile *File = getOrCreateFile(Loc);
   llvm::DIGlobalVariableExpression *Debug =
       DBuilder.createGlobalVariableExpression(
-          nullptr, StringRef(), StringRef(), getOrCreateFile(Loc),
+          nullptr, StringRef(), StringRef(), File,
           getLineNumber(Loc), getOrCreateType(S->getType(), File), true);
   GV->addDebugInfo(Debug);
 }
@@ -6210,7 +6245,7 @@ void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
   const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
   if (!NSDecl->isAnonymousNamespace() ||
       CGM.getCodeGenOpts().DebugExplicitImport) {
-    auto Loc = UD.getLocation();
+    SourceLocation Loc = getRefinedSpellingLocation(UD.getLocation());
     if (!Loc.isValid())
       Loc = CurLoc;
     DBuilder.createImportedModule(
@@ -6222,7 +6257,7 @@ void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
 void CGDebugInfo::EmitUsingShadowDecl(const UsingShadowDecl &USD) {
   if (llvm::DINode *Target =
           getDeclarationOrDefinition(USD.getUnderlyingDecl())) {
-    auto Loc = USD.getLocation();
+    SourceLocation Loc = getRefinedSpellingLocation(USD.getLocation());
     DBuilder.createImportedDeclaration(
         getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target,
         getOrCreateFile(Loc), getLineNumber(Loc));
@@ -6270,7 +6305,7 @@ void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {
     return;
   if (Module *M = ID.getImportedModule()) {
     auto Info = ASTSourceDescriptor(*M);
-    auto Loc = ID.getLocation();
+    auto Loc = getRefinedSpellingLocation(ID.getLocation());
     DBuilder.createImportedDeclaration(
         getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),
         getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc),
@@ -6286,7 +6321,7 @@ CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
   if (VH)
     return cast<llvm::DIImportedEntity>(VH);
   llvm::DIImportedEntity *R;
-  auto Loc = NA.getLocation();
+  auto Loc = getRefinedSpellingLocation(NA.getLocation());
   if (const auto *Underlying =
           dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace()))
     // This could cache & dedup here rather than relying on metadata deduping.
@@ -6418,6 +6453,7 @@ llvm::DebugLoc CGDebugInfo::SourceLocToDebugLoc(SourceLocation Loc) {
   if (LexicalBlockStack.empty())
     return llvm::DebugLoc();
 
+  Loc = getRefinedSpellingLocation(Loc);
   llvm::MDNode *Scope = LexicalBlockStack.back();
   return llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(Loc),
                                getColumnNumber(Loc), Scope);
diff --git a/clang/test/DebugInfo/Generic/macro-info.c b/clang/test/DebugInfo/Generic/macro-info.c
new file mode 100644
index 0000000000000..5cbd97b8d206e
--- /dev/null
+++ b/clang/test/DebugInfo/Generic/macro-info.c
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 %s -debug-info-kind=standalone -emit-llvm -o - | FileCheck %s
+#define ID(x) x
+
+// CHECK: DIGlobalVariable(name: "global",{{.*}} line: [[@LINE+3]]
+// CHECK: DIGlobalVariable({{.*}}line: [[@LINE+5]],{{.*}} type: [[TYPEID:![0-9]+]]
+ID(
+  int global = 42;
+
+  const char* s() {
+    return "1234567890";
+  }
+)
+
+#define SWAP(x,y) y; x
+
+// CHECK: DIGlobalVariable(name: "global3",{{.*}} line: [[@LINE+4]]
+// CHECK: DIGlobalVariable(name: "global2",{{.*}} line: [[@LINE+2]]
+SWAP(
+  int global2 = 43,
+  int global3 = 44
+);
\ No newline at end of file

>From 731f671dd61853a0aec85e9e10eaec4c82975e52 Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 15:23:33 +0200
Subject: [PATCH 04/11] Add more cases to macro-info test.

---
 clang/test/DebugInfo/Generic/macro-info.c | 35 +++++++++++++++--------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/clang/test/DebugInfo/Generic/macro-info.c b/clang/test/DebugInfo/Generic/macro-info.c
index 5cbd97b8d206e..5029c110ee170 100644
--- a/clang/test/DebugInfo/Generic/macro-info.c
+++ b/clang/test/DebugInfo/Generic/macro-info.c
@@ -1,21 +1,32 @@
 // RUN: %clang_cc1 %s -debug-info-kind=standalone -emit-llvm -o - | FileCheck %s
-#define ID(x) x
 
-// CHECK: DIGlobalVariable(name: "global",{{.*}} line: [[@LINE+3]]
-// CHECK: DIGlobalVariable({{.*}}line: [[@LINE+5]],{{.*}} type: [[TYPEID:![0-9]+]]
-ID(
-  int global = 42;
+#define GLOBAL(num) global##num
+#define DECL_GLOBAL(x) int x
+#define SAME_ORDER(x, y) x; y
+#define SWAP_ORDER(x,y) y; x
 
+// CHECK: DIGlobalVariable(name: "global",{{.*}} line: [[@LINE+4]]
+// CHECK: DIGlobalVariable({{.*}}line: [[@LINE+6]],{{.*}} type: [[TYPEID:![0-9]+]]
+SAME_ORDER(
+  int
+    GLOBAL  // <- global
+      () = 42,
   const char* s() {
     return "1234567890";
   }
 )
+// CHECK: DIGlobalVariable(name: "global3",{{.*}} line: [[@LINE+6]]
+// CHECK: DIGlobalVariable(name: "global2",{{.*}} line: [[@LINE+2]]
+SWAP_ORDER(
+  int GLOBAL(  // <- global2
+    2) = 43,
+  DECL_GLOBAL(
+    GLOBAL(  // <- global3
+      3)) = 44
+);
 
-#define SWAP(x,y) y; x
 
-// CHECK: DIGlobalVariable(name: "global3",{{.*}} line: [[@LINE+4]]
-// CHECK: DIGlobalVariable(name: "global2",{{.*}} line: [[@LINE+2]]
-SWAP(
-  int global2 = 43,
-  int global3 = 44
-);
\ No newline at end of file
+// CHECK: DIGlobalVariable(name: "global4",{{.*}} line: [[@LINE+2]]
+DECL_GLOBAL(
+  GLOBAL(  // <- global4
+    4));

>From 252e53771cea04db2ccc1f60cafd55b7d3469eda Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 15:54:29 +0200
Subject: [PATCH 05/11] Add comment for getRefinedSpellingLocation.

---
 clang/lib/CodeGen/CGDebugInfo.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 80812e6415e95..690cb2cd3c788 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4954,7 +4954,16 @@ void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
       getColumnNumber(CurLoc)));
 }
 
-SourceLocation CGDebugInfo::getRefinedSpellingLocation(SourceLocation Loc) const {
+// All locations handled by CGDebugInfo are refined locations because this
+// is more suitable for debugging than pure spelling or expansion locations.
+// Refined locations do not point into macro definitions. If a source
+// location is part of a macro argument expansion, its refined location is
+// the spelling location of the argument. If a source location is part of a
+// macro body, its refined location is the expansion location.
+// This allows debuggers to show the macro invocation site or the argument
+// site, but not the macro definition body.
+SourceLocation
+CGDebugInfo::getRefinedSpellingLocation(SourceLocation Loc) const {
   return CGM.getContext().getSourceManager().getRefinedSpellingLoc(Loc);
 }
 

>From 2855939920782eb422ee56e70979d226b0f89aac Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 16:45:47 +0200
Subject: [PATCH 06/11] Optimize implementation of
 getRefinedSpellingLocSlowCase.

---
 clang/lib/Basic/SourceManager.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index d71580763af69..6ce555b2a3d41 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -918,12 +918,13 @@ SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
 SourceLocation
 SourceManager::getRefinedSpellingLocSlowCase(SourceLocation Loc) const {
   do {
-    FileIDAndOffset LocInfo = getDecomposedLoc(Loc);
-    const ExpansionInfo &Expansion = getSLocEntry(LocInfo.first).getExpansion();
-    if (Expansion.isMacroArgExpansion()) {
-      Loc = Expansion.getSpellingLoc().getLocWithOffset(LocInfo.second);
+    const SLocEntry &E = getSLocEntry(getFileID(Loc));
+    const ExpansionInfo &Exp = E.getExpansion();
+    if (Exp.isMacroArgExpansion()) {
+      Loc = Exp.getSpellingLoc().getLocWithOffset(Loc.getOffset() -
+                                                  E.getOffset());
     } else {
-      Loc = Expansion.getExpansionLocStart();
+      Loc = Exp.getExpansionLocStart();
     }
   } while (!Loc.isFileID());
   return Loc;

>From 37bae8cc8aa1dda88ca147f1ae04a4bdb19dbc9f Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Tue, 14 Oct 2025 16:56:13 +0200
Subject: [PATCH 07/11] Rename some variables.

---
 clang/lib/Basic/SourceManager.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 6ce555b2a3d41..6f7a9c4614091 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -918,13 +918,13 @@ SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
 SourceLocation
 SourceManager::getRefinedSpellingLocSlowCase(SourceLocation Loc) const {
   do {
-    const SLocEntry &E = getSLocEntry(getFileID(Loc));
-    const ExpansionInfo &Exp = E.getExpansion();
-    if (Exp.isMacroArgExpansion()) {
-      Loc = Exp.getSpellingLoc().getLocWithOffset(Loc.getOffset() -
-                                                  E.getOffset());
+    const SLocEntry &Entry = getSLocEntry(getFileID(Loc));
+    const ExpansionInfo &ExpInfo = Entry.getExpansion();
+    if (ExpInfo.isMacroArgExpansion()) {
+      Loc = ExpInfo.getSpellingLoc().getLocWithOffset(Loc.getOffset() -
+                                                      Entry.getOffset());
     } else {
-      Loc = Exp.getExpansionLocStart();
+      Loc = ExpInfo.getExpansionLocStart();
     }
   } while (!Loc.isFileID());
   return Loc;

>From b7f92365c8c0cfa05c90b44dbe861e953ddd5ed2 Mon Sep 17 00:00:00 2001
From: SKill <41159490+SergejSalnikov at users.noreply.github.com>
Date: Tue, 14 Oct 2025 21:38:17 +0200
Subject: [PATCH 08/11] Update CGDebugInfo.h

---
 clang/lib/CodeGen/CGDebugInfo.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 78c3eb9c5792e..a4162d4140bc3 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -408,6 +408,8 @@ class CGDebugInfo {
   /// Create a new lexical block node and push it on the stack.
   void CreateLexicalBlock(SourceLocation Loc);
 
+  SourceLocation getRefinedSpellingLocation(SourceLocation Loc) const;
+
   /// If target-specific LLVM \p AddressSpace directly maps to target-specific
   /// DWARF address space, appends extended dereferencing mechanism to complex
   /// expression \p Expr. Otherwise, does nothing.

>From e065eff74faf34b09576354c2a178d63099ef4b8 Mon Sep 17 00:00:00 2001
From: SKill <41159490+SergejSalnikov at users.noreply.github.com>
Date: Tue, 14 Oct 2025 21:49:42 +0200
Subject: [PATCH 09/11] Move method comment to header file.

---
 clang/lib/CodeGen/CGDebugInfo.cpp |  8 --------
 clang/lib/CodeGen/CGDebugInfo.h   | 10 ++++++++++
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 690cb2cd3c788..835a9538fa403 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4954,14 +4954,6 @@ void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
       getColumnNumber(CurLoc)));
 }
 
-// All locations handled by CGDebugInfo are refined locations because this
-// is more suitable for debugging than pure spelling or expansion locations.
-// Refined locations do not point into macro definitions. If a source
-// location is part of a macro argument expansion, its refined location is
-// the spelling location of the argument. If a source location is part of a
-// macro body, its refined location is the expansion location.
-// This allows debuggers to show the macro invocation site or the argument
-// site, but not the macro definition body.
 SourceLocation
 CGDebugInfo::getRefinedSpellingLocation(SourceLocation Loc) const {
   return CGM.getContext().getSourceManager().getRefinedSpellingLoc(Loc);
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index a4162d4140bc3..206f72e6417b1 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -408,6 +408,16 @@ class CGDebugInfo {
   /// Create a new lexical block node and push it on the stack.
   void CreateLexicalBlock(SourceLocation Loc);
 
+  /// All locations handled by CGDebugInfo are refined locations because this
+  /// is more suitable for debugging than pure spelling or expansion locations.
+  ///
+  /// Refined locations do not point into macro definitions. If a source
+  /// location is part of a macro argument expansion, its refined location is
+  /// the spelling location of the argument. If a source location is part of a
+  /// macro body, its refined location is the expansion location.
+  ///
+  /// This allows debuggers to show the macro invocation site or the argument
+  /// site, but not the macro definition body.
   SourceLocation getRefinedSpellingLocation(SourceLocation Loc) const;
 
   /// If target-specific LLVM \p AddressSpace directly maps to target-specific

>From 456ab3e6f86c8088b5010e25aa7c8c55af91b990 Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Wed, 15 Oct 2025 12:58:22 +0200
Subject: [PATCH 10/11] Fix code formatting.

---
 clang/include/clang/Basic/SourceManager.h |  3 ++-
 clang/lib/CodeGen/CGDebugInfo.cpp         | 18 +++++++++---------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index 5e8ca172a89c0..48ddfd9d7c609 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -1261,7 +1261,8 @@ class SourceManager : public RefCountedBase<SourceManager> {
   SourceLocation getRefinedSpellingLoc(SourceLocation Loc) const {
     // Handle the non-mapped case inline, defer to out of line code to handle
     // expansions.
-    if (Loc.isFileID()) return Loc;
+    if (Loc.isFileID())
+      return Loc;
     return getRefinedSpellingLocSlowCase(Loc);
   }
 
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 835a9538fa403..913fb7da3bcaa 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -5469,8 +5469,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
       Ty = CreateSelfType(VD->getType(), Ty);
 
   // Get location information.
-  const unsigned Line =
-      getLineNumber(Loc.isValid() ? Loc : CurLoc);
+  const unsigned Line = getLineNumber(Loc.isValid() ? Loc : CurLoc);
   unsigned Column = getColumnNumber(Loc);
 
   const llvm::DataLayout &target = CGM.getDataLayout();
@@ -5579,7 +5578,8 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
   const BlockDecl *blockDecl = block.getBlockDecl();
 
   // Collect some general information about the block's location.
-  SourceLocation loc = getRefinedSpellingLocation(blockDecl->getCaretLocation());
+  SourceLocation loc =
+      getRefinedSpellingLocation(blockDecl->getCaretLocation());
   llvm::DIFile *tunit = getOrCreateFile(loc);
   unsigned line = getLineNumber(loc);
   unsigned column = getColumnNumber(loc);
@@ -6111,8 +6111,8 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
     }
 
   GV.reset(DBuilder.createGlobalVariableExpression(
-      DContext, Name, StringRef(), Unit, getLineNumber(Loc), Ty,
-      true, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
+      DContext, Name, StringRef(), Unit, getLineNumber(Loc), Ty, true, true,
+      InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD),
       TemplateParameters, Align));
 }
 
@@ -6131,8 +6131,8 @@ void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
   llvm::DIScope *DContext = getDeclContextDescriptor(D);
   llvm::DIGlobalVariableExpression *GVE =
       DBuilder.createGlobalVariableExpression(
-          DContext, Name, StringRef(), Unit, getLineNumber(Loc),
-          Ty, false, false, nullptr, nullptr, nullptr, Align);
+          DContext, Name, StringRef(), Unit, getLineNumber(Loc), Ty, false,
+          false, nullptr, nullptr, nullptr, Align);
   Var->addDebugInfo(GVE);
 }
 
@@ -6228,8 +6228,8 @@ void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
   llvm::DIFile *File = getOrCreateFile(Loc);
   llvm::DIGlobalVariableExpression *Debug =
       DBuilder.createGlobalVariableExpression(
-          nullptr, StringRef(), StringRef(), File,
-          getLineNumber(Loc), getOrCreateType(S->getType(), File), true);
+          nullptr, StringRef(), StringRef(), File, getLineNumber(Loc),
+          getOrCreateType(S->getType(), File), true);
   GV->addDebugInfo(Debug);
 }
 

>From fc6d2c90233524efb7db171fd090f88cf4b6e324 Mon Sep 17 00:00:00 2001
From: skill <skill at google.com>
Date: Fri, 17 Oct 2025 18:17:17 +0200
Subject: [PATCH 11/11] Reuse SourceManager.getFileLoc method

---
 clang/include/clang/Basic/SourceManager.h |  16 ---
 clang/lib/Basic/SourceManager.cpp         |  13 +--
 clang/lib/CodeGen/CGDebugInfo.cpp         | 117 +++++++++++-----------
 clang/lib/CodeGen/CGDebugInfo.h           |  12 +--
 4 files changed, 62 insertions(+), 96 deletions(-)

diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index 48ddfd9d7c609..7bf87f60e11f0 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -1250,22 +1250,6 @@ class SourceManager : public RefCountedBase<SourceManager> {
     return getSpellingLocSlowCase(Loc);
   }
 
-  /// Given a SourceLocation object, return the refined spelling
-  /// location referenced by the ID.
-  ///
-  /// The key difference to \ref getSpellingLoc is that the source location
-  /// for macro body is resolved to the expansion site.
-  ///
-  /// This is the place where the characters that make up the lexed token
-  /// can be found.
-  SourceLocation getRefinedSpellingLoc(SourceLocation Loc) const {
-    // Handle the non-mapped case inline, defer to out of line code to handle
-    // expansions.
-    if (Loc.isFileID())
-      return Loc;
-    return getRefinedSpellingLocSlowCase(Loc);
-  }
-
   /// Given a SourceLocation object, return the spelling location
   /// referenced by the ID.
   ///
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 6f7a9c4614091..9a59bc62d565f 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -915,8 +915,7 @@ SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const {
   return Loc;
 }
 
-SourceLocation
-SourceManager::getRefinedSpellingLocSlowCase(SourceLocation Loc) const {
+SourceLocation SourceManager::getFileLocSlowCase(SourceLocation Loc) const {
   do {
     const SLocEntry &Entry = getSLocEntry(getFileID(Loc));
     const ExpansionInfo &ExpInfo = Entry.getExpansion();
@@ -930,16 +929,6 @@ SourceManager::getRefinedSpellingLocSlowCase(SourceLocation Loc) const {
   return Loc;
 }
 
-SourceLocation SourceManager::getFileLocSlowCase(SourceLocation Loc) const {
-  do {
-    if (isMacroArgExpansion(Loc))
-      Loc = getImmediateSpellingLoc(Loc);
-    else
-      Loc = getImmediateExpansionRange(Loc).getBegin();
-  } while (!Loc.isFileID());
-  return Loc;
-}
-
 FileIDAndOffset SourceManager::getDecomposedExpansionLocSlowCase(
     const SrcMgr::SLocEntry *E) const {
   // If this is an expansion record, walk through all the expansion points.
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 913fb7da3bcaa..80f34b18fc32e 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -319,7 +319,7 @@ void CGDebugInfo::setLocation(SourceLocation Loc) {
     return;
 
   SourceManager &SM = CGM.getContext().getSourceManager();
-  CurLoc = SM.getRefinedSpellingLoc(Loc);
+  CurLoc = SM.getFileLoc(Loc);
 
   // If we've changed files in the middle of a lexical scope go ahead
   // and create a new lexical scope with file node if it's different
@@ -1332,7 +1332,7 @@ CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
   const RecordDecl *RD = Ty->getOriginalDecl()->getDefinitionOrSelf();
   if (llvm::DIType *T = getTypeOrNull(QualType(Ty, 0)))
     return cast<llvm::DICompositeType>(T);
-  SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+  SourceLocation Loc = getFileLocation(RD->getLocation());
   llvm::DIFile *DefUnit = getOrCreateFile(Loc);
   const unsigned Line = getLineNumber(Loc.isValid() ? Loc : CurLoc);
   StringRef RDName = getClassName(RD);
@@ -1561,7 +1561,7 @@ llvm::DIType *CGDebugInfo::CreateType(const TemplateSpecializationType *Ty,
   auto PP = getPrintingPolicy();
   Ty->getTemplateName().print(OS, PP, TemplateName::Qualified::None);
 
-  SourceLocation Loc = getRefinedSpellingLocation(AliasDecl->getLocation());
+  SourceLocation Loc = getFileLocation(AliasDecl->getLocation());
 
   if (CGM.getCodeGenOpts().DebugTemplateAlias) {
     auto ArgVector = ::GetTemplateArgs(TD, Ty);
@@ -1630,7 +1630,7 @@ llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,
 
   // We don't set size information, but do specify where the typedef was
   // declared.
-  SourceLocation Loc = getRefinedSpellingLocation(Ty->getDecl()->getLocation());
+  SourceLocation Loc = getFileLocation(Ty->getDecl()->getLocation());
 
   uint32_t Align = getDeclAlignIfRequired(Ty->getDecl(), CGM.getContext());
   // Typedefs are derived from some other type.
@@ -1764,7 +1764,7 @@ CGDebugInfo::createBitFieldType(const FieldDecl *BitFieldDecl,
   QualType Ty = BitFieldDecl->getType();
   if (BitFieldDecl->hasAttr<PreferredTypeAttr>())
     Ty = BitFieldDecl->getAttr<PreferredTypeAttr>()->getType();
-  SourceLocation Loc = getRefinedSpellingLocation(BitFieldDecl->getLocation());
+  SourceLocation Loc = getFileLocation(BitFieldDecl->getLocation());
   llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
 
@@ -1842,8 +1842,7 @@ llvm::DIDerivedType *CGDebugInfo::createBitFieldSeparatorIfNeeded(
     return nullptr;
 
   QualType Ty = PreviousBitfield->getType();
-  SourceLocation Loc =
-      getRefinedSpellingLocation(PreviousBitfield->getLocation());
+  SourceLocation Loc = getFileLocation(PreviousBitfield->getLocation());
   llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *DebugType = getOrCreateType(Ty, VUnit);
   llvm::DIScope *RecordTy = BitFieldDI->getScope();
@@ -1962,7 +1961,7 @@ void CGDebugInfo::CollectRecordLambdaFields(
       continue;
     }
 
-    Loc = getRefinedSpellingLocation(Loc);
+    Loc = getFileLocation(Loc);
     llvm::DIFile *VUnit = getOrCreateFile(Loc);
 
     elements.push_back(createFieldType(
@@ -1977,7 +1976,7 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
   // Create the descriptor for the static variable, with or without
   // constant initializers.
   Var = Var->getCanonicalDecl();
-  SourceLocation Loc = getRefinedSpellingLocation(Var->getLocation());
+  SourceLocation Loc = getFileLocation(Var->getLocation());
   llvm::DIFile *VUnit = getOrCreateFile(Loc);
   llvm::DIType *VTy = getOrCreateType(Var->getType(), VUnit);
 
@@ -2030,9 +2029,8 @@ void CGDebugInfo::CollectRecordNormalField(
     auto Align = getDeclAlignIfRequired(field, CGM.getContext());
     llvm::DINodeArray Annotations = CollectBTFDeclTagAnnotations(field);
     FieldType = createFieldType(
-        name, type, getRefinedSpellingLocation(field->getLocation()),
-        field->getAccess(), OffsetInBits, Align, tunit, RecordTy, RD,
-        Annotations);
+        name, type, getFileLocation(field->getLocation()), field->getAccess(),
+        OffsetInBits, Align, tunit, RecordTy, RD, Annotations);
   }
 
   elements.push_back(FieldType);
@@ -2046,7 +2044,7 @@ void CGDebugInfo::CollectRecordNestedType(
   // instead?
   if (isa<InjectedClassNameType>(Ty))
     return;
-  SourceLocation Loc = getRefinedSpellingLocation(TD->getLocation());
+  SourceLocation Loc = getFileLocation(TD->getLocation());
   if (llvm::DIType *nestedType = getOrCreateType(Ty, getOrCreateFile(Loc)))
     elements.push_back(nestedType);
 }
@@ -2250,7 +2248,7 @@ llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
   llvm::DIFile *MethodDefUnit = nullptr;
   unsigned MethodLine = 0;
   if (!Method->isImplicit()) {
-    SourceLocation Loc = getRefinedSpellingLocation(Method->getLocation());
+    SourceLocation Loc = getFileLocation(Method->getLocation());
     MethodDefUnit = getOrCreateFile(Loc);
     MethodLine = getLineNumber(Loc);
   }
@@ -2852,7 +2850,7 @@ void CGDebugInfo::CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile *Unit,
 llvm::DIType *CGDebugInfo::getOrCreateRecordType(QualType RTy,
                                                  SourceLocation Loc) {
   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
   llvm::DIType *T = getOrCreateType(RTy, getOrCreateFile(Loc));
   return T;
 }
@@ -2866,7 +2864,7 @@ llvm::DIType *CGDebugInfo::getOrCreateStandaloneType(QualType D,
                                                      SourceLocation Loc) {
   assert(CGM.getCodeGenOpts().hasReducedDebugInfo());
   assert(!D.isNull() && "null type");
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
   llvm::DIType *T = getOrCreateType(D, getOrCreateFile(Loc));
   assert(T && "could not create debug info for type");
 
@@ -2884,8 +2882,7 @@ void CGDebugInfo::addHeapAllocSiteMetadata(llvm::CallBase *CI,
   if (AllocatedTy->isVoidType())
     node = llvm::MDNode::get(CGM.getLLVMContext(), {});
   else
-    node = getOrCreateType(AllocatedTy,
-                           getOrCreateFile(getRefinedSpellingLocation(Loc)));
+    node = getOrCreateType(AllocatedTy, getOrCreateFile(getFileLocation(Loc)));
 
   CI->setMetadata("heapallocsite", node);
 }
@@ -3118,7 +3115,7 @@ std::pair<llvm::DIType *, llvm::DIType *>
 CGDebugInfo::CreateTypeDefinition(const RecordType *Ty) {
   RecordDecl *RD = Ty->getOriginalDecl()->getDefinitionOrSelf();
 
-  SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+  SourceLocation Loc = getFileLocation(RD->getLocation());
   // Get overall information about the record type for the debug info.
   llvm::DIFile *DefUnit = getOrCreateFile(Loc);
 
@@ -3188,7 +3185,7 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCObjectType *Ty,
 llvm::DIType *CGDebugInfo::CreateType(const ObjCTypeParamType *Ty,
                                       llvm::DIFile *Unit) {
   // Ignore protocols.
-  SourceLocation Loc = getRefinedSpellingLocation(Ty->getDecl()->getLocation());
+  SourceLocation Loc = getFileLocation(Ty->getDecl()->getLocation());
 
   // Use Typedefs to represent ObjCTypeParamType.
   return DBuilder.createTypedef(
@@ -3239,7 +3236,7 @@ llvm::DIType *CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
         llvm::dwarf::DW_TAG_structure_type, ID->getName(),
         getDeclContextDescriptor(ID), Unit, 0, RuntimeLang);
 
-  SourceLocation Loc = getRefinedSpellingLocation(ID->getLocation());
+  SourceLocation Loc = getFileLocation(ID->getLocation());
   // Get overall information about the record type for the debug info.
   llvm::DIFile *DefUnit = getOrCreateFile(Loc);
   unsigned Line = getLineNumber(Loc);
@@ -3363,7 +3360,7 @@ llvm::DIModule *CGDebugInfo::getOrCreateModuleRef(ASTSourceDescriptor Mod,
 llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
                                                 llvm::DIFile *Unit) {
   ObjCInterfaceDecl *ID = Ty->getDecl();
-  SourceLocation Loc = getRefinedSpellingLocation(ID->getLocation());
+  SourceLocation Loc = getFileLocation(ID->getLocation());
   llvm::DIFile *DefUnit = getOrCreateFile(Loc);
   unsigned Line = getLineNumber(Loc);
 
@@ -3460,7 +3457,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
     if (FieldName.empty())
       continue;
 
-    SourceLocation Loc = getRefinedSpellingLocation(Field->getLocation());
+    SourceLocation Loc = getFileLocation(Field->getLocation());
     // Get the location for the field.
     llvm::DIFile *FieldDefUnit = getOrCreateFile(Loc);
     unsigned FieldLine = getLineNumber(Loc);
@@ -3508,7 +3505,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const ObjCInterfaceType *Ty,
       if (ObjCPropertyImplDecl *PImpD =
               ImpD->FindPropertyImplIvarDecl(Field->getIdentifier())) {
         if (ObjCPropertyDecl *PD = PImpD->getPropertyDecl()) {
-          SourceLocation Loc = getRefinedSpellingLocation(PD->getLocation());
+          SourceLocation Loc = getFileLocation(PD->getLocation());
           llvm::DIFile *PUnit = getOrCreateFile(Loc);
           unsigned PLine = getLineNumber(Loc);
           ObjCMethodDecl *Getter = PImpD->getGetterMethodDecl();
@@ -3790,7 +3787,7 @@ llvm::DIType *CGDebugInfo::CreateEnumType(const EnumType *Ty) {
     // FwdDecl with the second and then replace the second with
     // complete type.
     llvm::DIScope *EDContext = getDeclContextDescriptor(ED);
-    SourceLocation Loc = getRefinedSpellingLocation(ED->getLocation());
+    SourceLocation Loc = getFileLocation(ED->getLocation());
     llvm::DIFile *DefUnit = getOrCreateFile(Loc);
     llvm::TempDIScope TmpContext(DBuilder.createReplaceableCompositeType(
         llvm::dwarf::DW_TAG_enumeration_type, "", TheCU, DefUnit, 0));
@@ -3828,7 +3825,7 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
   // Return a CompositeType for the enum itself.
   llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
 
-  SourceLocation Loc = getRefinedSpellingLocation(ED->getLocation());
+  SourceLocation Loc = getFileLocation(ED->getLocation());
   llvm::DIFile *DefUnit = getOrCreateFile(Loc);
   unsigned Line = getLineNumber(Loc);
   llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
@@ -3848,10 +3845,9 @@ llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
 llvm::DIMacroFile *CGDebugInfo::CreateTempMacroFile(llvm::DIMacroFile *Parent,
                                                     SourceLocation LineLoc,
                                                     SourceLocation FileLoc) {
-  llvm::DIFile *FName = getOrCreateFile(getRefinedSpellingLocation(FileLoc));
-  unsigned Line = LineLoc.isInvalid()
-                      ? 0
-                      : getLineNumber(getRefinedSpellingLocation(LineLoc));
+  llvm::DIFile *FName = getOrCreateFile(getFileLocation(FileLoc));
+  unsigned Line =
+      LineLoc.isInvalid() ? 0 : getLineNumber(getFileLocation(LineLoc));
   return DBuilder.createTempMacroFile(Parent, Line, FName);
 }
 
@@ -4174,7 +4170,7 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
 
   // Get overall information about the record type for the debug info.
   StringRef RDName = getClassName(RD);
-  const SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+  const SourceLocation Loc = getFileLocation(RD->getLocation());
   llvm::DIFile *DefUnit = nullptr;
   unsigned Line = 0;
   if (Loc.isValid()) {
@@ -4289,7 +4285,7 @@ void CGDebugInfo::CollectContainingType(const CXXRecordDecl *RD,
         break;
     }
     CanQualType T = CGM.getContext().getCanonicalTagType(PBase);
-    SourceLocation Loc = getRefinedSpellingLocation(RD->getLocation());
+    SourceLocation Loc = getFileLocation(RD->getLocation());
     ContainingType = getOrCreateType(T, getOrCreateFile(Loc));
   } else if (RD->isDynamicClass())
     ContainingType = RealDecl;
@@ -4361,7 +4357,7 @@ void CGDebugInfo::collectVarDeclProps(const VarDecl *VD, llvm::DIFile *&Unit,
                                       StringRef &Name, StringRef &LinkageName,
                                       llvm::MDTuple *&TemplateParameters,
                                       llvm::DIScope *&VDContext) {
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   Unit = getOrCreateFile(Loc);
   LineNo = getLineNumber(Loc);
 
@@ -4418,7 +4414,7 @@ llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
   StringRef Name, LinkageName;
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
-  SourceLocation Loc = getRefinedSpellingLocation(GD.getDecl()->getLocation());
+  SourceLocation Loc = getFileLocation(GD.getDecl()->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIScope *DContext = Unit;
   unsigned Line = getLineNumber(Loc);
@@ -4473,7 +4469,7 @@ llvm::DIGlobalVariable *
 CGDebugInfo::getGlobalVariableForwardDeclaration(const VarDecl *VD) {
   QualType T;
   StringRef Name, LinkageName;
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIScope *DContext = Unit;
   unsigned Line = getLineNumber(Loc);
@@ -4499,7 +4495,7 @@ llvm::DINode *CGDebugInfo::getDeclarationOrDefinition(const Decl *D) {
   // in unlimited debug info)
   if (const auto *TD = dyn_cast<TypeDecl>(D)) {
     QualType Ty = CGM.getContext().getTypeDeclType(TD);
-    SourceLocation Loc = getRefinedSpellingLocation(TD->getLocation());
+    SourceLocation Loc = getFileLocation(TD->getLocation());
     return getOrCreateType(Ty, getOrCreateFile(Loc));
   }
   auto I = DeclCache.find(D->getCanonicalDecl());
@@ -4546,7 +4542,7 @@ llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
   auto MI = SPCache.find(FD->getCanonicalDecl());
   if (MI == SPCache.end()) {
     if (const auto *MD = dyn_cast<CXXMethodDecl>(FD->getCanonicalDecl())) {
-      SourceLocation Loc = getRefinedSpellingLocation(MD->getLocation());
+      SourceLocation Loc = getFileLocation(MD->getLocation());
       return CreateCXXMemberFunction(MD, getOrCreateFile(Loc),
                                      cast<llvm::DICompositeType>(S));
     }
@@ -4709,7 +4705,7 @@ void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
 
   const Decl *D = GD.getDecl();
   bool HasDecl = (D != nullptr);
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
 
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DISubprogram::DISPFlags SPFlags = llvm::DISubprogram::SPFlagZero;
@@ -4778,7 +4774,7 @@ void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
       SPFlags | llvm::DISubprogram::SPFlagDefinition;
 
   const unsigned LineNo = getLineNumber(Loc.isValid() ? Loc : CurLoc);
-  unsigned ScopeLine = getLineNumber(getRefinedSpellingLocation(ScopeLoc));
+  unsigned ScopeLine = getLineNumber(getFileLocation(ScopeLoc));
   llvm::DISubroutineType *DIFnType = getOrCreateFunctionType(D, FnType, Unit);
   llvm::DISubprogram *Decl = nullptr;
   llvm::DINodeArray Annotations = nullptr;
@@ -4826,7 +4822,8 @@ void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
     return GetName(D, true);
   });
 
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
+
   llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   bool IsDeclForCallSite = Fn ? true : false;
@@ -4936,7 +4933,7 @@ void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
   // Update our current location
   setLocation(Loc);
 
-  if (CurLoc.isInvalid() || CurLoc.isMacroID() || LexicalBlockStack.empty())
+  if (CurLoc.isInvalid() || LexicalBlockStack.empty())
     return;
 
   llvm::MDNode *Scope = LexicalBlockStack.back();
@@ -4954,9 +4951,8 @@ void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) {
       getColumnNumber(CurLoc)));
 }
 
-SourceLocation
-CGDebugInfo::getRefinedSpellingLocation(SourceLocation Loc) const {
-  return CGM.getContext().getSourceManager().getRefinedSpellingLoc(Loc);
+SourceLocation CGDebugInfo::getFileLocation(SourceLocation Loc) const {
+  return CGM.getContext().getSourceManager().getFileLoc(Loc);
 }
 
 void CGDebugInfo::AppendAddressSpaceXDeref(
@@ -4975,7 +4971,7 @@ void CGDebugInfo::AppendAddressSpaceXDeref(
 void CGDebugInfo::EmitLexicalBlockStart(CGBuilderTy &Builder,
                                         SourceLocation Loc) {
   // Set our current location.
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
   setLocation(Loc);
 
   // Emit a line table change for the current location inside the new scope.
@@ -5028,7 +5024,7 @@ CGDebugInfo::EmitTypeForVarWithBlocksAttr(const VarDecl *VD,
   uint64_t FieldSize, FieldOffset;
   uint32_t FieldAlign;
 
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   QualType Type = VD->getType();
 
@@ -5105,7 +5101,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD,
   const bool VarIsArtificial = IsArtificial(VD);
 
   llvm::DIFile *Unit = nullptr;
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   if (!VarIsArtificial)
     Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty;
@@ -5291,7 +5287,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD,
   if (isa<DeclRefExpr>(BD->getBinding()))
     return nullptr;
 
-  SourceLocation Loc = getRefinedSpellingLocation(BD->getLocation());
+  SourceLocation Loc = getFileLocation(BD->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty = getOrCreateType(BD->getType(), Unit);
 
@@ -5410,7 +5406,7 @@ void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) {
     return;
 
   auto *Scope = cast<llvm::DIScope>(LexicalBlockStack.back());
-  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
+  SourceLocation Loc = getFileLocation(D->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
 
   // Get location information.
@@ -5454,7 +5450,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
   bool isByRef = VD->hasAttr<BlocksAttr>();
 
   uint64_t XOffset = 0;
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   llvm::DIType *Ty;
   if (isByRef)
@@ -5578,8 +5574,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
   const BlockDecl *blockDecl = block.getBlockDecl();
 
   // Collect some general information about the block's location.
-  SourceLocation loc =
-      getRefinedSpellingLocation(blockDecl->getCaretLocation());
+  SourceLocation loc = getFileLocation(blockDecl->getCaretLocation());
   llvm::DIFile *tunit = getOrCreateFile(loc);
   unsigned line = getLineNumber(loc);
   unsigned column = getColumnNumber(loc);
@@ -6051,7 +6046,7 @@ void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD, const APValue &Init) {
   });
 
   auto Align = getDeclAlignIfRequired(VD, CGM.getContext());
-  SourceLocation Loc = getRefinedSpellingLocation(VD->getLocation());
+  SourceLocation Loc = getFileLocation(VD->getLocation());
   // Create the descriptor for the variable.
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   StringRef Name = VD->getName();
@@ -6123,7 +6118,7 @@ void CGDebugInfo::EmitExternalVariable(llvm::GlobalVariable *Var,
     return;
 
   auto Align = getDeclAlignIfRequired(D, CGM.getContext());
-  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
+  SourceLocation Loc = getFileLocation(D->getLocation());
   llvm::DIFile *Unit = getOrCreateFile(Loc);
   StringRef Name = D->getName();
   llvm::DIType *Ty = getOrCreateType(D->getType(), Unit);
@@ -6209,7 +6204,7 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
     return;
 
   llvm::DIScope *DContext = getDeclContextDescriptor(D);
-  SourceLocation Loc = getRefinedSpellingLocation(D->getLocation());
+  SourceLocation Loc = getFileLocation(D->getLocation());
 
   llvm::DIImportedEntity *ImportDI = DBuilder.createImportedDeclaration(
       DContext, DI, getOrCreateFile(Loc), getLineNumber(Loc), D->getName());
@@ -6220,7 +6215,7 @@ void CGDebugInfo::EmitGlobalAlias(const llvm::GlobalValue *GV,
 
 void CGDebugInfo::AddStringLiteralDebugInfo(llvm::GlobalVariable *GV,
                                             const StringLiteral *S) {
-  SourceLocation Loc = getRefinedSpellingLocation(S->getStrTokenLoc(0));
+  SourceLocation Loc = getFileLocation(S->getStrTokenLoc(0));
   PresumedLoc PLoc = CGM.getContext().getSourceManager().getPresumedLoc(Loc);
   if (!PLoc.isValid())
     return;
@@ -6246,7 +6241,7 @@ void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
   const NamespaceDecl *NSDecl = UD.getNominatedNamespace();
   if (!NSDecl->isAnonymousNamespace() ||
       CGM.getCodeGenOpts().DebugExplicitImport) {
-    SourceLocation Loc = getRefinedSpellingLocation(UD.getLocation());
+    SourceLocation Loc = getFileLocation(UD.getLocation());
     if (!Loc.isValid())
       Loc = CurLoc;
     DBuilder.createImportedModule(
@@ -6258,7 +6253,7 @@ void CGDebugInfo::EmitUsingDirective(const UsingDirectiveDecl &UD) {
 void CGDebugInfo::EmitUsingShadowDecl(const UsingShadowDecl &USD) {
   if (llvm::DINode *Target =
           getDeclarationOrDefinition(USD.getUnderlyingDecl())) {
-    SourceLocation Loc = getRefinedSpellingLocation(USD.getLocation());
+    SourceLocation Loc = getFileLocation(USD.getLocation());
     DBuilder.createImportedDeclaration(
         getCurrentContextDescriptor(cast<Decl>(USD.getDeclContext())), Target,
         getOrCreateFile(Loc), getLineNumber(Loc));
@@ -6306,7 +6301,7 @@ void CGDebugInfo::EmitImportDecl(const ImportDecl &ID) {
     return;
   if (Module *M = ID.getImportedModule()) {
     auto Info = ASTSourceDescriptor(*M);
-    auto Loc = getRefinedSpellingLocation(ID.getLocation());
+    auto Loc = getFileLocation(ID.getLocation());
     DBuilder.createImportedDeclaration(
         getCurrentContextDescriptor(cast<Decl>(ID.getDeclContext())),
         getOrCreateModuleRef(Info, DebugTypeExtRefs), getOrCreateFile(Loc),
@@ -6322,7 +6317,7 @@ CGDebugInfo::EmitNamespaceAlias(const NamespaceAliasDecl &NA) {
   if (VH)
     return cast<llvm::DIImportedEntity>(VH);
   llvm::DIImportedEntity *R;
-  auto Loc = getRefinedSpellingLocation(NA.getLocation());
+  auto Loc = getFileLocation(NA.getLocation());
   if (const auto *Underlying =
           dyn_cast<NamespaceAliasDecl>(NA.getAliasedNamespace()))
     // This could cache & dedup here rather than relying on metadata deduping.
@@ -6454,7 +6449,7 @@ llvm::DebugLoc CGDebugInfo::SourceLocToDebugLoc(SourceLocation Loc) {
   if (LexicalBlockStack.empty())
     return llvm::DebugLoc();
 
-  Loc = getRefinedSpellingLocation(Loc);
+  Loc = getFileLocation(Loc);
   llvm::MDNode *Scope = LexicalBlockStack.back();
   return llvm::DILocation::get(CGM.getLLVMContext(), getLineNumber(Loc),
                                getColumnNumber(Loc), Scope);
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 206f72e6417b1..07e1fbc485292 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -408,17 +408,15 @@ class CGDebugInfo {
   /// Create a new lexical block node and push it on the stack.
   void CreateLexicalBlock(SourceLocation Loc);
 
-  /// All locations handled by CGDebugInfo are refined locations because this
+  /// All locations handled by CGDebugInfo are file locations because this
   /// is more suitable for debugging than pure spelling or expansion locations.
-  ///
-  /// Refined locations do not point into macro definitions. If a source
-  /// location is part of a macro argument expansion, its refined location is
+  /// File locations do not point into macro definitions. If a source
+  /// location is part of a macro argument expansion, its file location is
   /// the spelling location of the argument. If a source location is part of a
-  /// macro body, its refined location is the expansion location.
-  ///
+  /// macro body, its file location is the expansion location.
   /// This allows debuggers to show the macro invocation site or the argument
   /// site, but not the macro definition body.
-  SourceLocation getRefinedSpellingLocation(SourceLocation Loc) const;
+  SourceLocation getFileLocation(SourceLocation Loc) const;
 
   /// If target-specific LLVM \p AddressSpace directly maps to target-specific
   /// DWARF address space, appends extended dereferencing mechanism to complex



More information about the cfe-commits mailing list