diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2015-08-23 21:50:30 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2015-08-23 21:50:30 +0000 |
commit | ad4f95e395b752371643327c1fdf71fac70de526 (patch) | |
tree | 2d9bb42bb8fba1bb8290c5fdeb49a6955a68c642 /libgfortran/runtime/main.c | |
parent | 1487cca00ca6f4e0fe60d72761737da162e96840 (diff) | |
download | gcc-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.c | 166 |
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); } |