On Fri, 2010-07-02 at 15:19 +0200, Ulrich Weigand wrote: > Thiago Jung Bauermann wrote: > > > > + for (; v; v = value_next (v)) > > > > + { > > > > + if (VALUE_LVAL (v) == lval_memory) > > > > + { > > > > + /* A lazy memory lvalue is one that GDB never needed to fetch; > > > > + we either just used its address (e.g., `a' in `a.b') or > > > > + we never needed it at all (e.g., `a' in `a,b'). */ > > > > + if (!value_lazy (v)) > > > > + found_memory_cnt++; > > > > + } > > > > + else if (VALUE_LVAL (v) != not_lval > > > > + && deprecated_value_modifiable (v) == 0) > > > > + return -1; /* ??? What does this represent? */ > > > > > > These are values from the history (e.g. $1). In this context, they > > > should be treated as non-lvalues, so they should be fine ... > > > > I removed that else if then. I'll submit a separate patch to replace > > that comment in can_use_hardware_watchpoint. > > Actually, thinking about this a bit more, the logic still does not > seem quite correct. What we really want is: > > - not_lval values: these are fine > - deprecated_value_modifiable (v) == 0 (history) values: treat just > like not_lval, no matter what their VALUE_LVAL says > - lval_memory values: check whether they are lazy or not and count them > - all other values (lval_computed, lval_internalvar ...): *not* OK > > In particular, the missing check on lval_computed may become more important > now that DWARF multi-piece values are always represented as lval_computed ... > (This may also affect watchpoint code in breakpoint.c, but I guess that's > a different issue.) Ok, makes sense. That loop now reads: for (; v; v = value_next (v)) { /* Constants and values from the history are fine. */ if (VALUE_LVAL (v) == not_lval || deprecated_value_modifiable (v) == 0) continue; else if (VALUE_LVAL (v) == lval_memory) { /* A lazy memory lvalue is one that GDB never needed to fetch; we either just used its address (e.g., `a' in `a.b') or we never needed it at all (e.g., `a' in `a,b'). */ if (!value_lazy (v)) found_memory_cnt++; } /* Other kinds of values are not fine. */ else return -1; } > Except for the num_memory_accesses logic discussed above, the patch > is otherwise OK now. Great! Except for the change in the loop above, the rest of the patch is the same. Thanks for your help with this work. 2010-07-06 Sergio Durigan Junior Thiago Jung Bauermann * breakpoint.c (fetch_watchpoint_value): Rename to fetch_subexp_value and move to eval.c. Change callers. (insert_bp_location): Pass watchpoint condition in target_insert_watchpoint. (remove_breakpoint_1) Pass watchpoint condition in target_remove_watchpoint. (watchpoint_locations_match): Call target_can_accel_watchpoint_condition. * eval.c: Include wrapper.h. (fetch_subexp_value): Moved from breakpoint.c. * ppc-linux-nat.c (ppc_linux_region_ok_for_hw_watchpoint): Formatting fix. (can_use_watchpoint_cond_accel): New function. (calculate_dvc): Likewise. (num_memory_accesses): Likewise. (check_condition): Likewise. (ppc_linux_can_accel_watchpoint_condition): Likewise (ppc_linux_insert_watchpoint): Call can_use_watchpoint_cond_accel, check_condition and calculate_dvc. (ppc_linux_remove_watchpoint): Likewise. (_initialize_ppc_linux_nat): Set to_can_accel_watchpoint_condition to ppc_linux_can_accel_watchpoint_condition * target.c (debug_to_insert_watchpoint): Add argument for watchpoint condition. (debug_to_remove_watchpoint): Likewise. (debug_to_can_accel_watchpoint_condition): New function. (update_current_target): Set to_can_accel_watchpoint_condition. (setup_target_debug): Set to_can_accel_watchpoint_condition. * target.h: Add opaque declaration for struct expression. (struct target_ops) , : Add new arguments to pass the watchpoint : New member. condition. Update all callers and implementations. (target_can_accel_watchpoint_condition): New macro. * value.c (free_value_chain): New function. * value.h (fetch_subexp_value): New prototype. (free_value_chain): Likewise.