aboutsummaryrefslogtreecommitdiff
path: root/bootstrap
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-29 21:57:58 +0200
committerlemon <lsof@mailbox.org>2022-08-29 21:57:58 +0200
commit2f243de6ce9402f880677a07b832c0e56a7f688d (patch)
tree7f2844b121f52b0acbb5e03d2bdc83c51c187abc /bootstrap
parente0385225b5a4a0d7b391d3d71c19228efe06ed04 (diff)
many things ,varags
Diffstat (limited to 'bootstrap')
-rw-r--r--bootstrap/cgen.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c
index e4ba1fd..0bd7851 100644
--- a/bootstrap/cgen.c
+++ b/bootstrap/cgen.c
@@ -64,6 +64,7 @@ pristring(const char *s, u64 n) {
static void genexpr(struct expr *expr);
static void geniniex(struct expr *ex);
+static void geneuiniex(struct expr *ex);
void
pri(const char *fmt, ...) {
@@ -127,7 +128,8 @@ pri(const char *fmt, ...) {
genexpr(va_arg(ap, struct expr *));
break;
case 'n':
- geniniex(va_arg(ap, struct expr *));
+ ; struct expr *ex = va_arg(ap, struct expr *);
+ ex->t == Eini ? geniniex(ex) : ex->t == Eeuini ? geneuiniex(ex) : assert(0);
break;
default:
fprintf(outfp, "pri(): bad fmt '%%%c'\n", c);
@@ -150,12 +152,12 @@ geniniex(struct expr *ex) {
for (int i = 0; i < ex->ini.args.n; ++i) {
struct iniarg *arg = &ex->ini.args.d[i];
if (ex->ty->t == TYarr)
- if (arg->ex.t == Eini)
+ if (arg->ex.t == Eini || arg->ex.t == Eeuini)
pri("[%I] = %n, ", arg->idx, &arg->ex);
else
pri("[%I] = %e, ", arg->idx, &arg->ex);
else
- if (arg->ex.t == Eini)
+ if (arg->ex.t == Eini || arg->ex.t == Eeuini)
pri(".%s_ = %n, ", arg->fld, &arg->ex);
else
pri(".%s_ = %e, ", arg->fld, &arg->ex);
@@ -171,9 +173,14 @@ geneuiniex(struct expr *ex) {
pri("{0}");
else {
assert(ex->t == Eeuini);
- if (ex->euini.ini)
- pri("{ /* %s */ %I, .u.%s_ = %e }", ex->euini.fnam, ex->euini.tag,
- ex->euini.fnam, ex->euini.ini);
+ if (ex->euini.ini) {
+ pri("{ /* %s */ %I, .u.%s_ = ", ex->euini.fnam, ex->euini.tag, ex->euini.fnam);
+ struct expr *it = ex->euini.ini;
+ if (it->t == Eini || it->t == Eeuini)
+ pri("%n }", it);
+ else
+ pri("%e }", it);
+ }
else
pri("{ /* %s */ %I }", ex->euini.fnam, ex->euini.tag);
}
@@ -722,7 +729,7 @@ genstatic(bool externp, const char *cname, struct var *var) {
pri("static ");
pri("%t %s",var->ty, cname);
if (var->ini)
- pri(" = %e", var->ini);
+ pri((var->ini->t == Eini || var->ini->t == Eeuini) ? " = %n" : " = %e", var->ini);
pri(";\n");
}