Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[cherry-pick][swift/release/6.0] [lldb][Type Completion] Lazy loading of C++ methods #8698

Conversation

Michael137
Copy link

This cherry-picks all the commits associated with #8579

Michael137 added 9 commits May 6, 2024 09:40
Note, this is a no-op when the LLDB setting
`plugin.typesystem.clang.experimental-redecl-completion` is
not set (which is currently the default). So this patch has
no affect unless the user explicitly opts into it.

The type-completion rework (aka redecl-completion) implemented in
swiftlang#8222 comes with
a large performance penalty, since we now eagerly complete
`RecordType`s. Completing a `RecordType` previously unconditionally
resolved all member function of said type. With redecl-completion
completion, however, this meant we were now pulling in many
more definitions than needed. Without redecl-completion, this
isn't a problem, since importing method parameters is cheap
(they are imported minimally), so we wouldn't notice that
we always resolved all member functions.

This patch tries to load methods lazily when in redecl-completion
mode. We do this by introducing a new `ExternalASTSource::FindExternalVisibleMethods`
API which Clang parses a member access expression. The callback
into LLDB will do a `FindFunctions` call for all methods with the
method name we're looking for, filters out any mismatches, and
lets Clang continue with it's parsing. We still load following
methods eagerly:
1. virtual functions: currently overrides are resolved in `CompleteRecordType`
2. operators: currently I couldn't find a point at which Clang can call
              into LLDB here to facilitate lazy loading
3. ctors/dtors: same reason as (2)

In our benchmark harness, we saw this patch bring down redecl-completion
expression evaluation on-par with top-of-tree expression evaluation.

(cherry picked from commit ff8fdb9)
…lazy method loading

(cherry picked from commit 4397f63)
… definition is not found

(cherry picked from commit 44b5083)
…nt redecl-completion fixes

These were fixed in swiftlang#8659.

(cherry picked from commit 582bd6d)
We started hitting it after the fixes in swiftlang#8659.
The assert can safely be disabled, so this patch does so to
unblock CI.

(cherry picked from commit 41754cd)
@Michael137 Michael137 requested a review from adrian-prantl May 6, 2024 08:42
@Michael137
Copy link
Author

@swift-ci test

Expected failures due to lazy method loading
(swiftlang#8579)

(cherry picked from commit 9507b8b)
@Michael137 Michael137 force-pushed the lldb/type-completion/cherry-pick-all branch from f25ecc0 to 17fce6b Compare May 6, 2024 09:00
@Michael137
Copy link
Author

@swift-ci test

@adrian-prantl adrian-prantl merged commit 202ab23 into swiftlang:swift/release/6.0 May 6, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants