From 2fe91880451e17d3becefeb9eccc4e30a2f6e040 Mon Sep 17 00:00:00 2001
From: Christopher Li <sparse@chrisli.org>
Date: Sun, 24 Feb 2013 20:17:37 -0800
Subject: [PATCH 2/2] Remove the redundant attribute from ctype structure.

Signed-off-by: Christopher Li <sparse@chrisli.org>
---
 evaluate.c   | 23 -----------------------
 linearize.c  |  1 -
 parse.c      |  4 ----
 show-parse.c |  3 ---
 sparse.c     |  1 -
 symbol.h     | 26 --------------------------
 6 files changed, 58 deletions(-)

diff --git a/evaluate.c b/evaluate.c
index 3e087e6..f3f6572 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -185,7 +185,6 @@ static struct symbol *base_type(struct symbol *node, unsigned long *modp, unsign
 	mod = 0; as = 0;
 	while (node) {
 		mod |= node->ctype.modifiers;
-		check_sym(node);
 		as |= node->ctype.attribute->as;
 		if (node->type == SYM_NODE) {
 			node = node->ctype.base_type;
@@ -618,16 +617,12 @@ const char *type_difference(struct ctype *c1, struct ctype *c2,
 	int move1 = 1, move2 = 1;
 	mod1 |= c1->modifiers;
 	mod2 |= c2->modifiers;
-	check_attr(c1);
-	check_attr(c2);
 
 	for (;;) {
 		unsigned long diff;
 		int type;
 		struct symbol *base1 = t1->ctype.base_type;
 		struct symbol *base2 = t2->ctype.base_type;
-		check_sym(t1);
-		check_sym(t2);
 
 		/*
 		 * FIXME! Collect alignment and context too here!
@@ -704,8 +699,6 @@ const char *type_difference(struct ctype *c1, struct ctype *c2,
 			as1 = t1->ctype.attribute->as;
 			mod2 = t2->ctype.modifiers;
 			as2 = t2->ctype.attribute->as;
-			check_sym(t1);
-			check_sym(t2);
 			break;
 		case SYM_FN: {
 			struct symbol *arg1, *arg2;
@@ -719,8 +712,6 @@ const char *type_difference(struct ctype *c1, struct ctype *c2,
 			as1 = t1->ctype.attribute->as;
 			mod2 = t2->ctype.modifiers;
 			as2 = t2->ctype.attribute->as;
-			check_sym(t1);
-			check_sym(t2);
 
 			if (base1->variadic != base2->variadic)
 				return "incompatible variadic arguments";
@@ -1052,8 +1043,6 @@ static struct symbol *evaluate_compare(struct expression *expr)
 
 	/* they also have special treatment for pointers to void */
 	if (expr->op == SPECIAL_EQUAL || expr->op == SPECIAL_NOTEQUAL) {
-		check_sym(ltype);
-		check_sym(rtype);
 		if (ltype->ctype.attribute->as == rtype->ctype.attribute->as) {
 			if (lbase == &void_ctype) {
 				right = cast_to(right, ltype);
@@ -1158,8 +1147,6 @@ static struct symbol *evaluate_conditional_expression(struct expression *expr)
 			goto Err;
 		}
 		/* OK, it's pointer on pointer */
-		check_sym(ltype);
-		check_sym(rtype);
 		if (ltype->ctype.attribute->as != rtype->ctype.attribute->as) {
 			typediff = "different address spaces";
 			goto Err;
@@ -1350,8 +1337,6 @@ static int compatible_assignment_types(struct expression *expr, struct symbol *t
 			 * we do not remove qualifiers from pointed to [C]
 			 * or mix address spaces [sparse].
 			 */
-			check_sym(t);
-			check_sym(s);
 			if (t->ctype.attribute->as != s->ctype.attribute->as) {
 				typediff = "different address spaces";
 				goto Err;
@@ -1478,12 +1463,10 @@ static void examine_fn_arguments(struct symbol *fn)
 					ptr->ctype = arg->ctype;
 				else
 					ptr->ctype.base_type = arg;
-				check_sym(s);
 				merge_attr(&ptr->ctype, &s->ctype);
 				ptr->ctype.modifiers |= s->ctype.modifiers & MOD_PTRINHERIT;
 
 				s->ctype.base_type = ptr;
-				s->ctype.as = 0;
 				s->ctype.attribute = &null_attr;
 				s->ctype.modifiers &= ~MOD_PTRINHERIT;
 				s->bit_size = 0;
@@ -1502,7 +1485,6 @@ static struct symbol *convert_to_as_mod(struct symbol *sym, int as, int mod)
 {
 	/* Take the modifiers of the pointer, and apply them to the member */
 	mod |= sym->ctype.modifiers;
-	check_sym(sym);
 	if (sym->ctype.attribute->as != as || sym->ctype.modifiers != mod) {
 		struct symbol *newsym = alloc_symbol(sym->pos, SYM_NODE);
 		*newsym = *sym;
@@ -1526,7 +1508,6 @@ static struct symbol *create_pointer(struct expression *expr, struct symbol *sym
 	node->ctype.alignment = pointer_alignment;
 
 	access_symbol(sym);
-	check_sym(sym);
 	if (sym->ctype.modifiers & MOD_REGISTER) {
 		warning(expr->pos, "taking address of 'register' variable '%s'", show_ident(sym->ident));
 		sym->ctype.modifiers &= ~MOD_REGISTER;
@@ -1916,12 +1897,10 @@ static struct symbol *evaluate_member_dereference(struct expression *expr)
 
 	ctype = deref->ctype;
 	examine_symbol_type(ctype);
-	check_sym(ctype);
 	address_space = ctype->ctype.attribute->as;
 	mod = ctype->ctype.modifiers;
 	if (ctype->type == SYM_NODE) {
 		ctype = ctype->ctype.base_type;
-		check_sym(ctype);
 		address_space |= ctype->ctype.attribute->as;
 		mod |= ctype->ctype.modifiers;
 	}
@@ -2728,7 +2707,6 @@ static struct symbol *evaluate_cast(struct expression *expr)
 		as1 = -1;
 	else if (class1 == TYPE_PTR) {
 		examine_pointer_target(t1);
-		check_sym(t1);
 		as1 = t1->ctype.attribute->as;
 	}
 
@@ -2736,7 +2714,6 @@ static struct symbol *evaluate_cast(struct expression *expr)
 		as2 = -1;
 	else if (class2 == TYPE_PTR) {
 		examine_pointer_target(t2);
-		check_sym(t2);
 		as2 = t2->ctype.attribute->as;
 	}
 
diff --git a/linearize.c b/linearize.c
index 42df529..be546be 100644
--- a/linearize.c
+++ b/linearize.c
@@ -1240,7 +1240,6 @@ static pseudo_t linearize_call_expression(struct entrypoint *ep, struct expressi
 	add_one_insn(ep, insn);
 
 	if (ctype) {
-		check_attr(ctype);
 		FOR_EACH_PTR(ctype->attribute->contexts, context) {
 			int in = context->in;
 			int out = context->out;
diff --git a/parse.c b/parse.c
index ffd6ad8..c90bae6 100644
--- a/parse.c
+++ b/parse.c
@@ -1361,7 +1361,6 @@ static void apply_ctype(struct position pos, struct ctype *thistype, struct ctyp
 		ctype->alignment = thistype->alignment;
 
 	/* Attribute */
-	check_attr(thistype);
 	merge_attr(ctype, thistype);
 }
 
@@ -1711,13 +1710,10 @@ static struct token *pointer(struct token *token, struct decl_state *ctx)
 		struct symbol *ptr = alloc_symbol(token->pos, SYM_PTR);
 		ptr->ctype.modifiers = ctx->ctype.modifiers;
 		ptr->ctype.base_type = ctx->ctype.base_type;
-		check_attr(&ctx->ctype);
 		merge_attr(&ptr->ctype, &ctx->ctype);
 		ctx->ctype.modifiers = 0;
 		ctx->ctype.base_type = ptr;
-		ctx->ctype.as = 0;
 		ctx->ctype.attribute = &null_attr;
-		ctx->ctype.contexts = NULL;
 		ctx->ctype.alignment = 0;
 
 		token = handle_qualifiers(token->next, ctx);
diff --git a/show-parse.c b/show-parse.c
index ca6232d..47e490b 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -56,7 +56,6 @@ static void do_debug_symbol(struct symbol *sym, int indent)
 
 	if (!sym)
 		return;
-	check_sym(sym);
 	fprintf(stderr, "%.*s%s%3d:%lu %s %s (as: %d) %p (%s:%d:%d) %s\n",
 		indent, indent_string, typestr[sym->type],
 		sym->bit_size, sym->ctype.alignment,
@@ -64,7 +63,6 @@ static void do_debug_symbol(struct symbol *sym, int indent)
 		sym, stream_name(sym->pos.stream), sym->pos.line, sym->pos.pos,
 		builtin_typename(sym) ?: "");
 	i = 0;
-	check_sym(sym);
 	FOR_EACH_PTR(sym->ctype.attribute->contexts, context) {
 		/* FIXME: should print context expression */
 		fprintf(stderr, "< context%d: in=%d, out=%d\n",
@@ -296,7 +294,6 @@ deeper:
 		goto out;
 	}
 
-	check_sym(sym);
 	/* Prepend */
 	switch (sym->type) {
 	case SYM_PTR:
diff --git a/sparse.c b/sparse.c
index fad16ad..351e400 100644
--- a/sparse.c
+++ b/sparse.c
@@ -248,7 +248,6 @@ static void check_context(struct entrypoint *ep)
 
 	check_instructions(ep);
 
-	check_sym(sym);
 	FOR_EACH_PTR(sym->ctype.attribute->contexts, context) {
 		in_context += context->in;
 		out_context += context->out;
diff --git a/symbol.h b/symbol.h
index 192a957..63dc587 100644
--- a/symbol.h
+++ b/symbol.h
@@ -90,8 +90,6 @@ struct ctype {
 	unsigned long modifiers;
 	unsigned long alignment;
 	struct attribute *attribute;
-	struct context_list *contexts;
-	unsigned int as;
 	struct symbol *base_type;
 };
 
@@ -399,7 +397,6 @@ static inline struct attribute *duplicate_attribute(struct attribute *attr)
 
 static inline void attr_set_as(struct ctype *ctype, unsigned int as)
 {
-	ctype->as = as;
 	if (ctype->attribute->as != as) {
 		ctype->attribute = duplicate_attribute(ctype->attribute);
 		ctype->attribute->as = as;
@@ -408,36 +405,13 @@ static inline void attr_set_as(struct ctype *ctype, unsigned int as)
 
 static inline void attr_add_context(struct ctype *ctype, struct context *context)
 {
-	add_ptr_list(&ctype->contexts, context);
 	ctype->attribute = duplicate_attribute(ctype->attribute);
 	add_ptr_list(&ctype->attribute->contexts, context);
 }
 
-/*
- * Check the ctype.as is consistent with the ctype.attribute.
- * This function will get removed with ctype.as eventually.
- */
-static inline void check_attr(struct ctype *ctype)
-{
-	if (!ctype->attribute)
-		die("Empty attribute of %p\n", ctype);
-	if (ctype->as != ctype->attribute->as)
-		die("Attribute as difference %d %d\n", ctype->as, ctype->attribute->as);
-	if (context_list_size(ctype->contexts) != context_list_size(ctype->attribute->contexts))
-		die("Attribute context has different size \n");
-}
-
-static inline void check_sym(struct symbol *sym)
-{
-	check_attr(&sym->ctype);
-}
-
 static inline void merge_attr(struct ctype *dst, struct ctype *src)
 {
 	struct attribute *attr;
-	dst->as |= src->as;
-	concat_ptr_list((struct ptr_list *)src->contexts,
-			(struct ptr_list **)&dst->contexts);
 
 	if (src->attribute == &null_attr)
 		return;
-- 
1.8.1.2

