scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit bcb8fd114a9d34c4b06a9f5ed02c5d6f54f35366
parent 88d8d2ff08a1a1dd7d67655b9ff6869ef295ce61
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 22 Jan 2016 14:53:02 +0100

Emit initializers for strings

This modification removes strings from the expressions, which simplifies
the parsing of them, because we can be sure that lines are not too long.

Diffstat:
Mcc1/code.c | 52+++++++++++++++++++++++++++++++---------------------
Mcc1/expr.c | 6++++++
Mcc1/init.c | 8+++++---
Mcc1/symbol.c | 1+
Mcc1/tests/test001.c | 9++++++++-
Mcc1/tests/test026.c | 10++++++++--
Mcc1/tests/test027.c | 9+++++++--
Mcc1/tests/test028.c | 8+++++++-
Mcc1/tests/test032.c | 16+++++++++++-----
Mcc1/tests/test056.c | 15++++++++-------
10 files changed, 92 insertions(+), 42 deletions(-)

diff --git a/cc1/code.c b/cc1/code.c @@ -1,4 +1,5 @@ +#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> @@ -189,7 +190,6 @@ emitconst(Node *np) Type *tp = np->type; TUINT u; size_t n; - Node **p; switch (tp->op) { case PTR: @@ -200,27 +200,7 @@ emitconst(Node *np) np->type->letter, (long long) sym->u.i & ones(tp->size)); break; - case ARY: - /* TODO: All this code must go out */ - if (sym->flags & ISSTRING) { - putchar('"'); - n = tp->n.elem; - for (bp = sym->u.s; n-- > 0; ++bp) - printf("%02X", (*bp) & 0xFF); - /* TODO: Why we don't free here? */ - } else if (sym->flags & ISINITLST) { - n = tp->n.elem; - for (p = sym->u.init; n--; ++p) - emitexp(OEXPR, *p); - free(sym->u.init); - } else { - abort(); - } - break; - case STRUCT: - return; default: - /* TODO: Handle other kind of constants */ abort(); } } @@ -308,6 +288,32 @@ emittype(Type *tp) } static void +emitstring(Symbol *sym, Type *tp) +{ + char *bp, *s, *lim; + int n; + + bp = bp = sym->u.s; + lim = &sym->u.s[tp->n.elem]; + while (bp < lim) { + s = bp; + while (isprint(*bp) && bp < lim) + ++bp; + if ((n = bp - s) > 1) + printf("\t#\"%.*s\n", n, s); + else + bp = s; + if (bp == lim) + break; + do { + printf("\t#%c%02X\n", + chartype->letter, (*bp++) & 0xFF); + } while (!isprint(*bp) && bp < lim); + } + /* TODO: Why we don't free here? */ +} + +static void emitdesig(Node *np, Type *tp) { Symbol *sym; @@ -321,6 +327,10 @@ emitdesig(Node *np, Type *tp) if (!np->sym) goto emit_expression; sym = np->sym; + if (sym->flags & ISSTRING) { + emitstring(sym, tp); + return; + } if ((sym->flags & ISINITLST) == 0) goto emit_expression; } diff --git a/cc1/expr.c b/cc1/expr.c @@ -617,6 +617,12 @@ primary(void) sym = yylval.sym; switch (yytoken) { case STRING: + np = constnode(sym); + emit(ODECL, sym); + emit(OINIT, np); + np = decay(varnode(sym)); + next(); + break; case CONSTANT: np = constnode(sym); next(); diff --git a/cc1/init.c b/cc1/init.c @@ -107,11 +107,13 @@ initialize(Type *tp) } np = (yytoken == '{') ? initlist(tp) : assign(); - sym = np->sym; - if (sym && sym->flags&ISSTRING && tp->op == ARY) { + if (np->left && + np->left->sym->flags & ISSTRING && + tp->op == ARY) { + sym = np->left->sym; btp = tp->type; - if (btp != chartype && + if (btp != chartype && btp != uchartype && btp != schartype) { errorp("array of inappropriate type initialized from string constant"); diff --git a/cc1/symbol.c b/cc1/symbol.c @@ -230,6 +230,7 @@ newstring(char *s, size_t len) { Symbol *sym = newsym(NS_IDEN); + sym->id = newid(); sym->flags |= ISSTRING | ISCONSTANT | ISPRIVATE; sym->u.s = xmalloc(len); if (s) diff --git a/cc1/tests/test001.c b/cc1/tests/test001.c @@ -9,7 +9,14 @@ F5 I G6 F5 main { \ - X4 "68656C6C6F20776F726C640A00 'P pP cI +V8 K #13 +Y7 V8 +( + #"hello world + #K0A + #K00 +) + X4 Y7 'P pP cI r #I0 } */ diff --git a/cc1/tests/test026.c b/cc1/tests/test026.c @@ -10,8 +10,14 @@ G3 F2 main \ A4 I y A6 P p - A6 "746573743032362E6300 'P :P - A4 #I1F :I +V8 K #10 +Y7 V8 +( + #"test026.c + #K00 +) + A6 Y7 'P :P + A4 #I25 :I A4 #I1 :I A4 #I1 :I A4 #I1 :I diff --git a/cc1/tests/test027.c b/cc1/tests/test027.c @@ -9,7 +9,13 @@ G3 F2 main { \ A5 P p - A5 "68656C6C6F20697320626574746572207468616E2062796500 'P :P +V7 K #25 +Y6 V7 +( + #"hello is better than bye + #K00 +) + A5 Y6 'P :P r A5 @K gI } */ @@ -24,4 +30,3 @@ main(void) return *p; } - diff --git a/cc1/tests/test028.c b/cc1/tests/test028.c @@ -8,7 +8,13 @@ F5 P G6 F5 foo { \ - r "686900 'P +V8 K #3 +Y10 V8 +( + #"hi + #K00 +) + r Y10 'P } */ diff --git a/cc1/tests/test032.c b/cc1/tests/test032.c @@ -4,13 +4,19 @@ name: TEST032 description: test special characters @ and $ in macro definitions error: output: -F3 I -G4 F3 main +F4 I +G5 F4 main { \ -A6 P p - A6 "54686973206973206120737472696E672024206F722023206F72202323616E64206974206973206F6B202100 'P :P - r A6 #P0 !I +V9 K #44 +Y8 V9 +( + #"This is a string $ or # or ##and it is ok ! + #K00 +) +A7 P p + A7 Y8 'P :P + r A7 #P0 !I } */ diff --git a/cc1/tests/test056.c b/cc1/tests/test056.c @@ -20,13 +20,14 @@ G9 S2 s #K0 #I0 ) -F10 I -G11 F10 main +V10 K #0 +G11 V10 m +( +) +F12 I +G13 F12 main { \ -V12 K #0 -A13 V12 m - A13 :V12 r G9 M7 .V6 'P #P2 +P @K gI gN #N0 !I } */ @@ -42,10 +43,10 @@ struct S { .d = {[0] = 4, [1] = 6} }; +char m[] = {}; + int main(void) { - char m[] = {}; - return sizeof(m) == s.d[2]; }