Allow DWARF expression to push the initial address
authorTom Tromey <tromey@adacore.com>
Fri, 24 Apr 2020 19:40:31 +0000 (13:40 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 24 Apr 2020 19:40:31 +0000 (13:40 -0600)
Some DWARF expressions must be evaluated by first pushing the object
address onto the evaluation stack.  This patch adds this ability.
This functionality is not used yet, but it will be used in a later
patch.  This is split out for easier review and also because it
improved the patch series ordering.

gdb/ChangeLog
2020-04-24  Tom Tromey  <tromey@adacore.com>

* dwarf2/loc.c (dwarf2_locexpr_baton_eval): Add
"push_initial_value" parameter.
(dwarf2_evaluate_property): Likewise.
* dwarf2/loc.h (dwarf2_evaluate_property): Update.

gdb/ChangeLog
gdb/dwarf2/loc.c
gdb/dwarf2/loc.h

index b5128802cd227a0c40c0deb5a728cac025db8386..5db26a609472a1d911cf4f416b7525a94a884178 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-24  Tom Tromey  <tromey@adacore.com>
+
+       * dwarf2/loc.c (dwarf2_locexpr_baton_eval): Add
+       "push_initial_value" parameter.
+       (dwarf2_evaluate_property): Likewise.
+       * dwarf2/loc.h (dwarf2_evaluate_property): Update.
+
 2020-04-24  Tom Tromey  <tromey@adacore.com>
 
        * gdbtypes.c (is_dynamic_type_internal): Check for variant parts.
index b9456bc9dfbb90e311fb81538829fe5559f3a0f1..8df655f660ab64e2e16b8fb873619c48ee8b3731 100644 (file)
@@ -2388,13 +2388,16 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
    that the dwarf expression only produces a single CORE_ADDR.  FRAME is the
    frame in which the expression is evaluated.  ADDR is a context (location of
    a variable) and might be needed to evaluate the location expression.
-   Returns 1 on success, 0 otherwise.   */
+   PUSH_INITIAL_VALUE is true if ADDR should be pushed on the stack
+   before evaluating the expression;  this is required by certain
+   forms of DWARF expression.  Returns 1 on success, 0 otherwise.  */
 
 static int
 dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
                           struct frame_info *frame,
                           CORE_ADDR addr,
-                          CORE_ADDR *valp)
+                          CORE_ADDR *valp,
+                          bool push_initial_value)
 {
   struct objfile *objfile;
 
@@ -2414,6 +2417,9 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
   ctx.ref_addr_size = dlbaton->per_cu->ref_addr_size ();
   ctx.offset = dlbaton->per_cu->text_offset ();
 
+  if (push_initial_value)
+    ctx.push_address (addr, false);
+
   try
     {
       ctx.eval (dlbaton->data, dlbaton->size);
@@ -2462,7 +2468,8 @@ bool
 dwarf2_evaluate_property (const struct dynamic_prop *prop,
                          struct frame_info *frame,
                          const struct property_addr_info *addr_stack,
-                         CORE_ADDR *value)
+                         CORE_ADDR *value,
+                         bool push_initial_value)
 {
   if (prop == NULL)
     return false;
@@ -2480,7 +2487,7 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop,
 
        if (dwarf2_locexpr_baton_eval (&baton->locexpr, frame,
                                       addr_stack ? addr_stack->addr : 0,
-                                      value))
+                                      value, push_initial_value))
          {
            if (baton->locexpr.is_reference)
              {
index a59d3f998fd26a9b54c72f3ffe86f4d56b427719..6ff9b79dc0332437d17827148c6b7492d9dfe4af 100644 (file)
@@ -92,12 +92,16 @@ struct property_addr_info
    be NULL.
 
    Returns true if PROP could be converted and the static value is passed
-   back into VALUE, otherwise returns false.  */
+   back into VALUE, otherwise returns false.
+
+   If PUSH_INITIAL_VALUE is true, then the top value of ADDR_STACK
+   will be pushed before evaluating a location expression.  */
 
 bool dwarf2_evaluate_property (const struct dynamic_prop *prop,
                               struct frame_info *frame,
                               const struct property_addr_info *addr_stack,
-                              CORE_ADDR *value);
+                              CORE_ADDR *value,
+                              bool push_initial_value = false);
 
 /* A helper for the compiler interface that compiles a single dynamic
    property to C code.