diff options
| author | Michael Forney <mforney@mforney.org> | 2021-03-31 02:38:14 -0700 | 
|---|---|---|
| committer | Michael Forney <mforney@mforney.org> | 2021-03-31 02:55:26 -0700 | 
| commit | 5ff1d2fa7f389f68846407667c489fe791113d37 (patch) | |
| tree | c32b0e9ea555fef0f1f6b60d1b32d8dc00121431 /qbe.c | |
| parent | 4c2a04dde22d2f2d8b53bb981e5aa1845070e1fd (diff) | |
| download | cproc-5ff1d2fa7f389f68846407667c489fe791113d37.tar.xz | |
qbe: Use second argument of call/arg to store type name
Diffstat (limited to 'qbe.c')
| -rw-r--r-- | qbe.c | 51 | 
1 files changed, 23 insertions, 28 deletions
| @@ -18,7 +18,6 @@ struct name {  struct repr {  	char base;  	char ext; -	struct name abi;  };  struct value { @@ -27,6 +26,7 @@ struct value {  		VALUE_GLOBAL,  		VALUE_CONST,  		VALUE_TEMP, +		VALUE_TYPE,  	} kind;  	struct repr *repr;  	union { @@ -546,10 +546,8 @@ mkfunc(struct decl *decl, char *name, struct type *t, struct scope *s)  		p->value = xmalloc(sizeof(*p->value));  		functemp(f, p->value, pt->repr);  		d = mkdecl(DECLOBJECT, p->type, p->qual, LINKNONE); -		if (p->type->repr->abi.id) { -			d->value = xmalloc(sizeof(*d->value)); -			*d->value = *p->value; -			d->value->repr = &iptr; +		if (p->type->value) { +			d->value = p->value;  		} else {  			v = typecompatible(p->type, pt) ? p->value : convert(f, pt, p->type, p->value);  			funcinit(f, d, NULL); @@ -755,9 +753,9 @@ funcexpr(struct func *f, struct expr *e)  			argvals[i] = funcexpr(f, arg);  		}  		emittype(e->type); -		v = funcinst(f, op, e->type->repr, funcexpr(f, e->base), NULL); +		v = funcinst(f, op, e->type->repr, funcexpr(f, e->base), e->type->value);  		for (arg = e->call.args, i = 0; arg; arg = arg->next, ++i) -			funcinst(f, IARG, NULL, argvals[i], NULL); +			funcinst(f, IARG, NULL, argvals[i], arg->type->value);  		//if (e->base->type->base->func.isnoreturn)  		//	funcret(f, NULL);  		return v; @@ -1060,6 +1058,7 @@ emitvalue(struct value *v)  	static char sigil[] = {  		[VALUE_TEMP] = '%',  		[VALUE_GLOBAL] = '$', +		[VALUE_TYPE] = ':',  	};  	switch (v->kind) { @@ -1080,18 +1079,14 @@ emitvalue(struct value *v)  }  static void -emitrepr(struct repr *r, bool abi, bool ext) +emitrepr(struct repr *r, struct value *v, bool ext)  {  	if (!r)  		fatal("type has no QBE representation"); -	if (abi && r->abi.id) { -		putchar(':'); -		emitname(&r->abi); -	} else if (ext) { -		putchar(r->ext); -	} else { -		putchar(r->base); -	} +	if (v) +		emitvalue(v); +	else +		putchar(ext ? r->ext : r->base);  }  /* XXX: need to consider _Alignas on struct members */ @@ -1103,19 +1098,19 @@ emittype(struct type *t)  	struct type *sub;  	uint64_t i, off; -	if (!t->repr || t->repr->abi.id || t->kind != TYPESTRUCT && t->kind != TYPEUNION) +	if (t->value || !t->repr || t->kind != TYPESTRUCT && t->kind != TYPEUNION)  		return; -	t->repr = xmalloc(sizeof(*t->repr)); -	t->repr->base = 'l'; -	t->repr->abi.str = t->structunion.tag; -	t->repr->abi.id = ++id; +	t->value = xmalloc(sizeof(*t->value)); +	t->value->kind = VALUE_TYPE; +	t->value->name.str = t->structunion.tag; +	t->value->name.id = ++id;  	for (m = t->structunion.members; m; m = m->next) {  		for (sub = m->type; sub->kind == TYPEARRAY; sub = sub->base)  			;  		emittype(sub);  	} -	fputs("type :", stdout); -	emitname(&t->repr->abi); +	fputs("type ", stdout); +	emitvalue(t->value);  	fputs(" = { ", stdout);  	for (m = t->structunion.members, off = 0; m;) {  		if (t->kind == TYPESTRUCT) { @@ -1130,7 +1125,7 @@ emittype(struct type *t)  		}  		for (i = 1, sub = m->type; sub->kind == TYPEARRAY; sub = sub->base)  			i *= sub->array.length; -		emitrepr(sub->repr, true, true); +		emitrepr(sub->repr, sub->value, true);  		if (i > 1)  			printf(" %" PRIu64, i);  		if (t->kind == TYPESTRUCT) { @@ -1157,7 +1152,7 @@ emitinst(struct inst **instp, struct inst **instend)  	if (inst->res.kind) {  		emitvalue(&inst->res);  		fputs(" =", stdout); -		emitrepr(inst->res.repr, inst->kind == ICALL || inst->kind == IVACALL, false); +		emitrepr(inst->res.repr, inst->arg[1] && inst->arg[1]->kind == VALUE_TYPE ? inst->arg[1] : NULL, false);  		putchar(' ');  	}  	fputs(instname[inst->kind], stdout); @@ -1175,7 +1170,7 @@ emitinst(struct inst **instp, struct inst **instend)  			else  				fputs(", ", stdout);  			inst = *instp; -			emitrepr(inst->arg[0]->repr, true, false); +			emitrepr(inst->arg[0]->repr, inst->arg[1], false);  			putchar(' ');  			emitvalue(inst->arg[0]);  		} @@ -1235,7 +1230,7 @@ emitfunc(struct func *f, bool global)  		puts("export");  	fputs("function ", stdout);  	if (f->type->base != &typevoid) { -		emitrepr(f->type->base->repr, true, false); +		emitrepr(f->type->base->repr, f->type->base->value, false);  		putchar(' ');  	}  	emitvalue(f->decl->value); @@ -1243,7 +1238,7 @@ emitfunc(struct func *f, bool global)  	for (p = f->type->func.params; p; p = p->next) {  		if (p != f->type->func.params)  			fputs(", ", stdout); -		emitrepr(p->value->repr, true, false); +		emitrepr(p->value->repr, p->type->value, false);  		putchar(' ');  		emitvalue(p->value);  	} | 
