aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/runtime/main.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2015-08-23 21:50:30 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2015-08-23 21:50:30 +0000
commitad4f95e395b752371643327c1fdf71fac70de526 (patch)
tree2d9bb42bb8fba1bb8290c5fdeb49a6955a68c642 /libgfortran/runtime/main.c
parent1487cca00ca6f4e0fe60d72761737da162e96840 (diff)
downloadgcc-ad4f95e395b752371643327c1fdf71fac70de526.zip
gcc-ad4f95e395b752371643327c1fdf71fac70de526.tar.gz
gcc-ad4f95e395b752371643327c1fdf71fac70de526.tar.bz2
re PR libfortran/54572 (Use libbacktrace library)
PR libfortran/54572 * Makefile.def: Make libgfortran depend on libbacktrace. * Makefile.in: Regenerate. * config-lang.in: Add libbacktrace to target_libs. * Makefile.am (libgfortran_la_LDFLAGS): Link in libbacktrace. (AM_CPPFLAGS): Add libbacktrace directories to include paths. * Makefile.in: Regenerate. * aclocal.m4: Regenerate. * config.h.in: Regenerate. * configure: Regenerate. * configure.ac: Remove checks for strtok_r, wait, execve, pipe, and dup2. Remove call to GCC_CHECK_UNWIND_GETIPINFO. * libgfortran.h (full_exe_path, find_addr2line, backtrace): Remove prototypes. (show_backtrace): Add prototype. * runtime/backtrace.c: Rework file entirely. * runtime/compile_options.c (backtrace_handler): Rename backtrace to show_backtrace. (maybe_find_addr2line): Remove function. (set_options): Remove call to maybe_find_addr2line. * runtime/error.c (sys_abort): Rename backtrace to show_backtrace. * runtime/main.c (store_exe_path): Empty function body. (full_exe_path, gfstrtok_r, find_addr2line): Remove functions. (cleanup): Don't free removed variables. * runtime/minimal.c (full_exe_path): Remove function. (set_args): Don't set exe_path. * gfortran.dg/backtrace_1.f90: New test. From-SVN: r227106
Diffstat (limited to 'libgfortran/runtime/main.c')
-rw-r--r--libgfortran/runtime/main.c166
1 files changed, 4 insertions, 162 deletions
diff --git a/libgfortran/runtime/main.c b/libgfortran/runtime/main.c
index cb8e518..ecb613d 100644
--- a/libgfortran/runtime/main.c
+++ b/libgfortran/runtime/main.c
@@ -70,162 +70,13 @@ determine_endianness (void)
static int argc_save;
static char **argv_save;
-static const char *exe_path;
-static bool please_free_exe_path_when_done;
-/* Save the path under which the program was called, for use in the
- backtrace routines. */
void
-store_exe_path (const char * argv0)
+store_exe_path (const char * argv0 __attribute__ ((unused)))
{
-#ifndef DIR_SEPARATOR
-#define DIR_SEPARATOR '/'
-#endif
-
- char *cwd, *path;
-
- /* This can only happen if store_exe_path is called multiple times. */
- if (please_free_exe_path_when_done)
- free ((char *) exe_path);
-
- /* Reading the /proc/self/exe symlink is Linux-specific(?), but if
- it works it gives the correct answer. */
-#ifdef HAVE_READLINK
- ssize_t len, psize = 256;
- while (1)
- {
- path = xmalloc (psize);
- len = readlink ("/proc/self/exe", path, psize);
- if (len < 0)
- {
- free (path);
- break;
- }
- else if (len < psize)
- {
- path[len] = '\0';
- exe_path = strdup (path);
- free (path);
- please_free_exe_path_when_done = true;
- return;
- }
- /* The remaining option is len == psize. */
- free (path);
- psize *= 4;
- }
-#endif
-
- /* If the path is absolute or on a simulator where argv is not set. */
-#ifdef __MINGW32__
- if (argv0 == NULL
- || ('A' <= argv0[0] && argv0[0] <= 'Z' && argv0[1] == ':')
- || ('a' <= argv0[0] && argv0[0] <= 'z' && argv0[1] == ':')
- || (argv0[0] == '/' && argv0[1] == '/')
- || (argv0[0] == '\\' && argv0[1] == '\\'))
-#else
- if (argv0 == NULL || argv0[0] == DIR_SEPARATOR)
-#endif
- {
- exe_path = argv0;
- please_free_exe_path_when_done = false;
- return;
- }
-
-#ifdef HAVE_GETCWD
- size_t cwdsize = 256;
- while (1)
- {
- cwd = xmalloc (cwdsize);
- if (getcwd (cwd, cwdsize))
- break;
- else if (errno == ERANGE)
- {
- free (cwd);
- cwdsize *= 4;
- }
- else
- {
- free (cwd);
- cwd = NULL;
- break;
- }
- }
-#else
- cwd = NULL;
-#endif
-
- if (!cwd)
- {
- exe_path = argv0;
- please_free_exe_path_when_done = false;
- return;
- }
-
- /* exe_path will be cwd + "/" + argv[0] + "\0". This will not work
- if the executable is not in the cwd, but at this point we're out
- of better ideas. */
- size_t pathlen = strlen (cwd) + 1 + strlen (argv0) + 1;
- path = xmalloc (pathlen);
- snprintf (path, pathlen, "%s%c%s", cwd, DIR_SEPARATOR, argv0);
- free (cwd);
- exe_path = path;
- please_free_exe_path_when_done = true;
-}
-
-
-/* Return the full path of the executable. */
-char *
-full_exe_path (void)
-{
- return (char *) exe_path;
-}
-
-
-#ifndef HAVE_STRTOK_R
-static char*
-gfstrtok_r (char *str, const char *delim,
- char **saveptr __attribute__ ((unused)))
-{
- return strtok (str, delim);
-}
-#define strtok_r gfstrtok_r
-#endif
-
-char *addr2line_path;
-
-/* Find addr2line and store the path. */
-
-void
-find_addr2line (void)
-{
-#ifdef HAVE_ACCESS
-#define A2L_LEN 11
- char *path = secure_getenv ("PATH");
- if (!path)
- return;
- char *tp = strdup (path);
- if (!tp)
- return;
- size_t n = strlen (path);
- char *ap = xmalloc (n + A2L_LEN);
- char *saveptr;
- for (char *str = tp;; str = NULL)
- {
- char *token = strtok_r (str, ":", &saveptr);
- if (!token)
- break;
- size_t toklen = strlen (token);
- memcpy (ap, token, toklen);
- memcpy (ap + toklen, "/addr2line", A2L_LEN);
- if (access (ap, R_OK|X_OK) == 0)
- {
- addr2line_path = strdup (ap);
- break;
- }
- }
- free (tp);
- free (ap);
-#endif
+ /* This function is now useless, but is retained due to ABI compatibility.
+ Remove when bumping the library ABI. */
+ ;
}
@@ -236,7 +87,6 @@ set_args (int argc, char **argv)
{
argc_save = argc;
argv_save = argv;
- store_exe_path (argv[0]);
}
iexport(set_args);
@@ -279,9 +129,6 @@ init (void)
/* if (argc > 1 && strcmp(argv[1], "--resume") == 0) resume(); */
#endif
- if (options.backtrace == 1)
- find_addr2line ();
-
random_seed_i4 (NULL, NULL, NULL);
}
@@ -292,9 +139,4 @@ static void __attribute__((destructor))
cleanup (void)
{
close_units ();
-
- if (please_free_exe_path_when_done)
- free ((char *) exe_path);
-
- free (addr2line_path);
}