X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fjv-lang.c;h=f53c656f68373246085232c902727b8dd0e25d7a;hb=0c8b41f1c6ca809238df5662ea5f45e5f7a29121;hp=17516e09750bbfe3c10fa3585970e1eea439a893;hpb=dc5000e72188dd452616737a08bd11b320a8d25d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 17516e0975..f53c656f68 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1,13 +1,13 @@ /* Java language support routines for GDB, the GNU debugger. - Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2007 + Copyright (C) 1997, 1998, 1999, 2000, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "symtab.h" @@ -39,6 +37,7 @@ #include "demangle.h" #include "dictionary.h" #include +#include "gdb_assert.h" struct type *java_int_type; struct type *java_byte_type; @@ -62,7 +61,8 @@ static char *get_java_utf8_name (struct obstack *obstack, struct value *name); static int java_class_is_primitive (struct value *clas); static struct value *java_value_string (char *ptr, int len); -static void java_emit_char (int c, struct ui_file * stream, int quoter); +static void java_emit_char (int c, struct type *type, + struct ui_file * stream, int quoter); static char *java_class_name_from_physname (const char *physname); @@ -146,7 +146,7 @@ add_class_symbol (struct type *type, CORE_ADDR addr) obstack_alloc (&dynamics_objfile->objfile_obstack, sizeof (struct symbol)); memset (sym, 0, sizeof (struct symbol)); SYMBOL_LANGUAGE (sym) = language_java; - DEPRECATED_SYMBOL_NAME (sym) = TYPE_TAG_NAME (type); + SYMBOL_SET_LINKAGE_NAME (sym, TYPE_TAG_NAME (type)); SYMBOL_CLASS (sym) = LOC_TYPEDEF; /* SYMBOL_VALUE (sym) = valu; */ SYMBOL_TYPE (sym) = type; @@ -170,8 +170,7 @@ struct type * java_lookup_class (char *name) { struct symbol *sym; - sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, - (int *) 0, (struct symtab **) NULL); + sym = lookup_symbol (name, expression_context_block, STRUCT_DOMAIN, NULL); if (sym != NULL) return SYMBOL_TYPE (sym); #if 0 @@ -191,7 +190,7 @@ java_lookup_class (char *name) TYPE_CODE (type) = TYPE_CODE_STRUCT; INIT_CPLUS_SPECIFIC (type); TYPE_TAG_NAME (type) = obsavestring (name, strlen (name), &objfile->objfile_obstack); - TYPE_FLAGS (type) |= TYPE_FLAG_STUB; + TYPE_STUB (type) = 1; TYPE ? = addr; return type; #else @@ -212,8 +211,7 @@ get_java_utf8_name (struct obstack *obstack, struct value *name) CORE_ADDR data_addr; temp = value_struct_elt (&temp, NULL, "length", NULL, "structure"); name_length = (int) value_as_long (temp); - data_addr = VALUE_ADDRESS (temp) + value_offset (temp) - + TYPE_LENGTH (value_type (temp)); + data_addr = value_address (temp) + TYPE_LENGTH (value_type (temp)); chrs = obstack_alloc (obstack, name_length + 1); chrs[name_length] = '\0'; read_memory (data_addr, (gdb_byte *) chrs, name_length); @@ -268,7 +266,7 @@ type_from_class (struct value *clas) return NULL; clas = value_ind (clas); } - addr = VALUE_ADDRESS (clas) + value_offset (clas); + addr = value_address (clas); #if 0 get_java_class_symtab (); @@ -304,7 +302,10 @@ type_from_class (struct value *clas) if (type != NULL) return type; - type = alloc_type (objfile); + /* Do not use the "fake" dynamics objfile to own dynamically generated + types, as it does not provide an architecture, and it would not help + manage the lifetime of these types anyway. */ + type = alloc_type (NULL); TYPE_CODE (type) = TYPE_CODE_STRUCT; INIT_CPLUS_SPECIFIC (type); @@ -351,13 +352,14 @@ java_link_class_type (struct type *type, struct value *clas) struct objfile *objfile = get_dynamics_objfile (); struct type *tsuper; + gdb_assert (name != NULL); unqualified_name = strrchr (name, '.'); if (unqualified_name == NULL) unqualified_name = name; temp = clas; temp = value_struct_elt (&temp, NULL, "superclass", NULL, "structure"); - if (name != NULL && strcmp (name, "java.lang.Object") == 0) + if (strcmp (name, "java.lang.Object") == 0) { tsuper = get_java_object_type (); if (tsuper && TYPE_CODE (tsuper) == TYPE_CODE_PTR) @@ -422,8 +424,7 @@ java_link_class_type (struct type *type, struct value *clas) fields = NULL; nfields--; /* First set up dummy "class" field. */ - SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), - VALUE_ADDRESS (clas) + value_offset (clas)); + SET_FIELD_PHYSADDR (TYPE_FIELD (type, nfields), value_address (clas)); TYPE_FIELD_NAME (type, nfields) = "class"; TYPE_FIELD_TYPE (type, nfields) = value_type (clas); SET_TYPE_FIELD_PRIVATE (type, nfields); @@ -440,7 +441,9 @@ java_link_class_type (struct type *type, struct value *clas) } else { /* Re-use field value for next field. */ - VALUE_ADDRESS (field) += TYPE_LENGTH (value_type (field)); + CORE_ADDR addr + = value_address (field) + TYPE_LENGTH (value_type (field)); + set_value_address (field, addr); set_value_lazy (field, 1); } temp = field; @@ -510,7 +513,9 @@ java_link_class_type (struct type *type, struct value *clas) } else { /* Re-use method value for next method. */ - VALUE_ADDRESS (method) += TYPE_LENGTH (value_type (method)); + CORE_ADDR addr + = value_address (method) + TYPE_LENGTH (value_type (method)); + set_value_address (method, addr); set_value_lazy (method, 1); } @@ -557,7 +562,8 @@ java_link_class_type (struct type *type, struct value *clas) } fn_fields[k].physname = ""; fn_fields[k].is_stub = 1; - fn_fields[k].type = make_function_type (java_void_type, NULL); /* FIXME */ + /* FIXME */ + fn_fields[k].type = lookup_function_type (java_void_type); TYPE_CODE (fn_fields[k].type) = TYPE_CODE_METHOD; } @@ -577,8 +583,7 @@ get_java_object_type (void) if (java_object_type == NULL) { struct symbol *sym; - sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, - (int *) 0, (struct symtab **) NULL); + sym = lookup_symbol ("java.lang.Object", NULL, STRUCT_DOMAIN, NULL); if (sym == NULL) error (_("cannot find java.lang.Object")); java_object_type = SYMBOL_TYPE (sym); @@ -587,11 +592,11 @@ get_java_object_type (void) } int -get_java_object_header_size (void) +get_java_object_header_size (struct gdbarch *gdbarch) { struct type *objtype = get_java_object_type (); if (objtype == NULL) - return (2 * TARGET_PTR_BIT / TARGET_CHAR_BIT); + return (2 * gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT); else return TYPE_LENGTH (objtype); } @@ -777,7 +782,7 @@ java_array_type (struct type *type, int dims) while (dims-- > 0) { - range_type = create_range_type (NULL, builtin_type_int, 0, 0); + range_type = create_range_type (NULL, builtin_type_int32, 0, 0); /* FIXME This is bogus! Java arrays are not gdb arrays! */ type = create_array_type (NULL, type, range_type); } @@ -798,7 +803,7 @@ java_value_string (char *ptr, int len) characters and strings is language specific. */ static void -java_emit_char (int c, struct ui_file *stream, int quoter) +java_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) { switch (c) { @@ -898,7 +903,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, if (noside == EVAL_AVOID_SIDE_EFFECTS) return value_zero (el_type, VALUE_LVAL (arg1)); address = value_as_address (arg1); - address += JAVA_OBJECT_SIZE; + address += get_java_object_header_size (exp->gdbarch); read_memory (address, buf4, 4); length = (long) extract_signed_integer (buf4, 4); index = (long) value_as_long (arg2); @@ -940,38 +945,7 @@ evaluate_subexp_java (struct type *expect_type, struct expression *exp, standard: return evaluate_subexp_standard (expect_type, exp, pos, noside); nosideret: - return value_from_longest (builtin_type_long, (LONGEST) 1); -} - -static struct type * -java_create_fundamental_type (struct objfile *objfile, int typeid) -{ - switch (typeid) - { - case FT_VOID: - return java_void_type; - case FT_BOOLEAN: - return java_boolean_type; - case FT_CHAR: - return java_char_type; - case FT_FLOAT: - return java_float_type; - case FT_DBL_PREC_FLOAT: - return java_double_type; - case FT_BYTE: - case FT_SIGNED_CHAR: - return java_byte_type; - case FT_SHORT: - case FT_SIGNED_SHORT: - return java_short_type; - case FT_INTEGER: - case FT_SIGNED_INTEGER: - return java_int_type; - case FT_LONG: - case FT_SIGNED_LONG: - return java_long_type; - } - return c_create_fundamental_type (objfile, typeid); + return value_from_longest (builtin_type_int8, (LONGEST) 1); } static char *java_demangle (const char *mangled, int options) @@ -1073,6 +1047,51 @@ const struct op_print java_op_print_tab[] = {NULL, 0, 0, 0} }; +enum java_primitive_types +{ + java_primitive_type_int, + java_primitive_type_short, + java_primitive_type_long, + java_primitive_type_byte, + java_primitive_type_boolean, + java_primitive_type_char, + java_primitive_type_float, + java_primitive_type_double, + java_primitive_type_void, + nr_java_primitive_types +}; + +static void +java_language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) +{ + lai->string_char_type = java_char_type; + lai->primitive_type_vector + = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_java_primitive_types + 1, + struct type *); + lai->primitive_type_vector [java_primitive_type_int] + = java_int_type; + lai->primitive_type_vector [java_primitive_type_short] + = java_short_type; + lai->primitive_type_vector [java_primitive_type_long] + = java_long_type; + lai->primitive_type_vector [java_primitive_type_byte] + = java_byte_type; + lai->primitive_type_vector [java_primitive_type_boolean] + = java_boolean_type; + lai->primitive_type_vector [java_primitive_type_char] + = java_char_type; + lai->primitive_type_vector [java_primitive_type_float] + = java_float_type; + lai->primitive_type_vector [java_primitive_type_double] + = java_double_type; + lai->primitive_type_vector [java_primitive_type_void] + = java_void_type; + + lai->bool_type_symbol = "boolean"; + lai->bool_type_default = java_boolean_type; +} + const struct exp_descriptor exp_descriptor_java = { print_subexp_standard, @@ -1086,11 +1105,11 @@ const struct language_defn java_language_defn = { "java", /* Language name */ language_java, - NULL, range_check_off, type_check_off, case_sensitive_on, array_row_major, + macro_expansion_no, &exp_descriptor_java, java_parse, java_error, @@ -1098,12 +1117,12 @@ const struct language_defn java_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ java_emit_char, /* Function to print a single character */ - java_create_fundamental_type, /* Create fundamental type in this language */ java_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ - value_of_this, /* value_of_this */ + "this", /* name_of_this */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ java_demangle, /* Language specific symbol demangler */ @@ -1111,10 +1130,12 @@ const struct language_defn java_language_defn = java_op_print_tab, /* expression operators for printing */ 0, /* not c-style arrays */ 0, /* String lower bound */ - NULL, default_word_break_characters, - c_language_arch_info, + default_make_symbol_completion_list, + java_language_arch_info, default_print_array_index, + default_pass_by_reference, + default_get_string, LANG_MAGIC }; @@ -1134,25 +1155,3 @@ _initialize_java_language (void) add_language (&java_language_defn); } - -/* Cleanup code that should be run on every "run". - We should use make_run_cleanup to have this be called. - But will that mess up values in value histry? FIXME */ - -extern void java_rerun_cleanup (void); -void -java_rerun_cleanup (void) -{ - if (class_symtab != NULL) - { - free_symtab (class_symtab); /* ??? */ - class_symtab = NULL; - } - if (dynamics_objfile != NULL) - { - free_objfile (dynamics_objfile); - dynamics_objfile = NULL; - } - - java_object_type = NULL; -}