436 lines
14 KiB
Plaintext
436 lines
14 KiB
Plaintext
|
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));
|