[clang] [Modules] No transitive source location change (PR #86912)
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 24 09:34:38 PDT 2024
================
@@ -2220,33 +2221,40 @@ class ASTReader
return Sema::AlignPackInfo::getFromRawEncoding(Raw);
}
+ using RawLocEncoding = SourceLocationEncoding::RawLocEncoding;
+
/// Read a source location from raw form and return it in its
/// originating module file's source location space.
- SourceLocation ReadUntranslatedSourceLocation(SourceLocation::UIntTy Raw,
- LocSeq *Seq = nullptr) const {
+ std::pair<SourceLocation, unsigned>
+ ReadUntranslatedSourceLocation(RawLocEncoding Raw,
+ LocSeq *Seq = nullptr) const {
return SourceLocationEncoding::decode(Raw, Seq);
}
/// Read a source location from raw form.
- SourceLocation ReadSourceLocation(ModuleFile &ModuleFile,
- SourceLocation::UIntTy Raw,
- LocSeq *Seq = nullptr) const {
- SourceLocation Loc = ReadUntranslatedSourceLocation(Raw, Seq);
- return TranslateSourceLocation(ModuleFile, Loc);
+ SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw,
+ LocSeq *Seq = nullptr) const {
+ if (!MF.ModuleOffsetMap.empty())
+ ReadModuleOffsetMap(MF);
+
+ auto [Loc, ModuleFileIndex] = ReadUntranslatedSourceLocation(Raw, Seq);
+ ModuleFile *OwningModuleFile =
+ ModuleFileIndex ? MF.DependentModules[ModuleFileIndex - 1] : &MF;
+ return TranslateSourceLocation(*OwningModuleFile, Loc);
}
/// Translate a source location from another module file's source
/// location space into ours.
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile,
SourceLocation Loc) const {
- if (!ModuleFile.ModuleOffsetMap.empty())
- ReadModuleOffsetMap(ModuleFile);
- assert(ModuleFile.SLocRemap.find(Loc.getOffset()) !=
- ModuleFile.SLocRemap.end() &&
- "Cannot find offset to remap.");
- SourceLocation::IntTy Remap =
- ModuleFile.SLocRemap.find(Loc.getOffset())->second;
- return Loc.getLocWithOffset(Remap);
+ if (Loc.isInvalid())
+ return Loc;
+
+ // It implies that the Loc is already translated.
+ if (SourceMgr.isLoadedSourceLocation(Loc))
+ return Loc;
----------------
jansvoboda11 wrote:
I see, thanks for explaining that.
I think we should still attempt to unify things so that `TranslateSourceLocation()` is only called from `ReadSourceLocation()`. Even if it means carrying something like `std::variant<SourceLocation, SourceLocationEncoding::RawLocEncoding>` (or `, UntranslatedSourceLocation>`) in few places. Juggling translated and untranslated `SourceLocation` instances and making functions resilient to both seems unnecessarily complex. I'm fine with leaving a FIXME in this patch and doing a follow-up.
https://github.com/llvm/llvm-project/pull/86912
More information about the cfe-commits
mailing list