This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[2/6] Fortran dynamic arrays #2: Descriptors data retrieval


Hi,

DW_AT_data_location needs to retrieve the real data pointer.

This part only provides place for the later Fortran hook.


Regards,
Jan
2007-11-23  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 LA_VALUE_ADDRESS_GET call.

Index: sources/gdb/ada-lang.c
===================================================================
--- sources.orig/gdb/ada-lang.c	2007-11-23 22:07:48.000000000 +0100
+++ sources/gdb/ada-lang.c	2007-11-23 22:07:56.000000000 +0100
@@ -10440,6 +10440,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-23 22:07:48.000000000 +0100
+++ sources/gdb/c-lang.c	2007-11-23 22:07:56.000000000 +0100
@@ -620,6 +620,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
 };
 
@@ -724,6 +725,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
 };
 
@@ -759,6 +761,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
 };
 
@@ -799,6 +802,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-23 22:07:48.000000000 +0100
+++ sources/gdb/f-lang.c	2007-11-23 22:07:56.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-23 22:07:48.000000000 +0100
+++ sources/gdb/jv-lang.c	2007-11-23 22:07:56.000000000 +0100
@@ -1114,6 +1114,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-23 22:07:48.000000000 +0100
+++ sources/gdb/language.c	2007-11-23 22:07:56.000000000 +0100
@@ -1083,6 +1083,15 @@ default_print_array_index (struct value 
   fprintf_filtered (stream, "] = ");
 }
 
+/* No *ADDRESS_RETURN change is needed as we do not support DW_AT_data_location
+ * for general types.  */
+
+int
+default_value_address_get (struct type *type, CORE_ADDR *address_return)
+{
+  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-23 22:07:48.000000000 +0100
+++ sources/gdb/language.h	2007-11-23 22:07:56.000000000 +0100
@@ -274,6 +274,13 @@ 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 TYPE into
+       *ADDRESS_RETURN.  Return non-zero if the variable/data is valid.
+       You should set *ADDRESS_RETURN as VALUE_ADDRESS (VAL) as if no
+       DW_AT_data_location is present for TYPE *ADDRESS_RETURN is left
+       unchanged.  ADDRESS_RETURN may be NULL.  */
+    int (*la_value_address_get) (struct type *type, CORE_ADDR *address_return);
+
     /* Add fields above this point, so the magic number is always last. */
     /* Magic number for compat checking */
 
@@ -364,6 +371,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(type, address_return) \
+  (current_language->la_value_address_get(type, 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'
@@ -474,4 +484,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 type *type,
+				      CORE_ADDR *address_return);
+
 #endif /* defined (LANGUAGE_H) */
Index: sources/gdb/m2-lang.c
===================================================================
--- sources.orig/gdb/m2-lang.c	2007-11-23 22:07:48.000000000 +0100
+++ sources/gdb/m2-lang.c	2007-11-23 22:07:56.000000000 +0100
@@ -557,6 +557,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-23 22:07:48.000000000 +0100
+++ sources/gdb/objc-lang.c	2007-11-23 22:07:56.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-23 22:07:48.000000000 +0100
+++ sources/gdb/p-lang.c	2007-11-23 22:07:56.000000000 +0100
@@ -574,6 +574,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-23 22:07:48.000000000 +0100
+++ sources/gdb/scm-lang.c	2007-11-23 22:07:56.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-23 22:07:48.000000000 +0100
+++ sources/gdb/valops.c	2007-11-23 22:07:56.000000000 +0100
@@ -519,12 +519,21 @@ 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);
+  addr = VALUE_ADDRESS (val);
+  if (LA_VALUE_ADDRESS_GET (value_type (val), &addr))
+    {
+      struct type *type = value_enclosing_type (val);
+      int length = TYPE_LENGTH (check_typedef (type));
+
+      if (length)
+        {
+	  addr += value_offset (val);
+	  read_memory (addr, value_contents_all_raw (val), length);
+	}
+    }
 
   set_value_lazy (val, 0);
   return 0;
@@ -828,12 +837,17 @@ 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."));
 
+  address = VALUE_ADDRESS (arg1);
+  if (!LA_VALUE_ADDRESS_GET (type, &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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]