[Expressions] Add support of expressions evaluation in some object's context


[Expressions] Add support of expressions evaluation in some object's context

This patch adds support of expression evaluation in a context of some object.
Consider the following example:

struct S {
  int a = 11;
  int b = 12;

int main() {
  S s;
  int a = 1;
  int b = 2;
  // We have stopped here
  return 0;

This patch allows to do something like that:

lldb.frame.FindVariable("s").EvaluateExpression("a + b")

and the result will be 33 (not 3) because fields a and b of s will be
used (not locals a and b).

This is achieved by replacing of this type and object for the expression. This
has some limitations: an expression can be evaluated only for values located in
the debuggee process memory (they must have an address of eAddressTypeLoad

Reviewers: teemperor, clayborg, jingham, zturner, labath, davide, spyffe, serge-sans-paille

Reviewed By: jingham

Subscribers: abidh, lldb-commits, leonid.mashinskiy

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D55318

Event Timeline

krasimir added inline comments.

This triggers a -Wreorder warning:

ClangExpressionDeclMap.cpp:72:60: error: field 'm_struct_vars' will be initialized after field 'm_ctx_obj' [-Werror,-Wreorder]
      m_result_delegate(result_delegate), m_parser_vars(), m_struct_vars(),

Fix in https://reviews.llvm.org/D57742.