* 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 <quinot@act-europe.fr>
* 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
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73700
138bc75d-0d04-0410-961f-
82ee72b054a4
+2003-11-18 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * 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 <quinot@act-europe.fr>
+
+ * 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 <guitton@act-europe.fr>
* 5zthrini.adb: Remove the call to Init_RTS at elaboration, as it is
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
#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. */
}
{
- enum machine_mode mode;
-
if (definition == 0
&& Present (Ancestor_Subtype (gnat_entity))
&& ! In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity))
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),
{
}
+/*************************************************/
+/* __gnat_initialize (FreeBSD version) */
+/*************************************************/
+
+#elif defined (__FreeBSD__)
+
+#include <signal.h>
+#include <unistd.h>
+
+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) */
/***************************************/
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
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,";
|| (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
|| (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;
#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