PATCH: Java: Framework for cross-referencer support.

Alexandre Petit-Bianco apbianco@cygnus.com
Mon Mar 22 20:13:00 GMT 1999


This patch add the minimal support necessary so that one can write a
cross-reference "backend" to jc1. New xref backends can be added by
editing the xref.h file, augmenting the xref_flag_table[] in xref.c
and defining a cross reference generator in xref.c. A cross referencer
is activated by specifying `-fxref=<name>' on the jc1 command line.

This patch has been already checked in the egcs java repository.

1999-03-22  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* Makefile.in (JAVA_OBJS): Added entry xref.o.
	(xref.o): New rule.
	* java-tree.h (flag_emit_xref): Declared extern.
	* lang.c (xref.h): Included.
	(flag_emit_xref): New global variable.
	(lang_decode_option): Added support for -fxref.
	* xref.c: Created.
	* xref.h: Likewise.

Index: Makefile.in
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/java/Makefile.in,v
retrieving revision 1.30
diff -u -p -r1.30 Makefile.in
--- Makefile.in	1999/03/21 06:09:01	1.30
+++ Makefile.in	1999/03/22 22:04:54
@@ -175,7 +175,7 @@ INCLUDES = -I. -I.. -I$(srcdir) -I$(srcd
 #
 JAVA_OBJS = parse.o class.o decl.o expr.o constants.o lang.o typeck.o \
   except.o verify.o zextract.o jcf-io.o jcf-parse.o mangle.o jcf-write.o \
-  buffer.o check-init.o jcf-depend.o jcf-path.o
+  buffer.o check-init.o jcf-depend.o jcf-path.o xref.o
 
 JAVA_OBJS_LITE = parse-scan.o jv-scan.o
 
@@ -315,5 +315,7 @@ typeck.o : typeck.c $(CONFIG_H) $(JAVA_T
   $(srcdir)/../toplev.h $(srcdir)/../system.h
 verify.o : verify.c $(CONFIG_H) $(JAVA_TREE_H) jcf.h javaop.h java-opcodes.h \
   java-except.h $(srcdir)/../toplev.h $(srcdir)/../system.h
+xref.o : xref.h $(CONFIG_H) $(JAVA_TREE_H) $(srcdir)/../toplev.h \
+  $(srcdir)/../system.h
 zextract.o : zextract.c $(CONFIG_H) $(srcdir)/../system.h zipfile.h
 
Index: java-tree.h
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/java/java-tree.h,v
retrieving revision 1.33
diff -u -p -r1.33 java-tree.h
--- java-tree.h	1999/03/21 06:09:10	1.33
+++ java-tree.h	1999/03/22 22:04:54
@@ -127,6 +127,11 @@ extern int flag_assume_compiled;
 
 extern int flag_emit_class_files;
 
+/* When non zero, we emit xref strings. Values of the flag for xref
+   backends are defined in xref.h.  */
+
+extern int flag_emit_xref;
+
 /* Turned to 1 if -Wall was encountered. See lang.c for their meanings.  */
 extern int flag_wall;
 extern int flag_redundant;
Index: lang.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/java/lang.c,v
retrieving revision 1.17
diff -u -p -r1.17 lang.c
--- lang.c	1999/03/21 06:09:19	1.17
+++ lang.c	1999/03/22 22:04:54
@@ -32,6 +32,7 @@ The Free Software Foundation is independ
 #include "jcf.h"
 #include "toplev.h"
 #include "flags.h"
+#include "xref.h"
 
 #ifndef OBJECT_SUFFIX
 # define OBJECT_SUFFIX ".o"
@@ -87,6 +88,11 @@ int flag_assume_compiled = 1;
 
 int flag_emit_class_files = 0;
 
+/* When non zero, we emit xref strings. Values of the flag for xref
+   backends are defined in xref_flag_table, xref.c.  */
+
+int flag_emit_xref = 0;
+
 /* When non zero, -Wall was turned on.  */
 int flag_wall = 0;
 
@@ -167,6 +173,16 @@ lang_decode_option (argc, argv)
       return 1;
     }
 #undef ARG
+
+#define XARG "-fxref="
+  if (strncmp (p, XARG, sizeof (XARG) - 1) == 0)
+    {
+      if (!(flag_emit_xref = xref_flag_value (p + sizeof (XARG) - 1)))
+	{
+	  error ("Unkown xref format `%s'", p + sizeof (XARG) - 1);
+	}
+    }
+#undef XARG
 
   if (p[0] == '-' && p[1] == 'f')
     {

Index: xref.c
===================================================================
RCS file: New file
/* Write cross reference information extracted from Java(TM)
   source and bytecode files, in one of formats documented below.
   Copyright (C) 1999 Free Software Foundation, Inc.
   Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)

This file is part of GNU CC.

GNU CC 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.

GNU CC 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 GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.

Java and all Java-based marks are trademarks or registered trademarks
of Sun Microsystems, Inc. in the United States and other countries.
The Free Software Foundation is independent of Sun Microsystems, Inc.  */

#include <stdio.h>
#include "config.h"
#include "tree.h"
#include "java-tree.h"
#include "xref.h"


static xref_flag_table xref_table [] = {
  {NULL, NULL, NULL},
};

/* Decode an xref flag value. Return 0 if the flag wasn't found. */

int xref_flag_value (flag)
     char *flag;
{
  int i;
  for (i = 0; xref_table [i].key; i++)
    if (!strcmp (flag, xref_table [i].key))
      return i+1;
  return 0;
}

/* Branch to the right xref "back-end".  */

void
expand_xref (node)
     tree node;
{
  /* Maintain these two cached. */
  static FILE *fp = NULL;
  static void (*current_expand) PROTO ((FILE *, tree)) = NULL;

  if ( !flag_emit_xref )
    return;

  if (!fp)
    fp = xref_table [flag_emit_xref-1].fp;
  if (!current_expand)
    current_expand = xref_table [flag_emit_xref-1].expand;

  (*current_expand) (fp, node);
}

/* Implementation of the xref back-ends. */

Index: xref.h
===================================================================
RCS file: New file
/* Definitions for the cross reference backend xref.c
   Copyright (C) 1999 Free Software Foundation, Inc.
   Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com)

This file is part of GNU CC.

GNU CC 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.

GNU CC 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 GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.

Java and all Java-based marks are trademarks or registered trademarks
of Sun Microsystems, Inc. in the United States and other countries.
The Free Software Foundation is independent of Sun Microsystems, Inc.  */

/* Exported functions. */
int xref_flag_value PROTO ((char *));
void xref_generate PROTO ((tree));

/* flag_emit_xref range of possible values. */

enum {
  XREF_NONE = 0,
};

/* Lookup table to be used with the value of flag_emit_xref */

typedef struct {
  char *key;			         /* Activator in -fxref=<key>  */
  void (*expand) PROTO ((FILE *, tree)); /* Function to write xrefs out */
  FILE *fp;			         /* fp to use during the call.  */
} xref_flag_table;

.--- Alex (www.cygnus.com/~apbianco, apbianco@cygnus.com)
| Alexandre Petit-Bianco, Cygnus Solutions Java Team.


More information about the Gcc-patches mailing list