diff options
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); } |