[Lldb-commits] [PATCH] D66249: [JIT][Breakpoint] Add "BreakpointInjectedSite" and FCB Trampoline

Med Ismail Bennani via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 22 17:49:07 PDT 2019


mib added inline comments.


================
Comment at: lldb/include/lldb/Breakpoint/BreakpointSite.h:54-56
+   static bool classof(const BreakpointSite *bp_site) {
+     return bp_site->getKind() == eKindBreakpointSite;
+   }
----------------
labath wrote:
> This is weird. So, in OO terminology, `BreakpointInjectedSite` "is-a" `BreakpointSite`, but if you ask `llvm::isa<BreakpointSite>(injected_site)`, it will return false?
No, it returns **true**.


================
Comment at: lldb/include/lldb/Expression/ExpressionVariable.h:210
+public:
+  typedef AdaptedIterable<collection, lldb::ExpressionVariableSP,
+                          vector_adapter>
----------------
labath wrote:
> What is the purpose of this `AdaptedIterable`, and why is it better than just returning  say `ArrayRef<lldb::ExpressionVariableSP` ?
Given a class with a container, `AdaptedIterable` will generate the proper iterator accessor for this class.

In this case, it's pretty convenient to do:
```
for (auto var : expr_vars)
{ }
```

instead of:
```
for (auto var : expr_vars.GetContainer())
{ }
```

It doesn't require to have a getter on the container to iterate over it.

Most of LLDB container classes are built upon `std` containers (vector, map ...).
I could change it to `ArrayRef<lldb::ExpressionVariableSP>`, but I don't see why using it would be better, + it might break things (e.g. ArrayRef doesn't implement some of the `std` containers method like `erase()` or `clear()`).


================
Comment at: lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/fast_conditional_breakpoints/TestFastConditionalBreakpoints.py:181
+        # FCB falls back to regular conditional breakpoint that get hit once.
+        self.assertTrue(breakpoint.GetHitCount() == 1)
----------------
aprantl wrote:
> how does this test ensure that the breakpoint was actually injected and that it didn't fall back to a regular breakpoint?
The breakpoint doesn't get injected if we fallback to a regular breakpoint.
And I check the state of the breakpoint on the command above: 
```
self.assertFalse(location.GetInjectCondition(), VALID_BREAKPOINT_LOCATION)
```


================
Comment at: lldb/source/Breakpoint/BreakpointInjectedSite.cpp:47
+               loc_sp->GetConditionText());
+      return false;
+    }
----------------
aprantl wrote:
> Should this return an error instead of logging and returning false?
Error is handled on the upper function, at the process level.


================
Comment at: lldb/source/Breakpoint/BreakpointInjectedSite.cpp:443
+      int64_t operand = op.getRawOperand(0);
+      expr += "   src_addr = " + std::to_string(operand) +
+              ";\n"
----------------
aprantl wrote:
> This seems unnecessarily slow. Perhaps use an llvm::Twine?
As discussed, using `llvm::Twine` doesn't fit the implementation. Since this part of the code will probably change in the future, to support more DWARF Expression, I'll leave it as is for now, and try to come up with a more efficient approach in the coming patches.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D66249





More information about the lldb-commits mailing list