+ struct value *deref_val = NULL;
+ const int value_is_synthetic
+ = value_bits_synthetic_pointer (original_value,
+ TARGET_CHAR_BIT * embedded_offset,
+ TARGET_CHAR_BIT * TYPE_LENGTH (type));
+ const int must_coerce_ref = ((options->addressprint && value_is_synthetic)
+ || options->deref_ref);
+ const int type_is_defined = TYPE_CODE (elttype) != TYPE_CODE_UNDEF;
+ const gdb_byte *valaddr = value_contents_for_printing (original_value);
+
+ if (must_coerce_ref && type_is_defined)
+ {
+ deref_val = coerce_ref_if_computed (original_value);
+
+ if (deref_val != NULL)
+ {
+ /* More complicated computed references are not supported. */
+ gdb_assert (embedded_offset == 0);
+ }
+ else
+ deref_val = value_at (TYPE_TARGET_TYPE (type),
+ unpack_pointer (type, valaddr + embedded_offset));
+ }
+ /* Else, original_value isn't a synthetic reference or we don't have to print
+ the reference's contents.
+
+ Notice that for references to TYPE_CODE_STRUCT, 'set print object on' will
+ cause original_value to be a not_lval instead of an lval_computed,
+ which will make value_bits_synthetic_pointer return false.
+ This happens because if options->objectprint is true, c_value_print will
+ overwrite original_value's contents with the result of coercing
+ the reference through value_addr, and then set its type back to
+ TYPE_CODE_REF. In that case we don't have to coerce the reference again;
+ we can simply treat it as non-synthetic and move on. */