/* * Debugging object format (used to debug object format module interface) * * Copyright (C) 2001-2007 Peter Johnson * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include typedef struct yasm_objfmt_dbg { yasm_objfmt_base objfmt; /* base structure */ FILE *dbgfile; } yasm_objfmt_dbg; yasm_objfmt_module yasm_dbg_LTX_objfmt; static yasm_objfmt * dbg_objfmt_create(yasm_object *object) { yasm_objfmt_dbg *objfmt_dbg = yasm_xmalloc(sizeof(yasm_objfmt_dbg)); objfmt_dbg->objfmt.module = &yasm_dbg_LTX_objfmt; objfmt_dbg->dbgfile = tmpfile(); if (!objfmt_dbg->dbgfile) { fprintf(stderr, N_("could not open temporary file")); return 0; } fprintf(objfmt_dbg->dbgfile, "create()\n"); return (yasm_objfmt *)objfmt_dbg; } static void dbg_objfmt_output(yasm_object *object, FILE *f, int all_syms, yasm_errwarns *errwarns) { yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; char buf[1024]; size_t i; /* Copy temp file to real output file */ rewind(objfmt_dbg->dbgfile); while ((i = fread(buf, 1, 1024, objfmt_dbg->dbgfile))) { if (fwrite(buf, 1, i, f) != i) break; } /* Reassign objfmt debug file to output file */ fclose(objfmt_dbg->dbgfile); objfmt_dbg->dbgfile = f; fprintf(objfmt_dbg->dbgfile, "output(f, object->\n"); yasm_object_print(object, objfmt_dbg->dbgfile, 1); fprintf(objfmt_dbg->dbgfile, "%d)\n", all_syms); fprintf(objfmt_dbg->dbgfile, " Symbol Table:\n"); yasm_symtab_print(object->symtab, objfmt_dbg->dbgfile, 1); } static void dbg_objfmt_destroy(yasm_objfmt *objfmt) { yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)objfmt; fprintf(objfmt_dbg->dbgfile, "destroy()\n"); yasm_xfree(objfmt); } static void dbg_objfmt_init_new_section(yasm_section *sect, unsigned long line) { yasm_object *object = yasm_section_get_object(sect); yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; fprintf(objfmt_dbg->dbgfile, "init_new_section(\"%s\", %lu)\n", yasm_section_get_name(sect), line); yasm_symtab_define_label(object->symtab, ".text", yasm_section_bcs_first(sect), 1, 0); } static yasm_section * dbg_objfmt_add_default_section(yasm_object *object) { yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; yasm_section *retval; int isnew; fprintf(objfmt_dbg->dbgfile, "add_default_section()\n"); retval = yasm_object_get_general(object, ".text", 0, 0, 0, &isnew, 0); if (isnew) { yasm_section_set_default(retval, 1); } return retval; } static /*@observer@*/ /*@null@*/ yasm_section * dbg_objfmt_section_switch(yasm_object *object, yasm_valparamhead *valparams, /*@unused@*/ /*@null@*/ yasm_valparamhead *objext_valparams, unsigned long line) { yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; yasm_valparam *vp; yasm_section *retval; int isnew; fprintf(objfmt_dbg->dbgfile, "section_switch(headp, "); yasm_vps_print(valparams, objfmt_dbg->dbgfile); fprintf(objfmt_dbg->dbgfile, ", "); yasm_vps_print(objext_valparams, objfmt_dbg->dbgfile); fprintf(objfmt_dbg->dbgfile, ", %lu), returning ", line); vp = yasm_vps_first(valparams); if (!yasm_vp_string(vp)) { fprintf(objfmt_dbg->dbgfile, "NULL\n"); return NULL; } retval = yasm_object_get_general(object, yasm_vp_string(vp), 0, 0, 0, &isnew, line); if (isnew) { fprintf(objfmt_dbg->dbgfile, "(new) "); } yasm_section_set_default(retval, 0); fprintf(objfmt_dbg->dbgfile, "\"%s\" section\n", vp->val); return retval; } static /*@observer@*/ /*@null@*/ yasm_symrec * dbg_objfmt_get_special_sym(yasm_object *object, const char *name, const char *parser) { yasm_objfmt_dbg *objfmt_dbg = (yasm_objfmt_dbg *)object->objfmt; fprintf(objfmt_dbg->dbgfile, "get_special_sym(object, \"%s\", \"%s\")\n", name, parser); return NULL; } /* Define valid debug formats to use with this object format */ static const char *dbg_objfmt_dbgfmt_keywords[] = { "null", NULL }; /* Define objfmt structure -- see objfmt.h for details */ yasm_objfmt_module yasm_dbg_LTX_objfmt = { "Trace of all info passed to object format module", "dbg", "dbg", 32, 0, dbg_objfmt_dbgfmt_keywords, "null", NULL, /* no directives */ NULL, /* no standard macros */ dbg_objfmt_create, dbg_objfmt_output, dbg_objfmt_destroy, dbg_objfmt_add_default_section, dbg_objfmt_init_new_section, dbg_objfmt_section_switch, dbg_objfmt_get_special_sym };