[Lldb-commits] [PATCH] D135917: [lldb][trace] Add a basic function call dump [2] - Implement the reconstruction algorithm
Jakob Johnson via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 14 07:04:18 PDT 2022
jj10306 requested changes to this revision.
jj10306 added a comment.
This revision now requires changes to proceed.
this is awesome - the tests do a great job documenting the code and weird edge cases so thanks for that.
just some minor nits and questions, looks good overall
================
Comment at: lldb/include/lldb/Target/TraceDumper.h:86
+ /// A traced segment is a maximal list of consecutive traced instructions
+ /// that belong to the same call. A traced segment will end in three
+ /// possible ways:
----------------
nit
================
Comment at: lldb/include/lldb/Target/TraceDumper.h:213-214
+ /// The symbol information of the delimiting instructions.
+ SymbolInfo first_symbol_info;
+ SymbolInfo last_symbol_info;
+ /// A nested call starting at the end of this segment.
----------------
how would you have two different symbol info for the first and last? is last referring to the symbol of the next function?
================
Comment at: lldb/include/lldb/Target/TraceDumper.h:216
+ /// A nested call starting at the end of this segment.
+ llvm::Optional<FunctionCallUP> nested_call;
+ /// Owning call
----------------
nit:is the Optional<UP> redundant? thoughts on just using the UP and mentioning nullptr indicates there is no nested call
================
Comment at: lldb/source/Target/TraceDumper.cpp:92-94
+ Block *inline_block_a =
+ insn.sc.block ? insn.sc.block->GetContainingInlinedBlock() : nullptr;
+ Block *inline_block_b = prev_insn.sc.block
----------------
are these functions transferring ownership of these block pointers (ie are you responsible for freeing this mem)?
================
Comment at: lldb/source/Target/TraceDumper.cpp:584
+
+/// Given an instruction that happens after a return, find the ancestor function
+/// call that owns it. If this ancestor doesn't exist, create a new ancestor and
----------------
"that happens after a return"
from looking at how this function's called from `AppendInstructionToFunctionCallForest` this appears to be the return instruction, not the instruction after a return. is this correct?
================
Comment at: lldb/source/Target/TraceDumper.cpp:617-619
+ // Note: If this is not robust enough, we should actually check if we
+ // returning to the instruction that follows the last instruction from
+ // that call, as that's the behavior of CALL instructions.
----------------
this would only be the case for well behaved CALL/RET, right? in the case of modified stack return or JMP, this wouldn't necessarily be true?
================
Comment at: lldb/source/Target/TraceDumper.cpp:783-785
+ // TODO: In case of a CPU change, we create a new root because we haven't
+ // investigated yet if a call tree can safely continue or if interrupts
+ // could have polluted the original call tree.
----------------
wouldn't this be a very common case where a thread is in the middle of executing a function, gets context switched out of CPU X, then after some time gets context switched into CPU Y and continues executing the function?
================
Comment at: lldb/test/API/commands/trace/TestTraceDumpFunctionCalls.py:31-32
+
+[call tree #0]
+m.out`foo() + 65 at multi_thread.cpp:12:21 to 12:21 [4, 19524]
+
----------------
this is saying that events 4 - 19524 were all executed by foo() and there weren't any other function calls? am I understanding this output correctly?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135917/new/
https://reviews.llvm.org/D135917
More information about the lldb-commits
mailing list