[PATCH] D89749: SourceManager: Don't allocate an SLocEntry until it's loaded
Raphael Isemann via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 26 08:10:16 PDT 2020
teemperor added a subscriber: v.g.vassilev.
teemperor requested changes to this revision.
teemperor added a comment.
This revision now requires changes to proceed.
Maybe arc didn't correctly apply the patch, but this causes a few LLDB tests to fail on my machine:
lldb-api :: commands/expression/import-std-module/queue/TestQueueFromStdModule.py
lldb-api :: commands/expression/import-std-module/list/TestListFromStdModule.py
lldb-api :: commands/expression/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardListFromStdModule.py
>From the backtrace this seems like the ASTImporter needs to be updated:
* frame #0: 0x00007ffff25f1bb6 _lldb.so`clang::ASTImporter::Import(clang::FileID, bool) + 566
frame #1: 0x00007ffff25ecc56 _lldb.so`clang::ASTImporter::Import(clang::SourceLocation) + 182
frame #2: 0x00007ffff25bbaed _lldb.so`clang::SourceLocation clang::ASTNodeImporter::importChecked<clang::SourceLocation>(llvm::Error&, clang::SourceLocation const&) + 61
frame #3: 0x00007ffff25c34e8 _lldb.so`clang::ASTNodeImporter::VisitFunctionDecl(clang::FunctionDecl*) + 2968
frame #4: 0x00007ffff25ebb31 _lldb.so`clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) + 81
frame #5: 0x00007ffff25ebac2 _lldb.so`clang::ASTImporter::ImportImpl(clang::Decl*) + 34
frame #6: 0x00007ffff0df9cb1 _lldb.so`lldb_private::ClangASTImporter::ASTImporterDelegate::ImportImpl(clang::Decl*) + 1345
frame #7: 0x00007ffff25ed3f4 _lldb.so`clang::ASTImporter::Import(clang::Decl*) + 532
frame #8: 0x00007ffff25aeb93 _lldb.so`llvm::Expected<clang::ValueDecl*> clang::ASTNodeImport
The tests are just loading a Clang module and then trying to import some Decls into another ASTContext, so I don't think the error here is specific to LLDB. We just don't have any ASTImporter tests that exercise modules.
FWIW, if you quickly want to see if your SourceManager changes break LLDB, then you can just set the LIT_FILTER to "Modules" and run `check-lldb` as LLDB's use of Clang modules are the only place where we have any valid SourceLocations within LLDB.
Regarding the patch itself:
1. The `I - 1` everywhere when translating `SLocEntryLoaded` values to a `LoadedSLocEntryTable` index is a bit cryptic. We already do similar magic in other places, but here it's really just about expressing an optional integer. Could we maybe have a wrapper function that turns this into a `llvm::Optional<unsigned>` (that is `llvm::None` when it's not loaded). Something like this maybe (which hopefully optimizes to something similar to the original code):
llvm::Optional<unsigned> getLoadedSLocEntryTableIndex(size_t Index) const {
unsigned result = SLocEntryLoaded[Index];
if (result == /*sentinel value*/0)
return llvm::None;
return result - 1U;
}
2. If we have this as an Optional, we might as well make the sentinel value `std::numeric_limits<unsigned>::max()` instead of 0 in `SLocEntryLoaded`. Then we can just all values as-is without translating them to an index.
3. Now that the primary purpose of `SLocEntryLoaded` is storing indices and not the loaded status, maybe something like `SLocEntryIndices` would be a better name?
4. Do you still have your benchmarking values (or some estimates) for this? I'm just curious how much memory this actually saves.
Otherwise I think this looks good.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D89749/new/
https://reviews.llvm.org/D89749
More information about the cfe-commits
mailing list