* gdbtypes.c (make_{reference,pointer,function}_type): New

functions which handle overwriting of forward-referenced types
for stabs file reading.
(lookup_{reference,pointer,function}_type):  These just call
the make_*_type functions with a null storage alloc parameter.
* gdbtypes.h (make_{reference,pointer,function}_type):  Declare.
* xcoffread.c (smash_to_pointer_type):  Remove, no longer used.

* buildsym.c (dbx_lookup_type):  Zero result for (-1,-1) arg.
(dbx_alloc_type):  Make it easier to understand.  No funct change.
(define_symbol: 't'):  Don't put the typedef name into the name of
the struct, union, or enum.  Bugfix.
(read_type: '*', '&', 'f'):  Add comments.  Use make_XXX_type
routines to properly handle overwriting preallocated types so that
forward references will work.
(read_enum_type):  Force enum values to file scope, due to bug in
Sun compiler output.  FIXME, fix later.

Remove unused header_file_prev_index mechanism.  It was already
obsolete in gdb-3.5.  These comments appeared in 3.5:
  /* This code was used before I knew about the instance codes.
     My first hypothesis is that it is not necessary now
     that instance codes are handled.  */
* dbxread.c (add_new_header_file):  Remove header_file_prev_index.
* buildsym.h:  Remove it and prev_index that saves it.
* buildsym.c (push_subfile, pop_subfile, start_symtab):  Remove it.

* solib.c (special_symbol_handling):  When called from core files,
must set up debug_addr.  Don't print error messages, just return.
* symmisc.c (print_symbol):  Less ascii diarrhea for enums, please.
This commit is contained in:
John Gilmore
1992-05-01 09:14:43 +00:00
parent 5bdf762bb8
commit ea1549b346
6 changed files with 255 additions and 184 deletions

View File

@ -1,3 +1,36 @@
Fri May 1 01:53:26 1992 John Gilmore (gnu at cygnus.com)
* gdbtypes.c (make_{reference,pointer,function}_type): New
functions which handle overwriting of forward-referenced types
for stabs file reading.
(lookup_{reference,pointer,function}_type): These just call
the make_*_type functions with a null storage alloc parameter.
* gdbtypes.h (make_{reference,pointer,function}_type): Declare.
* xcoffread.c (smash_to_pointer_type): Remove, no longer used.
* buildsym.c (dbx_lookup_type): Zero result for (-1,-1) arg.
(dbx_alloc_type): Make it easier to understand. No funct change.
(define_symbol: 't'): Don't put the typedef name into the name of
the struct, union, or enum. Bugfix.
(read_type: '*', '&', 'f'): Add comments. Use make_XXX_type
routines to properly handle overwriting preallocated types so that
forward references will work.
(read_enum_type): Force enum values to file scope, due to bug in
Sun compiler output. FIXME, fix later.
Remove unused header_file_prev_index mechanism. It was already
obsolete in gdb-3.5. These comments appeared in 3.5:
/* This code was used before I knew about the instance codes.
My first hypothesis is that it is not necessary now
that instance codes are handled. */
* dbxread.c (add_new_header_file): Remove header_file_prev_index.
* buildsym.h: Remove it and prev_index that saves it.
* buildsym.c (push_subfile, pop_subfile, start_symtab): Remove it.
* solib.c (special_symbol_handling): When called from core files,
must set up debug_addr. Don't print error messages, just return.
* symmisc.c (print_symbol): Less ascii diarrhea for enums, please.
Wed Apr 29 15:26:51 1992 Per Bothner (bothner@rtl.cygnus.com) Wed Apr 29 15:26:51 1992 Per Bothner (bothner@rtl.cygnus.com)
* cplus-dem.c: Allow nested class names (as in * cplus-dem.c: Allow nested class names (as in

View File

@ -189,6 +189,9 @@ dbx_lookup_type (typenums)
register int filenum = typenums[0], index = typenums[1]; register int filenum = typenums[0], index = typenums[1];
unsigned old_len; unsigned old_len;
if (filenum == -1) /* -1,-1 is for temporary types. */
return 0;
if (filenum < 0 || filenum >= n_this_object_header_files) if (filenum < 0 || filenum >= n_this_object_header_files)
error ("Invalid symbol data: type number (%d,%d) out of range at symtab pos %d.", error ("Invalid symbol data: type number (%d,%d) out of range at symtab pos %d.",
filenum, index, symnum); filenum, index, symnum);
@ -252,30 +255,19 @@ dbx_alloc_type (typenums, objfile)
struct objfile *objfile; struct objfile *objfile;
{ {
register struct type **type_addr; register struct type **type_addr;
register struct type *type;
if (typenums[0] != -1) if (typenums[0] == -1)
{ return alloc_type (objfile);
type_addr = dbx_lookup_type (typenums); type_addr = dbx_lookup_type (typenums);
type = *type_addr;
}
else
{
type_addr = 0;
type = 0;
}
/* If we are referring to a type not known at all yet, /* If we are referring to a type not known at all yet,
allocate an empty type for it. allocate an empty type for it.
We will fill it in later if we find out how. */ We will fill it in later if we find out how. */
if (type == 0) if (*type_addr == 0)
{ *type_addr = alloc_type (objfile);
type = alloc_type (objfile);
if (type_addr)
*type_addr = type;
}
return type; return *type_addr;
} }
/* maintain the lists of symbols and blocks */ /* maintain the lists of symbols and blocks */
@ -595,7 +587,6 @@ push_subfile ()
if (current_subfile == 0 || current_subfile->name == 0) if (current_subfile == 0 || current_subfile->name == 0)
abort (); abort ();
tem->name = current_subfile->name; tem->name = current_subfile->name;
tem->prev_index = header_file_prev_index;
} }
char * char *
@ -609,7 +600,6 @@ pop_subfile ()
name = link->name; name = link->name;
subfile_stack = link->next; subfile_stack = link->next;
header_file_prev_index = link->prev_index;
free ((PTR)link); free ((PTR)link);
return name; return name;
@ -692,7 +682,6 @@ start_symtab (name, dirname, start_addr)
/* Leave FILENUM of 0 free for builtin types and this file's types. */ /* Leave FILENUM of 0 free for builtin types and this file's types. */
n_this_object_header_files = 1; n_this_object_header_files = 1;
header_file_prev_index = -1;
type_vector_length = 0; type_vector_length = 0;
type_vector = (struct type **) 0; type_vector = (struct type **) 0;
@ -1277,6 +1266,7 @@ define_symbol (valu, string, desc, type, objfile)
save away the name so that far away from here in read_range_type, save away the name so that far away from here in read_range_type,
we can examine it to decide between "int" and "long". FIXME. */ we can examine it to decide between "int" and "long". FIXME. */
long_kludge_name = SYMBOL_NAME (sym); long_kludge_name = SYMBOL_NAME (sym);
type_read = read_type (&p, objfile); type_read = read_type (&p, objfile);
if ((deftype == 'F' || deftype == 'f') if ((deftype == 'F' || deftype == 'f')
@ -1475,16 +1465,12 @@ define_symbol (valu, string, desc, type, objfile)
SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_CLASS (sym) = LOC_TYPEDEF;
SYMBOL_VALUE (sym) = valu; SYMBOL_VALUE (sym) = valu;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
if (TYPE_NAME (SYMBOL_TYPE (sym)) == NULL)
TYPE_NAME (SYMBOL_TYPE (sym)) =
obsavestring (SYMBOL_NAME (sym),
strlen (SYMBOL_NAME (sym)),
&objfile -> symbol_obstack);
/* C++ vagaries: we may have a type which is derived from /* C++ vagaries: we may have a type which is derived from
a base type which did not have its name defined when the a base type which did not have its name defined when the
derived class was output. We fill in the derived class's derived class was output. We fill in the derived class's
base part member's name here in that case. */ base part member's name here in that case. */
else if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT if (TYPE_NAME (SYMBOL_TYPE (sym)) != NULL)
if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
|| TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION) || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
&& TYPE_N_BASECLASSES (SYMBOL_TYPE (sym))) && TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)))
{ {
@ -1917,23 +1903,30 @@ read_type (pp, objfile)
*dbx_lookup_type (typenums) = type; *dbx_lookup_type (typenums) = type;
break; break;
/* In the following types, we must be sure to overwrite any existing
type that the typenums refer to, rather than allocating a new one
and making the typenums point to the new one. This is because there
may already be pointers to the existing type (if it had been
forward-referenced), and we must change it to a pointer, function,
reference, or whatever, *in-place*. */
case '*': case '*':
type1 = read_type (pp, objfile); type1 = read_type (pp, objfile);
/* FIXME -- we should be doing smash_to_XXX types here. */ type = make_pointer_type (type1, dbx_lookup_type (typenums));
#ifdef IBM6000_TARGET
/* postponed type decoration should be allowed. */
if (typenums[1] > 0 && typenums[1] < type_vector_length &&
(type = type_vector[typenums[1]])) {
smash_to_pointer_type (type, type1);
break;
}
#endif
type = lookup_pointer_type (type1);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
break; break;
case '@': case '&': /* Reference to another type */
type1 = read_type (pp, objfile);
type = make_reference_type (type1, dbx_lookup_type (typenums));
break;
case 'f': /* Function returning another type */
type1 = read_type (pp, objfile);
type = make_function_type (type1, dbx_lookup_type (typenums));
break;
/* FIXME -- we should be doing smash_to_XXX types here. */
case '@': /* Member (class & variable) type */
{ {
struct type *domain = read_type (pp, objfile); struct type *domain = read_type (pp, objfile);
struct type *memtype; struct type *memtype;
@ -1949,7 +1942,7 @@ read_type (pp, objfile)
} }
break; break;
case '#': case '#': /* Method (class & fn) type */
if ((*pp)[0] == '#') if ((*pp)[0] == '#')
{ {
/* We'll get the parameter types from the name. */ /* We'll get the parameter types from the name. */
@ -1980,33 +1973,19 @@ read_type (pp, objfile)
} }
break; break;
case '&': case 'r': /* Range type */
type1 = read_type (pp, objfile);
type = lookup_reference_type (type1);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
break;
case 'f':
type1 = read_type (pp, objfile);
type = lookup_function_type (type1);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
break;
case 'r':
type = read_range_type (pp, typenums, objfile); type = read_range_type (pp, typenums, objfile);
if (typenums[0] != -1) if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type; *dbx_lookup_type (typenums) = type;
break; break;
case 'e': case 'e': /* Enumeration type */
type = dbx_alloc_type (typenums, objfile); type = dbx_alloc_type (typenums, objfile);
type = read_enum_type (pp, type, objfile); type = read_enum_type (pp, type, objfile);
*dbx_lookup_type (typenums) = type; *dbx_lookup_type (typenums) = type;
break; break;
case 's': case 's': /* Struct type */
type = dbx_alloc_type (typenums, objfile); type = dbx_alloc_type (typenums, objfile);
if (!TYPE_NAME (type)) if (!TYPE_NAME (type))
TYPE_NAME (type) = type_synonym_name; TYPE_NAME (type) = type_synonym_name;
@ -2014,7 +1993,7 @@ read_type (pp, objfile)
type = read_struct_type (pp, type, objfile); type = read_struct_type (pp, type, objfile);
break; break;
case 'u': case 'u': /* Union type */
type = dbx_alloc_type (typenums, objfile); type = dbx_alloc_type (typenums, objfile);
if (!TYPE_NAME (type)) if (!TYPE_NAME (type))
TYPE_NAME (type) = type_synonym_name; TYPE_NAME (type) = type_synonym_name;
@ -2023,7 +2002,7 @@ read_type (pp, objfile)
TYPE_CODE (type) = TYPE_CODE_UNION; TYPE_CODE (type) = TYPE_CODE_UNION;
break; break;
case 'a': case 'a': /* Array type */
if (**pp != 'r') if (**pp != 'r')
return error_type (pp); return error_type (pp);
++*pp; ++*pp;
@ -2041,18 +2020,6 @@ read_type (pp, objfile)
if (type == 0) if (type == 0)
abort (); abort ();
#if 0
/* If this is an overriding temporary alteration for a header file's
contents, and this type number is unknown in the global definition,
put this type into the global definition at this type number. */
if (header_file_prev_index >= 0)
{
register struct type **tp
= explicit_lookup_type (header_file_prev_index, typenums[1]);
if (*tp == 0)
*tp = type;
}
#endif
return type; return type;
} }
@ -2874,9 +2841,14 @@ read_enum_type (pp, type, objfile)
struct pending *osyms, *syms; struct pending *osyms, *syms;
int o_nsyms; int o_nsyms;
#if 0
/* FIXME! The stabs produced by Sun CC merrily define things that ought
to be file-scope, between N_FN entries, using N_LSYM. What's a mother
to do? For now, force all enum values to file scope. */
if (within_function) if (within_function)
symlist = &local_symbols; symlist = &local_symbols;
else else
#endif
symlist = &file_symbols; symlist = &file_symbols;
osyms = *symlist; osyms = *symlist;
o_nsyms = osyms ? osyms->nsyms : 0; o_nsyms = osyms ? osyms->nsyms : 0;

View File

@ -256,18 +256,10 @@ EXTERN int n_this_object_header_files;
EXTERN int n_allocated_this_object_header_files; EXTERN int n_allocated_this_object_header_files;
/* When a header file is getting special overriding definitions
for one source file, record here the header_files index
of its normal definition vector.
At other times, this is -1. */
EXTERN int header_file_prev_index;
struct subfile_stack struct subfile_stack
{ {
struct subfile_stack *next; struct subfile_stack *next;
char *name; char *name;
int prev_index;
}; };
EXTERN struct subfile_stack *subfile_stack; EXTERN struct subfile_stack *subfile_stack;

View File

@ -62,6 +62,61 @@ alloc_type (objfile)
return (type); return (type);
} }
/* Lookup a pointer to a type TYPE. TYPEPTR, if nonzero, points
to a pointer to memory where the pointer type should be stored.
If *TYPEPTR is zero, update it to point to the pointer type we return.
We allocate new memory if needed. */
struct type *
make_pointer_type (type, typeptr)
struct type *type;
struct type **typeptr;
{
register struct type *ntype; /* New type */
struct objfile *objfile;
ntype = TYPE_POINTER_TYPE (type);
if (ntype)
if (typeptr == 0)
return ntype; /* Don't care about alloc, and have new type. */
else if (*typeptr == 0)
{
*typeptr = ntype; /* Tracking alloc, and we have new type. */
return ntype;
}
if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */
{
ntype = alloc_type (TYPE_OBJFILE (type));
if (typeptr)
*typeptr = ntype;
}
else /* We have storage, but need to reset it. */
{
ntype = *typeptr;
objfile = TYPE_OBJFILE (ntype);
memset ((char *)ntype, 0, sizeof (struct type));
TYPE_OBJFILE (ntype) = objfile;
}
TYPE_TARGET_TYPE (ntype) = type;
TYPE_POINTER_TYPE (type) = ntype;
/* FIXME! Assume the machine has only one representation for pointers! */
TYPE_LENGTH (ntype) = TARGET_PTR_BIT / TARGET_CHAR_BIT;
TYPE_CODE (ntype) = TYPE_CODE_PTR;
/* pointers are unsigned */
TYPE_FLAGS (ntype) |= TYPE_FLAG_UNSIGNED;
if (!TYPE_POINTER_TYPE (type)) /* Remember it, if don't have one. */
TYPE_POINTER_TYPE (type) = ntype;
return ntype;
}
/* Given a type TYPE, return a type of pointers to that type. /* Given a type TYPE, return a type of pointers to that type.
May need to construct such a type if this is the first use. */ May need to construct such a type if this is the first use. */
@ -69,52 +124,121 @@ struct type *
lookup_pointer_type (type) lookup_pointer_type (type)
struct type *type; struct type *type;
{ {
register struct type *ptype; return make_pointer_type (type, (struct type **)0);
}
if ((ptype = TYPE_POINTER_TYPE (type)) == NULL) /* Lookup a C++ `reference' to a type TYPE. TYPEPTR, if nonzero, points
to a pointer to memory where the reference type should be stored.
If *TYPEPTR is zero, update it to point to the reference type we return.
We allocate new memory if needed. */
struct type *
make_reference_type (type, typeptr)
struct type *type;
struct type **typeptr;
{ {
/* This is the first time anyone wanted a pointer to a TYPE. */ register struct type *ntype; /* New type */
struct objfile *objfile;
ptype = alloc_type (TYPE_OBJFILE (type)); ntype = TYPE_REFERENCE_TYPE (type);
TYPE_TARGET_TYPE (ptype) = type;
TYPE_POINTER_TYPE (type) = ptype;
/* FIXME, assume machine has only one representation for pointers! */
TYPE_LENGTH (ptype) = TARGET_PTR_BIT / TARGET_CHAR_BIT;
TYPE_CODE (ptype) = TYPE_CODE_PTR;
/* pointers are unsigned */
TYPE_FLAGS(ptype) |= TYPE_FLAG_UNSIGNED;
if (ntype)
if (typeptr == 0)
return ntype; /* Don't care about alloc, and have new type. */
else if (*typeptr == 0)
{
*typeptr = ntype; /* Tracking alloc, and we have new type. */
return ntype;
} }
return (ptype);
if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */
{
ntype = alloc_type (TYPE_OBJFILE (type));
if (typeptr)
*typeptr = ntype;
} }
else /* We have storage, but need to reset it. */
{
ntype = *typeptr;
objfile = TYPE_OBJFILE (ntype);
memset ((char *)ntype, 0, sizeof (struct type));
TYPE_OBJFILE (ntype) = objfile;
}
TYPE_TARGET_TYPE (ntype) = type;
TYPE_REFERENCE_TYPE (type) = ntype;
/* FIXME! Assume the machine has only one representation for references,
and that it matches the (only) representation for pointers! */
TYPE_LENGTH (ntype) = TARGET_PTR_BIT / TARGET_CHAR_BIT;
TYPE_CODE (ntype) = TYPE_CODE_REF;
if (!TYPE_REFERENCE_TYPE (type)) /* Remember it, if don't have one. */
TYPE_REFERENCE_TYPE (type) = ntype;
return ntype;
}
/* Same as above, but caller doesn't care about memory allocation details. */
struct type * struct type *
lookup_reference_type (type) lookup_reference_type (type)
struct type *type; struct type *type;
{ {
register struct type *rtype; return make_reference_type (type, (struct type **)0);
}
if ((rtype = TYPE_REFERENCE_TYPE (type)) == NULL) /* Lookup a function type that returns type TYPE. TYPEPTR, if nonzero, points
to a pointer to memory where the function type should be stored.
If *TYPEPTR is zero, update it to point to the function type we return.
We allocate new memory if needed. */
struct type *
make_function_type (type, typeptr)
struct type *type;
struct type **typeptr;
{ {
/* This is the first time anyone wanted a pointer to a TYPE. */ register struct type *ntype; /* New type */
struct objfile *objfile;
rtype = alloc_type (TYPE_OBJFILE (type)); ntype = TYPE_FUNCTION_TYPE (type);
TYPE_TARGET_TYPE (rtype) = type;
TYPE_REFERENCE_TYPE (type) = rtype;
/* We assume the machine has only one representation for pointers! */
/* FIXME: This confuses host<->target data representations, and is a
poor assumption besides. */
TYPE_LENGTH (rtype) = sizeof (char *);
TYPE_CODE (rtype) = TYPE_CODE_REF;
if (ntype)
if (typeptr == 0)
return ntype; /* Don't care about alloc, and have new type. */
else if (*typeptr == 0)
{
*typeptr = ntype; /* Tracking alloc, and we have new type. */
return ntype;
} }
return (rtype);
if (typeptr == 0 || *typeptr == 0) /* We'll need to allocate one. */
{
ntype = alloc_type (TYPE_OBJFILE (type));
if (typeptr)
*typeptr = ntype;
} }
else /* We have storage, but need to reset it. */
{
ntype = *typeptr;
objfile = TYPE_OBJFILE (ntype);
memset ((char *)ntype, 0, sizeof (struct type));
TYPE_OBJFILE (ntype) = objfile;
}
TYPE_TARGET_TYPE (ntype) = type;
TYPE_FUNCTION_TYPE (type) = ntype;
TYPE_LENGTH (ntype) = 1;
TYPE_CODE (ntype) = TYPE_CODE_FUNC;
if (!TYPE_FUNCTION_TYPE (type)) /* Remember it, if don't have one. */
TYPE_FUNCTION_TYPE (type) = ntype;
return ntype;
}
/* Given a type TYPE, return a type of functions that return that type. /* Given a type TYPE, return a type of functions that return that type.
May need to construct such a type if this is the first use. */ May need to construct such a type if this is the first use. */
@ -123,20 +247,7 @@ struct type *
lookup_function_type (type) lookup_function_type (type)
struct type *type; struct type *type;
{ {
register struct type *ptype; return make_function_type (type, (struct type **)0);
if ((ptype = TYPE_FUNCTION_TYPE (type)) == NULL)
{
/* This is the first time anyone wanted a function returning a TYPE. */
ptype = alloc_type (TYPE_OBJFILE (type));
TYPE_TARGET_TYPE (ptype) = type;
TYPE_FUNCTION_TYPE (type) = ptype;
TYPE_LENGTH (ptype) = 1;
TYPE_CODE (ptype) = TYPE_CODE_FUNC;
}
return (ptype);
} }
/* Implement direct support for MEMBER_TYPE in GNU C++. /* Implement direct support for MEMBER_TYPE in GNU C++.

View File

@ -485,6 +485,9 @@ init_type PARAMS ((enum type_code, int, int, char *, struct objfile *));
extern struct type * extern struct type *
lookup_reference_type PARAMS ((struct type *)); lookup_reference_type PARAMS ((struct type *));
extern struct type *
make_reference_type PARAMS ((struct type *, struct type **));
extern struct type * extern struct type *
lookup_member_type PARAMS ((struct type *, struct type *)); lookup_member_type PARAMS ((struct type *, struct type *));
@ -504,9 +507,15 @@ type_name_no_tag PARAMS ((const struct type *));
extern struct type * extern struct type *
lookup_struct_elt_type PARAMS ((struct type *, char *, int)); lookup_struct_elt_type PARAMS ((struct type *, char *, int));
extern struct type *
make_pointer_type PARAMS ((struct type *, struct type **));
extern struct type * extern struct type *
lookup_pointer_type PARAMS ((struct type *)); lookup_pointer_type PARAMS ((struct type *));
extern struct type *
make_function_type PARAMS ((struct type *, struct type **));
extern struct type * extern struct type *
lookup_function_type PARAMS ((struct type *)); lookup_function_type PARAMS ((struct type *));

View File

@ -2333,52 +2333,6 @@ _initialize_xcoffread ()
add_symtab_fns(&aixcoff_sym_fns); add_symtab_fns(&aixcoff_sym_fns);
} }
/* In order to handle forward type references, we needed to have this old
routine. Try printing the type of member `p' in the following structure
in a dbx environment.
struct s {
...
struct s *p;
};
*/
/* Smash TYPE to be a type of pointers to TO_TYPE.
If TO_TYPE is not permanent and has no pointer-type yet,
record TYPE as its pointer-type. */
void
smash_to_pointer_type (type, to_type)
struct type *type, *to_type;
{
/* int type_permanent = (TYPE_FLAGS (type) & TYPE_FLAG_PERM); */
bzero (type, sizeof (struct type));
TYPE_TARGET_TYPE (type) = to_type;
/* We assume the machine has only one representation for pointers! */
TYPE_LENGTH (type) = sizeof (char *);
TYPE_CODE (type) = TYPE_CODE_PTR;
/* ??? TYPE_TARGET_TYPE and TYPE_MAIN_VARIANT are the same. You can't do
this. It will break the target type!!!
TYPE_MAIN_VARIANT (type) = type;
if (type_permanent)
TYPE_FLAGS (type) |= TYPE_FLAG_PERM;
*/
if (TYPE_POINTER_TYPE (to_type) == 0)
#if 0
&& (!(TYPE_FLAGS (to_type) & TYPE_FLAG_PERM)
|| type_permanent))
#endif /* 0 */
{
TYPE_POINTER_TYPE (to_type) = type;
}
}
#else /* IBM6000_HOST */ #else /* IBM6000_HOST */
struct type * struct type *
builtin_type (ignore) builtin_type (ignore)