mirror of
https://github.com/open-simh/simtools.git
synced 2026-04-25 19:51:23 +00:00
Make some expression tree operations more generic.
This commit is contained in:
@@ -201,57 +201,52 @@ unsigned get_register(
|
|||||||
void implicit_gbl(
|
void implicit_gbl(
|
||||||
EX_TREE *value)
|
EX_TREE *value)
|
||||||
{
|
{
|
||||||
if (pass)
|
if (pass || !value)
|
||||||
return; /* Only do this in first pass */
|
return; /* Only do this in first pass */
|
||||||
|
|
||||||
switch (value->type) {
|
switch (num_subtrees(value)) {
|
||||||
case EX_UNDEFINED_SYM:
|
case 0:
|
||||||
{
|
switch (value->type) {
|
||||||
if (!(value->data.symbol->flags & SYMBOLFLAG_LOCAL)) {
|
case EX_UNDEFINED_SYM:
|
||||||
/* Unless it's a local symbol, */
|
{
|
||||||
if (enabl_gbl) {
|
if (!(value->data.symbol->flags & SYMBOLFLAG_LOCAL)) {
|
||||||
/* either make the undefined symbol into an
|
/* Unless it's a local symbol, */
|
||||||
implicit global */
|
if (enabl_gbl) {
|
||||||
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_GLOBAL,
|
/* either make the undefined symbol into an
|
||||||
&absolute_section, &implicit_st);
|
implicit global */
|
||||||
} else {
|
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_GLOBAL,
|
||||||
/* or add it to the undefined symbol table,
|
&absolute_section, &implicit_st);
|
||||||
purely for listing purposes.
|
} else {
|
||||||
It also works to add it to symbol_st,
|
/* or add it to the undefined symbol table,
|
||||||
all code is carefully made for that. */
|
purely for listing purposes.
|
||||||
|
It also works to add it to symbol_st,
|
||||||
|
all code is carefully made for that. */
|
||||||
#define ADD_UNDEFINED_SYMBOLS_TO_MAIN_SYMBOL_TABLE 0
|
#define ADD_UNDEFINED_SYMBOLS_TO_MAIN_SYMBOL_TABLE 0
|
||||||
#if ADD_UNDEFINED_SYMBOLS_TO_MAIN_SYMBOL_TABLE
|
#if ADD_UNDEFINED_SYMBOLS_TO_MAIN_SYMBOL_TABLE
|
||||||
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_UNDEFINED,
|
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_UNDEFINED,
|
||||||
&absolute_section, &symbol_st);
|
&absolute_section, &symbol_st);
|
||||||
#else
|
#else
|
||||||
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_UNDEFINED,
|
add_sym(value->data.symbol->label, 0, SYMBOLFLAG_UNDEFINED,
|
||||||
&absolute_section, &undefined_st);
|
&absolute_section, &undefined_st);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case EX_LIT:
|
||||||
|
case EX_SYM:
|
||||||
|
case EX_TEMP_SYM: // Impossible on this pass
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EX_LIT:
|
case 2:
|
||||||
case EX_SYM:
|
|
||||||
case EX_TEMP_SYM: // Impossible on this pass
|
|
||||||
return;
|
|
||||||
case EX_ADD:
|
|
||||||
case EX_SUB:
|
|
||||||
case EX_MUL:
|
|
||||||
case EX_DIV:
|
|
||||||
case EX_AND:
|
|
||||||
case EX_OR:
|
|
||||||
case EX_LSH:
|
|
||||||
implicit_gbl(value->data.child.right);
|
implicit_gbl(value->data.child.right);
|
||||||
/* FALLS THROUGH */
|
/* FALLS THROUGH */
|
||||||
case EX_COM:
|
case 1:
|
||||||
case EX_NEG:
|
|
||||||
implicit_gbl(value->data.child.left);
|
implicit_gbl(value->data.child.left);
|
||||||
break;
|
break;
|
||||||
case EX_ERR:
|
|
||||||
if (value->data.child.left)
|
|
||||||
implicit_gbl(value->data.child.left);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
112
extree.c
112
extree.c
@@ -1,6 +1,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "extree.h" /* my own definitions */
|
#include "extree.h" /* my own definitions */
|
||||||
|
|
||||||
@@ -130,31 +131,23 @@ void print_tree(
|
|||||||
fputc('\n', printfile);
|
fputc('\n', printfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free_tree frees an expression tree. */
|
/* num_subtrees tells you how many subtrees this EX_TREE has. */
|
||||||
|
|
||||||
void free_tree(
|
int num_subtrees(
|
||||||
EX_TREE *tp)
|
EX_TREE *tp)
|
||||||
{
|
{
|
||||||
switch (tp->type) {
|
switch (tp->type) {
|
||||||
case EX_UNDEFINED_SYM:
|
case EX_UNDEFINED_SYM:
|
||||||
case EX_TEMP_SYM:
|
case EX_TEMP_SYM:
|
||||||
free(tp->data.symbol->label);
|
|
||||||
free(tp->data.symbol);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EX_LIT:
|
|
||||||
case EX_SYM:
|
case EX_SYM:
|
||||||
|
case EX_LIT:
|
||||||
|
return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EX_COM:
|
case EX_COM:
|
||||||
case EX_NEG:
|
case EX_NEG:
|
||||||
free_tree(tp->data.child.left);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EX_ERR:
|
case EX_ERR:
|
||||||
if (tp->data.child.left)
|
return 1;
|
||||||
free_tree(tp->data.child.left);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EX_ADD:
|
case EX_ADD:
|
||||||
case EX_SUB:
|
case EX_SUB:
|
||||||
@@ -163,10 +156,46 @@ void free_tree(
|
|||||||
case EX_AND:
|
case EX_AND:
|
||||||
case EX_OR:
|
case EX_OR:
|
||||||
case EX_LSH:
|
case EX_LSH:
|
||||||
free_tree(tp->data.child.left);
|
return 2;
|
||||||
free_tree(tp->data.child.right);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free_tree frees an expression tree. */
|
||||||
|
|
||||||
|
void free_tree(
|
||||||
|
EX_TREE *tp)
|
||||||
|
{
|
||||||
|
if (!tp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (num_subtrees(tp)) {
|
||||||
|
case 0:
|
||||||
|
switch (tp->type) {
|
||||||
|
case EX_UNDEFINED_SYM:
|
||||||
|
case EX_TEMP_SYM:
|
||||||
|
free(tp->data.symbol->label);
|
||||||
|
free(tp->data.symbol);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EX_SYM:
|
||||||
|
case EX_LIT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
free_tree(tp->data.child.right);
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 1:
|
||||||
|
free_tree(tp->data.child.left);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
free(tp);
|
free(tp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,37 +257,34 @@ EX_TREE *dup_tree(
|
|||||||
res = new_ex_tree(tp->type);
|
res = new_ex_tree(tp->type);
|
||||||
res->cp = tp->cp;
|
res->cp = tp->cp;
|
||||||
|
|
||||||
switch (tp->type) {
|
switch (num_subtrees(tp)) {
|
||||||
case EX_UNDEFINED_SYM:
|
case 0:
|
||||||
case EX_TEMP_SYM:
|
switch (tp->type) {
|
||||||
res->data.symbol = dup_symbol(tp->data.symbol);
|
case EX_UNDEFINED_SYM:
|
||||||
break;
|
case EX_TEMP_SYM:
|
||||||
|
res->data.symbol = dup_symbol(tp->data.symbol);
|
||||||
|
break;
|
||||||
|
|
||||||
/* The symbol reference in EX_SYM is not freed in free_tree() */
|
/* The symbol reference in EX_SYM is not freed in free_tree() */
|
||||||
case EX_SYM:
|
case EX_SYM:
|
||||||
res->data.symbol = tp->data.symbol;
|
res->data.symbol = tp->data.symbol;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EX_LIT:
|
case EX_LIT:
|
||||||
res->data.lit = tp->data.lit;
|
res->data.lit = tp->data.lit;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EX_COM:
|
default:
|
||||||
case EX_NEG:
|
assert(0);
|
||||||
case EX_ERR:
|
break;
|
||||||
res->data.child.left = dup_tree(tp->data.child.left);
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case EX_ADD:
|
|
||||||
case EX_SUB:
|
|
||||||
case EX_MUL:
|
|
||||||
case EX_DIV:
|
|
||||||
case EX_AND:
|
|
||||||
case EX_OR:
|
|
||||||
case EX_LSH:
|
|
||||||
res->data.child.left = dup_tree(tp->data.child.left);
|
|
||||||
res->data.child.right = dup_tree(tp->data.child.right);
|
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
res->data.child.right = dup_tree(tp->data.child.right);
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 1:
|
||||||
|
res->data.child.left = dup_tree(tp->data.child.left);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
22
extree.h
22
extree.h
@@ -8,7 +8,8 @@ typedef struct ex_tree {
|
|||||||
enum ex_type { EX_LIT = 1,
|
enum ex_type { EX_LIT = 1,
|
||||||
/* Expression is a literal value */
|
/* Expression is a literal value */
|
||||||
EX_SYM = 2,
|
EX_SYM = 2,
|
||||||
/* Expression has a symbol reference */
|
/* Expression has a symbol reference
|
||||||
|
* (symbol from symbol table, so not freed) */
|
||||||
EX_UNDEFINED_SYM = 3,
|
EX_UNDEFINED_SYM = 3,
|
||||||
/* Expression is undefined sym reference */
|
/* Expression is undefined sym reference */
|
||||||
EX_TEMP_SYM = 4,
|
EX_TEMP_SYM = 4,
|
||||||
@@ -18,22 +19,22 @@ typedef struct ex_tree {
|
|||||||
/* One's complement */
|
/* One's complement */
|
||||||
EX_NEG = 6,
|
EX_NEG = 6,
|
||||||
/* Negate */
|
/* Negate */
|
||||||
EX_ERR = 7,
|
EX_ERR = 8,
|
||||||
/* Expression with an error */
|
/* Expression with an error */
|
||||||
|
|
||||||
EX_ADD = 8,
|
EX_ADD = 9,
|
||||||
/* Add */
|
/* Add */
|
||||||
EX_SUB = 9,
|
EX_SUB = 10,
|
||||||
/* Subtract */
|
/* Subtract */
|
||||||
EX_MUL = 10,
|
EX_MUL = 11,
|
||||||
/* Multiply */
|
/* Multiply */
|
||||||
EX_DIV = 11,
|
EX_DIV = 12,
|
||||||
/* Divide */
|
/* Divide */
|
||||||
EX_AND = 12,
|
EX_AND = 13,
|
||||||
/* bitwise and */
|
/* bitwise and */
|
||||||
EX_OR = 13,
|
EX_OR = 14,
|
||||||
/* bitwise or */
|
/* bitwise or */
|
||||||
EX_LSH = 14
|
EX_LSH = 15,
|
||||||
/* left shift */
|
/* left shift */
|
||||||
} type;
|
} type;
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ EX_TREE *new_ex_bin(
|
|||||||
EX_TREE *new_ex_una(
|
EX_TREE *new_ex_una(
|
||||||
int type,
|
int type,
|
||||||
EX_TREE *left);
|
EX_TREE *left);
|
||||||
|
int num_subtrees(
|
||||||
|
EX_TREE *tp);
|
||||||
EX_TREE *evaluate(
|
EX_TREE *evaluate(
|
||||||
EX_TREE *tp,
|
EX_TREE *tp,
|
||||||
int flags);
|
int flags);
|
||||||
|
|||||||
Reference in New Issue
Block a user