commit - a3884752fe0ed1480d2598d0a64e392ec63752a0
commit + 0781fcec52a98d9fe50df2d55a1c59c3935de603
blob - 98d806e4a17ac8e5eb6474d197054837888b50ef
blob + f97c19afbdb37010ead99b47f0d295e7d3da46c8
--- cc/cc1/cc1.h
+++ cc/cc1/cc1.h
};
enum expr_type {
+ EX_PAR,
EX_INT,
};
struct expr {
enum expr_type type;
+ struct dtype *dt;
union {
+ struct expr *e;
int i;
};
};
extern struct scope gscope, fscope;
extern yyerror (), yylex ();
-extern reg;
+extern reg, linenum;
#endif // FILE_CC1_H
blob - b2e78d9a6918ed04ddf2726764cbd96430e3f972
blob + 314b50ddb21774e4fed79fafa391d4b6cb5c0be1
--- cc/cc1/gen.c
+++ cc/cc1/gen.c
struct expr *e;
{
switch (e->type) {
+ case EX_PAR:
+ return eval_expr (e->e);
case EX_INT:
return e->i;
}
return NULL;
}
-gen_expr (dt, e)
+dt_is_eq (a, b)
+struct dtype *a, *b;
+{
+ if (a->type != b->type)
+ return 0;
+
+ switch (a->type) {
+ case DT_PTR:
+ case DT_FUNC:
+ return dt_is_eq (a->inner, b->inner);
+ default:
+ return 1;
+ }
+}
+
+struct expr *
+cast (e, dt, imp)
+struct expr *e;
struct dtype *dt;
+{
+ // TODO: casting
+ if (!dt_is_eq (e->dt, dt))
+ errx (1, "%d: TODO: cast(): %d, %d", linenum, e->dt->type, dt->type);
+
+ return e;
+}
+
+gen_expr (e)
struct expr *e;
{
int r;
switch (e->type) {
+ case EX_PAR:
+ r = gen_expr (e->e);
+ break;
case EX_INT:
r = reg++;
printf ("\tlet $%d: ", r);
- print_dt (dt);
+ print_dt (e->dt);
printf (" = %d;\n", e->i);
break;
}
{
struct symbol *sym;
struct stmt **st;
+ struct expr *ex;
int r, ch;
for (sym = fn->ahead; sym != NULL; sym = sym->xnext)
printf (";\n");
if (sym->sc == SC_AUTO && sym->init.type != IN_NONE) {
- r = gen_expr (sym->dt, sym->init.ex);
+ ex = cast (sym->init.ex, sym->dt, 0);
+ r = gen_expr (ex);
printf ("\twrite $%d, $%d;\n", sym->reg, r);
}
printf ("\n");
blob - 3dd3f14de96292b938a521ffe2640fb793d20be1
blob + 615264ca4e0c9356061e5d0af7ee4ef1df8c61f9
--- cc/cc1/parse.y
+++ cc/cc1/parse.y
;
basic_type : CHAR { $$ = BT_CHAR; }
- | INT { $$ = BT_SHORT; }
- | SHORT { $$ = BT_INT; }
+ | SHORT { $$ = BT_SHORT; }
+ | INT { $$ = BT_INT; }
| LONG { $$ = BT_LONG; }
| SIGNED { $$ = BT_SIGNED; }
| UNSIGNED { $$ = BT_UNSIGNED; }
| ';' { $$ = new (struct stmt); $$->type = ST_NULL; }
;
-expression : INTEGER { $$ = new (struct expr); $$->type = EX_INT; $$->i = lval.i; }
+expression : '(' expression ')' { $$ = new_expr (EX_PAR, $2->dt); $$->e = $2; }
+ | INTEGER { $$ = new_expr (EX_INT, &default_int); $$->i = lval.i; }
;
%%
-static struct dtype default_int = { DT_INT };
+static struct dtype default_int = { .type = DT_INT };
+struct expr *
+new_expr (type, dt)
+struct dtype *dt;
+{
+ struct expr *e;
+
+ e = new (struct expr);
+ e->type = type;
+ e->dt = dt;
+
+ return e;
+}
+
lst_new (lst)
struct list *lst;
{
dt->type = us ? DT_USHORT : DT_SHORT;
} else if (bt & DT_LONG) {
dt->type = us ? DT_ULONG : DT_LONG;
+ puts ("LOOOOOONG");
} else {
dt->type = us ? DT_UINT : DT_INT;
}
blob - 773a67f29a0d5739a1993b2612d86c7fdb18ea39
blob + 9b0117904614f051f994b0a7d37a629f48b04981
--- cc/cc1/test.c
+++ cc/cc1/test.c
main (argc, argv)
char **argv;
{
- int i = 0, j, k = 42;
-
- ;;;
+ int i, j, k = 0;
}
extern h ();