[03/11] Fortran dynamic arrays support: Descriptors data retrieval

Jan Kratochvil jan.kratochvil@redhat.com
Fri Nov 16 03:20:00 GMT 2007


Hi,

DW_AT_data_location needs to retrieve the real data pointer.

This functionality could be extended for all the types (not just the Fortran
ones) but it would cost sizeof (void *) in MAIN_TYPE.


Regards,
Jan
-------------- next part --------------
2007-11-16  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* ada-lang.c (ada_language_defn): New value DEFAULT_VALUE_ADDRESS_GET.
	* c-lang.c (c_language_defn, cplus_language_defn, asm_language_defn)
	(minimal_language_defn): Likewise.
	* f-lang.c (f_language_defn): Likewise.
	* jv-lang.c (java_language_defn): Likewise.
	* language.c (default_value_address_get): New function.
	(unknown_language_defn, auto_language_defn, local_language_defn):
	New value DEFAULT_VALUE_ADDRESS_GET.
	* language.h (struct language_defn): New field LA_VALUE_ADDRESS_GET.
	(LA_VALUE_ADDRESS_GET): New macro.
	(default_value_address_get): New prototype.
	* m2-lang.c (m2_language_defn): New value DEFAULT_VALUE_ADDRESS_GET.
	* objc-lang.c (objc_language_defn): Likewise.
	* p-lang.c (pascal_language_defn): Likewise.
	* scm-lang.c (scm_language_defn): Likewise.
	* valops.c (value_fetch_lazy, value_coerce_array): Replace the
	VALUE_ADDRESS call with the success-checking LA_VALUE_ADDRESS_GET call.

Index: sources/gdb/ada-lang.c
===================================================================
--- sources.orig/gdb/ada-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/ada-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -10448,6 +10448,7 @@ const struct language_defn ada_language_
   ada_language_arch_info,
   ada_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/c-lang.c
===================================================================
--- sources.orig/gdb/c-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/c-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -628,6 +628,7 @@ const struct language_defn c_language_de
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
@@ -732,6 +733,7 @@ const struct language_defn cplus_languag
   cplus_language_arch_info,
   default_print_array_index,
   cp_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
@@ -767,6 +769,7 @@ const struct language_defn asm_language_
   c_language_arch_info, /* FIXME: la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
@@ -807,6 +810,7 @@ const struct language_defn minimal_langu
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/f-lang.c
===================================================================
--- sources.orig/gdb/f-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/f-lang.c	2007-11-16 00:07:23.000000000 +0100
@@ -502,6 +502,7 @@ const struct language_defn f_language_de
   f_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/jv-lang.c
===================================================================
--- sources.orig/gdb/jv-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/jv-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -1122,6 +1122,7 @@ const struct language_defn java_language
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/language.c
===================================================================
--- sources.orig/gdb/language.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/language.c	2007-11-16 00:01:41.000000000 +0100
@@ -1083,6 +1083,15 @@ default_print_array_index (struct value 
   fprintf_filtered (stream, "] = ");
 }
 
+int
+default_value_address_get (struct value *val, CORE_ADDR *address_return)
+{
+  if (address_return != NULL)
+    *address_return = VALUE_ADDRESS (val);
+
+  return 1;
+}
+
 /* Define the language that is no language.  */
 
 static int
@@ -1207,6 +1216,7 @@ const struct language_defn unknown_langu
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
@@ -1243,6 +1253,7 @@ const struct language_defn auto_language
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
@@ -1278,6 +1289,7 @@ const struct language_defn local_languag
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/language.h
===================================================================
--- sources.orig/gdb/language.h	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/language.h	2007-11-16 00:01:41.000000000 +0100
@@ -274,6 +274,11 @@ struct language_defn
        reference at the language level.  */
     int (*la_pass_by_reference) (struct type *type);
 
+    /* Return the data address (DW_AT_data_location) of VAL in *ADDRESS_RETURN.
+       Return non-zero if the data is valid (*ADDRESS_RETURN is unset
+       otherwise).  ADDRESS_RETURN may be NULL.  */
+    int (*la_value_address_get) (struct value *val, CORE_ADDR *address_return);
+
     /* Add fields above this point, so the magic number is always last. */
     /* Magic number for compat checking */
 
@@ -367,6 +372,9 @@ extern enum language set_language (enum 
 #define LA_PRINT_ARRAY_INDEX(index_value, stream, format, pretty) \
   (current_language->la_print_array_index(index_value, stream, format, pretty))
 
+#define LA_VALUE_ADDRESS_GET(val,address_return) \
+  (current_language->la_value_address_get(val, address_return))
+
 /* Test a character to decide whether it can be printed in literal form
    or needs to be printed in another representation.  For example,
    in C the literal form of the character with octal value 141 is 'a'
@@ -477,4 +485,7 @@ int language_pass_by_reference (struct t
    independent of this.  */
 int default_pass_by_reference (struct type *type);
 
+extern int default_value_address_get (struct value *val,
+				      CORE_ADDR *address_return);
+
 #endif /* defined (LANGUAGE_H) */
Index: sources/gdb/m2-lang.c
===================================================================
--- sources.orig/gdb/m2-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/m2-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -565,6 +565,7 @@ const struct language_defn m2_language_d
   m2_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/objc-lang.c
===================================================================
--- sources.orig/gdb/objc-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/objc-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -667,6 +667,7 @@ const struct language_defn objc_language
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/p-lang.c
===================================================================
--- sources.orig/gdb/p-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/p-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -582,6 +582,7 @@ const struct language_defn pascal_langua
   pascal_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/scm-lang.c
===================================================================
--- sources.orig/gdb/scm-lang.c	2007-11-16 00:00:16.000000000 +0100
+++ sources/gdb/scm-lang.c	2007-11-16 00:01:41.000000000 +0100
@@ -266,6 +266,7 @@ const struct language_defn scm_language_
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  default_value_address_get,	/* Retrieve the real data value */
   LANG_MAGIC
 };
 
Index: sources/gdb/valops.c
===================================================================
--- sources.orig/gdb/valops.c	2007-11-15 23:59:44.000000000 +0100
+++ sources/gdb/valops.c	2007-11-16 00:08:21.000000000 +0100
@@ -519,12 +519,19 @@ value_at_lazy (struct type *type, CORE_A
 int
 value_fetch_lazy (struct value *val)
 {
-  CORE_ADDR addr = VALUE_ADDRESS (val) + value_offset (val);
-  int length = TYPE_LENGTH (value_enclosing_type (val));
+  CORE_ADDR addr;
+  int length;
 
-  struct type *type = value_type (val);
-  if (length)
-    read_memory (addr, value_contents_all_raw (val), length);
+  if (LA_VALUE_ADDRESS_GET (val, &addr))
+    {
+      int length = TYPE_LENGTH (value_enclosing_type (val));
+
+      if (length)
+        {
+	  addr += value_offset (val);
+	  read_memory (addr, value_contents_all_raw (val), length);
+	}
+    }
 
   set_value_lazy (val, 0);
   return 0;
@@ -828,12 +835,16 @@ struct value *
 value_coerce_array (struct value *arg1)
 {
   struct type *type = check_typedef (value_type (arg1));
+  CORE_ADDR address;
 
   if (VALUE_LVAL (arg1) != lval_memory)
     error (_("Attempt to take address of value not located in memory."));
 
+  if (!LA_VALUE_ADDRESS_GET (arg1, &address))
+    error (_("Attempt to take address of non-valid value."));
+
   return value_from_pointer (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
-			     (VALUE_ADDRESS (arg1) + value_offset (arg1)));
+			     address + value_offset (arg1));
 }
 
 /* Given a value which is a function, return a value which is a pointer


More information about the Gdb-patches mailing list