/* This file is debug.c
   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 2000
   Free Software Foundation, Inc.

   This file is part of GAS, the GNU Assembler.

   GAS is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   GAS is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GAS; see the file COPYING.  If not, write to
   the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

/* Routines for debug use only.  */

#include "as.h"
#include "subsegs.h"

dmp_frags ()
{
  frchainS *chp;
  char *p;

  for (chp = frchain_root; chp; chp = chp->frch_next)
    {
      switch (chp->frch_seg)
	{
	case SEG_DATA:
	  p = "Data";
	  break;
	case SEG_TEXT:
	  p = "Text";
	  break;
	default:
	  p = "???";
	  break;
	}
      printf ("\nSEGMENT %s %d\n", p, chp->frch_subseg);
      dmp_frag (chp->frch_root, "\t");
    }
}

dmp_frag (fp, indent)
     struct frag *fp;
     char *indent;
{
  for (; fp; fp = fp->fr_next)
    {
      printf ("%sFRAGMENT @ 0x%x\n", indent, fp);
      switch (fp->fr_type)
	{
	case rs_align:
	  printf ("%srs_align(%d)\n", indent, fp->fr_offset);
	  break;
	case rs_fill:
	  printf ("%srs_fill(%d)\n", indent, fp->fr_offset);
	  printf ("%s", indent);
	  var_chars (fp, fp->fr_var + fp->fr_fix);
	  printf ("%s\t repeated %d times,", indent, fp->fr_offset);
	  printf (" fixed length if # chars == 0)\n");
	  break;
	case rs_org:
	  printf ("%srs_org(%d+sym @0x%x)\n", indent,
		  fp->fr_offset, fp->fr_symbol);
	  printf ("%sfill with ", indent);
	  var_chars (fp, 1);
	  printf ("\n");
	  break;
	case rs_machine_dependent:
	  printf ("%smachine_dep\n", indent);
	  break;
	default:
	  printf ("%sunknown type\n", indent);
	  break;
	}
      printf ("%saddr=%d(0x%x)\n", indent, fp->fr_address, fp->fr_address);
      printf ("%sfr_fix=%d\n", indent, fp->fr_fix);
      printf ("%sfr_var=%d\n", indent, fp->fr_var);
      printf ("%sfr_offset=%d\n", indent, fp->fr_offset);
      printf ("%schars @ 0x%x\n", indent, fp->fr_literal);
      printf ("\n");
    }
}

var_chars (fp, n)
     struct frag *fp;
     int n;
{
  unsigned char *p;

  for (p = (unsigned char *) fp->fr_literal; n; n--, p++)
    {
      printf ("%02x ", *p);
    }
}

/* end of debug.c */
