================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits