]> granicus.if.org Git - yasm/commitdiff
Add symrec_delete() for deleting non-table symbols. Use it from expr_delete().
authorPeter Johnson <peter@tortall.net>
Sun, 18 Nov 2001 07:06:05 +0000 (07:06 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 18 Nov 2001 07:06:05 +0000 (07:06 -0000)
Also allow the sect for labels to be NULL (special case for new directive
handling code).

svn path=/trunk/yasm/; revision=337

libyasm/expr.c
libyasm/symrec.c
libyasm/symrec.h
src/expr.c
src/symrec.c
src/symrec.h

index a82973bb67fa326c3a98169be30c66cf05469c8d..ebacf7f5ff516d1f4397bd04c1a914058cdc38b4 100644 (file)
@@ -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 */
        }
index ca75622a8bc4639b26efd0af9e3120ad3ee583fc..b1871689034af0fa1f0427d6ef632c45244973f9 100644 (file)
@@ -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 {
index d79af7e58fed7fef63386d497985211eea154b51..8946275bb4c5a5ee7beeddad8126a8e5997c4cba 100644 (file)
@@ -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
index a82973bb67fa326c3a98169be30c66cf05469c8d..ebacf7f5ff516d1f4397bd04c1a914058cdc38b4 100644 (file)
@@ -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 */
        }
index ca75622a8bc4639b26efd0af9e3120ad3ee583fc..b1871689034af0fa1f0427d6ef632c45244973f9 100644 (file)
@@ -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 {
index d79af7e58fed7fef63386d497985211eea154b51..8946275bb4c5a5ee7beeddad8126a8e5997c4cba 100644 (file)
@@ -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