📄 gdbtypes.c
字号:
return (NULL); } else { error ("No type named %s.", name); } } return (SYMBOL_TYPE (sym));}struct type *lookup_unsigned_typename (name) char *name;{ char *uns = alloca (strlen (name) + 10); strcpy (uns, "unsigned "); strcpy (uns + 9, name); return (lookup_typename (uns, (struct block *) NULL, 0));}struct type *lookup_signed_typename (name) char *name;{ struct type *t; char *uns = alloca (strlen (name) + 8); strcpy (uns, "signed "); strcpy (uns + 7, name); t = lookup_typename (uns, (struct block *) NULL, 1); /* If we don't find "signed FOO" just try again with plain "FOO". */ if (t != NULL) return t; return lookup_typename (name, (struct block *) NULL, 0);}/* Lookup a structure type named "struct NAME", visible in lexical block BLOCK. */struct type *lookup_struct (name, block) char *name; struct block *block;{ register struct symbol *sym; sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **) NULL); if (sym == NULL) { error ("No struct type named %s.", name); } if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT) { error ("This context has class, union or enum %s, not a struct.", name); } return (SYMBOL_TYPE (sym));}/* Lookup a union type named "union NAME", visible in lexical block BLOCK. */struct type *lookup_union (name, block) char *name; struct block *block;{ register struct symbol *sym; sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **) NULL); if (sym == NULL) { error ("No union type named %s.", name); } if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_UNION) { error ("This context has class, struct or enum %s, not a union.", name); } return (SYMBOL_TYPE (sym));}/* Lookup an enum type named "enum NAME", visible in lexical block BLOCK. */struct type *lookup_enum (name, block) char *name; struct block *block;{ register struct symbol *sym; sym = lookup_symbol (name, block, STRUCT_NAMESPACE, 0, (struct symtab **) NULL); if (sym == NULL) { error ("No enum type named %s.", name); } if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_ENUM) { error ("This context has class, struct or union %s, not an enum.", name); } return (SYMBOL_TYPE (sym));}/* Lookup a template type named "template NAME<TYPE>", visible in lexical block BLOCK. */struct type *lookup_template_type (name, type, block) char *name; struct type *type; struct block *block;{ struct symbol *sym; char *nam = (char*) alloca(strlen(name) + strlen(type->name) + 4); strcpy (nam, name); strcat (nam, "<"); strcat (nam, type->name); strcat (nam, " >"); /* FIXME, extra space still introduced in gcc? */ sym = lookup_symbol (nam, block, VAR_NAMESPACE, 0, (struct symtab **)NULL); if (sym == NULL) { error ("No template type named %s.", name); } if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT) { error ("This context has class, union or enum %s, not a struct.", name); } return (SYMBOL_TYPE (sym));}/* Given a type TYPE, lookup the type of the component of type named NAME. If NOERR is nonzero, return zero if NAME is not suitably defined. */struct type *lookup_struct_elt_type (type, name, noerr) struct type *type; char *name; int noerr;{ int i; if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_CODE (type) == TYPE_CODE_REF) type = TYPE_TARGET_TYPE (type); if (TYPE_CODE (type) != TYPE_CODE_STRUCT && TYPE_CODE (type) != TYPE_CODE_UNION) { target_terminal_ours (); fflush (stdout); fprintf (stderr, "Type "); type_print (type, "", stderr, -1); error (" is not a structure or union type."); } check_stub_type (type); for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--) { char *t_field_name = TYPE_FIELD_NAME (type, i); if (t_field_name && !strcmp (t_field_name, name)) { return TYPE_FIELD_TYPE (type, i); } } /* OK, it's not in this class. Recursively check the baseclasses. */ for (i = TYPE_N_BASECLASSES (type) - 1; i >= 0; i--) { struct type *t; t = lookup_struct_elt_type (TYPE_BASECLASS (type, i), name, 0); if (t != NULL) { return t; } } if (noerr) { return NULL; } target_terminal_ours (); fflush (stdout); fprintf (stderr, "Type "); type_print (type, "", stderr, -1); fprintf (stderr, " has no component named "); fputs_filtered (name, stderr); error ("."); return (struct type *)-1; /* For lint */}/* This function is really horrible, but to avoid it, there would need to be more filling in of forward references. */voidfill_in_vptr_fieldno (type) struct type *type;{ if (TYPE_VPTR_FIELDNO (type) < 0) { int i; for (i = 1; i < TYPE_N_BASECLASSES (type); i++) { fill_in_vptr_fieldno (TYPE_BASECLASS (type, i)); if (TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)) >= 0) { TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)); TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (TYPE_BASECLASS (type, i)); break; } } }}/* Added by Bryan Boreham, Kewill, Sun Sep 17 18:07:17 1989. If this is a stubbed struct (i.e. declared as struct foo *), see if we can find a full definition in some other file. If so, copy this definition, so we can use it in future. If not, set a flag so we don't waste too much time in future. (FIXME, this doesn't seem to be happening...) This used to be coded as a macro, but I don't think it is called often enough to merit such treatment.*/struct complaint stub_noname_complaint = {"stub type has NULL name", 0, 0};void check_stub_type (type) struct type *type;{ if (TYPE_FLAGS(type) & TYPE_FLAG_STUB) { char* name = type_name_no_tag (type); struct symbol *sym; if (name == NULL) { complain (&stub_noname_complaint, 0); return; } sym = lookup_symbol (name, 0, STRUCT_NAMESPACE, 0, (struct symtab **) NULL); if (sym) { memcpy ((char *)type, (char *)SYMBOL_TYPE(sym), sizeof (struct type)); } }}/* Ugly hack to convert method stubs into method types. He ain't kiddin'. This demangles the name of the method into a string including argument types, parses out each argument type, generates a string casting a zero to that type, evaluates the string, and stuffs the resulting type into an argtype vector!!! Then it knows the type of the whole function (including argument types for overloading), which info used to be in the stab's but was removed to hack back the space required for them. */voidcheck_stub_method (type, i, j) struct type *type; int i; int j;{ struct fn_field *f; char *mangled_name = gdb_mangle_name (type, i, j); char *demangled_name = cplus_demangle (mangled_name, DMGL_PARAMS | DMGL_ANSI); char *argtypetext, *p; int depth = 0, argcount = 1; struct type **argtypes; struct type *mtype; if (demangled_name == NULL) { error ("Internal: Cannot demangle mangled name `%s'.", mangled_name); } /* Now, read in the parameters that define this type. */ argtypetext = strchr (demangled_name, '(') + 1; p = argtypetext; while (*p) { if (*p == '(') { depth += 1; } else if (*p == ')') { depth -= 1; } else if (*p == ',' && depth == 0) { argcount += 1; } p += 1; } /* We need two more slots: one for the THIS pointer, and one for the NULL [...] or void [end of arglist]. */ argtypes = (struct type **) TYPE_ALLOC (type, (argcount + 2) * sizeof (struct type *)); p = argtypetext; argtypes[0] = lookup_pointer_type (type); argcount = 1; if (*p != ')') /* () means no args, skip while */ { depth = 0; while (*p) { if (depth <= 0 && (*p == ',' || *p == ')')) { argtypes[argcount] = parse_and_eval_type (argtypetext, p - argtypetext); argcount += 1; argtypetext = p + 1; } if (*p == '(') { depth += 1; } else if (*p == ')') { depth -= 1; } p += 1; } } if (p[-2] != '.') /* Not '...' */ { argtypes[argcount] = builtin_type_void; /* List terminator */ } else { argtypes[argcount] = NULL; /* Ellist terminator */ } free (demangled_name); f = TYPE_FN_FIELDLIST1 (type, i); TYPE_FN_FIELD_PHYSNAME (f, j) = mangled_name; /* Now update the old "stub" type into a real type. */ mtype = TYPE_FN_FIELD_TYPE (f, j); TYPE_DOMAIN_TYPE (mtype) = type; TYPE_ARG_TYPES (mtype) = argtypes; TYPE_FLAGS (mtype) &= ~TYPE_FLAG_STUB; TYPE_FN_FIELD_STUB (f, j) = 0;}const struct cplus_struct_type cplus_struct_default;voidallocate_cplus_struct_type (type) struct type *type;{ if (!HAVE_CPLUS_STRUCT (type)) { TYPE_CPLUS_SPECIFIC (type) = (struct cplus_struct_type *) TYPE_ALLOC (type, sizeof (struct cplus_struct_type)); *(TYPE_CPLUS_SPECIFIC(type)) = cplus_struct_default; }}/* Helper function to initialize the standard scalar types. If NAME is non-NULL and OBJFILE is non-NULL, then we make a copy of the string pointed to by name in the type_obstack for that objfile, and initialize the type name to that copy. There are places (mipsread.c in particular, where init_type is called with a NULL value for NAME). */struct type *init_type (code, length, flags, name, objfile) enum type_code code; int length; int flags; char *name; struct objfile *objfile;{ register struct type *type; type = alloc_type (objfile); TYPE_CODE (type) = code; TYPE_LENGTH (type) = length; TYPE_FLAGS (type) |= flags; if ((name != NULL) && (objfile != NULL)) { TYPE_NAME (type) = obsavestring (name, strlen (name), &objfile -> type_obstack); } else { TYPE_NAME (type) = name; } /* C++ fancies. */ if (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION) { INIT_CPLUS_SPECIFIC (type); } return (type);}/* Look up a fundamental type for the specified objfile. May need to construct such a type if this is the first use. Some object file formats (ELF, COFF, etc) do not define fundamental types such as "int" or "double". Others (stabs for example), do define fundamental types. For the formats which don't provide fundamental types, gdb can create such types, using defaults reasonable for the current target machine. FIXME: Some compilers distinguish explicitly signed integral types (signed short, signed int, signed long) from "regular" integral types (short, int, long) in the debugging information. There is some dis- agreement as to how useful this feature is. In particular, gcc does not support this. Also, only some debugging formats allow the distinction to be passed on to a debugger. For now, we always just use "short", "int", or "long" as the type name, for both the implicit and explicitly signed types. This also makes life easier for the gdb test suite since we don't have to account for the differences in output depending upon what the compiler and debugging format support. We will probably have to re-examine the issue when gdb starts taking it's fundamental type information directly from the debugging information supplied by the compiler. fnf@cygnus.com */struct type *lookup_fundamental_type (objfile, typeid) struct objfile *objfile; int typeid;{ register struct type *type = NULL; register struct type **typep; register int nbytes; if (typeid < 0 || typeid >= FT_NUM_MEMBERS) { error ("internal error - invalid fundamental type id %d", typeid); } else { /* If this is the first time we */ if (objfile -> fundamental_types == NULL) { nbytes = FT_NUM_MEMBERS * sizeof (struct type *); objfile -> fundamental_types = (struct type **) obstack_alloc (&objfile -> type_obstack, nbytes); memset ((char *) objfile -> fundamental_types, 0, nbytes); } typep = objfile -> fundamental_types + typeid; if ((type = *typep) == NULL) { switch (typeid) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -