From: Peter Johnson Date: Sun, 18 Nov 2001 07:06:05 +0000 (-0000) Subject: Add symrec_delete() for deleting non-table symbols. Use it from expr_delete(). X-Git-Tag: v0.1.0~193 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6d0cb8785250c492a82da804a1857928fb71eb4;p=yasm Add symrec_delete() for deleting non-table symbols. Use it from expr_delete(). Also allow the sect for labels to be NULL (special case for new directive handling code). svn path=/trunk/yasm/; revision=337 --- diff --git a/libyasm/expr.c b/libyasm/expr.c index a82973bb..ebacf7f5 100644 --- a/libyasm/expr.c +++ b/libyasm/expr.c @@ -687,6 +687,10 @@ expr_delete_each(/*@only@*/ expr *e, /*@unused@*/ void *d) case EXPR_FLOAT: floatnum_delete(e->terms[i].data.flt); break; + case EXPR_SYM: + /* call symrec_delete in case sym isn't in the symbol table */ + symrec_delete(e->terms[i].data.sym); + break; default: break; /* none of the other types needs to be deleted */ } diff --git a/libyasm/symrec.c b/libyasm/symrec.c index ca75622a..b1871689 100644 --- a/libyasm/symrec.c +++ b/libyasm/symrec.c @@ -59,7 +59,7 @@ struct symrec { union { expr *expn; /* equ value */ struct label_s { /* bytecode immediately preceding a label */ - /*@dependent@*/ section *sect; + /*@dependent@*/ /*@null@*/ section *sect; /*@dependent@*/ /*@null@*/ bytecode *bc; } label; } value; @@ -266,6 +266,15 @@ symrec_delete_all(void) sym_table = NULL; } +void +symrec_delete(symrec *sym) +{ + /*@-branchstate@*/ + if (sym->status & SYM_NOTINTABLE) + symrec_delete_one(sym); + /*@=branchstate@*/ +} + void symrec_print(const symrec *sym) { @@ -283,7 +292,8 @@ symrec_print(const symrec *sym) break; case SYM_LABEL: printf("_Label_\n"); - printf("Section=`%s'\n", section_get_name(sym->value.label.sect)); + printf("Section=`%s'\n", sym->value.label.sect? + section_get_name(sym->value.label.sect):"(nil)"); if (!sym->value.label.bc) printf("[First bytecode]\n"); else { diff --git a/libyasm/symrec.h b/libyasm/symrec.h index d79af7e5..8946275b 100644 --- a/libyasm/symrec.h +++ b/libyasm/symrec.h @@ -35,7 +35,8 @@ typedef enum { /*@keep@*/ expr *e); /* in_table specifies if the label should be inserted into the symbol table. */ /*@dependent@*/ symrec *symrec_define_label(const char *name, - /*@dependent@*/ section *sect, + /*@dependent@*/ /*@null@*/ + section *sect, /*@dependent@*/ /*@null@*/ bytecode *precbc, int in_table); /*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis); @@ -59,5 +60,10 @@ void symrec_parser_finalize(void); void symrec_delete_all(void); +/* Deletes symrec if it isn't in the symbol table. If it *is* in the symbol + * table, does nothing. + */ +void symrec_delete(/*@only@*/ symrec *sym); + void symrec_print(const symrec *sym); #endif diff --git a/src/expr.c b/src/expr.c index a82973bb..ebacf7f5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -687,6 +687,10 @@ expr_delete_each(/*@only@*/ expr *e, /*@unused@*/ void *d) case EXPR_FLOAT: floatnum_delete(e->terms[i].data.flt); break; + case EXPR_SYM: + /* call symrec_delete in case sym isn't in the symbol table */ + symrec_delete(e->terms[i].data.sym); + break; default: break; /* none of the other types needs to be deleted */ } diff --git a/src/symrec.c b/src/symrec.c index ca75622a..b1871689 100644 --- a/src/symrec.c +++ b/src/symrec.c @@ -59,7 +59,7 @@ struct symrec { union { expr *expn; /* equ value */ struct label_s { /* bytecode immediately preceding a label */ - /*@dependent@*/ section *sect; + /*@dependent@*/ /*@null@*/ section *sect; /*@dependent@*/ /*@null@*/ bytecode *bc; } label; } value; @@ -266,6 +266,15 @@ symrec_delete_all(void) sym_table = NULL; } +void +symrec_delete(symrec *sym) +{ + /*@-branchstate@*/ + if (sym->status & SYM_NOTINTABLE) + symrec_delete_one(sym); + /*@=branchstate@*/ +} + void symrec_print(const symrec *sym) { @@ -283,7 +292,8 @@ symrec_print(const symrec *sym) break; case SYM_LABEL: printf("_Label_\n"); - printf("Section=`%s'\n", section_get_name(sym->value.label.sect)); + printf("Section=`%s'\n", sym->value.label.sect? + section_get_name(sym->value.label.sect):"(nil)"); if (!sym->value.label.bc) printf("[First bytecode]\n"); else { diff --git a/src/symrec.h b/src/symrec.h index d79af7e5..8946275b 100644 --- a/src/symrec.h +++ b/src/symrec.h @@ -35,7 +35,8 @@ typedef enum { /*@keep@*/ expr *e); /* in_table specifies if the label should be inserted into the symbol table. */ /*@dependent@*/ symrec *symrec_define_label(const char *name, - /*@dependent@*/ section *sect, + /*@dependent@*/ /*@null@*/ + section *sect, /*@dependent@*/ /*@null@*/ bytecode *precbc, int in_table); /*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis); @@ -59,5 +60,10 @@ void symrec_parser_finalize(void); void symrec_delete_all(void); +/* Deletes symrec if it isn't in the symbol table. If it *is* in the symbol + * table, does nothing. + */ +void symrec_delete(/*@only@*/ symrec *sym); + void symrec_print(const symrec *sym); #endif