The following patches are needed in order to build GNAT with EGCS.

These patches were tested with egcs-980308 and gnat-3.10p on a mips-sgi-irix6.3
system.  The gnat build succeeded as per the instructions in the gnat
README.BUILD file for building one library, except that CFLAGS="-O -g" and
GNATLIBCFLAGS="-O -g" were substituted for the recommended "-O2" so that the
build could be debugged.  There was no attempt to run the resulting build
against any testsuite or validation suite.

--

Developers Notes:

Every use of sizetype in the Ada front end should be checked to see if perhaps
it should be using bitsizetype instead.  The change to maybe_pad_type is just
a hack to work around this problem, and may not be desirable in the long term.

There are many places in the Ada front end where it calls operand_equal_p to
see if two type sizes are the same.  operand_equal_p fails if the two
arguments have different TYPE_MODEs.  sizetype and bitsizetype can have
different TYPE_MODEs.  Thus this code can fail if one type size is based
on sizetype, and the other is based on bitsizetype.  The change to
maybe_pad_type fixes one very critical place where this happens.  There may
be others.

--

Mon Mar 16 11:00:25 1998  Jim Wilson  <wilson@cygnus.com>

	* a-gtran3.c (maybe_pad_type): Convert both size and orig_size to
	sizetype if they have differing modes.
	* a-misc.c (gnat_tree_code_type): Change from string to char array.
	(init_lex): Delete realloc calls for tree_code_* globals.  Adjust
	bcopy call for gnat_tree_code_type change.
	* a-tree.def: Adjust for tree_code_* type changes.

	* a-misc.c (init_lex): Rename to init_parse.

diff -c ada/a-gtran3.c /home/brolley/comp/egcs/tmp/ada/a-gtran3.c
*** ada/a-gtran3.c	Mon Mar 30 16:29:04 1998
--- /home/brolley/comp/egcs/tmp/ada/a-gtran3.c	Thu Apr  2 17:16:15 1998
***************
*** 3329,3334 ****
--- 3329,3341 ----
       isn't changing.  Likewise, clear the alignment if it isn't being
       changed.  Then return if we aren't doing anything.  */
  
+     if (size != 0
+ 	&& TYPE_MODE (TREE_TYPE (size)) != TYPE_MODE (TREE_TYPE (orig_size)))
+       {
+ 	size = convert (sizetype, size);
+ 	orig_size = convert (sizetype, orig_size);
+       }
+  
    if (size != 0
        && (operand_equal_p (size, orig_size, 0)
  	  || (TREE_CODE (orig_size) == INTEGER_CST
diff -c ada/a-misc.c /home/brolley/comp/egcs/tmp/ada/a-misc.c
*** ada/a-misc.c	Mon Mar 30 16:29:05 1998
--- /home/brolley/comp/egcs/tmp/ada/a-misc.c	Thu Apr  2 17:36:19 1998
***************
*** 70,77 ****
  
  #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
  
! char *gnat_tree_code_type[] = {
!   "x",
  #include "a-tree.def"
  };
  #undef DEFTREECODE
--- 70,77 ----
  
  #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
  
! char gnat_tree_code_type[] = {
!   'x',
  #include "a-tree.def"
  };
  #undef DEFTREECODE
***************
*** 254,259 ****
--- 254,268 ----
  print_lang_statistics ()
  {}
  
+ void
+ lang_print_xnode (file, node, indent)
+      FILE *file;
+      tree node;
+      int indent;
+ {
+ }
+  
+ 
  /* integrate_decl_tree calls this function, but since we don't use the
     DECL_LANG_SPECIFIC field, this is a no-op.  */
  
***************
*** 603,622 ****
     it, but it's where g++ does it.  */
  
  void
! init_lex ()
  {
    lang_expand_expr = gnat_expand_expr;
  
-   tree_code_type
-     = (char **) realloc (tree_code_type,
- 			 sizeof (char *) * LAST_GNAT_TREE_CODE);
-   tree_code_length
-     = (int *) realloc (tree_code_length,
- 		       sizeof (int) * LAST_GNAT_TREE_CODE);
-   tree_code_name
-     = (char **) realloc (tree_code_name,
- 			 sizeof (char *) * LAST_GNAT_TREE_CODE);
- 
    bcopy ((char *) gnat_tree_code_type,
  	 (char *) (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE),
  	 ((LAST_GNAT_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE)
--- 612,622 ----
     it, but it's where g++ does it.  */
  
  void
! init_parse (filename)
!      char *filename;
  {
    lang_expand_expr = gnat_expand_expr;
  
    bcopy ((char *) gnat_tree_code_type,
  	 (char *) (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE),
  	 ((LAST_GNAT_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE)
***************
*** 629,636 ****
  
    bcopy ((char *) gnat_tree_code_name,
  	 (char *) (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
! 	 ((LAST_GNAT_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE)
! 	  * sizeof (char *)));
  }
  
  /* Sets some debug flags for the parsed. It does nothing here.  */
--- 629,640 ----
  
    bcopy ((char *) gnat_tree_code_name,
  	 (char *) (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
! 	 LAST_GNAT_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE);
! }
! 
! void
! finish_parse ()
! {
  }
  
  /* Sets some debug flags for the parsed. It does nothing here.  */
diff -c ada/a-tree.def /home/brolley/comp/egcs/tmp/ada/a-tree.def
*** ada/a-tree.def	Mon Mar 30 16:29:09 1998
--- /home/brolley/comp/egcs/tmp/ada/a-tree.def	Thu Apr  2 17:20:38 1998
***************
*** 31,69 ****
     The only field used if TREE_COMPLEXITY, which contains the GNAT node
     number.  */
  
! DEFTREECODE (TRANSFORM_EXPR, "transform_expr", "e", 0)
  
  /* Perform an unchecked conversion between the input and the output. 
     if TREE_ADDRESSABLE is set, it means this is in an LHS; in that case,
     we can only use techniques, such as pointer punning, that leave the
     expression a "name".  */
  
! DEFTREECODE (UNCHECKED_CONVERT_EXPR, "unchecked_convert_expr", "1", 1)
  
  /* A type that is an unconstrained array itself.  This node is never passed
     to GCC. TREE_TYPE is the type of the fat pointer and TYPE_OBJECT_RECORD_TYPE
     is the type of a record containing the template and data.  */
  
! DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", "t", 0)
  
  /* A reference to an unconstrained array.  This node only exists as an
     intermediate node during the translation of a GNAT tree to a GCC tree;
     it is never passed to GCC.  The only field used is operand 0, which
     is the fat pointer object.  */
  
! DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref", "r", 1)
  
  /* An expression that returns an RTL suitable for its type.  Operand 0
     is an expression to be evaluated for side effects only.  */
  
! DEFTREECODE (NULL_EXPR, "null_expr", "e", 1)
  
  /* An expression that emits a USE for its single operand.  */
  
! DEFTREECODE (USE_EXPR, "use_expr", "e", 1)
  
  /* An expression that is treated as a conversion while generating code, but is
     used to prevent infinite recursion when conversions of biased types are
     involved.  */
  
! DEFTREECODE (GNAT_NOP_EXPR, "gnat_nop_expr", "1", 1)
--- 31,69 ----
     The only field used if TREE_COMPLEXITY, which contains the GNAT node
     number.  */
  
! DEFTREECODE (TRANSFORM_EXPR, "transform_expr", 'e', 0)
  
  /* Perform an unchecked conversion between the input and the output. 
     if TREE_ADDRESSABLE is set, it means this is in an LHS; in that case,
     we can only use techniques, such as pointer punning, that leave the
     expression a "name".  */
  
! DEFTREECODE (UNCHECKED_CONVERT_EXPR, "unchecked_convert_expr", '1', 1)
  
  /* A type that is an unconstrained array itself.  This node is never passed
     to GCC. TREE_TYPE is the type of the fat pointer and TYPE_OBJECT_RECORD_TYPE
     is the type of a record containing the template and data.  */
  
! DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", 't', 0)
  
  /* A reference to an unconstrained array.  This node only exists as an
     intermediate node during the translation of a GNAT tree to a GCC tree;
     it is never passed to GCC.  The only field used is operand 0, which
     is the fat pointer object.  */
  
! DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref", 'r', 1)
  
  /* An expression that returns an RTL suitable for its type.  Operand 0
     is an expression to be evaluated for side effects only.  */
  
! DEFTREECODE (NULL_EXPR, "null_expr", 'e', 1)
  
  /* An expression that emits a USE for its single operand.  */
  
! DEFTREECODE (USE_EXPR, "use_expr", 'e', 1)
  
  /* An expression that is treated as a conversion while generating code, but is
     used to prevent infinite recursion when conversions of biased types are
     involved.  */
  
! DEFTREECODE (GNAT_NOP_EXPR, "gnat_nop_expr", '1', 1)


This patch from Fred Fish to GNAT may make building simpler.  We haven't
tested it.

> I put a very short blurb in the faq.  GNAT is complicated enough that
> we should probably write a whole page on how to build/install it.

You may want to use some or all of these patches:

	* Make-lang.in (gnattools): Depends upon GCC_PARTS.
	(ada.start.encap): Depends upon gnattools.
	(ada.rest.encap): Depends upon gnatlib.
	* Makefile.in (../stamp-gnatlib1): Since we are still in the rts
	subdir when the rule runs, we need to touch ../../stamp-gnatlib1.
	(../stamp-gnatlib1): Don't unconditionally remove the rts directory,
	create it if one does not exist.
	(gnatlib): Remove superflous leading blank char at *-*-pe line.
	* a-init.c: Define NULL if not yet defined.

Index: Make-lang.in
===================================================================
RCS file: /cvsroot/gg/egcs/gcc/ada/Make-lang.in,v
retrieving revision 1.1.1.1
retrieving revision 1.3
diff -c -r1.1.1.1 -r1.3
*** Make-lang.in	1997/10/17 06:19:09	1.1.1.1
--- Make-lang.in	1998/03/17 14:26:14	1.3
***************
*** 100,106 ****
  
  # use host-gcc
  # getopt*.o has to be built before CC=../xgcc
! gnattools: getopt.o getopt1.o force
  	$(MAKE) $(FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS)\
  	   CC="../xgcc -B../" GNATBIND="../gnatbind" \
  	   gnatf gnatlink gnatkr gnatmake gnatcmd gnatprep \
--- 100,107 ----
  
  # use host-gcc
  # getopt*.o has to be built before CC=../xgcc
! # GCC_PARTS has to be built before CC=../xgcc
! gnattools: getopt.o getopt1.o $(GCC_PARTS) force
  	$(MAKE) $(FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS)\
  	   CC="../xgcc -B../" GNATBIND="../gnatbind" \
  	   gnatf gnatlink gnatkr gnatmake gnatcmd gnatprep \
***************
*** 163,170 ****
  	-if [ -f gnatls$(exeext) ] ; then\
  	  mv gnatls$(exeext)    gnatls-cross$(exeext); fi
  
! ada.start.encap:
! ada.rest.encap:
  ada.info:
  ada.dvi:
  
--- 164,171 ----
  	-if [ -f gnatls$(exeext) ] ; then\
  	  mv gnatls$(exeext)    gnatls-cross$(exeext); fi
  
! ada.start.encap: gnattools
! ada.rest.encap: gnatlib
  ada.info:
  ada.dvi:
  
Index: Makefile.in
===================================================================
RCS file: /cvsroot/gg/egcs/gcc/ada/Makefile.in,v
retrieving revision 1.1.1.1
retrieving revision 1.5
diff -c -r1.1.1.1 -r1.5
*** Makefile.in	1997/10/17 06:19:09	1.1.1.1
--- Makefile.in	1998/02/19 14:16:34	1.5
***************
*** 798,806 ****
     #  3. copy 3xyyy.ad[sb] -->-- i-yyy.ad[sb] 
  
  ../stamp-gnatlib1: Makefile ../stamp-gnatlib2
! 	rm -rf rts
! 	mkdir rts
! 	chmod u+w rts
  	(\
  	   case $(target) in \
  		sparc-sun-sunos4*) 	letter=u ;;\
--- 800,806 ----
     #  3. copy 3xyyy.ad[sb] -->-- i-yyy.ad[sb] 
  
  ../stamp-gnatlib1: Makefile ../stamp-gnatlib2
! 	if [ -d rts ]; then true; else mkdir rts; chmod u+w rts; fi
  	(\
  	   case $(target) in \
  		sparc-sun-sunos4*) 	letter=u ;;\
***************
*** 888,894 ****
  		   done;; \
  	   esac ; \
  	   rm -f ../stamp-gnatlib ;  \
! 	   touch ../stamp-gnatlib1)
  
  gnatlib-common: ../stamp-gnatlib1
  	(subdir=`cd $(srcdir); pwd`; \
--- 888,894 ----
  		   done;; \
  	   esac ; \
  	   rm -f ../stamp-gnatlib ;  \
! 	   touch ../../stamp-gnatlib1)
  
  gnatlib-common: ../stamp-gnatlib1
  	(subdir=`cd $(srcdir); pwd`; \
***************
*** 923,929 ****
  		mips-sni-*	       |\
  		*-*-cygwin32*          |\
  		*-*-mingw32*           |\
!  		*-*-pe                 |\
                  *)		       \
                  \
  		 $(MAKE)  CC="../../xgcc -B../../" \
--- 923,929 ----
  		mips-sni-*	       |\
  		*-*-cygwin32*          |\
  		*-*-mingw32*           |\
! 		*-*-pe                 |\
                  *)		       \
                  \
  		 $(MAKE)  CC="../../xgcc -B../../" \
Index: a-init.c
===================================================================
RCS file: /cvsroot/gg/egcs/gcc/ada/a-init.c,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -c -r1.1.1.1 -r1.2
*** a-init.c	1997/10/17 06:19:10	1.1.1.1
--- a-init.c	1998/01/04 23:11:42	1.2
***************
*** 516,521 ****
--- 516,525 ----
    __gnat_raise (exception);
  }
  
+ #ifndef NULL
+ #define NULL 0
+ #endif
+ 
  static void
  __gnat_install_handler ()
  {

Wed Jun 24 15:06:09 1998  Dave Brolley  <brolley@cygnus.com>

	* a-misc.c (lang_decode_option): New interface.
	* a-misc.h (lang_decode_option): New interface.

*** /home/brolley/tmp/a-misc.c	Wed Jun 24 15:01:22 1998
--- ada/a-misc.c	Wed Jun 24 15:02:42 1998
*************** init_gnat_args ()
*** 162,170 ****
     it returns 0. */
  
  int
! lang_decode_option (p)
!      char *p;
  {
    extern int  save_argc;
    extern char **save_argv;
  
--- 162,172 ----
     it returns 0. */
  
  int
! lang_decode_option (argc, argv)
!      int argc;
!      char **argv;
  {
+   char *p = argv[0];
    extern int  save_argc;
    extern char **save_argv;
  
*** /home/brolley/tmp/a-misc.h	Wed Jun 24 15:01:22 1998
--- ada/a-misc.h	Wed Jun 24 15:03:20 1998
*************** enum gnat_tree_code {
*** 63,69 ****
     option decoding phase of GCC calls this routine on the flags that it cannot
     decode. This routine returns 1 if it is successful, otherwise it
     returns 0. */
! extern int lang_decode_option	PROTO((char *));
  
  /* Perform all the initialization steps that are language-specific.  */
  extern void lang_init		PROTO((void));
--- 63,69 ----
     option decoding phase of GCC calls this routine on the flags that it cannot
     decode. This routine returns 1 if it is successful, otherwise it
     returns 0. */
! extern int lang_decode_option	PROTO((int, char **));
  
  /* Perform all the initialization steps that are language-specific.  */
  extern void lang_init		PROTO((void));
