toolchain-funcs.eclass: fix tc-ld-disable-gold when using clang
authorRahul Chaudhry <rahulchaudhry@chromium.org>
Thu, 24 May 2018 23:05:04 +0000 (16:05 -0700)
committerAnthony G. Basile <blueness@gentoo.org>
Sat, 26 May 2018 21:32:48 +0000 (17:32 -0400)
tc-ld-disable-gold checks gcc version to see if we have gcc-4.8+
The version check fails if clang is set as the compiler.
  $ clang -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"
  4 2 1
i.e. clang returns a gcc version of 4.2.1
This results in incorrectly adding -B ... to LDFLAGS, when clang
supports "-fuse-ld" just fine.

Support for "-fuse-ld" first appeared in clang-3.5, so check clang
version and use the flag if supported.

eclass/toolchain-funcs.eclass

index 1c8090cf75c721a4b05b8ea711ea80794d88c3f3..cea8949b45d7eca5111203d06c716803f1c45d33 100644 (file)
@@ -391,11 +391,28 @@ tc-ld-disable-gold() {
        local path_ld=$(which "${bfd_ld}" 2>/dev/null)
        [[ -e ${path_ld} ]] && export LD=${bfd_ld}
 
-       # Set up LDFLAGS to select gold based on the gcc version.
-       local major=$(gcc-major-version "$@")
-       local minor=$(gcc-minor-version "$@")
-       if [[ ${major} -lt 4 ]] || [[ ${major} -eq 4 && ${minor} -lt 8 ]] ; then
-               # <=gcc-4.7 requires some coercion.  Only works if bfd exists.
+       # Set up LDFLAGS to select gold based on the gcc / clang version.
+       local fallback="true"
+       if tc-is-gcc; then
+               local major=$(gcc-major-version "$@")
+               local minor=$(gcc-minor-version "$@")
+               if [[ ${major} -gt 4 ]] || [[ ${major} -eq 4 && ${minor} -ge 8 ]]; then
+                       # gcc-4.8+ supports -fuse-ld directly.
+                       export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"
+                       fallback="false"
+               fi
+       elif tc-is-clang; then
+               local major=$(clang-major-version "$@")
+               local minor=$(clang-minor-version "$@")
+               if [[ ${major} -gt 3 ]] || [[ ${major} -eq 3 && ${minor} -ge 5 ]]; then
+                       # clang-3.5+ supports -fuse-ld directly.
+                       export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"
+                       fallback="false"
+               fi
+       fi
+       if [[ ${fallback} == "true" ]] ; then
+               # <=gcc-4.7 and <=clang-3.4 require some coercion.
+               # Only works if bfd exists.
                if [[ -e ${path_ld} ]] ; then
                        local d="${T}/bfd-linker"
                        mkdir -p "${d}"
@@ -404,9 +421,6 @@ tc-ld-disable-gold() {
                else
                        die "unable to locate a BFD linker to bypass gold"
                fi
-       else
-               # gcc-4.8+ supports -fuse-ld directly.
-               export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"
        fi
 }