ref: a90c987aa4bf133d6b484e26684919f482ffad73
parent: b5fe10c6fb6606d271bc75e2245a801286f91bb4
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Mar 18 06:31:41 EDT 2015
Add prev pointer in Inst We are going to add and remove elements from the list, so it is a good idea to have a pointer to the previous element, because with this data structure is easy to remove elements from it.
--- a/cc2/cc2.h
+++ b/cc2/cc2.h
@@ -85,6 +85,25 @@
struct node *left, *right;
};
+typedef struct inst Inst;
+typedef struct addr Addr;
+
+struct addr {
+ char kind;
+ union {
+ uint8_t reg;
+ TINT i;
+ Inst *pc;
+ Symbol *sym;
+ } u;
+};
+
+struct inst {
+ char op;
+ Addr from, to;
+ Inst *next, *prev;
+};
+
enum nerrors {
EINTNUM, /* too much internal identifiers */
EEXTNUM, /* too much external identifiers */
@@ -101,8 +120,6 @@
ENUMERR
};
-
-
enum {
LDW,
LDL,
@@ -124,6 +141,7 @@
};
extern Symbol *curfun;
+extern Inst *prog, *pc;
/* main.c */
extern void error(unsigned nerror, ...);
--- a/cc2/code.c
+++ b/cc2/code.c
@@ -48,26 +48,8 @@
[INC] = "INC"
};
-typedef struct inst Inst;
-typedef struct addr Addr;
+Inst *pc, *prog;
-struct addr {
- char kind;
- union {
- uint8_t reg;
- TINT i;
- Inst *pc;
- Symbol *sym;
- } u;
-};
-
-struct inst {
- char op;
- Addr from, to;
- Inst *next;
-};
-Inst *prog, *pc;
-
Inst *
nextpc(void)
{
@@ -74,6 +56,8 @@
Inst *new;
new = xmalloc(sizeof(*new));
+ new->prev = pc;
+
if (!pc)
prog = new;
else