jarin added a comment. Just a few replies below; I am hoping to put the relevant code changes together tomorrow.
In D110571#3027173 <https://reviews.llvm.org/D110571#3027173>, @labath wrote: > I haven't looked at the actual code yet, so I could be off, but here are some > thoughts. > > In D110571#3025527 <https://reviews.llvm.org/D110571#3025527>, @jarin wrote: > >> Hi, could you take a look at this change? >> >> Some discussion points: >> >> - In the ParseVariablesInFunctionContext method, we are using a lambda for >> the recursive parser. We could also use a function-local class or inner >> class of SymbolFileDWARF. Would any of these be preferable? > > Yeah, what's the deal with that? Why wouldn't a regular function be > sufficient? You can just pass things in arguments instead of closures or > classes.. Right, I worked on a codebase where they used local classes for such things and in lldb I have seen lambdas. I actually do not have a strong preference, will rewrite this to use plain methods. >> - The variables created by ParseVariableDIE on abstract formal parameters >> are fairly strange, especially if a function gets inlined into two different >> functions. If that happens, then the parsed variable will refer to a symbol >> context that does not contain the variable DIE and a block can contain a >> variable that is not in the DIE of tree of the block. Is that a big problem? >> (Quick testing of this situation did not reveal any strange stack traces or >> `frame var` anomalies.) Unfortunately, there is no good way to provide the >> correct block and the correct function because LLDB does not parse functions >> and blocks for the abstract functions (i.e., for the DW_TAG_subroutines that >> are referenced by DW_AT_abstract_origin of concrete functions). > > Judging by your description, I take it you parse these variables only once, > regardless of how many functions they are inlined in. Could we fix that my > creating a fresh variable object for each inlined instance? Then it could > maybe be correctly made to point to the actual block and function it is > inlined into(?) Yes, they are parsed only once. This is because there is a DIE->Variable map (see SymbolFileDWARF::GetDIEToVariable) that makes sure no DIE gets parsed twice. Are you suggesting to index the map with a pair <concrete-function-die, variable-die>? That would indeed create healthier structure (even though I could not spot any problems even with my current somewhat flawed approach). >> - The provided test only tests the case of an inlined function where some >> parameters are unused/omitted. Would it make sense to also provide tests for >> other interesting cases or would that be too much bloat? The particularly >> interesting cases are: >> - Inlined function with all its parameters unused/omitted, >> - Inlined function that is called from different top-level functions. >> - Test correctness of the stack trace in the cases above. >> - We could supply a test written in C, but it needs -O1 and is fairly >> sensitive to the meaning of -O1 (e.g., clang started inlining and omitting >> unsued inlined parameters only recently, so changes to -O1 could make a C >> test easily meaningless). Any concerns here? >> - The provided test is a bit verbose, mostly because we wanted to mostly >> preserve the structure of the C compiler output. We could still cut the size >> of the test down by removing the main function in favour of _start and by >> removing all the file/line info. Would any of that make sense? > > I think you could get quite far by just testing the output of the "image > lookup" command. That should give you list variables that are in scope for > any particular address, and a bunch of details about each var, including the > expression used to compute its value (not the value itself, obviously). The > main advantage is that you wouldn't need a fully functional program, as you > wouldn't be running anything. That would remove a lot of bloat, and also > allow the test to run on non-x86-pc-linux hosts. Then, maybe it wouldn't be > too messy to add the additional test cases you mention. > > You can look at (e.g.) DW_AT_loclists_base.s for an example of a test case > with image lookup and local variables. Makes sense, I really like that approach. Let me try to get that working. > After that, we could think about adding a c++ test case. Although tests with > optimized code are tricky, it is often possible (with judicious use of > noinline, always_inline and optnone attributes) to constrain the optimizer in > a way that it has no choice but to do exactly what we want. I have actually use the attributes when experimenting with the patch - if you think this is useful, I can certainly provide those tests. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D110571/new/ https://reviews.llvm.org/D110571 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits