diff options
author | Michael Forney <mforney@mforney.org> | 2019-04-24 21:13:46 -0700 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2019-04-24 22:32:22 -0700 |
commit | 212dd57e0a870e8fc5532477583e36e465825c5b (patch) | |
tree | 1bab1cc3b81cd4c113826d9c7d22dc3de469c743 | |
parent | 79a8df42a334dab965fa32b6bf4230829dde0d0f (diff) | |
download | cproc-212dd57e0a870e8fc5532477583e36e465825c5b.tar.xz |
Free functions when we're done with them
-rw-r--r-- | cc.h | 1 | ||||
-rw-r--r-- | decl.c | 1 | ||||
-rw-r--r-- | qbe.c | 18 |
3 files changed, 20 insertions, 0 deletions
@@ -487,6 +487,7 @@ struct value *mkintconst(struct repr *, uint64_t); uint64_t intconstvalue(struct value *); struct func *mkfunc(char *, struct type *, struct scope *); +void delfunc(struct func *); struct type *functype(struct func *); void funclabel(struct func *, struct value *); struct value *funcexpr(struct func *, struct expr *); @@ -938,6 +938,7 @@ decl(struct scope *s, struct func *f) stmt(f, s); emitfunc(f, d->linkage == LINKEXTERN); s = delscope(s); + delfunc(f); d->defined = true; return true; } @@ -3,6 +3,7 @@ #include <errno.h> #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <inttypes.h> #include "util.h" @@ -413,6 +414,23 @@ mkfunc(char *name, struct type *t, struct scope *s) return f; } +void +delfunc(struct func *f) +{ + struct block *b; + struct inst **inst; + + while (b = f->start) { + f->start = b->next; + arrayforeach (&b->insts, inst) + free(*inst); + free(b->insts.val); + free(b); + } + delmap(f->gotos, free); + free(f); +} + struct type * functype(struct func *f) { |