Message ID | 1459882257-7029-1-git-send-email-donb@codesourcery.com |
---|---|
State | New |
Headers | show |
On 04/05/2016 07:50 PM, Don Breazeal wrote: > Hi Yao, > > On 4/5/2016 5:52 AM, Yao Qi wrote: >> Don Breazeal <donb@codesourcery.com> writes: > >>> + CATCH (ex, RETURN_MASK_ERROR) >>> + { >>> + /* If we get an error, assume the value is not optimized out. */ >>> + return 0; >> >> Why don't we fall back to checking value->optimized_out below? Some >> bits/pieces of value are optimized out, but reading the rest of >> bits/piece may trigger the memory error. In this case, the value is >> optimized out too. We can do this... >> >> TRY >> { >> value_fetch_lazy (value); >> } >> CATCH (ex, RETURN_MASK_ERROR) >> { >> /* Fall back to checking value->optimized_out. */ >> } >> END_CATCH >> >> What do you think? > > Of course, that makes more sense, thanks. > >> Note that, after this patch, value_optimized_out will no longer throw >> exceptions, some TRY/CATCH in value_optimized_out's callers can be >> removed, such as gdbscm_value_optimized_out_p and >> valpy_get_is_optimized_out. This can be done in a follow-up patch. > > I've done a more thorough audit of the call sites for value_optimized_out > than I did previously, and the only places where an enclosing TRY/CATCH can > be removed are the two you name. There is one other place where it is > called inside a TRY/CATCH, but there are other functions that could throw > errors called there as well. > > I will create a follow-up patch. > > I changed this patch as you suggest above, as well as changing > RETURN_MASK_ERROR to RETURN_MASK_ALL. The TRY/CATCH blocks that are > going to be removed use RETURN_MASK_ALL, and I thought that this patch > should maintain the same level of coverage. Please don't. A RETURN_MASK_ALL swallows Ctrl-C/QUIT, and that's almost always a bug. The cases you mention translate a QUIT to a python/scheme exception, which is not the same as just swallowing the exception. Thanks, Pedro Alves
diff --git a/gdb/value.c b/gdb/value.c index 8268b08..8a210e7 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1205,7 +1205,8 @@ value_actual_type (struct value *value, int resolve_simple_types, if ((TYPE_CODE (result) == TYPE_CODE_PTR || TYPE_CODE (result) == TYPE_CODE_REF) && TYPE_CODE (check_typedef (TYPE_TARGET_TYPE (result))) - == TYPE_CODE_STRUCT) + == TYPE_CODE_STRUCT + && !value_optimized_out (value)) { struct type *real_type; @@ -1433,7 +1434,17 @@ value_optimized_out (struct value *value) /* We can only know if a value is optimized out once we have tried to fetch it. */ if (VEC_empty (range_s, value->optimized_out) && value->lazy) - value_fetch_lazy (value); + { + TRY + { + value_fetch_lazy (value); + } + CATCH (ex, RETURN_MASK_ALL) + { + /* Fall back to checking value->optimized_out. */ + } + END_CATCH + } return !VEC_empty (range_s, value->optimized_out); }