diff options
author | Tobias Burnus <burnus@net-b.de> | 2009-05-26 23:19:57 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2009-05-26 23:19:57 +0200 |
commit | 092231a8d635d601a3d05a284f279286f59cab9e (patch) | |
tree | 43a6fbb9dd54816b1c1a284ffc7fba3adac67337 /libgfortran | |
parent | 9a0bab0be682be2aaee5f1146518c4d94d44ac8e (diff) | |
download | gcc-092231a8d635d601a3d05a284f279286f59cab9e.zip gcc-092231a8d635d601a3d05a284f279286f59cab9e.tar.gz gcc-092231a8d635d601a3d05a284f279286f59cab9e.tar.bz2 |
re PR fortran/39178 (Generate main() rather than using a main in libgfortran/fmain.c)
fortran/
2009-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/39178
* gfortranspec.c (lang_specific_driver): Stop linking
libgfortranbegin.
* trans-decl.c (gfc_build_builtin_function_decls): Stop
making MAIN__ publicly visible.
(gfc_build_builtin_function_decls): Add
gfor_fndecl_set_args.
(create_main_function) New function.
(gfc_generate_function_code): Use it.
libgfortran/
2009-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/39178
* runtime/main.c (store_exe_path): Make static
and multiple-times callable.
(set_args): Call store_exe_path.
* libgfortran.h: Remove store_exe_path prototype.
* fmain.c (main): Remove store_exe_path call.
From-SVN: r147883
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 9 | ||||
-rw-r--r-- | libgfortran/fmain.c | 6 | ||||
-rw-r--r-- | libgfortran/libgfortran.h | 3 | ||||
-rw-r--r-- | libgfortran/runtime/main.c | 48 |
4 files changed, 38 insertions, 28 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index e9acb8b..e651606 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,12 @@ +2009-05-26 Tobias Burnus <burnus@net-b.de> + + PR fortran/39178 + * runtime/main.c (store_exe_path): Make static + and multiple-times callable. + (set_args): Call store_exe_path. + * libgfortran.h: Remove store_exe_path prototype. + * fmain.c (main): Remove store_exe_path call. + 2009-05-19 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libfortran/37754 diff --git a/libgfortran/fmain.c b/libgfortran/fmain.c index 1d6b45e..2e8ed88 100644 --- a/libgfortran/fmain.c +++ b/libgfortran/fmain.c @@ -9,12 +9,8 @@ void MAIN__ (void); int main (int argc, char *argv[]) { - /* Store the path of the executable file. */ - store_exe_path (argv[0]); - /* Set up the runtime environment. */ - set_args (argc, argv); - + PREFIX(set_args) (argc, argv); /* Call the Fortran main program. Internally this is a function called MAIN__ */ diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index 3591fa9..85b454d 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -610,9 +610,6 @@ export_proto(set_args); extern void get_args (int *, char ***); internal_proto(get_args); -extern void store_exe_path (const char *); -export_proto(store_exe_path); - extern char * full_exe_path (void); internal_proto(full_exe_path); diff --git a/libgfortran/runtime/main.c b/libgfortran/runtime/main.c index 3cccc3d..6df2775 100644 --- a/libgfortran/runtime/main.c +++ b/libgfortran/runtime/main.c @@ -69,31 +69,12 @@ determine_endianness (void) static int argc_save; static char **argv_save; -/* Set the saved values of the command line arguments. */ - -void -set_args (int argc, char **argv) -{ - argc_save = argc; - argv_save = argv; -} - -/* Retrieve the saved values of the command line arguments. */ - -void -get_args (int *argc, char ***argv) -{ - *argc = argc_save; - *argv = argv_save; -} - - static const char *exe_path; static int please_free_exe_path_when_done; /* Save the path under which the program was called, for use in the backtrace routines. */ -void +static void store_exe_path (const char * argv0) { #ifndef PATH_MAX @@ -106,6 +87,10 @@ store_exe_path (const char * argv0) char buf[PATH_MAX], *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); + /* On the simulator argv is not set. */ if (argv0 == NULL || argv0[0] == '/') { @@ -128,6 +113,7 @@ store_exe_path (const char * argv0) please_free_exe_path_when_done = 1; } + /* Return the full path of the executable. */ char * full_exe_path (void) @@ -135,6 +121,28 @@ 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; + store_exe_path (argv[0]); +} + + +/* Retrieve the saved values of the command line arguments. */ + +void +get_args (int *argc, char ***argv) +{ + *argc = argc_save; + *argv = argv_save; +} + + /* Initialize the runtime library. */ static void __attribute__((constructor)) |