]> granicus.if.org Git - yasm/commitdiff
Combine global/common/extern handling into general of_data in symrec.
authorPeter Johnson <peter@tortall.net>
Sun, 20 Oct 2002 08:59:47 +0000 (08:59 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 20 Oct 2002 08:59:47 +0000 (08:59 -0000)
svn path=/trunk/yasm/; revision=766

12 files changed:
libyasm/objfmt.h
libyasm/symrec.c
libyasm/symrec.h
modules/objfmts/bin/bin-objfmt.c
modules/objfmts/dbg/dbg-objfmt.c
modules/parsers/nasm/nasm-bison.y
src/objfmt.h
src/objfmts/bin/bin-objfmt.c
src/objfmts/dbg/dbg-objfmt.c
src/parsers/nasm/nasm-bison.y
src/symrec.c
src/symrec.h

index 41436b8ec36a538713a9bb223cc7394c5ffbe650..dc860ee5a437a77e86633595b181428431335ebd 100644 (file)
@@ -83,25 +83,19 @@ struct objfmt {
     void (*section_data_delete)(/*@only@*/ void *data);
     void (*section_data_print)(FILE *f, void *data);
 
-    /*@null@*/ void *(*extern_data_new)(const char *name, /*@null@*/
-                                       valparamhead *objext_valparams);
-    /*@null@*/ void *(*global_data_new)(const char *name, /*@null@*/
-                                       valparamhead *objext_valparams);
-    /*@null@*/ void *(*common_data_new)(const char *name,
-                                       /*@only@*/ expr *size, /*@null@*/
-                                       valparamhead *objext_valparams);
-
-    /* It's only valid to pass these functions *one* SymVisibility (eg, vis
-     * is an enum not a bitmask).
-     * These functions may be NULL if no data is ever returned by the above
-     * *_data_new() functions.
+    /* These functions should call symrec_set_of_data() to store data.
+     * May be NULL if objfmt doesn't care about such declarations.
      */
-    void (*declare_data_delete)(SymVisibility vis, /*@only@*/ void *data);
-    void (*declare_data_print)(FILE *f, SymVisibility vis,
-                              /*@null@*/ void *data);
+    void (*extern_declare)(symrec *sym,
+                          /*@null@*/ valparamhead *objext_valparams);
+    void (*global_declare)(symrec *sym,
+                          /*@null@*/ valparamhead *objext_valparams);
+    void (*common_declare)(symrec *sym, /*@only@*/ expr *size,
+                          /*@null@*/ valparamhead *objext_valparams);
 
     /* May be NULL if symrec_set_of_data() is never called. */
     void (*symrec_data_delete)(/*@only@*/ void *data);
+    void (*symrec_data_print)(FILE *f, /*@null@*/ void *data);
 
     /* Object format-specific directive support.  Returns 1 if directive was
      * not recognized.  Returns 0 if directive was recognized, even if it
index b9edd6992590d0e9226efd4c815341b16fd38f9c..0e6fb75e50f86b2280991e3ffad44c16b053a2c1 100644 (file)
@@ -68,13 +68,7 @@ struct symrec {
        } label;
     } value;
 
-    /* objfmt-specific data (related to visibility, so common/extern share
-     * a pointer, and global has its own pointer).
-     */
-    /*@null@*/ /*@owned@*/ void *of_data_vis_ce;
-    /*@null@*/ /*@owned@*/ void *of_data_vis_g;
-
-    /* General objfmt-specific data */
+    /* objfmt-specific data */
     /*@null@*/ /*@owned@*/ void *of_data;
 
     /* storage for optimizer flags */
@@ -101,25 +95,6 @@ symrec_delete_one(/*@only@*/ void *d)
     if (sym->type == SYM_EQU)
        expr_delete(sym->value.expn);
     assert(cur_objfmt != NULL);
-    if (sym->of_data_vis_g && (sym->visibility & SYM_GLOBAL)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_GLOBAL, sym->of_data_vis_g);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-    }
-    if (sym->of_data_vis_ce && (sym->visibility & SYM_COMMON)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_COMMON, sym->of_data_vis_ce);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-       sym->of_data_vis_ce = NULL;
-    }
-    if (sym->of_data_vis_ce && (sym->visibility & SYM_EXTERN)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_EXTERN, sym->of_data_vis_ce);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-    }
     if (sym->of_data) {
        if (cur_objfmt->symrec_data_delete)
            cur_objfmt->symrec_data_delete(sym->of_data);
@@ -137,8 +112,6 @@ symrec_new_common(/*@keep@*/ char *name)
     rec->type = SYM_UNKNOWN;
     rec->line = 0;
     rec->visibility = SYM_LOCAL;
-    rec->of_data_vis_ce = NULL;
-    rec->of_data_vis_g = NULL;
     rec->of_data = NULL;
     rec->opt_flags = 0;
     return rec;
@@ -249,7 +222,7 @@ symrec_define_label(const char *name, section *sect, bytecode *precbc,
 }
 
 symrec *
-symrec_declare(const char *name, SymVisibility vis, void *of_data)
+symrec_declare(const char *name, SymVisibility vis)
 {
     symrec *rec = symrec_get_or_new(name, 1);
 
@@ -270,49 +243,11 @@ symrec_declare(const char *name, SymVisibility vis, void *of_data)
        (!(rec->status & SYM_DEFINED) &&
         (!(rec->visibility & (SYM_COMMON | SYM_EXTERN)) ||
          ((rec->visibility & SYM_COMMON) && (vis == SYM_COMMON)) ||
-         ((rec->visibility & SYM_EXTERN) && (vis == SYM_EXTERN))))) {
+         ((rec->visibility & SYM_EXTERN) && (vis == SYM_EXTERN)))))
        rec->visibility |= vis;
-
-       if (of_data) {
-           switch (vis) {
-               case SYM_GLOBAL:
-                   if (rec->of_data_vis_g) {
-                       if (cur_objfmt->declare_data_delete)
-                           cur_objfmt->declare_data_delete(vis,
-                               rec->of_data_vis_g);
-                       else
-                           InternalError(_("don't know how to delete objfmt-specific declare data"));
-                   }
-                   rec->of_data_vis_g = of_data;
-                   break;
-               case SYM_COMMON:
-               case SYM_EXTERN:
-                   /* set line number of declaration */
-                   if (rec->line == 0)
-                       rec->line = line_index;
-                   if (rec->of_data_vis_ce) {
-                       if (cur_objfmt->declare_data_delete)
-                           cur_objfmt->declare_data_delete(vis,
-                               rec->of_data_vis_ce);
-                       else
-                           InternalError(_("don't know how to delete objfmt-specific declare data"));
-                   }
-                   rec->of_data_vis_ce = of_data;
-                   break;
-               default:
-                   InternalError(_("Unexpected vis value"));
-           }
-       }
-    } else {
+    else
        Error(_("duplicate definition of `%s'; first defined on line %lu"),
              name, rec->line);
-       if (of_data) {
-           if (cur_objfmt->declare_data_delete)
-               cur_objfmt->declare_data_delete(vis, of_data);
-           else
-               InternalError(_("don't know how to delete objfmt-specific declare data"));
-       }
-    } 
     return rec;
 }
 
@@ -506,23 +441,12 @@ symrec_print(FILE *f, const symrec *sym)
        fprintf(f, "\n");
     }
 
-    assert(cur_objfmt != NULL);
-    if (sym->visibility & SYM_GLOBAL) {
-       fprintf(f, "%*sGlobal object format-specific data:\n", indent_level,
-               "");
-       indent_level++;
-       if (cur_objfmt->declare_data_print)
-           cur_objfmt->declare_data_print(f, SYM_GLOBAL, sym->of_data_vis_g);
-       else
-           fprintf(f, "%*sUNKNOWN\n", indent_level, "");
-       indent_level--;
-    }
-    if (sym->visibility & SYM_COMMON) {
-       fprintf(f, "%*sCommon/Extern object format-specific data:\n",
-               indent_level, "");
+    if (sym->of_data) {
+       fprintf(f, "%*sObject format-specific data:\n", indent_level, "");
        indent_level++;
-       if (cur_objfmt->declare_data_print)
-           cur_objfmt->declare_data_print(f, SYM_COMMON, sym->of_data_vis_ce);
+       assert(cur_objfmt != NULL);
+       if (cur_objfmt->symrec_data_print)
+           cur_objfmt->symrec_data_print(f, sym->of_data);
        else
            fprintf(f, "%*sUNKNOWN\n", indent_level, "");
        indent_level--;
index c2f3fc83a40b5c173d40bfd37d9b00ca314cda62..5c5a4980647eac362ad3103e4244c8f7fbc4d15b 100644 (file)
                                            section *sect,
                                            /*@dependent@*/ /*@null@*/
                                            bytecode *precbc, int in_table);
-/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis,
-                                      /*@only@*/ /*@null@*/ void *of_data);
+/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis);
 
 /*@observer@*/ const char *symrec_get_name(const symrec *sym);
 SymVisibility symrec_get_visibility(const symrec *sym);
 
 /*@observer@*/ /*@null@*/ const expr *symrec_get_equ(const symrec *sym);
 /* Returns 0 if not a label or if EXTERN/COMMON (not defined in the file) */
-typedef /*@dependent@*/ section *symrec_get_label_sectionp;
+typedef /*@dependent@*/ /*@null@*/ section *symrec_get_label_sectionp;
 typedef /*@dependent@*/ /*@null@*/ bytecode *symrec_get_label_bytecodep;
 int symrec_get_label(const symrec *sym,
                     /*@out@*/ symrec_get_label_sectionp *sect,
index d18dc4d8edf3545c324f6d0491443e89b4311043..b6ed9b404af27618761741fd4515a25b1774838b 100644 (file)
@@ -392,28 +392,13 @@ bin_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
        return NULL;
 }
 
-static /*@null@*/ void *
-bin_objfmt_extern_data_new(/*@unused@*/ const char *name, /*@unused@*/
-                          /*@null@*/ valparamhead *objext_valparams)
-{
-    return NULL;
-}
-
-static /*@null@*/ void *
-bin_objfmt_global_data_new(/*@unused@*/ const char *name, /*@unused@*/
-                          /*@null@*/ valparamhead *objext_valparams)
-{
-    return NULL;
-}
-
-static /*@null@*/ void *
-bin_objfmt_common_data_new(/*@unused@*/ const char *name,
-                          /*@only@*/ expr *size, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+bin_objfmt_common_declare(/*@unused@*/ symrec *sym, /*@only@*/ expr *size,
+                         /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     expr_delete(size);
     Error(_("binary object format does not support common variables"));
-    return NULL;
 }
 
 static int
@@ -470,12 +455,11 @@ objfmt yasm_bin_LTX_objfmt = {
     bin_objfmt_sections_switch,
     xfree,
     bin_objfmt_section_data_print,
-    bin_objfmt_extern_data_new,
-    bin_objfmt_global_data_new,
-    bin_objfmt_common_data_new,
-    NULL /*bin_objfmt_declare_data_delete*/,
-    NULL /*bin_objfmt_declare_data_print*/,
+    NULL /*bin_objfmt_extern_declare*/,
+    NULL /*bin_objfmt_global_declare*/,
+    bin_objfmt_common_declare,
     NULL /*bin_objfmt_symrec_data_delete*/,
+    NULL /*bin_objfmt_symrec_data_print*/,
     bin_objfmt_directive,
     NULL /*bin_objfmt_bc_objfmt_data_delete*/,
     NULL /*bin_objfmt_bc_objfmt_data_print*/
index eeb889d02acd40a177258a5ec8a5d30d54cec1de..1b2d972ed290ba18c6af131b245c8b671b07468f 100644 (file)
@@ -113,78 +113,62 @@ dbg_objfmt_section_data_print(FILE *f, /*@null@*/ void *data)
        fprintf(f, "%*s(none)\n", indent_level, "");
 }
 
-static /*@null@*/ void *
-dbg_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_extern_declare(symrec *sym, /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sextern_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*sextern_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning NULL\n");
-    return NULL;
+    fprintf(debug_file, "), setting of_data=NULL\n");
+    symrec_set_of_data(sym, NULL);
 }
 
-static /*@null@*/ void *
-dbg_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_global_declare(symrec *sym, /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sglobal_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*sglobal_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning NULL\n");
-    return NULL;
+    fprintf(debug_file, "), setting of_data=NULL\n");
+    symrec_set_of_data(sym, NULL);
 }
 
-static /*@null@*/ void *
-dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
-                          /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_common_declare(symrec *sym, /*@only@*/ expr *size, /*@unused@*/
+                         /*@null@*/ valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*scommon_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*scommon_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     expr_print(debug_file, size);
     fprintf(debug_file, ", ");
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning ");
+    fprintf(debug_file, "), setting of_data=");
     expr_print(debug_file, size);
+    symrec_set_of_data(sym, size);
     fprintf(debug_file, "\n");
-    return size;
 }
 
 static void
-dbg_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
+dbg_objfmt_symrec_data_delete(/*@only@*/ void *data)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sdeclare_data_delete(", indent_level, "");
-    switch (vis) {
-       case SYM_LOCAL:
-           fprintf(debug_file, "Local, ");
-           break;
-       case SYM_GLOBAL:
-           fprintf(debug_file, "Global, ");
-           break;
-       case SYM_COMMON:
-           fprintf(debug_file, "Common, ");
-           break;
-       case SYM_EXTERN:
-           fprintf(debug_file, "Extern, ");
-           break;
-    }
-    if (vis == SYM_COMMON) {
+    fprintf(debug_file, "%*ssymrec_data_delete(", indent_level, "");
+    if (data) {
        expr_print(debug_file, data);
        expr_delete(data);
-    } else {
-       fprintf(debug_file, "%p", data);
-       xfree(data);
     }
     fprintf(debug_file, ")\n");
 }
 
 static void
-dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
-                             /*@null@*/ void *data)
+dbg_objfmt_symrec_data_print(FILE *f, /*@null@*/ void *data)
 {
-    if (vis == SYM_COMMON) {
+    if (data) {
        fprintf(f, "%*sSize=", indent_level, "");
        expr_print(f, data);
        fprintf(f, "\n");
@@ -193,14 +177,6 @@ dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
     }
 }
 
-static void
-dbg_objfmt_symrec_data_delete(/*@only@*/ void *data)
-{
-    assert(debug_file != NULL);
-    fprintf(debug_file, "%*ssymrec_data_delete(%p)\n", indent_level, "", data);
-    xfree(data);
-}
-
 static int
 dbg_objfmt_directive(const char *name, valparamhead *valparams,
                     /*@null@*/ valparamhead *objext_valparams,
@@ -244,12 +220,11 @@ objfmt yasm_dbg_LTX_objfmt = {
     dbg_objfmt_sections_switch,
     dbg_objfmt_section_data_delete,
     dbg_objfmt_section_data_print,
-    dbg_objfmt_extern_data_new,
-    dbg_objfmt_global_data_new,
-    dbg_objfmt_common_data_new,
-    dbg_objfmt_declare_data_delete,
-    dbg_objfmt_declare_data_print,
+    dbg_objfmt_extern_declare,
+    dbg_objfmt_global_declare,
+    dbg_objfmt_common_declare,
     dbg_objfmt_symrec_data_delete,
+    dbg_objfmt_symrec_data_print,
     dbg_objfmt_directive,
     dbg_objfmt_bc_objfmt_data_delete,
     dbg_objfmt_bc_objfmt_data_print
index 3a7bd67d49f9ec447e70c1a1e69b4f714edf7d2d..74828f99217f7afdb3418fbe3566fbb57283f4b2 100644 (file)
@@ -498,25 +498,26 @@ nasm_parser_directive(const char *name, valparamhead *valparams,
                      valparamhead *objext_valparams)
 {
     valparam *vp, *vp2;
+    symrec *sym;
 
     assert(cur_objfmt != NULL);
 
     /* Handle (mostly) output-format independent directives here */
     if (strcasecmp(name, "extern") == 0) {
        vp = vps_first(valparams);
-       if (vp->val)
-           symrec_declare(vp->val, SYM_EXTERN,
-                          cur_objfmt->extern_data_new(vp->val,
-                                                      objext_valparams));
-       else
+       if (vp->val) {
+           sym = symrec_declare(vp->val, SYM_EXTERN);
+           if (cur_objfmt->extern_declare)
+               cur_objfmt->extern_declare(sym, objext_valparams);
+       else
            Error(_("invalid argument to [%s]"), "EXTERN");
     } else if (strcasecmp(name, "global") == 0) {
        vp = vps_first(valparams);
-       if (vp->val)
-           symrec_declare(vp->val, SYM_GLOBAL,
-                          cur_objfmt->global_data_new(vp->val,
-                                                      objext_valparams));
-       else
+       if (vp->val) {
+           sym = symrec_declare(vp->val, SYM_GLOBAL);
+           if (cur_objfmt->global_declare)
+               cur_objfmt->global_declare(sym, objext_valparams);
+       else
            Error(_("invalid argument to [%s]"), "GLOBAL");
     } else if (strcasecmp(name, "common") == 0) {
        vp = vps_first(valparams);
@@ -525,15 +526,17 @@ nasm_parser_directive(const char *name, valparamhead *valparams,
            if (!vp2 || (!vp2->val && !vp2->param))
                Error(_("no size specified in %s declaration"), "COMMON");
            else {
-               if (vp2->val)
-                   symrec_declare(vp->val, SYM_COMMON,
-                       cur_objfmt->common_data_new(vp->val,
+               if (vp2->val) {
+                   sym = symrec_declare(vp->val, SYM_COMMON);
+                   if (cur_objfmt->common_declare)
+                       cur_objfmt->common_declare(sym,
                            expr_new_ident(ExprSym(symrec_use(vp2->val))),
-                           objext_valparams));
-               else if (vp2->param) {
-                   symrec_declare(vp->val, SYM_COMMON,
-                       cur_objfmt->common_data_new(vp->val, vp2->param,
-                                                   objext_valparams));
+                           objext_valparams);
+               } else if (vp2->param) {
+                   sym = symrec_declare(vp->val, SYM_COMMON);
+                   if (cur_objfmt->common_declare)
+                       cur_objfmt->common_declare(sym, vp2->param,
+                                                  objext_valparams);
                    vp2->param = NULL;
                }
            }
index 41436b8ec36a538713a9bb223cc7394c5ffbe650..dc860ee5a437a77e86633595b181428431335ebd 100644 (file)
@@ -83,25 +83,19 @@ struct objfmt {
     void (*section_data_delete)(/*@only@*/ void *data);
     void (*section_data_print)(FILE *f, void *data);
 
-    /*@null@*/ void *(*extern_data_new)(const char *name, /*@null@*/
-                                       valparamhead *objext_valparams);
-    /*@null@*/ void *(*global_data_new)(const char *name, /*@null@*/
-                                       valparamhead *objext_valparams);
-    /*@null@*/ void *(*common_data_new)(const char *name,
-                                       /*@only@*/ expr *size, /*@null@*/
-                                       valparamhead *objext_valparams);
-
-    /* It's only valid to pass these functions *one* SymVisibility (eg, vis
-     * is an enum not a bitmask).
-     * These functions may be NULL if no data is ever returned by the above
-     * *_data_new() functions.
+    /* These functions should call symrec_set_of_data() to store data.
+     * May be NULL if objfmt doesn't care about such declarations.
      */
-    void (*declare_data_delete)(SymVisibility vis, /*@only@*/ void *data);
-    void (*declare_data_print)(FILE *f, SymVisibility vis,
-                              /*@null@*/ void *data);
+    void (*extern_declare)(symrec *sym,
+                          /*@null@*/ valparamhead *objext_valparams);
+    void (*global_declare)(symrec *sym,
+                          /*@null@*/ valparamhead *objext_valparams);
+    void (*common_declare)(symrec *sym, /*@only@*/ expr *size,
+                          /*@null@*/ valparamhead *objext_valparams);
 
     /* May be NULL if symrec_set_of_data() is never called. */
     void (*symrec_data_delete)(/*@only@*/ void *data);
+    void (*symrec_data_print)(FILE *f, /*@null@*/ void *data);
 
     /* Object format-specific directive support.  Returns 1 if directive was
      * not recognized.  Returns 0 if directive was recognized, even if it
index d18dc4d8edf3545c324f6d0491443e89b4311043..b6ed9b404af27618761741fd4515a25b1774838b 100644 (file)
@@ -392,28 +392,13 @@ bin_objfmt_sections_switch(sectionhead *headp, valparamhead *valparams,
        return NULL;
 }
 
-static /*@null@*/ void *
-bin_objfmt_extern_data_new(/*@unused@*/ const char *name, /*@unused@*/
-                          /*@null@*/ valparamhead *objext_valparams)
-{
-    return NULL;
-}
-
-static /*@null@*/ void *
-bin_objfmt_global_data_new(/*@unused@*/ const char *name, /*@unused@*/
-                          /*@null@*/ valparamhead *objext_valparams)
-{
-    return NULL;
-}
-
-static /*@null@*/ void *
-bin_objfmt_common_data_new(/*@unused@*/ const char *name,
-                          /*@only@*/ expr *size, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+bin_objfmt_common_declare(/*@unused@*/ symrec *sym, /*@only@*/ expr *size,
+                         /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     expr_delete(size);
     Error(_("binary object format does not support common variables"));
-    return NULL;
 }
 
 static int
@@ -470,12 +455,11 @@ objfmt yasm_bin_LTX_objfmt = {
     bin_objfmt_sections_switch,
     xfree,
     bin_objfmt_section_data_print,
-    bin_objfmt_extern_data_new,
-    bin_objfmt_global_data_new,
-    bin_objfmt_common_data_new,
-    NULL /*bin_objfmt_declare_data_delete*/,
-    NULL /*bin_objfmt_declare_data_print*/,
+    NULL /*bin_objfmt_extern_declare*/,
+    NULL /*bin_objfmt_global_declare*/,
+    bin_objfmt_common_declare,
     NULL /*bin_objfmt_symrec_data_delete*/,
+    NULL /*bin_objfmt_symrec_data_print*/,
     bin_objfmt_directive,
     NULL /*bin_objfmt_bc_objfmt_data_delete*/,
     NULL /*bin_objfmt_bc_objfmt_data_print*/
index eeb889d02acd40a177258a5ec8a5d30d54cec1de..1b2d972ed290ba18c6af131b245c8b671b07468f 100644 (file)
@@ -113,78 +113,62 @@ dbg_objfmt_section_data_print(FILE *f, /*@null@*/ void *data)
        fprintf(f, "%*s(none)\n", indent_level, "");
 }
 
-static /*@null@*/ void *
-dbg_objfmt_extern_data_new(const char *name, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_extern_declare(symrec *sym, /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sextern_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*sextern_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning NULL\n");
-    return NULL;
+    fprintf(debug_file, "), setting of_data=NULL\n");
+    symrec_set_of_data(sym, NULL);
 }
 
-static /*@null@*/ void *
-dbg_objfmt_global_data_new(const char *name, /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_global_declare(symrec *sym, /*@unused@*/ /*@null@*/
+                         valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sglobal_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*sglobal_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning NULL\n");
-    return NULL;
+    fprintf(debug_file, "), setting of_data=NULL\n");
+    symrec_set_of_data(sym, NULL);
 }
 
-static /*@null@*/ void *
-dbg_objfmt_common_data_new(const char *name, /*@only@*/ expr *size,
-                          /*@unused@*/ /*@null@*/
-                          valparamhead *objext_valparams)
+static void
+dbg_objfmt_common_declare(symrec *sym, /*@only@*/ expr *size, /*@unused@*/
+                         /*@null@*/ valparamhead *objext_valparams)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*scommon_data_new(\"%s\", ", indent_level, "", name);
+    fprintf(debug_file, "%*scommon_declare(\"%s\", ", indent_level, "",
+           symrec_get_name(sym));
     expr_print(debug_file, size);
     fprintf(debug_file, ", ");
     vps_print(debug_file, objext_valparams);
-    fprintf(debug_file, "), returning ");
+    fprintf(debug_file, "), setting of_data=");
     expr_print(debug_file, size);
+    symrec_set_of_data(sym, size);
     fprintf(debug_file, "\n");
-    return size;
 }
 
 static void
-dbg_objfmt_declare_data_delete(SymVisibility vis, /*@only@*/ void *data)
+dbg_objfmt_symrec_data_delete(/*@only@*/ void *data)
 {
     assert(debug_file != NULL);
-    fprintf(debug_file, "%*sdeclare_data_delete(", indent_level, "");
-    switch (vis) {
-       case SYM_LOCAL:
-           fprintf(debug_file, "Local, ");
-           break;
-       case SYM_GLOBAL:
-           fprintf(debug_file, "Global, ");
-           break;
-       case SYM_COMMON:
-           fprintf(debug_file, "Common, ");
-           break;
-       case SYM_EXTERN:
-           fprintf(debug_file, "Extern, ");
-           break;
-    }
-    if (vis == SYM_COMMON) {
+    fprintf(debug_file, "%*ssymrec_data_delete(", indent_level, "");
+    if (data) {
        expr_print(debug_file, data);
        expr_delete(data);
-    } else {
-       fprintf(debug_file, "%p", data);
-       xfree(data);
     }
     fprintf(debug_file, ")\n");
 }
 
 static void
-dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
-                             /*@null@*/ void *data)
+dbg_objfmt_symrec_data_print(FILE *f, /*@null@*/ void *data)
 {
-    if (vis == SYM_COMMON) {
+    if (data) {
        fprintf(f, "%*sSize=", indent_level, "");
        expr_print(f, data);
        fprintf(f, "\n");
@@ -193,14 +177,6 @@ dbg_objfmt_declare_data_print(FILE *f, SymVisibility vis,
     }
 }
 
-static void
-dbg_objfmt_symrec_data_delete(/*@only@*/ void *data)
-{
-    assert(debug_file != NULL);
-    fprintf(debug_file, "%*ssymrec_data_delete(%p)\n", indent_level, "", data);
-    xfree(data);
-}
-
 static int
 dbg_objfmt_directive(const char *name, valparamhead *valparams,
                     /*@null@*/ valparamhead *objext_valparams,
@@ -244,12 +220,11 @@ objfmt yasm_dbg_LTX_objfmt = {
     dbg_objfmt_sections_switch,
     dbg_objfmt_section_data_delete,
     dbg_objfmt_section_data_print,
-    dbg_objfmt_extern_data_new,
-    dbg_objfmt_global_data_new,
-    dbg_objfmt_common_data_new,
-    dbg_objfmt_declare_data_delete,
-    dbg_objfmt_declare_data_print,
+    dbg_objfmt_extern_declare,
+    dbg_objfmt_global_declare,
+    dbg_objfmt_common_declare,
     dbg_objfmt_symrec_data_delete,
+    dbg_objfmt_symrec_data_print,
     dbg_objfmt_directive,
     dbg_objfmt_bc_objfmt_data_delete,
     dbg_objfmt_bc_objfmt_data_print
index 3a7bd67d49f9ec447e70c1a1e69b4f714edf7d2d..74828f99217f7afdb3418fbe3566fbb57283f4b2 100644 (file)
@@ -498,25 +498,26 @@ nasm_parser_directive(const char *name, valparamhead *valparams,
                      valparamhead *objext_valparams)
 {
     valparam *vp, *vp2;
+    symrec *sym;
 
     assert(cur_objfmt != NULL);
 
     /* Handle (mostly) output-format independent directives here */
     if (strcasecmp(name, "extern") == 0) {
        vp = vps_first(valparams);
-       if (vp->val)
-           symrec_declare(vp->val, SYM_EXTERN,
-                          cur_objfmt->extern_data_new(vp->val,
-                                                      objext_valparams));
-       else
+       if (vp->val) {
+           sym = symrec_declare(vp->val, SYM_EXTERN);
+           if (cur_objfmt->extern_declare)
+               cur_objfmt->extern_declare(sym, objext_valparams);
+       else
            Error(_("invalid argument to [%s]"), "EXTERN");
     } else if (strcasecmp(name, "global") == 0) {
        vp = vps_first(valparams);
-       if (vp->val)
-           symrec_declare(vp->val, SYM_GLOBAL,
-                          cur_objfmt->global_data_new(vp->val,
-                                                      objext_valparams));
-       else
+       if (vp->val) {
+           sym = symrec_declare(vp->val, SYM_GLOBAL);
+           if (cur_objfmt->global_declare)
+               cur_objfmt->global_declare(sym, objext_valparams);
+       else
            Error(_("invalid argument to [%s]"), "GLOBAL");
     } else if (strcasecmp(name, "common") == 0) {
        vp = vps_first(valparams);
@@ -525,15 +526,17 @@ nasm_parser_directive(const char *name, valparamhead *valparams,
            if (!vp2 || (!vp2->val && !vp2->param))
                Error(_("no size specified in %s declaration"), "COMMON");
            else {
-               if (vp2->val)
-                   symrec_declare(vp->val, SYM_COMMON,
-                       cur_objfmt->common_data_new(vp->val,
+               if (vp2->val) {
+                   sym = symrec_declare(vp->val, SYM_COMMON);
+                   if (cur_objfmt->common_declare)
+                       cur_objfmt->common_declare(sym,
                            expr_new_ident(ExprSym(symrec_use(vp2->val))),
-                           objext_valparams));
-               else if (vp2->param) {
-                   symrec_declare(vp->val, SYM_COMMON,
-                       cur_objfmt->common_data_new(vp->val, vp2->param,
-                                                   objext_valparams));
+                           objext_valparams);
+               } else if (vp2->param) {
+                   sym = symrec_declare(vp->val, SYM_COMMON);
+                   if (cur_objfmt->common_declare)
+                       cur_objfmt->common_declare(sym, vp2->param,
+                                                  objext_valparams);
                    vp2->param = NULL;
                }
            }
index b9edd6992590d0e9226efd4c815341b16fd38f9c..0e6fb75e50f86b2280991e3ffad44c16b053a2c1 100644 (file)
@@ -68,13 +68,7 @@ struct symrec {
        } label;
     } value;
 
-    /* objfmt-specific data (related to visibility, so common/extern share
-     * a pointer, and global has its own pointer).
-     */
-    /*@null@*/ /*@owned@*/ void *of_data_vis_ce;
-    /*@null@*/ /*@owned@*/ void *of_data_vis_g;
-
-    /* General objfmt-specific data */
+    /* objfmt-specific data */
     /*@null@*/ /*@owned@*/ void *of_data;
 
     /* storage for optimizer flags */
@@ -101,25 +95,6 @@ symrec_delete_one(/*@only@*/ void *d)
     if (sym->type == SYM_EQU)
        expr_delete(sym->value.expn);
     assert(cur_objfmt != NULL);
-    if (sym->of_data_vis_g && (sym->visibility & SYM_GLOBAL)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_GLOBAL, sym->of_data_vis_g);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-    }
-    if (sym->of_data_vis_ce && (sym->visibility & SYM_COMMON)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_COMMON, sym->of_data_vis_ce);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-       sym->of_data_vis_ce = NULL;
-    }
-    if (sym->of_data_vis_ce && (sym->visibility & SYM_EXTERN)) {
-       if (cur_objfmt->declare_data_delete)
-           cur_objfmt->declare_data_delete(SYM_EXTERN, sym->of_data_vis_ce);
-       else
-           InternalError(_("don't know how to delete objfmt-specific declare data"));
-    }
     if (sym->of_data) {
        if (cur_objfmt->symrec_data_delete)
            cur_objfmt->symrec_data_delete(sym->of_data);
@@ -137,8 +112,6 @@ symrec_new_common(/*@keep@*/ char *name)
     rec->type = SYM_UNKNOWN;
     rec->line = 0;
     rec->visibility = SYM_LOCAL;
-    rec->of_data_vis_ce = NULL;
-    rec->of_data_vis_g = NULL;
     rec->of_data = NULL;
     rec->opt_flags = 0;
     return rec;
@@ -249,7 +222,7 @@ symrec_define_label(const char *name, section *sect, bytecode *precbc,
 }
 
 symrec *
-symrec_declare(const char *name, SymVisibility vis, void *of_data)
+symrec_declare(const char *name, SymVisibility vis)
 {
     symrec *rec = symrec_get_or_new(name, 1);
 
@@ -270,49 +243,11 @@ symrec_declare(const char *name, SymVisibility vis, void *of_data)
        (!(rec->status & SYM_DEFINED) &&
         (!(rec->visibility & (SYM_COMMON | SYM_EXTERN)) ||
          ((rec->visibility & SYM_COMMON) && (vis == SYM_COMMON)) ||
-         ((rec->visibility & SYM_EXTERN) && (vis == SYM_EXTERN))))) {
+         ((rec->visibility & SYM_EXTERN) && (vis == SYM_EXTERN)))))
        rec->visibility |= vis;
-
-       if (of_data) {
-           switch (vis) {
-               case SYM_GLOBAL:
-                   if (rec->of_data_vis_g) {
-                       if (cur_objfmt->declare_data_delete)
-                           cur_objfmt->declare_data_delete(vis,
-                               rec->of_data_vis_g);
-                       else
-                           InternalError(_("don't know how to delete objfmt-specific declare data"));
-                   }
-                   rec->of_data_vis_g = of_data;
-                   break;
-               case SYM_COMMON:
-               case SYM_EXTERN:
-                   /* set line number of declaration */
-                   if (rec->line == 0)
-                       rec->line = line_index;
-                   if (rec->of_data_vis_ce) {
-                       if (cur_objfmt->declare_data_delete)
-                           cur_objfmt->declare_data_delete(vis,
-                               rec->of_data_vis_ce);
-                       else
-                           InternalError(_("don't know how to delete objfmt-specific declare data"));
-                   }
-                   rec->of_data_vis_ce = of_data;
-                   break;
-               default:
-                   InternalError(_("Unexpected vis value"));
-           }
-       }
-    } else {
+    else
        Error(_("duplicate definition of `%s'; first defined on line %lu"),
              name, rec->line);
-       if (of_data) {
-           if (cur_objfmt->declare_data_delete)
-               cur_objfmt->declare_data_delete(vis, of_data);
-           else
-               InternalError(_("don't know how to delete objfmt-specific declare data"));
-       }
-    } 
     return rec;
 }
 
@@ -506,23 +441,12 @@ symrec_print(FILE *f, const symrec *sym)
        fprintf(f, "\n");
     }
 
-    assert(cur_objfmt != NULL);
-    if (sym->visibility & SYM_GLOBAL) {
-       fprintf(f, "%*sGlobal object format-specific data:\n", indent_level,
-               "");
-       indent_level++;
-       if (cur_objfmt->declare_data_print)
-           cur_objfmt->declare_data_print(f, SYM_GLOBAL, sym->of_data_vis_g);
-       else
-           fprintf(f, "%*sUNKNOWN\n", indent_level, "");
-       indent_level--;
-    }
-    if (sym->visibility & SYM_COMMON) {
-       fprintf(f, "%*sCommon/Extern object format-specific data:\n",
-               indent_level, "");
+    if (sym->of_data) {
+       fprintf(f, "%*sObject format-specific data:\n", indent_level, "");
        indent_level++;
-       if (cur_objfmt->declare_data_print)
-           cur_objfmt->declare_data_print(f, SYM_COMMON, sym->of_data_vis_ce);
+       assert(cur_objfmt != NULL);
+       if (cur_objfmt->symrec_data_print)
+           cur_objfmt->symrec_data_print(f, sym->of_data);
        else
            fprintf(f, "%*sUNKNOWN\n", indent_level, "");
        indent_level--;
index c2f3fc83a40b5c173d40bfd37d9b00ca314cda62..5c5a4980647eac362ad3103e4244c8f7fbc4d15b 100644 (file)
                                            section *sect,
                                            /*@dependent@*/ /*@null@*/
                                            bytecode *precbc, int in_table);
-/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis,
-                                      /*@only@*/ /*@null@*/ void *of_data);
+/*@dependent@*/ symrec *symrec_declare(const char *name, SymVisibility vis);
 
 /*@observer@*/ const char *symrec_get_name(const symrec *sym);
 SymVisibility symrec_get_visibility(const symrec *sym);
 
 /*@observer@*/ /*@null@*/ const expr *symrec_get_equ(const symrec *sym);
 /* Returns 0 if not a label or if EXTERN/COMMON (not defined in the file) */
-typedef /*@dependent@*/ section *symrec_get_label_sectionp;
+typedef /*@dependent@*/ /*@null@*/ section *symrec_get_label_sectionp;
 typedef /*@dependent@*/ /*@null@*/ bytecode *symrec_get_label_bytecodep;
 int symrec_get_label(const symrec *sym,
                     /*@out@*/ symrec_get_label_sectionp *sect,