aboutsummaryrefslogtreecommitdiff
path: root/binutils/sysdump.c
diff options
context:
space:
mode:
authorJ.T. Conklin <jtc@acorntoolworks.com>1995-07-13 22:43:48 +0000
committerJ.T. Conklin <jtc@acorntoolworks.com>1995-07-13 22:43:48 +0000
commit19f6aedd53cbb4e637f66904424ea1b342c28e42 (patch)
tree546539d295ed92b42278b625c40f96fd8b8f8297 /binutils/sysdump.c
parent14cffc83e75dec1874b0e136ca021ee6230ebdef (diff)
downloadgdb-19f6aedd53cbb4e637f66904424ea1b342c28e42.zip
gdb-19f6aedd53cbb4e637f66904424ea1b342c28e42.tar.gz
gdb-19f6aedd53cbb4e637f66904424ea1b342c28e42.tar.bz2
* srconv.c (wr_tr): Write out handcrafted tr block.
(walk_tree_symbol): Use evallen and evalue instead of vallen & value because of corresponding changes in sysroff.info. * sysdump.c (sysroff_swap_tr_in, sysroff_print_tr_out): New functions. * sysroff.info (tr): the tr block is a special case --- a block without contents --- which can't be handled by generated code. (den, dpp): only first byte is present for DENend, DPPend. (dsy): describe a conditional portion of block, rename some fields. (dps): describe a conditional portion of block. (dfl): removed. * sysinfo.y (yyerror): write error message to standard error.
Diffstat (limited to 'binutils/sysdump.c')
-rw-r--r--binutils/sysdump.c186
1 files changed, 103 insertions, 83 deletions
diff --git a/binutils/sysdump.c b/binutils/sysdump.c
index aa65624..aa7b7cd 100644
--- a/binutils/sysdump.c
+++ b/binutils/sysdump.c
@@ -1,5 +1,5 @@
/* Sysroff object format dumper.
- Copyright (C) 1994 Free Software Foundation, Inc.
+ Copyright (C) 1994 Free Software Foundation, Inc.
This file is part of GNU Binutils.
@@ -15,32 +15,35 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Written by Steve Chamberlain <sac@cygnus.com>.
- This program reads a SYSROFF object file and prints it in an
- almost human readable form to stdout. */
+ This program reads a SYSROFF object file and prints it in an
+ almost human readable form to stdout. */
#include <stdio.h>
+#include <ctype.h>
#include <libiberty.h>
#include <getopt.h>
#include "sysroff.h"
#include <stdlib.h>
-
+#include "sysdep.h"
#define PROGRAM_VERSION "1.0"
-
+static int h8300;
+static int sh;
static int dump = 1;
static int segmented_p;
static int code;
static FILE *file;
-static char *xcalloc(a,b)
-int a;
-int b;
+static char *
+xcalloc (a, b)
+ int a;
+ int b;
{
- char *r = xmalloc(a,b);
+ char *r = xmalloc (a, b);
memset (r, 0, a * b);
return r;
}
@@ -68,11 +71,12 @@ getCHARS (ptr, idx, size, max)
}
*idx += b * 8;
- r = calloc (b + 1, 1);
+ r = xcalloc (b + 1, 1);
memcpy (r, ptr + oc, b);
r[b] = 0;
return r;
}
+
static void
dh (ptr, size)
unsigned char *ptr;
@@ -106,7 +110,7 @@ dh (ptr, size)
}
}
-int
+int
fillup (ptr)
char *ptr;
{
@@ -130,8 +134,7 @@ fillup (ptr)
return size;
}
-
-barray
+barray
getBARRAY (ptr, idx, dsize, max)
unsigned char *ptr;
int *idx;
@@ -143,7 +146,7 @@ getBARRAY (ptr, idx, dsize, max)
int byte = *idx / 8;
int size = ptr[byte++];
res.len = size;
- res.data = (unsigned char *)xmalloc (size);
+ res.data = (unsigned char *) xmalloc (size);
for (i = 0; i < size; i++)
{
res.data[i] = ptr[byte++];
@@ -151,9 +154,7 @@ getBARRAY (ptr, idx, dsize, max)
return res;
}
-
-
-int
+int
getINT (ptr, idx, size, max)
unsigned char *ptr;
int *idx;
@@ -205,7 +206,6 @@ getBITS (ptr, idx, size)
return (ptr[byte] >> (8 - bit - size)) & ((1 << size) - 1);
}
-
static void
itheader (name, code)
char *name;
@@ -213,6 +213,7 @@ itheader (name, code)
{
printf ("\n%s 0x%02x\n", name, code);
}
+
static int indent;
static void
p ()
@@ -225,7 +226,7 @@ p ()
printf ("> ");
}
-static void
+static void
tabout ()
{
p ();
@@ -249,6 +250,28 @@ pbarray (y)
#include "sysroff.c"
+/*
+ * FIXME: sysinfo, which generates sysroff.[ch] from sysroff.info, can't
+ * hack the special case of the tr block, which has no contents. So we
+ * implement our own functions for reading in and printing out the tr
+ * block.
+ */
+
+#define IT_tr_CODE 0x7f
+void
+sysroff_swap_tr_in()
+{
+ char raw[255];
+
+ memset(raw, 0, 255);
+ fillup(raw);
+}
+
+void
+sysroff_print_tr_out()
+{
+ itheader("tr", IT_tr_CODE);
+}
static int
getone (type)
@@ -419,14 +442,14 @@ getone (type)
sysroff_swap_dss_in (&dummy);
sysroff_print_dss_out (&dummy);
}
+ break;
case IT_hs_CODE:
{
struct IT_hs dummy;
sysroff_swap_hs_in (&dummy);
sysroff_print_hs_out (&dummy);
}
-
-
+ break;
case IT_dps_CODE:
{
struct IT_dps dummy;
@@ -434,13 +457,10 @@ getone (type)
sysroff_print_dps_out (&dummy);
}
break;
-
-
case IT_tr_CODE:
{
- struct IT_tr dummy;
- sysroff_swap_tr_in (&dummy);
- sysroff_print_tr_out (&dummy);
+ sysroff_swap_tr_in ();
+ sysroff_print_tr_out ();
}
break;
case IT_dds_CODE:
@@ -450,14 +470,12 @@ getone (type)
sysroff_print_dds_out (&dummy);
}
break;
- break;
default:
printf ("GOT A %x\n", c);
return 0;
break;
}
return 1;
-
}
static int
@@ -467,37 +485,37 @@ opt (x)
return getone (x);
}
-static void
+static void
unit_info_list ()
{
- if (opt (IT_un_CODE))
+ while (opt (IT_un_CODE))
{
+ getone (IT_us_CODE);
+
while (getone (IT_sc_CODE))
- {
- getone (IT_ss_CODE);
- }
+ getone (IT_ss_CODE);
while (getone (IT_er_CODE))
- {
- }
+ ;
while (getone (IT_ed_CODE))
- {
- }
+ ;
}
}
static void
object_body_list ()
{
- getone (IT_sh_CODE);
- while (getone (IT_ob_CODE))
- ;
- while (getone (IT_rl_CODE))
- ;
+ while (getone (IT_sh_CODE))
+ {
+ while (getone (IT_ob_CODE))
+ ;
+ while (getone (IT_rl_CODE))
+ ;
+ }
}
-static void
+static void
must (x)
int x;
{
@@ -507,7 +525,7 @@ must (x)
}
}
-static void
+static void
tab (i, s)
int i;
char *s;
@@ -520,6 +538,7 @@ tab (i, s)
printf ("\n");
}
}
+
static void derived_type ();
static void
@@ -597,27 +616,24 @@ program_structure ()
tab (1, "PROGRAM STRUCTURE");
while (opt (IT_dps_CODE))
{
- opt (IT_dso_CODE);
+ must (IT_dso_CODE);
opt (IT_dss_CODE);
symbol_info ();
+ must (IT_dps_CODE);
}
tab (-1, "");
}
+
static void
debug_list ()
{
tab (1, "DEBUG LIST");
- getone (IT_du_CODE);
- while (getone (IT_dus_CODE))
- ;
- while (opt (IT_dfl_CODE))
- ;
- while (getone (IT_dus_CODE))
- ;
+ must (IT_du_CODE);
+ opt (IT_dus_CODE);
program_structure ();
+ must (IT_dln_CODE);
- getone (IT_dln_CODE);
tab (-1, "");
}
@@ -626,20 +642,29 @@ module ()
{
int c = 0;
int l = 0;
-
- tab (1, "MODULE***\n");
- getone (IT_cs_CODE);
- getone (IT_hd_CODE);
- getone (IT_hs_CODE);
+ tab (1, "MODULE***\n");
- while (!opt (IT_tr_CODE) && c < 10)
+ do
{
- unit_info_list ();
- object_body_list ();
- debug_list ();
-c++;
+ c = getc (file);
+ ungetc (c, file);
+
+ c &= 0x7f;
}
+ while (getone (c) && c != IT_tr_CODE);
+
+#if 0
+ must (IT_cs_CODE);
+ must (IT_hd_CODE);
+ opt (IT_hs_CODE);
+
+ unit_info_list ();
+ object_body_list ();
+ debug_list ();
+
+ must (IT_tr_CODE);
+#endif
tab (-1, "");
c = getc (file);
@@ -656,15 +681,14 @@ c++;
}
}
-
-char * program_name;
+char *program_name;
static void
show_usage (file, status)
FILE *file;
int status;
{
- fprintf (file, "Usage: %s [-hV] in-file\n", program_name);
+ fprintf (file, "Usage: %s [-hV] in-file\n", program_name);
exit (status);
}
@@ -676,8 +700,7 @@ show_help ()
show_usage (stdout, 0);
}
-
-int
+int
main (ac, av)
int ac;
char **av;
@@ -685,18 +708,16 @@ main (ac, av)
char *input_file = NULL;
int opt;
static struct option long_options[] =
- {
- { "help", no_argument, 0, 'h' },
- { "version", no_argument, 0, 'V' },
- { NULL, no_argument, 0, 0 }
- };
+ {
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'V'},
+ {NULL, no_argument, 0, 0}
+ };
program_name = av[0];
xmalloc_set_program_name (program_name);
- while ((opt = getopt_long (ac, av, "hV", long_options,
- (int *) NULL))
- != EOF)
+ while ((opt = getopt_long (ac, av, "hV", long_options, (int *) NULL)) != EOF)
{
switch (opt)
{
@@ -724,20 +745,19 @@ main (ac, av)
if (!input_file)
{
- fprintf (stderr,"%s: no input file specified\n",
+ fprintf (stderr, "%s: no input file specified\n",
program_name);
- exit(1);
+ exit (1);
}
- file = fopen (input_file, "r");
+ file = fopen (input_file, FOPEN_RB);
if (!file)
{
- fprintf (stderr,"%s: cannot open input file %s\n",
+ fprintf (stderr, "%s: cannot open input file %s\n",
program_name, input_file);
- exit(1);
+ exit (1);
}
-
module ();
return 0;
}