From 0d77ab84bb83effb9ac3e41635747a658a3332f6 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Tue, 18 Nov 2003 11:00:43 +0100 Subject: [PATCH] [multiple changes] 2003-11-18 Richard Kenner * ada-tree.def: (ALLOCATE_EXPR): Class is "2", not "s". * decl.c (gnat_to_gnu_entity, case E_Floating_Point_Subtype): Set TYPE_PRECISION directly from esize. 2003-11-18 Thomas Quinot * cstreams.c: Use realpath(3) on FreeBSD. Fix typo in comment while we are at it. * init.c: Initialization routines for FreeBSD * link.c: Link info for FreeBSD * sysdep.c: Add the case of FreeBSD From-SVN: r73700 --- gcc/ada/ChangeLog | 18 ++++++++++ gcc/ada/ada-tree.def | 2 +- gcc/ada/cstreams.c | 4 +-- gcc/ada/decl.c | 10 +----- gcc/ada/init.c | 84 +++++++++++++++++++++++++++++++++++++++++++- gcc/ada/link.c | 9 +++++ gcc/ada/sysdep.c | 6 ++-- 7 files changed, 117 insertions(+), 16 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 84487d814c8..49bb48086f0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,21 @@ +2003-11-18 Richard Kenner + + * ada-tree.def: (ALLOCATE_EXPR): Class is "2", not "s". + + * decl.c (gnat_to_gnu_entity, case E_Floating_Point_Subtype): Set + TYPE_PRECISION directly from esize. + +2003-11-18 Thomas Quinot + + * cstreams.c: + Use realpath(3) on FreeBSD. Fix typo in comment while we are at it. + + * init.c: Initialization routines for FreeBSD + + * link.c: Link info for FreeBSD + + * sysdep.c: Add the case of FreeBSD + 2003-11-17 Jerome Guitton * 5zthrini.adb: Remove the call to Init_RTS at elaboration, as it is diff --git a/gcc/ada/ada-tree.def b/gcc/ada/ada-tree.def index 24cfa59fa8e..08a69acd21f 100644 --- a/gcc/ada/ada-tree.def +++ b/gcc/ada/ada-tree.def @@ -37,7 +37,7 @@ DEFTREECODE (TRANSFORM_EXPR, "transform_expr", 'e', 0) by operand 0 at the alignment given by operand 1 and return the address of the resulting memory. */ -DEFTREECODE (ALLOCATE_EXPR, "allocate_expr", 's', 2) +DEFTREECODE (ALLOCATE_EXPR, "allocate_expr", '2', 2) /* 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 diff --git a/gcc/ada/cstreams.c b/gcc/ada/cstreams.c index 6db356b50a6..7001f847b57 100644 --- a/gcc/ada/cstreams.c +++ b/gcc/ada/cstreams.c @@ -175,9 +175,9 @@ __gnat_full_name (char *nam, char *buffer) #elif defined (MSDOS) _fixpath (nam, buffer); -#elif defined (sgi) +#elif defined (sgi) || defined (__FreeBSD__) - /* Use realpath function which resolves links and references to .. and .. + /* Use realpath function which resolves links and references to . and .. on those Unix systems that support it. Note that GNU/Linux provides it but cannot handle more than 5 symbolic links in a full name, so we use the getcwd approach instead. */ diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 058b61e18ef..85bd27bf274 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -1357,8 +1357,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) } { - enum machine_mode mode; - if (definition == 0 && Present (Ancestor_Subtype (gnat_entity)) && ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity)) @@ -1367,15 +1365,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity), gnu_expr, definition); - for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); - (GET_MODE_WIDER_MODE (mode) != VOIDmode - && GET_MODE_BITSIZE (GET_MODE_WIDER_MODE (mode)) <= esize); - mode = GET_MODE_WIDER_MODE (mode)) - ; - gnu_type = make_node (REAL_TYPE); TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity)); - TYPE_PRECISION (gnu_type) = GET_MODE_BITSIZE (mode); + TYPE_PRECISION (gnu_type) = fp_size_to_prec (esize); TYPE_MIN_VALUE (gnu_type) = convert (TREE_TYPE (gnu_type), diff --git a/gcc/ada/init.c b/gcc/ada/init.c index b6161b36704..4f50b8f902e 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -1456,6 +1456,88 @@ __gnat_initialize(void) { } +/*************************************************/ +/* __gnat_initialize (FreeBSD version) */ +/*************************************************/ + +#elif defined (__FreeBSD__) + +#include +#include + +static void +__gnat_error_handler (sig, code, sc) + int sig; + int code; + struct sigcontext *sc; +{ + struct Exception_Data *exception; + char *msg; + + switch (sig) + { + case SIGFPE: + exception = &constraint_error; + msg = "SIGFPE"; + break; + + case SIGILL: + exception = &constraint_error; + msg = "SIGILL"; + break; + + case SIGSEGV: + exception = &storage_error; + msg = "stack overflow or erroneous memory access"; + break; + + case SIGBUS: + exception = &constraint_error; + msg = "SIGBUS"; + break; + + default: + exception = &program_error; + msg = "unhandled signal"; + } + + Raise_From_Signal_Handler (exception, msg); +} + +void +__gnat_install_handler () +{ + struct sigaction act; + + /* Set up signal handler to map synchronous signals to appropriate + exceptions. Make sure that the handler isn't interrupted by another + signal that might cause a scheduling event! */ + + act.sa_handler = __gnat_error_handler; + act.sa_flags = SA_NODEFER | SA_RESTART; + (void) sigemptyset (&act.sa_mask); + + (void) sigaction (SIGILL, &act, NULL); + (void) sigaction (SIGFPE, &act, NULL); + (void) sigaction (SIGSEGV, &act, NULL); + (void) sigaction (SIGBUS, &act, NULL); +} + +void __gnat_init_float (); + +void +__gnat_initialize () +{ + __gnat_install_handler (); + + /* XXX - Initialize floating-point coprocessor. This call is + needed because FreeBSD defaults to 64-bit precision instead + of 80-bit precision? We require the full precision for + proper operation, given that we have set Max_Digits etc + with this in mind */ + __gnat_init_float (); +} + /***************************************/ /* __gnat_initialize (VXWorks Version) */ /***************************************/ @@ -1749,7 +1831,7 @@ __gnat_install_handler (void) WIN32 and could be used under OS/2 */ #if defined (_WIN32) || defined (__INTERIX) || defined (__EMX__) \ - || defined (__Lynx__) || defined(__NetBSD__) + || defined (__Lynx__) || defined(__NetBSD__) || defined(__FreeBSD__) #define HAVE_GNAT_INIT_FLOAT diff --git a/gcc/ada/link.c b/gcc/ada/link.c index 5a8fbeb8339..4dd087658b0 100644 --- a/gcc/ada/link.c +++ b/gcc/ada/link.c @@ -154,6 +154,15 @@ unsigned char objlist_file_supported = 0; unsigned char using_gnu_linker = 0; const char *object_library_extension = ".a"; +#elif defined (__FreeBSD__) +char *object_file_option = ""; +char *run_path_option = ""; +char shared_libgnat_default = SHARED; +int link_max = 2147483647; +unsigned char objlist_file_supported = 0; +unsigned char using_gnu_linker = 0; +char *object_library_extension = ".a"; + #elif defined (linux) const char *object_file_option = ""; const char *run_path_option = "-Wl,-rpath,"; diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c index 9ec94ea819c..fcca318c7f5 100644 --- a/gcc/ada/sysdep.c +++ b/gcc/ada/sysdep.c @@ -291,7 +291,7 @@ __gnat_ttyname (int filedes) || (defined (__osf__) && ! defined (__alpha_vxworks)) || defined (WINNT) \ || defined (__MACHTEN__) || defined (hpux) || defined (_AIX) \ || (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \ - || defined (__CYGWIN__) + || defined (__CYGWIN__) || defined (__FreeBSD__) #ifdef __MINGW32__ #if OLD_MINGW @@ -348,7 +348,7 @@ getc_immediate_common (FILE *stream, || (defined (__osf__) && ! defined (__alpha_vxworks)) \ || defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (hpux) \ || defined (_AIX) || (defined (__svr4__) && defined (i386)) \ - || defined (__Lynx__) + || defined (__Lynx__) || defined (__FreeBSD__) char c; int nread; int good_one = 0; @@ -367,7 +367,7 @@ getc_immediate_common (FILE *stream, #if defined(linux) || defined (sun) || defined (sgi) || defined (__EMX__) \ || defined (__osf__) || defined (__MACHTEN__) || defined (hpux) \ || defined (_AIX) || (defined (__svr4__) && defined (i386)) \ - || defined (__Lynx__) + || defined (__Lynx__) || defined (__FreeBSD__) eof_ch = termios_rec.c_cc[VEOF]; /* If waiting (i.e. Get_Immediate (Char)), set MIN = 1 and wait for -- 2.30.2