CORE_ADDR 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) { /* Can't call into inferior to lookup selector. */ return 0; } if (lookup_minimal_symbol("sel_getUid", 0, 0).minsym) function = find_function_in_inferior("sel_getUid", NULL); else if (lookup_minimal_symbol ("sel_get_any_uid", 0, 0).minsym) function = find_function_in_inferior("sel_get_any_uid", NULL); else { complaint (&symfile_complaints, _("no way to lookup Objective-C selectors")); return 0; } selstring = value_coerce_array (value_string (selname, strlen (selname) + 1, char_type)); return value_as_long (call_function_by_hand (function, 1, &selstring)); }
CORE_ADDR 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) { /* Can't call into inferior to lookup class. */ return 0; } if (lookup_minimal_symbol("objc_lookUpClass", 0, 0).minsym) function = find_function_in_inferior("objc_lookUpClass", NULL); else if (lookup_minimal_symbol ("objc_lookup_class", 0, 0).minsym) function = find_function_in_inferior("objc_lookup_class", NULL); else { complaint (&symfile_complaints, _("no way to lookup Objective-C classes")); return 0; } 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)); }
/* Use inferior's dlopen() to bring in some helper functions: */ void load_helpers(void) { struct value *dlfn, *args[2], *val; long rslt; args[0] = value_string(LIBCHECKPOINT_NAME, (strlen(LIBCHECKPOINT_NAME) + 1UL)); args[0] = value_coerce_array(args[0]); args[1] = value_from_longest(builtin_type_int, (LONGEST)RTLD_NOW); if (lookup_minimal_symbol("dlopen", 0, 0) && (dlfn = find_function_in_inferior("dlopen", builtin_type_int))) { val = call_function_by_hand_expecting_type(dlfn, builtin_type_int, 2, args, 1); rslt = (long)value_as_long(val); if (rslt == 0) warning("dlopen of checkpoint library returned NULL"); } else { warning("dlopen not found, libcheckpoint functions not loaded"); } }
static int wrap_value_coerce_array (char *opaque_arg) { struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; value_ptr val; val = (value_ptr) (*args)->args[0].ptr; (*args)->result.ptr = value_coerce_array (val); return 1; }
struct value * 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; if (!target_has_execution) return 0; /* Can't call into inferior to create NSString. */ 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).minsym) { function = find_function_in_inferior("_NSNewStringFromCString", NULL); nsstringValue = call_function_by_hand(function, 1, &stringValue[2]); } else if (lookup_minimal_symbol("istr", 0, 0).minsym) { 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).minsym) { function = find_function_in_inferior("+[NSString stringWithCString:]", NULL); type = builtin_type (gdbarch)->builtin_long; stringValue[0] = value_from_longest (type, lookup_objc_class (gdbarch, "NSString")); stringValue[1] = value_from_longest (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")); sym = lookup_struct_typedef("NSString", 0, 1); if (sym == NULL) sym = lookup_struct_typedef("NXString", 0, 1); if (sym == NULL) type = builtin_type (gdbarch)->builtin_data_ptr; else type = lookup_pointer_type(SYMBOL_TYPE (sym)); deprecated_set_value_type (nsstringValue, type); return nsstringValue; }
struct value * value_subscript (struct value *array, LONGEST index) { int c_style = current_language->c_style_arrays; struct type *tarray; array = coerce_ref (array); tarray = check_typedef (value_type (array)); if (TYPE_CODE (tarray) == TYPE_CODE_ARRAY || TYPE_CODE (tarray) == TYPE_CODE_STRING) { struct type *range_type = TYPE_INDEX_TYPE (tarray); LONGEST lowerbound, upperbound; get_discrete_bounds (range_type, &lowerbound, &upperbound); if (VALUE_LVAL (array) != lval_memory) return value_subscripted_rvalue (array, index, lowerbound); if (c_style == 0) { if (index >= lowerbound && index <= upperbound) return value_subscripted_rvalue (array, index, lowerbound); /* Emit warning unless we have an array of unknown size. An array of unknown size has lowerbound 0 and upperbound -1. */ if (upperbound > -1) warning (_("array or string index out of range")); /* fall doing C stuff */ c_style = 1; } index -= lowerbound; array = value_coerce_array (array); } if (c_style) return value_ind (value_ptradd (array, index)); else error (_("not an array or string")); }