outdbg.c
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:6k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* outdbg.c output routines for the Netwide Assembler to produce
  2.  * a debugging trace
  3.  *
  4.  * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
  5.  * Julian Hall. All rights reserved. The software is
  6.  * redistributable under the licence given in the file "Licence"
  7.  * distributed in the NASM archive.
  8.  */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include "nasm.h"
  14. #include "nasmlib.h"
  15. #include "outform.h"
  16. #ifdef OF_DBG
  17. struct Section {
  18.     struct Section *next;
  19.     long number;
  20.     char *name;
  21. } *dbgsect;
  22. FILE *dbgf;
  23. efunc dbgef;
  24. struct ofmt of_dbg;
  25. static void dbg_init(FILE *fp, efunc errfunc, ldfunc ldef, evalfunc eval)
  26. {
  27.     (void) eval;
  28.     dbgf = fp;
  29.     dbgef = errfunc;
  30.     dbgsect = NULL;
  31.     (void) ldef;
  32.     fprintf(fp,"NASM Output format debug dumpn");
  33.     of_dbg.current_dfmt->init(&of_dbg,0,fp,errfunc);
  34.     
  35. }
  36. static void dbg_cleanup(int debuginfo)
  37. {
  38.     (void) debuginfo;
  39.     of_dbg.current_dfmt->cleanup();
  40.     while (dbgsect) {
  41. struct Section *tmp = dbgsect;
  42. dbgsect = dbgsect->next;
  43. nasm_free (tmp->name);
  44. nasm_free (tmp);
  45.     }
  46.     fclose(dbgf);
  47. }
  48. static long dbg_section_names (char *name, int pass, int *bits)
  49. {
  50.     int seg;
  51.     /*
  52.      * We must have an initial default: let's make it 16.
  53.      */
  54.     if (!name)
  55. *bits = 16;
  56.     if (!name)
  57. fprintf(dbgf, "section_name on init: returning %dn",
  58. seg = seg_alloc());
  59.     else {
  60. int n = strcspn(name, " t");
  61. char *sname = nasm_strndup(name, n);
  62. struct Section *s;
  63. seg = NO_SEG;
  64. for (s = dbgsect; s; s = s->next)
  65.     if (!strcmp(s->name, sname))
  66. seg = s->number;
  67. if (seg == NO_SEG) {
  68.     s = nasm_malloc(sizeof(*s));
  69.     s->name = sname;
  70.     s->number = seg = seg_alloc();
  71.     s->next = dbgsect;
  72.     dbgsect = s;
  73.     fprintf(dbgf, "section_name %s (pass %d): returning %dn",
  74.     name, pass, seg);
  75. }
  76.     }
  77.     return seg;
  78. }
  79. static void dbg_deflabel (char *name, long segment, long offset,
  80.   int is_global, char *special) 
  81. {
  82.     fprintf(dbgf,"deflabel %s := %08lx:%08lx %s (%d)%s%sn",
  83.     name, segment, offset,
  84.     is_global == 2 ? "common" : is_global ? "global" : "local",
  85.     is_global,
  86.     special ? ": " : "", special);
  87. }
  88. static void dbg_out (long segto, void *data, unsigned long type,
  89.      long segment, long wrt) 
  90. {
  91.     long realbytes = type & OUT_SIZMASK;
  92.     long ldata;
  93.     int id;
  94.     type &= OUT_TYPMASK;
  95.     fprintf(dbgf,"out to %lx, len = %ld: ",segto,realbytes);
  96.     switch(type) {
  97.       case OUT_RESERVE:
  98. fprintf(dbgf,"reserved.n"); break;
  99.       case OUT_RAWDATA:
  100. fprintf(dbgf,"raw data = ");
  101. while (realbytes--) {
  102.     id = *(unsigned char *)data;
  103.     data = (char *)data + 1;
  104.     fprintf(dbgf,"%02x ",id);
  105. }
  106. fprintf(dbgf,"n"); break;
  107.       case OUT_ADDRESS:
  108. ldata = 0; /* placate gcc */
  109. if (realbytes == 1)
  110.     ldata = *((char *)data);
  111. else if (realbytes == 2)
  112.     ldata = *((short *)data);
  113. else if (realbytes == 4)
  114.     ldata = *((long *)data);
  115. fprintf(dbgf,"addr %08lx (seg %08lx, wrt %08lx)n",ldata,
  116. segment,wrt);break;
  117.       case OUT_REL2ADR:
  118. fprintf(dbgf,"rel2adr %04x (seg %08lx)n",(int)*(short *)data,segment);
  119. break;
  120.       case OUT_REL4ADR:
  121. fprintf(dbgf,"rel4adr %08lx (seg %08lx)n",*(long *)data,segment);
  122. break;
  123.       default:
  124. fprintf(dbgf,"unknownn");
  125. break;
  126.     }
  127. }
  128. static long dbg_segbase(long segment) 
  129. {
  130.     return segment;
  131. }
  132. static int dbg_directive (char *directive, char *value, int pass) 
  133. {
  134.     fprintf(dbgf, "directive [%s] value [%s] (pass %d)n",
  135.     directive, value, pass);
  136.     return 1;
  137. }
  138. static void dbg_filename (char *inname, char *outname, efunc error) 
  139. {
  140.     standard_extension (inname, outname, ".dbg", error);
  141. }
  142. static int dbg_set_info(enum geninfo type, char **val)
  143. {
  144.     (void) type;
  145.     (void) val;
  146.     return 0;
  147. }
  148. char *types[] = { 
  149. "unknown", "label", "byte","word","dword","float","qword","tbyte" 
  150. };
  151. void dbgdbg_init(struct ofmt * of, void * id, FILE * fp, efunc error)
  152. {
  153.     (void) of;
  154.     (void) id;
  155.     (void) fp;
  156.     (void) error;
  157.     fprintf(fp,"   With debug infon");
  158. }
  159. static void dbgdbg_cleanup(void)
  160. {
  161. }
  162. static void dbgdbg_linnum (const char *lnfname, long lineno, long segto)
  163. {
  164.     fprintf(dbgf,"dbglinenum %s(%ld) := %08lxn",
  165. lnfname,lineno,segto);
  166. }
  167. static void dbgdbg_deflabel (char *name, long segment,
  168.   long offset, int is_global, char *special) 
  169. {
  170.     fprintf(dbgf,"dbglabel %s := %08lx:%08lx %s (%d)%s%sn",
  171.     name,
  172.             segment, offset,
  173.     is_global == 2 ? "common" : is_global ? "global" : "local",
  174.     is_global,
  175.     special ? ": " : "", special);
  176. }
  177. static void dbgdbg_define(const char *type, const char *params)
  178. {
  179.     fprintf(dbgf,"dbgdirective [%s] value [%s]n",type, params);
  180. }
  181. static void dbgdbg_output (int output_type, void *param)
  182. {
  183.     (void) output_type;
  184.     (void) param;
  185. }
  186. static void dbgdbg_typevalue(long type)
  187. {
  188. fprintf(dbgf,"new type: %s(%lX)n",
  189.     types[TYM_TYPE(type) >> 3], TYM_ELEMENTS(type) );
  190. }
  191. static struct dfmt debug_debug_form = {
  192.     "Trace of all info passed to debug stage",
  193.     "debug",
  194.     dbgdbg_init,
  195.     dbgdbg_linnum,
  196.     dbgdbg_deflabel,
  197.     dbgdbg_define,
  198.     dbgdbg_typevalue,
  199.     dbgdbg_output,
  200.     dbgdbg_cleanup,
  201. };
  202. static struct dfmt *debug_debug_arr[3] = {
  203. &debug_debug_form,
  204. &null_debug_form,
  205. NULL
  206. };
  207. struct ofmt of_dbg = {
  208.     "Trace of all info passed to output stage",
  209.     "dbg",
  210.     NULL,
  211.     debug_debug_arr,
  212.     &null_debug_form,
  213.     NULL,
  214.     dbg_init,
  215.     dbg_set_info,
  216.     dbg_out,
  217.     dbg_deflabel,
  218.     dbg_section_names,
  219.     dbg_segbase,
  220.     dbg_directive,
  221.     dbg_filename,
  222.     dbg_cleanup
  223. };
  224. #endif /* OF_DBG */