jimingham wrote:
> > I don't remember how that works in swift, but note, there are two separate
> > issues with the C family expression parser. One was making local
> > declarations override ivar references in name resolution in the context of
> > the expression. That is why we inject variables into the expression by hand
> > (and is controlled by the target.experimental.inject-local-vars setting).
> > That's not even necessary, IIRC it's to work around the side effect of the
> > too much optimizing of the DWARF.
>
> I don't believe that has anything to do with DWARF -- the debug info
> describes that situation perfectly. The problem is that when you have code
> like
>
> ```
> struct Foo {
> int bar;
> void foo() { int bar; ...; }
> };
> ```
>
> if you stop in `foo` and go `expr bar`, per c++ rules, you'd expect to see
> the local variable, but clang will not even ask us what `bar` is because it
> will assume you're referring to the member variable. Injecting the local
> variable into the expression forces clang to ask us what
> `__lldb_local_vars::bar` is.
>
> That said, C doesn't have methods, so maybe this isn't an issue there.
>
> > But the more important C++ requirement is that we use it to make the
> > expression
> > local_or_global_variable = 100
> > work correctly without having to pass variable references into the
> > expression from a separate context as a pointer, which would require that
> > behind the user's back we would be munging this expression to:
> > *local_or_global_variable_pointer = 100
> > We wanted to avoid having to do that everywhere, and the solution to that
> > was to use C++ references when a variable was mentioned in an expression.
> > That's the harder bit you are going to have to solve to get rid of C++ in
> > the basic C-family expression evaluator.
>
> Yes, this sounds like a more complicated issue. Perhaps we could fake it by
> pretending `bar` is a global variable and then rewriting the access in the
> resulting IR (I think we do something similar for function calls already)?
Clang already has all the code to do this, it just only allows it for C++. So
the other option would be to allow C with references. That's obviously not a
language feature clang wants to expose, but might be a more robust way of
handling this than going in to do surgery to the IR after the face.
https://github.com/llvm/llvm-project/pull/156648
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits