Commit 2bf105ab by Richard Kenner Committed by Richard Kenner

alias.c (struct alias_set_entry): New field has_zero_child.

	* alias.c (struct alias_set_entry): New field has_zero_child.
	(mem_in_disjoint_alias_sets_p): Return 0 if set in either ase.
	(get_alias_set): If language-dependent routine set TYPE_ALIAS_SET,
	do nothing.
	Call record_component_aliases for aggregate types.
	(record_alias_subset): Set has_zero_child.
	(record_component_aliases, case ARRAY_TYPE): Do nothing if
	TYPE_NONALIASES_COMPONENT.
	(record_component_aliases, case RECORD_TYPE): Test
	DECL_NONADDRESSABLE_P.
	* c-decl.c (grokdeclarator): Set DECL_NONADDRESSABLE_P instead
	of TREE_ADDRESSABLE.
	* calls.c (initialize_argument_information): Only test
	TYPE_TRANSPARENT_UNION for UNION_TYPE.
	* function.c (assign_parms): Likewise.
	* integrate.c (function_cannot_inline_p): Likewise.
	* stor-layout.c (finish_record_layout): Don't call
	record_component_aliases.
	* tree.h (struct tree_int_cst): Use struct tree_common.
	(struct tree_real_cst, struct tree_string): Likewise.
	(struct tree_complex, struct tree_identifier): Likewise.
	(struct tree_list, struct tree_vec, struct tree_exp): Likewise.
	(struct tree_block, struct tree_type, struct tree_decl): Likewise.
	(TYPE_TRANSPARENT_UNION): Use UNION_TYPE_CHECK.
	(TYPE_NONALIASES_COMPONENT): New macro.
	(TYPE_AMBIENT_BOUNDEDNESS): Use FUNCTION_TYPE_CHECK.
	(DECL_NONADDRESSABLE_P): New macro.
	(struct tree_decl): Reorder bits for clarity of how many left;
	add non_adressable.
	* cp/cp-tree.h: Use struct tree_common instead of a char array.
	* cp/decl.c (grokdeclarator): Set DECL_NONADDRESSABLE_P instead
	of TREE_ADDRESSABLE.

From-SVN: r34373
parent 0e13506e
Fri Jun 2 19:31:03 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* alias.c (struct alias_set_entry): New field has_zero_child.
(mem_in_disjoint_alias_sets_p): Return 0 if set in either ase.
(get_alias_set): If language-dependent routine set TYPE_ALIAS_SET,
do nothing.
Call record_component_aliases for aggregate types.
(record_alias_subset): Set has_zero_child.
(record_component_aliases, case ARRAY_TYPE): Do nothing if
TYPE_NONALIASES_COMPONENT.
(record_component_aliases, case RECORD_TYPE): Test
DECL_NONADDRESSABLE_P.
* c-decl.c (grokdeclarator): Set DECL_NONADDRESSABLE_P instead
of TREE_ADDRESSABLE.
* calls.c (initialize_argument_information): Only test
TYPE_TRANSPARENT_UNION for UNION_TYPE.
* function.c (assign_parms): Likewise.
* integrate.c (function_cannot_inline_p): Likewise.
* stor-layout.c (finish_record_layout): Don't call
record_component_aliases.
* tree.h (struct tree_int_cst): Use struct tree_common.
(struct tree_real_cst, struct tree_string): Likewise.
(struct tree_complex, struct tree_identifier): Likewise.
(struct tree_list, struct tree_vec, struct tree_exp): Likewise.
(struct tree_block, struct tree_type, struct tree_decl): Likewise.
(TYPE_TRANSPARENT_UNION): Use UNION_TYPE_CHECK.
(TYPE_NONALIASES_COMPONENT): New macro.
(TYPE_AMBIENT_BOUNDEDNESS): Use FUNCTION_TYPE_CHECK.
(DECL_NONADDRESSABLE_P): New macro.
(struct tree_decl): Reorder bits for clarity of how many left;
add non_adressable.
2000-06-02 Jason Merrill <jason@casey.soma.redhat.com> 2000-06-02 Jason Merrill <jason@casey.soma.redhat.com>
* Makefile.in (libgcc.a): Also depend on $(LIB2ADD). * Makefile.in (libgcc.a): Also depend on $(LIB2ADD).
......
...@@ -79,6 +79,10 @@ typedef struct alias_set_entry ...@@ -79,6 +79,10 @@ typedef struct alias_set_entry
continuing our example above, the children here will be all of continuing our example above, the children here will be all of
`int', `double', `float', and `struct S'. */ `int', `double', `float', and `struct S'. */
splay_tree children; splay_tree children;
/* Nonzero if would have a child of zero: this effectively makes this
alias set the same as alias set zero. */
int has_zero_child;
} *alias_set_entry; } *alias_set_entry;
static int rtx_equal_for_memref_p PARAMS ((rtx, rtx)); static int rtx_equal_for_memref_p PARAMS ((rtx, rtx));
...@@ -239,14 +243,18 @@ mems_in_disjoint_alias_sets_p (mem1, mem2) ...@@ -239,14 +243,18 @@ mems_in_disjoint_alias_sets_p (mem1, mem2)
/* See if the first alias set is a subset of the second. */ /* See if the first alias set is a subset of the second. */
ase = get_alias_set_entry (MEM_ALIAS_SET (mem1)); ase = get_alias_set_entry (MEM_ALIAS_SET (mem1));
if (ase != 0 && splay_tree_lookup (ase->children, if (ase != 0
(splay_tree_key) MEM_ALIAS_SET (mem2))) && (ase->has_zero_child
|| splay_tree_lookup (ase->children,
(splay_tree_key) MEM_ALIAS_SET (mem2))))
return 0; return 0;
/* Now do the same, but with the alias sets reversed. */ /* Now do the same, but with the alias sets reversed. */
ase = get_alias_set_entry (MEM_ALIAS_SET (mem2)); ase = get_alias_set_entry (MEM_ALIAS_SET (mem2));
if (ase != 0 && splay_tree_lookup (ase->children, if (ase != 0
(splay_tree_key) MEM_ALIAS_SET (mem1))) && (ase->has_zero_child
|| splay_tree_lookup (ase->children,
(splay_tree_key) MEM_ALIAS_SET (mem1))))
return 0; return 0;
/* The two MEMs are in distinct alias sets, and neither one is the /* The two MEMs are in distinct alias sets, and neither one is the
...@@ -406,7 +414,12 @@ get_alias_set (t) ...@@ -406,7 +414,12 @@ get_alias_set (t)
/* See if the language has special handling for this type. */ /* See if the language has special handling for this type. */
if ((set = lang_get_alias_set (t)) != -1) if ((set = lang_get_alias_set (t)) != -1)
; {
/* If the alias set is now known, we are done. */
if (TYPE_ALIAS_SET_KNOWN_P (t))
return TYPE_ALIAS_SET (t);
}
/* There are no objects of FUNCTION_TYPE, so there's no point in /* There are no objects of FUNCTION_TYPE, so there's no point in
using up an alias set for them. (There are, of course, pointers using up an alias set for them. (There are, of course, pointers
and references to functions, but that's different.) */ and references to functions, but that's different.) */
...@@ -417,6 +430,12 @@ get_alias_set (t) ...@@ -417,6 +430,12 @@ get_alias_set (t)
set = new_alias_set (); set = new_alias_set ();
TYPE_ALIAS_SET (t) = set; TYPE_ALIAS_SET (t) = set;
/* If this is an aggregate type, we must record any component aliasing
information. */
if (AGGREGATE_TYPE_P (t))
record_component_aliases (t);
return set; return set;
} }
...@@ -468,18 +487,26 @@ record_alias_subset (superset, subset) ...@@ -468,18 +487,26 @@ record_alias_subset (superset, subset)
} }
if (subset == 0)
superset_entry->has_zero_child = 1;
else
{
subset_entry = get_alias_set_entry (subset); subset_entry = get_alias_set_entry (subset);
/* If there is an entry for the subset, enter all of its children /* If there is an entry for the subset, enter all of its children
(if they are not already present) as children of the SUPERSET. */ (if they are not already present) as children of the SUPERSET. */
if (subset_entry) if (subset_entry)
splay_tree_foreach (subset_entry->children, {
insert_subset_children, if (subset_entry->has_zero_child)
superset_entry->has_zero_child = 1;
splay_tree_foreach (subset_entry->children, insert_subset_children,
superset_entry->children); superset_entry->children);
}
/* Enter the SUBSET itself as a child of the SUPERSET. */ /* Enter the SUBSET itself as a child of the SUPERSET. */
splay_tree_insert (superset_entry->children, splay_tree_insert (superset_entry->children,
(splay_tree_key) subset, 0); (splay_tree_key) subset, 0);
}
} }
/* Record that component types of TYPE, if any, are part of that type for /* Record that component types of TYPE, if any, are part of that type for
...@@ -493,7 +520,6 @@ record_component_aliases (type) ...@@ -493,7 +520,6 @@ record_component_aliases (type)
tree type; tree type;
{ {
HOST_WIDE_INT superset = get_alias_set (type); HOST_WIDE_INT superset = get_alias_set (type);
HOST_WIDE_INT subset;
tree field; tree field;
if (superset == 0) if (superset == 0)
...@@ -502,20 +528,16 @@ record_component_aliases (type) ...@@ -502,20 +528,16 @@ record_component_aliases (type)
switch (TREE_CODE (type)) switch (TREE_CODE (type))
{ {
case ARRAY_TYPE: case ARRAY_TYPE:
subset = get_alias_set (TREE_TYPE (type)); if (! TYPE_NONALIASED_COMPONENT (type))
if (subset != 0) record_alias_subset (superset, get_alias_set (TREE_TYPE (type)));
record_alias_subset (superset, subset);
break; break;
case RECORD_TYPE: case RECORD_TYPE:
case UNION_TYPE: case UNION_TYPE:
case QUAL_UNION_TYPE: case QUAL_UNION_TYPE:
for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field)) for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field))
{ if (! DECL_NONADDRESSABLE_P (field))
subset = get_alias_set (TREE_TYPE (field)); record_alias_subset (superset, get_alias_set (TREE_TYPE (field)));
if (TREE_ADDRESSABLE (field) && subset != 0 && subset != superset)
record_alias_subset (superset, subset);
}
break; break;
default: default:
......
...@@ -4697,7 +4697,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) ...@@ -4697,7 +4697,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
#endif #endif
} }
decl = build_decl (FIELD_DECL, declarator, type); decl = build_decl (FIELD_DECL, declarator, type);
TREE_ADDRESSABLE (decl) = ! bitfield; DECL_NONADDRESSABLE_P (decl) = bitfield;
if (size_varies) if (size_varies)
C_DECL_VARIABLE_SIZE (decl) = 1; C_DECL_VARIABLE_SIZE (decl) = 1;
} }
......
...@@ -1109,7 +1109,7 @@ initialize_argument_information (num_actuals, args, args_size, n_named_args, ...@@ -1109,7 +1109,7 @@ initialize_argument_information (num_actuals, args, args_size, n_named_args,
/* If TYPE is a transparent union, pass things the way we would /* If TYPE is a transparent union, pass things the way we would
pass the first field of the union. We have already verified that pass the first field of the union. We have already verified that
the modes are the same. */ the modes are the same. */
if (TYPE_TRANSPARENT_UNION (type)) if (TREE_CODE (type) == UNION_TYPE && TYPE_TRANSPARENT_UNION (type))
type = TREE_TYPE (TYPE_FIELDS (type)); type = TREE_TYPE (TYPE_FIELDS (type));
/* Decide where to pass this arg. /* Decide where to pass this arg.
......
Fri Jun 2 19:38:57 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* cp-tree.h: Use struct tree_common instead of a char array.
* decl.c (grokdeclarator): Set DECL_NONADDRESSABLE_P instead
of TREE_ADDRESSABLE.
2000-06-02 Richard Henderson <rth@cygnus.com> 2000-06-02 Richard Henderson <rth@cygnus.com>
* decl.c (init_decl_processing): Don't set lang_get_alias_set. * decl.c (init_decl_processing): Don't set lang_get_alias_set.
......
...@@ -299,7 +299,7 @@ typedef struct ...@@ -299,7 +299,7 @@ typedef struct
typedef struct typedef struct
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
HOST_WIDE_INT index; HOST_WIDE_INT index;
HOST_WIDE_INT level; HOST_WIDE_INT level;
HOST_WIDE_INT orig_level; HOST_WIDE_INT orig_level;
...@@ -308,7 +308,7 @@ typedef struct ...@@ -308,7 +308,7 @@ typedef struct
typedef struct ptrmem_cst typedef struct ptrmem_cst
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
/* This isn't used, but the middle-end expects all constants to have /* This isn't used, but the middle-end expects all constants to have
this field. */ this field. */
struct rtx_def *rtl; struct rtx_def *rtl;
...@@ -351,7 +351,7 @@ typedef struct ptrmem_cst ...@@ -351,7 +351,7 @@ typedef struct ptrmem_cst
struct tree_binding struct tree_binding
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
union { union {
tree scope; tree scope;
struct binding_level *level; struct binding_level *level;
...@@ -374,7 +374,7 @@ struct tree_binding ...@@ -374,7 +374,7 @@ struct tree_binding
struct tree_overload struct tree_overload
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
tree function; tree function;
}; };
...@@ -391,7 +391,7 @@ struct tree_overload ...@@ -391,7 +391,7 @@ struct tree_overload
struct tree_wrapper struct tree_wrapper
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
union { union {
void *ptr; void *ptr;
int i; int i;
...@@ -402,7 +402,7 @@ struct tree_wrapper ...@@ -402,7 +402,7 @@ struct tree_wrapper
#define SRCLOC_LINE(NODE) (((struct tree_srcloc*)SRCLOC_CHECK (NODE))->linenum) #define SRCLOC_LINE(NODE) (((struct tree_srcloc*)SRCLOC_CHECK (NODE))->linenum)
struct tree_srcloc struct tree_srcloc
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
const char *filename; const char *filename;
int linenum; int linenum;
}; };
......
...@@ -11594,7 +11594,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11594,7 +11594,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
else else
{ {
decl = build_decl (FIELD_DECL, declarator, type); decl = build_decl (FIELD_DECL, declarator, type);
TREE_ADDRESSABLE (decl) = ! bitfield; DECL_NONADDRESSABLE_P (decl) = bitfield;
if (RIDBIT_SETP (RID_MUTABLE, specbits)) if (RIDBIT_SETP (RID_MUTABLE, specbits))
{ {
DECL_MUTABLE_P (decl) = 1; DECL_MUTABLE_P (decl) = 1;
......
...@@ -4231,7 +4231,8 @@ assign_parms (fndecl) ...@@ -4231,7 +4231,8 @@ assign_parms (fndecl)
type of the first field for the tests below. We have already type of the first field for the tests below. We have already
verified that the modes are the same. */ verified that the modes are the same. */
if (DECL_TRANSPARENT_UNION (parm) if (DECL_TRANSPARENT_UNION (parm)
|| TYPE_TRANSPARENT_UNION (passed_type)) || (TREE_CODE (passed_type) == UNION_TYPE
&& TYPE_TRANSPARENT_UNION (passed_type)))
passed_type = TREE_TYPE (TYPE_FIELDS (passed_type)); passed_type = TREE_TYPE (TYPE_FIELDS (passed_type));
/* See if this arg was passed by invisible reference. It is if /* See if this arg was passed by invisible reference. It is if
......
...@@ -201,7 +201,8 @@ function_cannot_inline_p (fndecl) ...@@ -201,7 +201,8 @@ function_cannot_inline_p (fndecl)
{ {
if (int_size_in_bytes (TREE_TYPE (parms)) < 0) if (int_size_in_bytes (TREE_TYPE (parms)) < 0)
return N_("function with varying-size parameter cannot be inline"); return N_("function with varying-size parameter cannot be inline");
else if (TYPE_TRANSPARENT_UNION (TREE_TYPE (parms))) else if (TREE_CODE (TREE_TYPE (parms)) == UNION_TYPE
&& TYPE_TRANSPARENT_UNION (TREE_TYPE (parms)))
return N_("function with transparent unit parameter cannot be inline"); return N_("function with transparent unit parameter cannot be inline");
} }
......
...@@ -1173,9 +1173,6 @@ finish_record_layout (rli) ...@@ -1173,9 +1173,6 @@ finish_record_layout (rli)
rli->pending_statics = TREE_CHAIN (rli->pending_statics); rli->pending_statics = TREE_CHAIN (rli->pending_statics);
} }
/* Show any alias subsetting we need. */
record_component_aliases (rli->t);
/* Clean up. */ /* Clean up. */
free (rli); free (rli);
} }
......
...@@ -671,7 +671,7 @@ extern void tree_class_check_failed PARAMS ((const tree, char, ...@@ -671,7 +671,7 @@ extern void tree_class_check_failed PARAMS ((const tree, char,
struct tree_int_cst struct tree_int_cst
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
struct rtx_def *rtl; /* acts as link to register transfer language struct rtx_def *rtl; /* acts as link to register transfer language
(rtl) info */ (rtl) info */
unsigned HOST_WIDE_INT int_cst_low; unsigned HOST_WIDE_INT int_cst_low;
...@@ -695,7 +695,7 @@ struct tree_int_cst ...@@ -695,7 +695,7 @@ struct tree_int_cst
struct tree_real_cst struct tree_real_cst
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
struct rtx_def *rtl; /* acts as link to register transfer language struct rtx_def *rtl; /* acts as link to register transfer language
(rtl) info */ (rtl) info */
REAL_VALUE_TYPE real_cst; REAL_VALUE_TYPE real_cst;
...@@ -707,7 +707,7 @@ struct tree_real_cst ...@@ -707,7 +707,7 @@ struct tree_real_cst
struct tree_string struct tree_string
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
struct rtx_def *rtl; /* acts as link to register transfer language struct rtx_def *rtl; /* acts as link to register transfer language
(rtl) info */ (rtl) info */
int length; int length;
...@@ -720,7 +720,7 @@ struct tree_string ...@@ -720,7 +720,7 @@ struct tree_string
struct tree_complex struct tree_complex
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
struct rtx_def *rtl; /* acts as link to register transfer language struct rtx_def *rtl; /* acts as link to register transfer language
(rtl) info */ (rtl) info */
union tree_node *real; union tree_node *real;
...@@ -734,7 +734,7 @@ struct tree_complex ...@@ -734,7 +734,7 @@ struct tree_complex
struct tree_identifier struct tree_identifier
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
int length; int length;
char *pointer; char *pointer;
}; };
...@@ -745,7 +745,7 @@ struct tree_identifier ...@@ -745,7 +745,7 @@ struct tree_identifier
struct tree_list struct tree_list
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
union tree_node *purpose; union tree_node *purpose;
union tree_node *value; union tree_node *value;
}; };
...@@ -757,7 +757,7 @@ struct tree_list ...@@ -757,7 +757,7 @@ struct tree_list
struct tree_vec struct tree_vec
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
int length; int length;
union tree_node *a[1]; union tree_node *a[1];
}; };
...@@ -813,7 +813,7 @@ struct tree_vec ...@@ -813,7 +813,7 @@ struct tree_vec
struct tree_exp struct tree_exp
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
int complexity; int complexity;
union tree_node *operands[1]; union tree_node *operands[1];
}; };
...@@ -839,7 +839,7 @@ struct tree_exp ...@@ -839,7 +839,7 @@ struct tree_exp
struct tree_block struct tree_block
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
unsigned handler_block_flag : 1; unsigned handler_block_flag : 1;
unsigned abstract_flag : 1; unsigned abstract_flag : 1;
...@@ -1007,11 +1007,18 @@ struct tree_block ...@@ -1007,11 +1007,18 @@ struct tree_block
/* Indicates that objects of this type must be initialized by calling a /* Indicates that objects of this type must be initialized by calling a
function when they are created. */ function when they are created. */
#define TYPE_NEEDS_CONSTRUCTING(NODE) (TYPE_CHECK (NODE)->type.needs_constructing_flag) #define TYPE_NEEDS_CONSTRUCTING(NODE) \
(TYPE_CHECK (NODE)->type.needs_constructing_flag)
/* Indicates that objects of this type (a UNION_TYPE), should be passed /* Indicates that objects of this type (a UNION_TYPE), should be passed
the same way that the first union alternative would be passed. */ the same way that the first union alternative would be passed. */
#define TYPE_TRANSPARENT_UNION(NODE) (TYPE_CHECK (NODE)->type.transparent_union_flag) #define TYPE_TRANSPARENT_UNION(NODE) \
(UNION_TYPE_CHECK (NODE)->type.transparent_union_flag)
/* For an ARRAY_TYPE, indicates that it is not permitted to
take the address of a component of the type. */
#define TYPE_NONALIASED_COMPONENT(NODE) \
(ARRAY_TYPE_CHECK (NODE)->type.transparent_union_flag)
/* Indicated that objects of this type should be laid out in as /* Indicated that objects of this type should be laid out in as
compact a way as possible. */ compact a way as possible. */
...@@ -1070,15 +1077,15 @@ struct tree_block ...@@ -1070,15 +1077,15 @@ struct tree_block
default_pointer_boundedness at the time TYPE was created. It is default_pointer_boundedness at the time TYPE was created. It is
useful for choosing default boundedness of function arguments for useful for choosing default boundedness of function arguments for
non-prototype function decls and for varargs/stdarg lists. */ non-prototype function decls and for varargs/stdarg lists. */
#define TYPE_AMBIENT_BOUNDEDNESS(TYPE) \
#define TYPE_AMBIENT_BOUNDEDNESS(TYPE) (TYPE_CHECK (TYPE)->type.transparent_union_flag) (FUNCTION_TYPE_CHECK (TYPE)->type.transparent_union_flag)
#define MAX_POINTER_DEPTH 2 #define MAX_POINTER_DEPTH 2
#define VA_LIST_POINTER_DEPTH 3 #define VA_LIST_POINTER_DEPTH 3
struct tree_type struct tree_type
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
union tree_node *values; union tree_node *values;
union tree_node *size; union tree_node *size;
union tree_node *size_unit; union tree_node *size_unit;
...@@ -1522,6 +1529,11 @@ struct tree_type ...@@ -1522,6 +1529,11 @@ struct tree_type
an address constant. */ an address constant. */
#define DECL_NON_ADDR_CONST_P(NODE) (DECL_CHECK (NODE)->decl.non_addr_const_p) #define DECL_NON_ADDR_CONST_P(NODE) (DECL_CHECK (NODE)->decl.non_addr_const_p)
/* Used in a FIELD_DECL to indicate that we cannot form the address of
this component. */
#define DECL_NONADDRESSABLE_P(NODE) \
(FIELD_DECL_CHECK (NODE)->decl.non_addressable)
/* Used to indicate an alias set for the memory pointed to by this /* Used to indicate an alias set for the memory pointed to by this
particular FIELD_DECL, PARM_DECL, or VAR_DECL, which must have particular FIELD_DECL, PARM_DECL, or VAR_DECL, which must have
pointer (or reference) type. */ pointer (or reference) type. */
...@@ -1544,7 +1556,7 @@ struct tree_type ...@@ -1544,7 +1556,7 @@ struct tree_type
struct tree_decl struct tree_decl
{ {
char common[sizeof (struct tree_common)]; struct tree_common common;
const char *filename; const char *filename;
int linenum; int linenum;
unsigned int uid; unsigned int uid;
...@@ -1575,9 +1587,12 @@ struct tree_decl ...@@ -1575,9 +1587,12 @@ struct tree_decl
unsigned comdat_flag : 1; unsigned comdat_flag : 1;
unsigned malloc_flag : 1; unsigned malloc_flag : 1;
unsigned no_limit_stack : 1; unsigned no_limit_stack : 1;
unsigned pure_flag : 1;
ENUM_BITFIELD(built_in_class) built_in_class : 2; ENUM_BITFIELD(built_in_class) built_in_class : 2;
unsigned pure_flag : 1;
unsigned pointer_depth : 2; unsigned pointer_depth : 2;
unsigned non_addressable : 1;
/* Four unused bits. */
unsigned lang_flag_0 : 1; unsigned lang_flag_0 : 1;
unsigned lang_flag_1 : 1; unsigned lang_flag_1 : 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment