diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-04-24 23:39:32 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-04-24 23:39:32 +0200 |
commit | 0b4718956d6a3030dacd0e65f6a21c674593b9ca (patch) | |
tree | fe0aff5a3b463dbc2be7987281aa3e301337df98 /gcc/d/d-spec.cc | |
parent | 28b733ea04f4f5d85cab621e901aa8ba7b6b1ae4 (diff) | |
download | gcc-0b4718956d6a3030dacd0e65f6a21c674593b9ca.zip gcc-0b4718956d6a3030dacd0e65f6a21c674593b9ca.tar.gz gcc-0b4718956d6a3030dacd0e65f6a21c674593b9ca.tar.bz2 |
d: Fix order of precedence for -defaultlib and -debuglib
The order of precedence used by the upstream reference compiler for
determining what library to link against is:
- No library if -nophoboslib or -fno-druntime was seen.
- The library passed to -debuglib if -g was also seen.
- The library passed to -defaultlib
- The in-tree libgphobos library.
This aligns the D language driver to follow the same rules.
gcc/d/ChangeLog:
* d-spec.cc (need_phobos): Remove.
(lang_specific_driver): Replace need_phobos with phobos_library.
Reorder -debuglib and -defaultlib to have precedence over libphobos.
(lang_specific_pre_link): Remove test for need_phobos.
Diffstat (limited to 'gcc/d/d-spec.cc')
-rw-r--r-- | gcc/d/d-spec.cc | 84 |
1 files changed, 36 insertions, 48 deletions
diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc index e084422..f474476 100644 --- a/gcc/d/d-spec.cc +++ b/gcc/d/d-spec.cc @@ -61,10 +61,6 @@ enum phobos_action static phobos_action phobos_library = PHOBOS_DEFAULT; -/* If true, use the standard D runtime library when linking with - standard libraries. */ -static bool need_phobos = true; - /* If true, do load libgphobos.spec even if not needed otherwise. */ static bool need_spec = false; @@ -151,13 +147,15 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, break; case OPT_nophoboslib: - need_phobos = false; + phobos_library = PHOBOS_NOLINK; args[i] |= SKIPOPT; break; case OPT_fdruntime: if (!value) - need_phobos = false; + phobos_library = PHOBOS_NOLINK; + else + phobos_library = PHOBOS_LINK; break; case OPT_defaultlib_: @@ -165,7 +163,6 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, free (CONST_CAST (char *, defaultlib)); if (arg != NULL) { - need_phobos = false; args[i] |= SKIPOPT; defaultlib = XNEWVEC (char, strlen (arg)); strcpy (CONST_CAST (char *, defaultlib), arg); @@ -177,7 +174,6 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, free (CONST_CAST (char *, debuglib)); if (arg != NULL) { - need_phobos = false; args[i] |= SKIPOPT; debuglib = XNEWVEC (char, strlen (arg)); strcpy (CONST_CAST (char *, debuglib), arg); @@ -314,10 +310,11 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, #endif /* Make sure to have room for the trailing NULL argument. - - needstdcxx might add `-lstdcxx' + - need_stdcxx might add `-lstdcxx' - libphobos adds `-Bstatic -lphobos -Bdynamic' - only_source adds 1 more arg, also maybe add `-o'. */ - num_args = argc + need_stdcxx + shared_libgcc + need_phobos * 4 + 2; + num_args = argc + need_stdcxx + shared_libgcc + + (phobos_library != PHOBOS_NOLINK) * 4 + 2; new_decoded_options = XNEWVEC (cl_decoded_option, num_args); i = 0; @@ -409,60 +406,51 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, } /* Add `-lgphobos' if we haven't already done so. */ - if (phobos_library != PHOBOS_NOLINK && need_phobos) + if (phobos_library != PHOBOS_NOLINK) { /* Default to static linking. */ if (phobos_library != PHOBOS_DYNAMIC) phobos_library = PHOBOS_STATIC; #ifdef HAVE_LD_STATIC_DYNAMIC - if (phobos_library == PHOBOS_DYNAMIC && static_link) - { - generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER, - &new_decoded_options[j]); - j++; - } - else if (phobos_library == PHOBOS_STATIC && !static_link) + if (phobos_library == PHOBOS_STATIC && !static_link) { generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER, - &new_decoded_options[j]); - j++; + &new_decoded_options[j++]); } #endif - - generate_option (OPT_l, - saw_profile_flag ? LIBPHOBOS_PROFILE : LIBPHOBOS, 1, - CL_DRIVER, &new_decoded_options[j]); - added_libraries++; - j++; - -#ifdef HAVE_LD_STATIC_DYNAMIC - if (phobos_library == PHOBOS_DYNAMIC && static_link) + /* Order of precedence in determining what library to link against is: + - `-l<lib>' from `-debuglib=<lib>' if `-g' was also seen. + - `-l<lib>' from `-defaultlib=<lib>'. + - `-lgphobos' unless `-nophoboslib' or `-fno-druntime' was seen. */ + if (debuglib && saw_debug_flag) { - generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER, - &new_decoded_options[j]); - j++; + generate_option (OPT_l, debuglib, 1, CL_DRIVER, + &new_decoded_options[j++]); + added_libraries++; } - else if (phobos_library == PHOBOS_STATIC && !static_link) + else if (defaultlib) + { + generate_option (OPT_l, defaultlib, 1, CL_DRIVER, + &new_decoded_options[j++]); + added_libraries++; + } + else + { + generate_option (OPT_l, + saw_profile_flag ? LIBPHOBOS_PROFILE : LIBPHOBOS, 1, + CL_DRIVER, &new_decoded_options[j++]); + added_libraries++; + } + +#ifdef HAVE_LD_STATIC_DYNAMIC + if (phobos_library == PHOBOS_STATIC && !static_link) { generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER, - &new_decoded_options[j]); - j++; + &new_decoded_options[j++]); } #endif } - else if (saw_debug_flag && debuglib) - { - generate_option (OPT_l, debuglib, 1, CL_DRIVER, - &new_decoded_options[j++]); - added_libraries++; - } - else if (defaultlib) - { - generate_option (OPT_l, defaultlib, 1, CL_DRIVER, - &new_decoded_options[j++]); - added_libraries++; - } if (saw_libcxx) new_decoded_options[j++] = *saw_libcxx; @@ -492,7 +480,7 @@ lang_specific_driver (cl_decoded_option **in_decoded_options, int lang_specific_pre_link (void) { - if ((phobos_library != PHOBOS_NOLINK && need_phobos) || need_spec) + if ((phobos_library != PHOBOS_NOLINK) || need_spec) do_spec ("%:include(libgphobos.spec)"); return 0; |