scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit f9abdd7888869258a99de6ce8e1f894035a1d9e3
parent 199aaf23b5da8b9c77351d861fa37aa3f4f172e6
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 27 Dec 2024 23:04:14 +0100

cc2: Add range() and delrange()

The range datatype enables making operations over specific
ranges of statements that will fit very well in operations
over basic blocks.

Diffstat:
Msrc/cmd/scc-cc/cc2/cc2.h | 2++
Msrc/cmd/scc-cc/cc2/node.c | 31+++++++++++++++++++++++++++++++
2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/src/cmd/scc-cc/cc2/cc2.h b/src/cmd/scc-cc/cc2/cc2.h @@ -276,6 +276,8 @@ extern Node *addstmt(Node *np, int flags); extern Node *delstmt(void); extern Node *nextstmt(void); extern Node *insstmt(Node *, Node *, int); +extern void delrange(Range *); +extern Range range(Node *, Node *); /* symbol.c */ #define TMPSYM 0 diff --git a/src/cmd/scc-cc/cc2/node.c b/src/cmd/scc-cc/cc2/node.c @@ -185,6 +185,37 @@ newfun(Symbol *sym) } void +delrange(Range *rp) +{ + Node *lprev, *rnext, *next, *np; + + lprev = rp->begin->prev; + rnext = rp->end->next; + + if (lprev) + lprev->next = rnext; + if (rnext) + rnext->prev = lprev; + + for (np = rp->begin; np != rnext; np = next) { + next = np->next; + deltree(np); + } + + rp->begin = rp->end = rp->cur = NULL; +} + +Range +range(Node *begin, Node *end) +{ + Range r; + + r.cur = r.begin = begin; + r.end = end; + return r; +} + +void apply(Node *(*fun)(Node *)) { if (!curfun)