[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