Turn value_enclosing_type into method
authorTom Tromey <tom@tromey.com>
Tue, 31 Jan 2023 17:19:10 +0000 (10:19 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 13 Feb 2023 22:21:07 +0000 (15:21 -0700)
This changes value_enclosing_type to be a method of value.  Much of
this patch was written by script.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
15 files changed:
gdb/ada-lang.c
gdb/bfin-tdep.c
gdb/c-valprint.c
gdb/cp-valprint.c
gdb/gnu-v3-abi.c
gdb/i386-darwin-tdep.c
gdb/i386-tdep.c
gdb/m68k-tdep.c
gdb/rl78-tdep.c
gdb/tilegx-tdep.c
gdb/valops.c
gdb/value.c
gdb/value.h
gdb/vax-tdep.c
gdb/xstormy16-tdep.c

index 5aec8b77b149fb0c6b7c7d3413f888bd61cdd30c..baffea756576b0d00c8a19c13c9dfcafa5389287 100644 (file)
@@ -3060,7 +3060,7 @@ ada_value_ptr_subscript (struct value *arr, int arity, struct value **ind)
   int k;
   struct value *array_ind = ada_value_ind (arr);
   struct type *type
-    = check_typedef (value_enclosing_type (array_ind));
+    = check_typedef (array_ind->enclosing_type ());
 
   if (type->code () == TYPE_CODE_ARRAY
       && TYPE_FIELD_BITSIZE (type, 0) > 0)
@@ -3334,7 +3334,7 @@ ada_array_bound (struct value *arr, int n, int which)
 
   if (check_typedef (arr->type ())->code () == TYPE_CODE_PTR)
     arr = value_ind (arr);
-  arr_type = value_enclosing_type (arr);
+  arr_type = arr->enclosing_type ();
 
   if (ada_is_constrained_packed_array_type (arr_type))
     return ada_array_bound (decode_constrained_packed_array (arr), n, which);
@@ -3358,7 +3358,7 @@ ada_array_length (struct value *arr, int n)
 
   if (check_typedef (arr->type ())->code () == TYPE_CODE_PTR)
     arr = value_ind (arr);
-  arr_type = value_enclosing_type (arr);
+  arr_type = arr->enclosing_type ();
 
   if (ada_is_constrained_packed_array_type (arr_type))
     return ada_array_length (decode_constrained_packed_array (arr), n);
index 4d84407cc4575fd0f0c968c26fd045b26c07e079..e1be4b77071cb7c0b0fb2e6c9008cadb691b1a47 100644 (file)
@@ -509,7 +509,7 @@ bfin_push_dummy_call (struct gdbarch *gdbarch,
 
   for (i = nargs - 1; i >= 0; i--)
     {
-      struct type *value_type = value_enclosing_type (args[i]);
+      struct type *value_type = args[i]->enclosing_type ();
 
       total_len += align_up (value_type->length (), 4);
     }
@@ -525,7 +525,7 @@ bfin_push_dummy_call (struct gdbarch *gdbarch,
 
   for (i = nargs - 1; i >= 0; i--)
     {
-      struct type *value_type = value_enclosing_type (args[i]);
+      struct type *value_type = args[i]->enclosing_type ();
       struct type *arg_type = check_typedef (value_type);
       int container_len = align_up (arg_type->length (), 4);
 
index 8d28c45cbfc192de5ff38ca501176914a5cd38f3..0a9e4f49ba64233d22877ceaed1faf4395fcf585 100644 (file)
@@ -571,18 +571,18 @@ c_value_print (struct value *val, struct ui_file *stream,
             better to leave the object as-is.  */
          if (!(full
                && (real_type->length ()
-                   < value_enclosing_type (val)->length ())))
+                   < val->enclosing_type ()->length ())))
            val = value_cast (real_type, val);
          gdb_printf (stream, "(%s%s) ",
                      real_type->name (),
                      full ? "" : _(" [incomplete object]"));
        }
-      else if (type != check_typedef (value_enclosing_type (val)))
+      else if (type != check_typedef (val->enclosing_type ()))
        {
          /* No RTTI information, so let's do our best.  */
          gdb_printf (stream, "(%s ?) ",
-                     value_enclosing_type (val)->name ());
-         val = value_cast (value_enclosing_type (val), val);
+                     val->enclosing_type ()->name ());
+         val = value_cast (val->enclosing_type (), val);
        }
     }
 
index 33ff17b8d2b7c30bc6684b76208dd6795fc9f2ee..476ec9c1b1e1ef9ca9f2135f7d06f326cda3df3b 100644 (file)
@@ -763,7 +763,7 @@ test_print_fields (gdbarch *arch)
 
   value *val = allocate_value (the_struct);
   gdb_byte *contents = value_contents_writeable (val).data ();
-  store_unsigned_integer (contents, value_enclosing_type (val)->length (),
+  store_unsigned_integer (contents, val->enclosing_type ()->length (),
                          gdbarch_byte_order (arch), 0xe9);
 
   string_file out;
index d9e0d57925951dca6d73a2e70689ffeb030e0e22..782f5765d6f1e1fd00f30ac5b694f5893efbbf88 100644 (file)
@@ -372,7 +372,7 @@ gnuv3_rtti_type (struct value *value,
 
   if (full_p)
     *full_p = (- offset_to_top == value_embedded_offset (value)
-              && (value_enclosing_type (value)->length ()
+              && (value->enclosing_type ()->length ()
                   >= run_time_type->length ()));
   if (top_p)
     *top_p = - offset_to_top;
index d84e5ed8005f7f4088407ed1afba91e9dacc54ef..abf68ef7c394e859e2f74bd09648e50340aa36ab 100644 (file)
@@ -183,7 +183,7 @@ i386_darwin_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
       for (i = 0; i < nargs; i++)
        {
-         struct type *arg_type = value_enclosing_type (args[i]);
+         struct type *arg_type = args[i]->enclosing_type ();
 
          if (i386_m128_p (arg_type) && num_m128 < 4)
            {
index 090f5468067ccf78d418bef6f913743ccb6b57f4..aea5e12f38780670f3f718564730711062ba7b80 100644 (file)
@@ -2725,11 +2725,11 @@ i386_thiscall_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
       for (i = thiscall ? 1 : 0; i < nargs; i++)
        {
-         int len = value_enclosing_type (args[i])->length ();
+         int len = args[i]->enclosing_type ()->length ();
 
          if (write_pass)
            {
-             if (i386_16_byte_align_p (value_enclosing_type (args[i])))
+             if (i386_16_byte_align_p (args[i]->enclosing_type ()))
                args_space_used = align_up (args_space_used, 16);
 
              write_memory (sp + args_space_used,
@@ -2745,7 +2745,7 @@ i386_thiscall_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
            }
          else
            {
-             if (i386_16_byte_align_p (value_enclosing_type (args[i])))
+             if (i386_16_byte_align_p (args[i]->enclosing_type ()))
                args_space = align_up (args_space, 16);
              args_space += align_up (len, 4);
            }
index ae020c89d1945d5c1978fee75e66292ce969c51e..e776060935c3877c64df310897ef74cc502c68b4 100644 (file)
@@ -544,7 +544,7 @@ m68k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   /* Push arguments in reverse order.  */
   for (i = nargs - 1; i >= 0; i--)
     {
-      struct type *value_type = value_enclosing_type (args[i]);
+      struct type *value_type = args[i]->enclosing_type ();
       int len = value_type->length ();
       int container_len = (len + 3) & ~3;
       int offset;
index 4979e09b15fb005b15f29bd7c805648bc54fec8f..cd84666916930218033c94ac81ab0a9dbd418c7a 100644 (file)
@@ -1340,7 +1340,7 @@ rl78_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   /* Push arguments in reverse order.  */
   for (i = nargs - 1; i >= 0; i--)
     {
-      struct type *value_type = value_enclosing_type (args[i]);
+      struct type *value_type = args[i]->enclosing_type ();
       int len = value_type->length ();
       int container_len = (len + 1) & ~1;
 
index 5dfb2376e99a3f157d5406041153785d91d94a1a..8f005e81dcc4999b5c8f5c51637400adfc790754 100644 (file)
@@ -298,7 +298,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch,
   for (i = 0; i < nargs && argreg <= TILEGX_R9_REGNUM; i++)
     {
       const gdb_byte *val;
-      typelen = value_enclosing_type (args[i])->length ();
+      typelen = args[i]->enclosing_type ()->length ();
 
       if (typelen > (TILEGX_R9_REGNUM - argreg + 1) * tilegx_reg_size)
        break;
@@ -325,7 +325,7 @@ tilegx_push_dummy_call (struct gdbarch *gdbarch,
     {
       const gdb_byte *contents = value_contents (args[j]).data ();
 
-      typelen = value_enclosing_type (args[j])->length ();
+      typelen = args[j]->enclosing_type ()->length ();
       slacklen = align_up (typelen, 8) - typelen;
       gdb::byte_vector val (typelen + slacklen);
       memcpy (val.data (), contents, typelen);
index f462da8b5644bd1deeeaa8e1ea44705514937bab..9870e0da337ae136b926bbc4e49890849bd17f45 100644 (file)
@@ -327,7 +327,7 @@ value_cast_pointers (struct type *type, struct value *arg2,
   /* No superclass found, just change the pointer type.  */
   arg2 = value_copy (arg2);
   arg2->deprecated_set_type (type);
-  set_value_enclosing_type (arg2, type);
+  arg2->set_enclosing_type (type);
   set_value_pointed_to_offset (arg2, 0);       /* pai: chk_val */
   return arg2;
 }
@@ -649,7 +649,7 @@ value_cast (struct type *type, struct value *arg2)
 
       arg2 = value_copy (arg2);
       arg2->deprecated_set_type (to_type);
-      set_value_enclosing_type (arg2, to_type);
+      arg2->set_enclosing_type (to_type);
       set_value_pointed_to_offset (arg2, 0);   /* pai: chk_val */
       return arg2;
     }
@@ -1352,7 +1352,7 @@ value_assign (struct value *toval, struct value *fromval)
      to by TOVAL retains its original dynamic type after assignment.  */
   if (type->code () == TYPE_CODE_PTR)
     {
-      set_value_enclosing_type (val, value_enclosing_type (fromval));
+      val->set_enclosing_type (fromval->enclosing_type ());
       set_value_pointed_to_offset (val, value_pointed_to_offset (fromval));
     }
 
@@ -1371,14 +1371,14 @@ value_repeat (struct value *arg1, int count)
   if (count < 1)
     error (_("Invalid number %d of repetitions."), count);
 
-  val = allocate_repeat_value (value_enclosing_type (arg1), count);
+  val = allocate_repeat_value (arg1->enclosing_type (), count);
 
   VALUE_LVAL (val) = lval_memory;
   set_value_address (val, value_address (arg1));
 
   read_value_memory (val, 0, value_stack (val), value_address (val),
                     value_contents_all_raw (val).data (),
-                    type_length_units (value_enclosing_type (val)));
+                    type_length_units (val->enclosing_type ()));
 
   return val;
 }
@@ -1568,13 +1568,13 @@ value_addr (struct value *arg1)
          struct type *type_ptr
            = lookup_pointer_type (type->target_type ());
          struct type *enclosing_type
-           = check_typedef (value_enclosing_type (arg1));
+           = check_typedef (arg1->enclosing_type ());
          struct type *enclosing_type_ptr
            = lookup_pointer_type (enclosing_type->target_type ());
 
          arg2 = value_copy (arg1);
          arg2->deprecated_set_type (type_ptr);
-         set_value_enclosing_type (arg2, enclosing_type_ptr);
+         arg2->set_enclosing_type (enclosing_type_ptr);
 
          return arg2;
        }
@@ -1596,8 +1596,7 @@ value_addr (struct value *arg1)
 
   /* This may be a pointer to a base subobject; so remember the
      full derived object's type ...  */
-  set_value_enclosing_type (arg2,
-                           lookup_pointer_type (value_enclosing_type (arg1)));
+  arg2->set_enclosing_type (lookup_pointer_type (arg1->enclosing_type ()));
   /* ... and also the relative position of the subobject in the full
      object.  */
   set_value_pointed_to_offset (arg2, value_embedded_offset (arg1));
@@ -1657,7 +1656,7 @@ value_ind (struct value *arg1)
 
       /* We may be pointing to something embedded in a larger object.
         Get the real type of the enclosing object.  */
-      enc_type = check_typedef (value_enclosing_type (arg1));
+      enc_type = check_typedef (arg1->enclosing_type ());
       enc_type = enc_type->target_type ();
 
       CORE_ADDR base_addr;
@@ -1710,17 +1709,17 @@ value_array (int lowbound, int highbound, struct value **elemvec)
     {
       error (_("bad array bounds (%d, %d)"), lowbound, highbound);
     }
-  typelength = type_length_units (value_enclosing_type (elemvec[0]));
+  typelength = type_length_units (elemvec[0]->enclosing_type ());
   for (idx = 1; idx < nelem; idx++)
     {
-      if (type_length_units (value_enclosing_type (elemvec[idx]))
+      if (type_length_units (elemvec[idx]->enclosing_type ())
          != typelength)
        {
          error (_("array elements must all be the same size"));
        }
     }
 
-  arraytype = lookup_array_range_type (value_enclosing_type (elemvec[0]),
+  arraytype = lookup_array_range_type (elemvec[0]->enclosing_type (),
                                       lowbound, highbound);
 
   if (!current_language->c_style_arrays_p ())
@@ -2095,7 +2094,7 @@ struct_field_searcher::search (struct value *arg1, LONGEST offset,
 
          boffset += value_embedded_offset (arg1) + offset;
          if (boffset < 0
-             || boffset >= value_enclosing_type (arg1)->length ())
+             || boffset >= arg1->enclosing_type ()->length ())
            {
              CORE_ADDR base_addr;
 
@@ -3944,14 +3943,14 @@ value_full_object (struct value *argp,
     real_type = value_rtti_type (argp, &full, &top, &using_enc);
 
   /* If no RTTI data, or if object is already complete, do nothing.  */
-  if (!real_type || real_type == value_enclosing_type (argp))
+  if (!real_type || real_type == argp->enclosing_type ())
     return argp;
 
   /* In a destructor we might see a real type that is a superclass of
      the object's type.  In this case it is better to leave the object
      as-is.  */
   if (full
-      && real_type->length () < value_enclosing_type (argp)->length ())
+      && real_type->length () < argp->enclosing_type ()->length ())
     return argp;
 
   /* If we have the full object, but for some reason the enclosing
@@ -3960,7 +3959,7 @@ value_full_object (struct value *argp,
   if (full)
     {
       argp = value_copy (argp);
-      set_value_enclosing_type (argp, real_type);
+      argp->set_enclosing_type (real_type);
       return argp;
     }
 
index 783ef7deae763602bd2dcc25baf5af1a73a465ba..efa780a897adad6e221abf56182a8e7468cb81ec 100644 (file)
@@ -177,7 +177,7 @@ value_bits_available (const struct value *value,
   /* Don't pretend we have anything available there in the history beyond
      the boundaries of the value recorded.  It's not like inferior memory
      where there is actual stuff underneath.  */
-  ULONGEST val_len = TARGET_CHAR_BIT * value_enclosing_type (value)->length ();
+  ULONGEST val_len = TARGET_CHAR_BIT * value->enclosing_type ()->length ();
   return !((value->m_in_history
            && (offset < 0 || offset + length > val_len))
           || ranges_contain (value->m_unavailable, offset, length));
@@ -240,7 +240,7 @@ value_entirely_covered_by_range_vector (struct value *value,
 
       if (t.offset == 0
          && t.length == (TARGET_CHAR_BIT
-                         * value_enclosing_type (value)->length ()))
+                         * value->enclosing_type ()->length ()))
        return 1;
     }
 
@@ -725,8 +725,8 @@ value_contents_eq (const struct value *val1, LONGEST offset1,
 bool
 value_contents_eq (const struct value *val1, const struct value *val2)
 {
-  ULONGEST len1 = check_typedef (value_enclosing_type (val1))->length ();
-  ULONGEST len2 = check_typedef (value_enclosing_type (val2))->length ();
+  ULONGEST len1 = check_typedef (val1->enclosing_type ())->length ();
+  ULONGEST len2 = check_typedef (val2->enclosing_type ())->length ();
   if (len1 != len2)
     return false;
   return value_contents_eq (val1, 0, val2, 0, len1);
@@ -934,7 +934,7 @@ allocate_value_contents (struct value *val, bool check_size)
 {
   if (!val->m_contents)
     {
-      struct type *enclosing_type = value_enclosing_type (val);
+      struct type *enclosing_type = val->enclosing_type ();
       ULONGEST len = enclosing_type->length ();
 
       if (check_size)
@@ -1042,16 +1042,10 @@ value_contents_all_raw (struct value *value)
 {
   allocate_value_contents (value, true);
 
-  ULONGEST length = value_enclosing_type (value)->length ();
+  ULONGEST length = value->enclosing_type ()->length ();
   return gdb::make_array_view (value->m_contents.get (), length);
 }
 
-struct type *
-value_enclosing_type (const struct value *value)
-{
-  return value->m_enclosing_type;
-}
-
 /* Look at value.h for description.  */
 
 struct type *
@@ -1089,7 +1083,7 @@ value_actual_type (struct value *value, int resolve_simple_types,
        {
          if (real_type_found)
            *real_type_found = 1;
-         result = value_enclosing_type (value);
+         result = value->enclosing_type ();
        }
     }
 
@@ -1128,7 +1122,7 @@ value_contents_for_printing (struct value *value)
   if (value->m_lazy)
     value_fetch_lazy (value);
 
-  ULONGEST length = value_enclosing_type (value)->length ();
+  ULONGEST length = value->enclosing_type ()->length ();
   return gdb::make_array_view (value->m_contents.get (), length);
 }
 
@@ -1137,7 +1131,7 @@ value_contents_for_printing_const (const struct value *value)
 {
   gdb_assert (!value->m_lazy);
 
-  ULONGEST length = value_enclosing_type (value)->length ();
+  ULONGEST length = value->enclosing_type ()->length ();
   return gdb::make_array_view (value->m_contents.get (), length);
 }
 
@@ -1614,7 +1608,7 @@ value_release_to_mark (const struct value *mark)
 struct value *
 value_copy (const value *arg)
 {
-  struct type *encl_type = value_enclosing_type (arg);
+  struct type *encl_type = arg->enclosing_type ();
   struct value *val;
 
   val = allocate_value_lazy (encl_type);
@@ -1643,7 +1637,7 @@ value_copy (const value *arg)
     {
       ULONGEST length = val->m_limited_length;
       if (length == 0)
-       length = value_enclosing_type (val)->length ();
+       length = val->enclosing_type ()->length ();
 
       gdb_assert (arg->m_contents != nullptr);
       const auto &arg_view
@@ -1676,12 +1670,11 @@ struct value *
 make_cv_value (int cnst, int voltl, struct value *v)
 {
   struct type *val_type = v->type ();
-  struct type *m_enclosing_type = value_enclosing_type (v);
+  struct type *m_enclosing_type = v->enclosing_type ();
   struct value *cv_val = value_copy (v);
 
   cv_val->deprecated_set_type (make_cv_type (cnst, voltl, val_type, NULL));
-  set_value_enclosing_type (cv_val,
-                           make_cv_type (cnst, voltl, m_enclosing_type, NULL));
+  cv_val->set_enclosing_type (make_cv_type (cnst, voltl, m_enclosing_type, NULL));
 
   return cv_val;
 }
@@ -1693,7 +1686,7 @@ value_non_lval (struct value *arg)
 {
   if (VALUE_LVAL (arg) != not_lval)
     {
-      struct type *enc_type = value_enclosing_type (arg);
+      struct type *enc_type = arg->enclosing_type ();
       struct value *val = allocate_value (enc_type);
 
       copy (value_contents_all (arg), value_contents_all_raw (val));
@@ -1788,7 +1781,7 @@ set_value_component_location (struct value *component,
 int
 record_latest_value (struct value *val)
 {
-  struct type *enclosing_type = value_enclosing_type (val);
+  struct type *enclosing_type = val->enclosing_type ();
   struct type *type = val->type ();
 
   /* We don't want this value to have anything to do with the inferior anymore.
@@ -2972,17 +2965,16 @@ value_static_field (struct type *type, int fieldno)
    data.  */
 
 void
-set_value_enclosing_type (struct value *val, struct type *new_encl_type)
+value::set_enclosing_type (struct type *new_encl_type)
 {
-  if (new_encl_type->length () > value_enclosing_type (val)->length ())
+  if (new_encl_type->length () > enclosing_type ()->length ())
     {
       check_type_length_before_alloc (new_encl_type);
-      val->m_contents
-       .reset ((gdb_byte *) xrealloc (val->m_contents.release (),
-                                      new_encl_type->length ()));
+      m_contents.reset ((gdb_byte *) xrealloc (m_contents.release (),
+                                              new_encl_type->length ()));
     }
 
-  val->m_enclosing_type = new_encl_type;
+  m_enclosing_type = new_encl_type;
 }
 
 /* Given a value ARG1 (offset by OFFSET bytes)
@@ -3062,12 +3054,12 @@ value_primitive_field (struct value *arg1, LONGEST offset,
        boffset = arg_type->field (fieldno).loc_bitpos () / 8;
 
       if (value_lazy (arg1))
-       v = allocate_value_lazy (value_enclosing_type (arg1));
+       v = allocate_value_lazy (arg1->enclosing_type ());
       else
        {
-         v = allocate_value (value_enclosing_type (arg1));
+         v = allocate_value (arg1->enclosing_type ());
          value_contents_copy_raw (v, 0, arg1, 0,
-                                  value_enclosing_type (arg1)->length ());
+                                  arg1->enclosing_type ()->length ());
        }
       v->m_type = type;
       v->m_offset = arg1->offset ();
@@ -3780,7 +3772,7 @@ readjust_indirect_value_type (struct value *value, struct type *enc_type,
   value->deprecated_set_type (resolved_original_target_type);
 
   /* Add embedding info.  */
-  set_value_enclosing_type (value, enc_type);
+  value->set_enclosing_type (enc_type);
   set_value_embedded_offset (value, value_pointed_to_offset (original_value));
 
   /* We may be pointing to an object of some derived type.  */
@@ -3801,7 +3793,7 @@ coerce_ref (struct value *arg)
   if (!TYPE_IS_REFERENCE (value_type_arg_tmp))
     return arg;
 
-  enc_type = check_typedef (value_enclosing_type (arg));
+  enc_type = check_typedef (arg->enclosing_type ());
   enc_type = enc_type->target_type ();
 
   CORE_ADDR addr = unpack_pointer (arg->type (), value_contents (arg).data ());
@@ -3913,7 +3905,7 @@ value_fetch_lazy_memory (struct value *val)
   gdb_assert (VALUE_LVAL (val) == lval_memory);
 
   CORE_ADDR addr = value_address (val);
-  struct type *type = check_typedef (value_enclosing_type (val));
+  struct type *type = check_typedef (val->enclosing_type ());
 
   /* Figure out how much we should copy from memory.  Usually, this is just
      the size of the type, but, for arrays, we might only be loading a
index befd41789ee230178390bd0993d559b2a8f0e3e9..a3d07c0b5fd31163432951146f5563048806e0d2 100644 (file)
@@ -215,6 +215,52 @@ struct value
   int deprecated_modifiable () const
   { return m_modifiable; }
 
+  /* If a value represents a C++ object, then the `type' field gives the
+     object's compile-time type.  If the object actually belongs to some
+     class derived from `type', perhaps with other base classes and
+     additional members, then `type' is just a subobject of the real
+     thing, and the full object is probably larger than `type' would
+     suggest.
+
+     If `type' is a dynamic class (i.e. one with a vtable), then GDB can
+     actually determine the object's run-time type by looking at the
+     run-time type information in the vtable.  When this information is
+     available, we may elect to read in the entire object, for several
+     reasons:
+
+     - When printing the value, the user would probably rather see the
+     full object, not just the limited portion apparent from the
+     compile-time type.
+
+     - If `type' has virtual base classes, then even printing `type'
+     alone may require reaching outside the `type' portion of the
+     object to wherever the virtual base class has been stored.
+
+     When we store the entire object, `enclosing_type' is the run-time
+     type -- the complete object -- and `embedded_offset' is the offset
+     of `type' within that larger type, in bytes.  The value_contents()
+     macro takes `embedded_offset' into account, so most GDB code
+     continues to see the `type' portion of the value, just as the
+     inferior would.
+
+     If `type' is a pointer to an object, then `enclosing_type' is a
+     pointer to the object's run-time type, and `pointed_to_offset' is
+     the offset in bytes from the full object to the pointed-to object
+     -- that is, the value `embedded_offset' would have if we followed
+     the pointer and fetched the complete object.  (I don't really see
+     the point.  Why not just determine the run-time type when you
+     indirect, and avoid the special case?  The contents don't matter
+     until you indirect anyway.)
+
+     If we're not doing anything fancy, `enclosing_type' is equal to
+     `type', and `embedded_offset' is zero, so everything works
+     normally.  */
+
+  struct type *enclosing_type  () const
+  { return m_enclosing_type; }
+
+  void set_enclosing_type (struct type *new_type);
+
 
   /* Type of value; either not an lval, or one of the various
      different possible kinds of lval.  */
@@ -393,51 +439,6 @@ struct value
   ULONGEST m_limited_length = 0;
 };
 
-/* If a value represents a C++ object, then the `type' field gives the
-   object's compile-time type.  If the object actually belongs to some
-   class derived from `type', perhaps with other base classes and
-   additional members, then `type' is just a subobject of the real
-   thing, and the full object is probably larger than `type' would
-   suggest.
-
-   If `type' is a dynamic class (i.e. one with a vtable), then GDB can
-   actually determine the object's run-time type by looking at the
-   run-time type information in the vtable.  When this information is
-   available, we may elect to read in the entire object, for several
-   reasons:
-
-   - When printing the value, the user would probably rather see the
-     full object, not just the limited portion apparent from the
-     compile-time type.
-
-   - If `type' has virtual base classes, then even printing `type'
-     alone may require reaching outside the `type' portion of the
-     object to wherever the virtual base class has been stored.
-
-   When we store the entire object, `enclosing_type' is the run-time
-   type -- the complete object -- and `embedded_offset' is the offset
-   of `type' within that larger type, in bytes.  The value_contents()
-   macro takes `embedded_offset' into account, so most GDB code
-   continues to see the `type' portion of the value, just as the
-   inferior would.
-
-   If `type' is a pointer to an object, then `enclosing_type' is a
-   pointer to the object's run-time type, and `pointed_to_offset' is
-   the offset in bytes from the full object to the pointed-to object
-   -- that is, the value `embedded_offset' would have if we followed
-   the pointer and fetched the complete object.  (I don't really see
-   the point.  Why not just determine the run-time type when you
-   indirect, and avoid the special case?  The contents don't matter
-   until you indirect anyway.)
-
-   If we're not doing anything fancy, `enclosing_type' is equal to
-   `type', and `embedded_offset' is zero, so everything works
-   normally.  */
-
-extern struct type *value_enclosing_type (const struct value *);
-extern void set_value_enclosing_type (struct value *val,
-                                     struct type *new_type);
-
 /* Returns value_type or value_enclosing_type depending on
    value_print_options.objectprint.
 
@@ -768,7 +769,7 @@ extern void mark_value_bits_unavailable (struct value *value,
    example, to compare a complete object value with itself, including
    its enclosing type chunk, you'd do:
 
-     int len = check_typedef (value_enclosing_type (val))->length ();
+   int len = check_typedef (val->enclosing_type ())->length ();
      value_contents_eq (val, 0, val, 0, len);
 
    Returns true iff the set of available/valid contents match.
index c229e66042365f60b7a2859be9d51fd580dec137..c46010d0b130cd4faf913bb3fbe86a4d10f401a3 100644 (file)
@@ -117,7 +117,7 @@ vax_store_arguments (struct regcache *regcache, int nargs,
   /* Push arguments in reverse order.  */
   for (i = nargs - 1; i >= 0; i--)
     {
-      int len = value_enclosing_type (args[i])->length ();
+      int len = args[i]->enclosing_type ()->length ();
 
       sp -= (len + 3) & ~3;
       count += (len + 3) / 4;
index 0c33b9a7554cee2479db6dea39e1bd8e52a4cf4d..c12d83213ae1a8bace11372d2acb6ea3705ddaaf 100644 (file)
@@ -247,7 +247,7 @@ xstormy16_push_dummy_call (struct gdbarch *gdbarch,
      would fit in the remaining unused registers.  */
   for (i = 0; i < nargs && argreg <= E_LST_ARG_REGNUM; i++)
     {
-      typelen = value_enclosing_type (args[i])->length ();
+      typelen = args[i]->enclosing_type ()->length ();
       if (typelen > E_MAX_RETTYPE_SIZE (argreg))
        break;
 
@@ -272,7 +272,7 @@ xstormy16_push_dummy_call (struct gdbarch *gdbarch,
     {
       const gdb_byte *bytes = value_contents (args[j]).data ();
 
-      typelen = value_enclosing_type (args[j])->length ();
+      typelen = args[j]->enclosing_type ()->length ();
       slacklen = typelen & 1;
       gdb::byte_vector val (typelen + slacklen);
       memcpy (val.data (), bytes, typelen);