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
} 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 */
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);
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;
}
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);
(!(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;
}
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--;
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,
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
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*/
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");
}
}
-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,
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
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);
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;
}
}
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
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
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*/
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");
}
}
-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,
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
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);
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;
}
}
} 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 */
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);
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;
}
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);
(!(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;
}
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--;
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,