[Lldb-commits] [PATCH] D104422: [trace] Add a TraceCursor class
Greg Clayton via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Jun 16 17:17:23 PDT 2021
clayborg added inline comments.
================
Comment at: lldb/include/lldb/Target/Trace.h:224
+ /// failed to load, an \a llvm::Error is returned.
+ virtual llvm::Expected<lldb::TraceCursorSP> GetThreadEndCursor(
+ Thread &thread,
----------------
If the trace cursor contains an error, do we need llvm::Expected here? Maybe return a std::unique_ptr<TraceCursor> since the cursor can indicate any errors. I am assuming you did a shared pointer to make it easier to eventually push this into the lldb::SB API? a unique pointer works great for the SBAPI and no one will ever need a shared reference to one of these.
================
Comment at: lldb/include/lldb/Target/Trace.h:226-227
+ Thread &thread,
+ lldb::TraceInstructionType filter = lldb::eTraceInstructionTypeAny,
+ bool ignore_errors = false) = 0;
+
----------------
We don' t need these arguments right? These are only needed for the TraceCursor::Next(...) and TraceCursor::Prev(...) right?
================
Comment at: lldb/include/lldb/Target/Trace.h:231
+ /// instruction instead.
+ virtual llvm::Expected<lldb::TraceCursorSP> GetThreadBeginCursor(
+ Thread &thread,
----------------
Ditto, return std::unique_ptr<TraceCursor>?
================
Comment at: lldb/include/lldb/Target/Trace.h:233-234
+ Thread &thread,
+ lldb::TraceInstructionType filter = lldb::eTraceInstructionTypeAny,
+ bool ignore_errors = false) = 0;
+
----------------
We don' t need these arguments right? These are only needed for the TraceCursor::Next(...) and TraceCursor::Prev(...) right?
================
Comment at: lldb/include/lldb/Target/Trace.h:235
+ bool ignore_errors = false) = 0;
+
/// Get the number of available instructions in the trace of the given thread.
----------------
Should there just be a single Trace::GetCursor() and then we can just add some more TraceInstructionType bits? My thinking is the cursor would always return an end cursor and we could do something like:
```
std::unique_ptr<TraceCursor> end_cursor_up = trace-GetCursor(thread);
std::unique_ptr<TraceCursor> begin_cursor_up = trace-GetCursor(thread);
begin_cursor_up->Prev(eTraceInstructionTypeBegin);
```
================
Comment at: lldb/include/lldb/Target/TraceCursor.h:39
+///
+class TraceCursor {
+public:
----------------
I am assuming all function calls need to be pure virtual here so that each plug-in can subclass this?
================
Comment at: lldb/include/lldb/Target/TraceCursor.h:61
+ /// Similar to \a TraceCursor::Next(), but moves backwards chronologically.
+ bool Prev();
+
----------------
Do we not need the filter and ignore errors arguments for this as well?
================
Comment at: lldb/include/lldb/Target/TraceCursor.h:72-75
+ /// \return
+ /// \b true if the cursor is pointing to an error in the trace. The actual
+ /// error message can be gotten by calling \a TraceCursor::GetError().
+ bool IsError();
----------------
Do we need this if we have GetError?
================
Comment at: lldb/include/lldb/Target/TraceCursor.h:79
+ /// \b nullptr if the cursor is not pointing to an error in the trace.
+ /// Otherwise return an error message describing the issue.
+ const char *GetError();
----------------
What is the intended ownership of this string? If this object would own it, maybe add a "std::string m_error;" member variable to this class to store any error strings.
================
Comment at: lldb/include/lldb/Target/TraceCursor.h:88
+ /// \return
+ /// The size in bytes of the instruction. If the cursor points to an error
+ /// in the trace, return \b 0.
----------------
describe what the size means a bit better? Is the size of instructions going to be larger if we go to the next Jump or call?
================
Comment at: lldb/include/lldb/lldb-enumerations.h:963
+/// analysis on traces.
+FLAGS_ENUM(TraceInstructionType){
+ /// Any instruction not listed below.
----------------
Maybe "TraceCursorGranularity"? the "Type" suffix seems to indicate individual types
================
Comment at: lldb/include/lldb/lldb-enumerations.h:964-965
+FLAGS_ENUM(TraceInstructionType){
+ /// Any instruction not listed below.
+ eTraceInstructionTypeNormal = (1u << 1),
+ /// This includes both conditional and unconditional jumps.
----------------
================
Comment at: lldb/include/lldb/lldb-enumerations.h:966-967
+ eTraceInstructionTypeNormal = (1u << 1),
+ /// This includes both conditional and unconditional jumps.
+ eTraceInstructionTypeJump = (1u << 2),
+ /// This represents a call to a function.
----------------
Maybe have two things for branches? Something like:
```
/// Any branch instruction even if the branch is conditional and not taken.
eTraceInstructionTypeBranch,
/// Only branches that are taken and cause the control flow to change.
eTraceInstructionTypeBranchTaken,
```
This might help avoid multiple calls to the cursor if the user doesn't need to worry about branches that aren't taken (like when single stepping maybe?)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D104422/new/
https://reviews.llvm.org/D104422
More information about the lldb-commits
mailing list