wallace added a comment.

Btw, thanks for the conversation. This is being really helpful.

> I'm not convinced that retaining only 1 decoded instruction in memory at a 
> time (under a TraverseInstructions callback) will be sufficient for the use 
> cases you've outlined. Let's say the user sets a few breakpoints, then 
> repeatedly does "rev-continue" followed by "bt". If lldb only holds a max of 
> 1 decoded instruction in memory, it would need to repeatedly decode parts of 
> the trace to evaluate those user commands, which would be slow as you pointed 
> out earlier. OTOH there's not enough memory to retain all of the decoded 
> instructions.
>
> It seems like we need a way for generic trace analyses to request _batches_ 
> of decoded trace data at a time, lazily demanding more from the trace plugin 
> only if the analysis requires it to proceed, while freeing any stale decoded 
> data it's not using.
>
> Moreover, there doesn't seem to be a hard requirement that each trace plugin 
> specialize a TraceInstruction class. For example, to support that 
> breakpoint/rev-continue/bt workflow, you really only need a list of the 
> places where _control flow changed_. So the generic layer could request that 
> data from a trace plugin ('plugin->decodeControlFlowChanges(startPos, 
> stopPos)'), then query more specific APIs that answer questions about how 
> many control flow changes there were, and what the inst type + load address 
> was at each control flow change point. Each plugin implementation can pick 
> the most efficient way to implement those narrower APIs, instead of trying to 
> cram all potentially useful information into a single TraceInst class.
>
> The reason why I believe this to be such a crucial part of the design is 
> because of the scaling problem I mentioned earlier. A single 1.5GHz core 
> running at IPC=2 yields 3*10^9 instructions/second, so we hit "gigantic" all 
> too quickly!

Yes, I agree with everything you said. It will really make the implementation 
simpler and more generic if we have these accessors based on indices instead of 
a struct/class, and we let each plug-in manage its data and its cache their own 
way. 
`decodeControlFlowChanges` is definitely a good idea, and other similar 
interfaces could be created following the same approach.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103588/new/

https://reviews.llvm.org/D103588

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to