123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /* Copyright (C) 2002-2015 Free Software Foundation, Inc.
- Contributed by Andy Vaught and Paul Brook <paul@nowt.org>
- This file is part of the GNU Fortran runtime library (libgfortran).
- Libgfortran 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 3, or (at your option)
- any later version.
- Libgfortran 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.
- Under Section 7 of GPL version 3, you are granted additional
- permissions described in the GCC Runtime Library Exception, version
- 3.1, as published by the Free Software Foundation.
- You should have received a copy of the GNU General Public License and
- a copy of the GCC Runtime Library Exception along with this program;
- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- <http://www.gnu.org/licenses/>. */
- #include "libgfortran.h"
- #include <stdlib.h>
- #include <string.h>
- #include <limits.h>
- #include <errno.h>
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- /* Stupid function to be sure the constructor is always linked in, even
- in the case of static linking. See PR libfortran/22298 for details. */
- void
- stupid_function_name_for_static_linking (void)
- {
- return;
- }
- options_t options;
- /* This will be 0 for little-endian
- machines and 1 for big-endian machines.
- Currently minimal libgfortran only runs on little-endian devices
- which don't support constructors so this is just a constant. */
- int big_endian = 0;
- static int argc_save;
- static char **argv_save;
- static const char *exe_path;
- /* recursion_check()-- It's possible for additional errors to occur
- * during fatal error processing. We detect this condition here and
- * exit with code 4 immediately. */
- #define MAGIC 0x20DE8101
- static void
- recursion_check (void)
- {
- static int magic = 0;
- /* Don't even try to print something at this point */
- if (magic == MAGIC)
- sys_abort ();
- magic = MAGIC;
- }
- /* os_error()-- Operating system error. We get a message from the
- * operating system, show it and leave. Some operating system errors
- * are caught and processed by the library. If not, we come here. */
- void
- os_error (const char *message)
- {
- recursion_check ();
- printf ("Operating system error: ");
- printf ("%s\n", message);
- exit (1);
- }
- iexport(os_error);
- /* void runtime_error()-- These are errors associated with an
- * invalid fortran program. */
- void
- runtime_error (const char *message, ...)
- {
- va_list ap;
- recursion_check ();
- printf ("Fortran runtime error: ");
- va_start (ap, message);
- vprintf (message, ap);
- va_end (ap);
- printf ("\n");
- exit (2);
- }
- iexport(runtime_error);
- /* void runtime_error_at()-- These are errors associated with a
- * run time error generated by the front end compiler. */
- void
- runtime_error_at (const char *where, const char *message, ...)
- {
- va_list ap;
- recursion_check ();
- printf ("%s", where);
- printf ("\nFortran runtime error: ");
- va_start (ap, message);
- vprintf (message, ap);
- va_end (ap);
- printf ("\n");
- exit (2);
- }
- iexport(runtime_error_at);
- void
- runtime_warning_at (const char *where, const char *message, ...)
- {
- va_list ap;
- printf ("%s", where);
- printf ("\nFortran runtime warning: ");
- va_start (ap, message);
- vprintf (message, ap);
- va_end (ap);
- printf ("\n");
- }
- iexport(runtime_warning_at);
- /* void internal_error()-- These are this-can't-happen errors
- * that indicate something deeply wrong. */
- void
- internal_error (st_parameter_common *cmp, const char *message)
- {
- recursion_check ();
- printf ("Internal Error: ");
- printf ("%s", message);
- printf ("\n");
- /* This function call is here to get the main.o object file included
- when linking statically. This works because error.o is supposed to
- be always linked in (and the function call is in internal_error
- because hopefully it doesn't happen too often). */
- stupid_function_name_for_static_linking();
- exit (3);
- }
- /* Return the full path of the executable. */
- char *
- full_exe_path (void)
- {
- return (char *) exe_path;
- }
- /* Set the saved values of the command line arguments. */
- void
- set_args (int argc, char **argv)
- {
- argc_save = argc;
- argv_save = argv;
- exe_path = argv[0];
- }
- iexport(set_args);
- /* Retrieve the saved values of the command line arguments. */
- void
- get_args (int *argc, char ***argv)
- {
- *argc = argc_save;
- *argv = argv_save;
- }
- /* sys_abort()-- Terminate the program showing backtrace and dumping
- core. */
- void
- sys_abort (void)
- {
- /* If backtracing is enabled, print backtrace and disable signal
- handler for ABRT. */
- if (options.backtrace == 1
- || (options.backtrace == -1 && compile_options.backtrace == 1))
- {
- printf ("\nProgram aborted.\n");
- }
- abort();
- }
|