From: fxcoudert Date: Wed, 27 Jun 2007 22:58:37 +0000 (+0000) Subject: PR other/31400 X-Git-Tag: upstream/4.9.2~47843 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9a61fba11c6ef8f8b06a09ab26bab6ec2df6eff1;p=platform%2Fupstream%2Flinaro-gcc.git PR other/31400 * gcc.c (process_command): Recognize the new -static-libgfortran option. * lang.opt (static-libgfortran): New option. * gfortranspec.c (ADD_ARG_LIBGFORTRAN): New macro. (Option): Add OPTION_static and OPTION_static_libgfortran. (lookup_option): Handle the new -static-libgfortran option. (lang_specific_driver): Check whether -static is passed. Handle the new -static-libgfortran option. * options.c (gfc_handle_option): If -static-libgfortran is passed and isn't supported on this configuration, error out. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126068 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b707ba..174f39e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-28 Francois-Xavier Coudert + + PR other/31400 + * gcc.c (process_command): Recognize the new -static-libgfortran + option. + 2007-06-27 Rask Ingemann Lambertsen PR target/32418 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6fcd5bc..d8be9304 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,15 @@ +2007-06-28 Francois-Xavier Coudert + + PR other/31400 + * lang.opt (static-libgfortran): New option. + * gfortranspec.c (ADD_ARG_LIBGFORTRAN): New macro. + (Option): Add OPTION_static and OPTION_static_libgfortran. + (lookup_option): Handle the new -static-libgfortran option. + (lang_specific_driver): Check whether -static is passed. + Handle the new -static-libgfortran option. + * options.c (gfc_handle_option): If -static-libgfortran is + passed and isn't supported on this configuration, error out. + 2007-06-27 Daniel Franke PR fortran/32467 diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c index 5913bd3..5cc3e15 100644 --- a/gcc/fortran/gfortranspec.c +++ b/gcc/fortran/gfortranspec.c @@ -66,6 +66,20 @@ Boston, MA 02110-1301, USA. */ #define FORTRAN_LIBRARY "-lgfortran" #endif +#ifdef HAVE_LD_STATIC_DYNAMIC +#define ADD_ARG_LIBGFORTRAN(arg) \ + { \ + if (static_lib && !static_linking) \ + append_arg ("-Wl,-Bstatic"); \ + append_arg (arg); \ + if (static_lib && !static_linking) \ + append_arg ("-Wl,-Bdynamic"); \ + } +#else +#define ADD_ARG_LIBGFORTRAN(arg) append_arg (arg); +#endif + + /* Options this driver needs to recognize, not just know how to skip over. */ typedef enum @@ -82,6 +96,8 @@ typedef enum -nodefaultlibs. */ OPTION_o, /* Aka --output. */ OPTION_S, /* Aka --assemble. */ + OPTION_static, /* -static. */ + OPTION_static_libgfortran, /* -static-libgfortran. */ OPTION_syntax_only, /* -fsyntax-only. */ OPTION_v, /* Aka --verbose. */ OPTION_version, /* --version. */ @@ -170,6 +186,8 @@ lookup_option (Option *xopt, int *xskip, const char **xarg, const char *text) opt = OPTION_nostdlib; else if (!strcmp (text, "-fsyntax-only")) opt = OPTION_syntax_only; + else if (!strcmp (text, "-static-libgfortran")) + opt = OPTION_static_libgfortran; else if (!strcmp (text, "-dumpversion")) opt = OPTION_version; else if (!strcmp (text, "-fversion")) /* Really --version!! */ @@ -265,6 +283,12 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, /* By default, we throw on the math library if we have one. */ int need_math = (MATH_LIBRARY[0] != '\0'); + /* Whether we should link a static libgfortran. */ + int static_lib = 0; + + /* Whether we need to link statically. */ + int static_linking = 0; + /* The number of input and output files in the incoming arg list. */ int n_infiles = 0; int n_outfiles = 0; @@ -323,6 +347,13 @@ lang_specific_driver (int *in_argc, const char *const **in_argv, library = 0; break; + case OPTION_static_libgfortran: + static_lib = 1; + break; + + case OPTION_static: + static_linking = 1; + case OPTION_l: ++n_infiles; break; @@ -468,11 +499,16 @@ For more information about these matters, see the file named COPYING\n\n")); append_arg (FORTRAN_INIT); use_init = 1; } - append_arg (FORTRAN_LIBRARY); + + ADD_ARG_LIBGFORTRAN (FORTRAN_LIBRARY); } } else if (strcmp (argv[i], FORTRAN_LIBRARY) == 0) - saw_library = 1; /* -l. */ + { + saw_library = 1; /* -l. */ + ADD_ARG_LIBGFORTRAN (argv[i]); + continue; + } else { /* Other library, or filename. */ if (saw_library == 1 && need_math) @@ -498,7 +534,9 @@ For more information about these matters, see the file named COPYING\n\n")); append_arg (FORTRAN_INIT); use_init = 1; } - append_arg (library); + ADD_ARG_LIBGFORTRAN (library); + /* Fall through. */ + case 1: if (need_math) append_arg (MATH_LIBRARY); diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index fe2c4aa..f5385a1 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -253,6 +253,10 @@ funderscoring Fortran Append underscores to externally visible names +static-libgfortran +Fortran +Statically link the GNU Fortran helper library (libgfortran) + std=f2003 Fortran Conform to the ISO Fortran 2003 standard diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c index fbcb94e..50f5e94 100644 --- a/gcc/fortran/options.c +++ b/gcc/fortran/options.c @@ -551,6 +551,13 @@ gfc_handle_option (size_t scode, const char *arg, int value) gfc_option.flag_second_underscore = value; break; + case OPT_static_libgfortran: +#ifndef HAVE_LD_STATIC_DYNAMIC + gfc_fatal_error ("-static-libgfortran is not supported in this " + "configuration"); +#endif + break; + case OPT_fimplicit_none: gfc_option.flag_implicit_none = value; break; diff --git a/gcc/gcc.c b/gcc/gcc.c index 11b6b08..32fb21b 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -4214,11 +4214,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" switches[n_switches].live_cond = SWITCH_OK; switches[n_switches].validated = 0; switches[n_switches].ordering = 0; - /* These are always valid, since gcc.c itself understands them. */ + /* These are always valid, since gcc.c itself understands the + first four and gfortranspec.c understands -static-libgfortran. */ if (!strcmp (p, "save-temps") || !strcmp (p, "static-libgcc") || !strcmp (p, "shared-libgcc") - || !strcmp (p, "pipe")) + || !strcmp (p, "pipe") + || !strcmp (p, "static-libgfortran")) switches[n_switches].validated = 1; else {