⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdbtypes.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
	  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 + -