From 1b4a99913beba2fb4edccb58481a92e8ab6a7d9f Mon Sep 17 00:00:00 2001 From: Rahul Chaudhry Date: Thu, 24 May 2018 16:05:04 -0700 Subject: [PATCH] toolchain-funcs.eclass: fix tc-ld-disable-gold when using clang 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 | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/eclass/toolchain-funcs.eclass b/eclass/toolchain-funcs.eclass index 1c8090cf75c7..cea8949b45d7 100644 --- a/eclass/toolchain-funcs.eclass +++ b/eclass/toolchain-funcs.eclass @@ -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 } -- 2.26.2