From 3b7538c0317072d430eca4e808b183dac5bd5e45 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 17 Jun 2009 18:47:35 +0000 Subject: [PATCH] * gdbtypes.c (create_string_type): Receive character type as argument. * gdbtypes.h (create_string_type): Add character type argument. * dwarf2read.c (read_tag_string_type): Pass character type to create_string_type. * value.h (value_string): Add character type argument. * valops.c (value_string): Add character type argument. Pass it to create_string_type. Do not allocate space in inferior. * valarith.c (value_concat): Pass character type to value_string. * value.h (value_typed_string): Rename to ... (value_cstring): ... this. * valops.c (value_typed_string): Rename to ... (value_cstring): ... this. * c-lang.c (evaluate_subexp_c): Update. * python/python-value.c (builtin_type_pychar): New define. (convert_value_from_python): Call value_cstring instead of value_from_string. * value.c (value_from_string): Remove. * value.h (value_from_string): Remove. * eval.c (evaluate_subexp_standard): Pass character type to value_string. Pass expression architecture to value_nsstring and lookup_child_selector. * objc-lang.h (lookup_objc_class): Add GDBARCH parameter. (lookup_child_selector): Likewise. (value_nsstring): Likewise. * objc-lang.c (lookup_objc_class): Add GDBARCH parameter. Pass character type to value_string.. (lookup_child_selector): Likewise. (value_nsstring): Add GDBARCH parameter, use it instead of objfile architecture. Pass architecture to lookup_objc_class and lookup_child_selector. Pass character type to value_string. (end_msglist): Pass architecture to lookup_objc_class. * objc-exp.y: Pass architecture to lookup_objc_class. --- gdb/ChangeLog | 39 +++++++++++++++++++++++++++++++++++++++ gdb/c-lang.c | 8 ++++---- gdb/dwarf2read.c | 4 +++- gdb/eval.c | 20 +++++++++++++------- gdb/gdbtypes.c | 7 ++----- gdb/gdbtypes.h | 3 ++- gdb/objc-exp.y | 5 +++-- gdb/objc-lang.c | 33 ++++++++++++++++----------------- gdb/objc-lang.h | 9 ++++++--- gdb/python/python-value.c | 5 ++++- gdb/valarith.c | 9 +++++++-- gdb/valops.c | 29 ++++++++--------------------- gdb/value.c | 28 ---------------------------- gdb/value.h | 8 ++++---- 14 files changed, 111 insertions(+), 96 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2c277d72015..ec1e3d5ee77 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,42 @@ +2009-06-17 Ulrich Weigand + + * gdbtypes.c (create_string_type): Receive character type as argument. + * gdbtypes.h (create_string_type): Add character type argument. + * dwarf2read.c (read_tag_string_type): Pass character type to + create_string_type. + + * value.h (value_string): Add character type argument. + * valops.c (value_string): Add character type argument. Pass it to + create_string_type. Do not allocate space in inferior. + * valarith.c (value_concat): Pass character type to value_string. + + * value.h (value_typed_string): Rename to ... + (value_cstring): ... this. + * valops.c (value_typed_string): Rename to ... + (value_cstring): ... this. + * c-lang.c (evaluate_subexp_c): Update. + + * python/python-value.c (builtin_type_pychar): New define. + (convert_value_from_python): Call value_cstring instead + of value_from_string. + * value.c (value_from_string): Remove. + * value.h (value_from_string): Remove. + + * eval.c (evaluate_subexp_standard): Pass character type to + value_string. Pass expression architecture to value_nsstring + and lookup_child_selector. + * objc-lang.h (lookup_objc_class): Add GDBARCH parameter. + (lookup_child_selector): Likewise. + (value_nsstring): Likewise. + * objc-lang.c (lookup_objc_class): Add GDBARCH parameter. + Pass character type to value_string.. + (lookup_child_selector): Likewise. + (value_nsstring): Add GDBARCH parameter, use it instead of + objfile architecture. Pass architecture to lookup_objc_class + and lookup_child_selector. Pass character type to value_string. + (end_msglist): Pass architecture to lookup_objc_class. + * objc-exp.y: Pass architecture to lookup_objc_class. + 2009-06-17 Ulrich Weigand * gdbtypes.h (struct language_defn): Add forward declaration. diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 109d4a169b9..898ae8ddb8b 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -951,7 +951,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, if ((dest_type & C_CHAR) != 0) result = allocate_value (type); else - result = value_typed_string ("", 0, type); + result = value_cstring ("", 0, type); do_cleanups (cleanup); return result; } @@ -971,9 +971,9 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, /* Write the terminating character. */ for (i = 0; i < TYPE_LENGTH (type); ++i) obstack_1grow (&output, 0); - result = value_typed_string (obstack_base (&output), - obstack_object_size (&output), - type); + result = value_cstring (obstack_base (&output), + obstack_object_size (&output), + type); } do_cleanups (cleanup); return result; diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 26baba56a77..ae8870c262f 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -5165,6 +5165,7 @@ static struct type * read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; + struct gdbarch *gdbarch = get_objfile_arch (objfile); struct type *type, *range_type, *index_type, *char_type; struct attribute *attr; unsigned int length; @@ -5190,7 +5191,8 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) index_type = builtin_type_int32; range_type = create_range_type (NULL, index_type, 1, length); - type = create_string_type (NULL, range_type); + char_type = language_string_char_type (cu->language_defn, gdbarch); + type = create_string_type (NULL, char_type, range_type); return set_die_type (die, type, cu); } diff --git a/gdb/eval.c b/gdb/eval.c index e64d4bf52f9..df730057d80 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -789,7 +789,8 @@ evaluate_subexp_standard (struct type *expect_type, (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); if (noside == EVAL_SKIP) goto nosideret; - return value_string (&exp->elts[pc + 2].string, tem); + type = language_string_char_type (exp->language_defn, exp->gdbarch); + return value_string (&exp->elts[pc + 2].string, tem, type); case OP_OBJC_NSSTRING: /* Objective C Foundation Class NSString constant. */ tem = longest_to_int (exp->elts[pc + 1].longconst); @@ -798,7 +799,7 @@ evaluate_subexp_standard (struct type *expect_type, { goto nosideret; } - return (struct value *) value_nsstring (&exp->elts[pc + 2].string, tem + 1); + return value_nsstring (exp->gdbarch, &exp->elts[pc + 2].string, tem + 1); case OP_BITSTRING: tem = longest_to_int (exp->elts[pc + 1].longconst); @@ -1010,7 +1011,8 @@ evaluate_subexp_standard (struct type *expect_type, sel[len] = 0; /* Make sure it's terminated. */ selector_type = builtin_type (exp->gdbarch)->builtin_data_ptr; - return value_from_longest (selector_type, lookup_child_selector (sel)); + return value_from_longest (selector_type, + lookup_child_selector (exp->gdbarch, sel)); } case OP_OBJC_MSGCALL: @@ -1098,16 +1100,20 @@ evaluate_subexp_standard (struct type *expect_type, the verification method than the non-standard, but more often used, 'NSObject' class. Make sure we check for both. */ - responds_selector = lookup_child_selector ("respondsToSelector:"); + responds_selector + = lookup_child_selector (exp->gdbarch, "respondsToSelector:"); if (responds_selector == 0) - responds_selector = lookup_child_selector ("respondsTo:"); + responds_selector + = lookup_child_selector (exp->gdbarch, "respondsTo:"); if (responds_selector == 0) error (_("no 'respondsTo:' or 'respondsToSelector:' method")); - method_selector = lookup_child_selector ("methodForSelector:"); + method_selector + = lookup_child_selector (exp->gdbarch, "methodForSelector:"); if (method_selector == 0) - method_selector = lookup_child_selector ("methodFor:"); + method_selector + = lookup_child_selector (exp->gdbarch, "methodFor:"); if (method_selector == 0) error (_("no 'methodFor:' or 'methodForSelector:' method")); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 17df58e13f2..005a29d1dad 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -846,13 +846,10 @@ create_array_type (struct type *result_type, type? */ struct type * -create_string_type (struct type *result_type, +create_string_type (struct type *result_type, + struct type *string_char_type, struct type *range_type) { - struct type *string_char_type; - - string_char_type = language_string_char_type (current_language, - current_gdbarch); result_type = create_array_type (result_type, string_char_type, range_type); diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index f23aedeef1f..c5175efb5f9 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1177,7 +1177,8 @@ extern struct type *create_range_type (struct type *, struct type *, int, extern struct type *create_array_type (struct type *, struct type *, struct type *); -extern struct type *create_string_type (struct type *, struct type *); +extern struct type *create_string_type (struct type *, struct type *, + struct type *); extern struct type *create_set_type (struct type *, struct type *); diff --git a/gdb/objc-exp.y b/gdb/objc-exp.y index 1a31f5edc82..8103de6e073 100644 --- a/gdb/objc-exp.y +++ b/gdb/objc-exp.y @@ -333,7 +333,8 @@ exp : '[' TYPENAME { CORE_ADDR class; - class = lookup_objc_class (copy_name ($2.stoken)); + class = lookup_objc_class (parse_gdbarch, + copy_name ($2.stoken)); if (class == 0) error ("%s is not an ObjC Class", copy_name ($2.stoken)); @@ -1748,7 +1749,7 @@ yylex () /* See if it's an ObjC classname. */ if (!sym) { - CORE_ADDR Class = lookup_objc_class(tmp); + CORE_ADDR Class = lookup_objc_class (parse_gdbarch, tmp); if (Class) { yylval.class.class = Class; diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index cd4c1977c4e..cff54bbaffd 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -108,8 +108,9 @@ lookup_struct_typedef (char *name, struct block *block, int noerr) } CORE_ADDR -lookup_objc_class (char *classname) +lookup_objc_class (struct gdbarch *gdbarch, char *classname) { + struct type *char_type = builtin_type (gdbarch)->builtin_char; struct value * function, *classval; if (! target_has_execution) @@ -128,15 +129,16 @@ lookup_objc_class (char *classname) return 0; } - classval = value_string (classname, strlen (classname) + 1); + classval = value_string (classname, strlen (classname) + 1, char_type); classval = value_coerce_array (classval); return (CORE_ADDR) value_as_long (call_function_by_hand (function, 1, &classval)); } CORE_ADDR -lookup_child_selector (char *selname) +lookup_child_selector (struct gdbarch *gdbarch, char *selname) { + struct type *char_type = builtin_type (gdbarch)->builtin_char; struct value * function, *selstring; if (! target_has_execution) @@ -156,53 +158,50 @@ lookup_child_selector (char *selname) } selstring = value_coerce_array (value_string (selname, - strlen (selname) + 1)); + strlen (selname) + 1, char_type)); return value_as_long (call_function_by_hand (function, 1, &selstring)); } struct value * -value_nsstring (char *ptr, int len) +value_nsstring (struct gdbarch *gdbarch, char *ptr, int len) { + struct type *char_type = builtin_type (gdbarch)->builtin_char; struct value *stringValue[3]; struct value *function, *nsstringValue; struct symbol *sym; struct type *type; - struct objfile *objf; - struct gdbarch *gdbarch; if (!target_has_execution) return 0; /* Can't call into inferior to create NSString. */ - stringValue[2] = value_string(ptr, len); + stringValue[2] = value_string(ptr, len, char_type); stringValue[2] = value_coerce_array(stringValue[2]); /* _NSNewStringFromCString replaces "istr" after Lantern2A. */ if (lookup_minimal_symbol("_NSNewStringFromCString", 0, 0)) { - function = find_function_in_inferior("_NSNewStringFromCString", &objf); + function = find_function_in_inferior("_NSNewStringFromCString", NULL); nsstringValue = call_function_by_hand(function, 1, &stringValue[2]); } else if (lookup_minimal_symbol("istr", 0, 0)) { - function = find_function_in_inferior("istr", &objf); + function = find_function_in_inferior("istr", NULL); nsstringValue = call_function_by_hand(function, 1, &stringValue[2]); } else if (lookup_minimal_symbol("+[NSString stringWithCString:]", 0, 0)) { function - = find_function_in_inferior("+[NSString stringWithCString:]", &objf); - type = builtin_type (get_objfile_arch (objf))->builtin_long; + = find_function_in_inferior("+[NSString stringWithCString:]", NULL); + type = builtin_type (gdbarch)->builtin_long; stringValue[0] = value_from_longest - (type, lookup_objc_class ("NSString")); + (type, lookup_objc_class (gdbarch, "NSString")); stringValue[1] = value_from_longest - (type, lookup_child_selector ("stringWithCString:")); + (type, lookup_child_selector (gdbarch, "stringWithCString:")); nsstringValue = call_function_by_hand(function, 3, &stringValue[0]); } else error (_("NSString: internal error -- no way to create new NSString")); - gdbarch = get_objfile_arch (objf); - sym = lookup_struct_typedef("NSString", 0, 1); if (sym == NULL) sym = lookup_struct_typedef("NXString", 0, 1); @@ -612,7 +611,7 @@ end_msglist(void) selname_chain = sel->next; msglist_len = sel->msglist_len; msglist_sel = sel->msglist_sel; - selid = lookup_child_selector(p); + selid = lookup_child_selector (parse_gdbarch, p); if (!selid) error (_("Can't find selector \"%s\""), p); write_exp_elt_longcst (selid); diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h index d0cbb8dc55a..0d23467c67b 100644 --- a/gdb/objc-lang.h +++ b/gdb/objc-lang.h @@ -29,8 +29,10 @@ extern int objc_parse (void); /* Defined in c-exp.y */ extern void objc_error (char *); /* Defined in c-exp.y */ -extern CORE_ADDR lookup_objc_class (char *classname); -extern CORE_ADDR lookup_child_selector (char *methodname); +extern CORE_ADDR lookup_objc_class (struct gdbarch *gdbarch, + char *classname); +extern CORE_ADDR lookup_child_selector (struct gdbarch *gdbarch, + char *methodname); extern char *objc_demangle (const char *mangled, int options); @@ -46,7 +48,8 @@ extern char *find_imps (struct symtab *symtab, struct block *block, char *method, struct symbol **syms, unsigned int *nsym, unsigned int *ndebug); -extern struct value *value_nsstring (char *ptr, int len); +extern struct value *value_nsstring (struct gdbarch *gdbarch, + char *ptr, int len); /* for parsing Objective C */ extern void start_msglist (void); diff --git a/gdb/python/python-value.c b/gdb/python/python-value.c index 46af318e610..1b34f47c271 100644 --- a/gdb/python/python-value.c +++ b/gdb/python/python-value.c @@ -55,6 +55,9 @@ struct value *values_in_python = NULL; #define builtin_type_pybool \ language_bool_type (current_language, current_gdbarch) +#define builtin_type_pychar \ + language_string_char_type (current_language, current_gdbarch) + typedef struct { PyObject_HEAD struct value *value; @@ -867,7 +870,7 @@ convert_value_from_python (PyObject *obj) if (s != NULL) { old = make_cleanup (xfree, s); - value = value_from_string (s); + value = value_cstring (s, strlen (s), builtin_type_pychar); do_cleanups (old); } } diff --git a/gdb/valarith.c b/gdb/valarith.c index 57e6194c7f9..6f08705b757 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -624,6 +624,7 @@ value_concat (struct value *arg1, struct value *arg2) char inchar; struct type *type1 = check_typedef (value_type (arg1)); struct type *type2 = check_typedef (value_type (arg2)); + struct type *char_type; /* First figure out if we are dealing with two values to be concatenated or a repeat count and a value to be repeated. INVAL1 is set to the @@ -659,6 +660,7 @@ value_concat (struct value *arg1, struct value *arg2) ptr = (char *) alloca (count * inval2len); if (TYPE_CODE (type2) == TYPE_CODE_CHAR) { + char_type = type2; inchar = (char) unpack_long (type2, value_contents (inval2)); for (idx = 0; idx < count; idx++) @@ -668,13 +670,14 @@ value_concat (struct value *arg1, struct value *arg2) } else { + char_type = TYPE_TARGET_TYPE (type2); for (idx = 0; idx < count; idx++) { memcpy (ptr + (idx * inval2len), value_contents (inval2), inval2len); } } - outval = value_string (ptr, count * inval2len); + outval = value_string (ptr, count * inval2len, char_type); } else if (TYPE_CODE (type2) == TYPE_CODE_BITSTRING || TYPE_CODE (type2) == TYPE_CODE_BOOL) @@ -700,10 +703,12 @@ value_concat (struct value *arg1, struct value *arg2) ptr = (char *) alloca (inval1len + inval2len); if (TYPE_CODE (type1) == TYPE_CODE_CHAR) { + char_type = type1; *ptr = (char) unpack_long (type1, value_contents (inval1)); } else { + char_type = TYPE_TARGET_TYPE (type1); memcpy (ptr, value_contents (inval1), inval1len); } if (TYPE_CODE (type2) == TYPE_CODE_CHAR) @@ -715,7 +720,7 @@ value_concat (struct value *arg1, struct value *arg2) { memcpy (ptr + inval1len, value_contents (inval2), inval2len); } - outval = value_string (ptr, inval1len + inval2len); + outval = value_string (ptr, inval1len + inval2len, char_type); } else if (TYPE_CODE (type1) == TYPE_CODE_BITSTRING || TYPE_CODE (type1) == TYPE_CODE_BOOL) diff --git a/gdb/valops.c b/gdb/valops.c index 422821ab1e6..05585c997af 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1349,7 +1349,7 @@ value_array (int lowbound, int highbound, struct value **elemvec) } struct value * -value_typed_string (char *ptr, int len, struct type *char_type) +value_cstring (char *ptr, int len, struct type *char_type) { struct value *val; int lowbound = current_language->string_lower_bound; @@ -1376,34 +1376,21 @@ value_typed_string (char *ptr, int len, struct type *char_type) string may contain embedded null bytes. */ struct value * -value_string (char *ptr, int len) +value_string (char *ptr, int len, struct type *char_type) { struct value *val; int lowbound = current_language->string_lower_bound; + int highbound = len / TYPE_LENGTH (char_type); struct type *rangetype = create_range_type ((struct type *) NULL, builtin_type_int32, lowbound, - len + lowbound - 1); + highbound + lowbound - 1); struct type *stringtype - = create_string_type ((struct type *) NULL, rangetype); - CORE_ADDR addr; - - if (current_language->c_style_arrays == 0) - { - val = allocate_value (stringtype); - memcpy (value_contents_raw (val), ptr, len); - return val; - } + = create_string_type ((struct type *) NULL, char_type, rangetype); - - /* Allocate space to store the string in the inferior, and then copy - LEN bytes from PTR in gdb to that address in the inferior. */ - - addr = allocate_space_in_inferior (len); - write_memory (addr, (gdb_byte *) ptr, len); - - val = value_at_lazy (stringtype, addr); - return (val); + val = allocate_value (stringtype); + memcpy (value_contents_raw (val), ptr, len); + return val; } struct value * diff --git a/gdb/value.c b/gdb/value.c index aec3b4b500e..7566921c80f 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2025,34 +2025,6 @@ value_from_pointer (struct type *type, CORE_ADDR addr) } -/* Create a value for a string constant to be stored locally - (not in the inferior's memory space, but in GDB memory). - This is analogous to value_from_longest, which also does not - use inferior memory. String shall NOT contain embedded nulls. */ - -struct value * -value_from_string (char *ptr) -{ - struct value *val; - int len = strlen (ptr); - int lowbound = current_language->string_lower_bound; - struct type *string_char_type; - struct type *rangetype; - struct type *stringtype; - - rangetype = create_range_type ((struct type *) NULL, - builtin_type_int32, - lowbound, len + lowbound - 1); - string_char_type = language_string_char_type (current_language, - current_gdbarch); - stringtype = create_array_type ((struct type *) NULL, - string_char_type, - rangetype); - val = allocate_value (stringtype); - memcpy (value_contents_raw (val), ptr, len); - return val; -} - /* Create a value of type TYPE whose contents come from VALADDR, if it is non-null, and whose memory address (in the inferior) is ADDRESS. */ diff --git a/gdb/value.h b/gdb/value.h index 317d4ef8ce6..db4dcc1dd43 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -339,7 +339,6 @@ extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr); extern struct value *value_from_double (struct type *type, DOUBLEST num); extern struct value *value_from_decfloat (struct type *type, const gdb_byte *decbytes); -extern struct value *value_from_string (char *string); extern struct value *value_at (struct type *type, CORE_ADDR addr); extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); @@ -381,9 +380,10 @@ extern struct value *value_mark (void); extern void value_free_to_mark (struct value *mark); -extern struct value *value_typed_string (char *ptr, int len, - struct type *char_type); -extern struct value *value_string (char *ptr, int len); +extern struct value *value_cstring (char *ptr, int len, + struct type *char_type); +extern struct value *value_string (char *ptr, int len, + struct type *char_type); extern struct value *value_bitstring (char *ptr, int len); extern struct value *value_array (int lowbound, int highbound, -- 2.30.2