From ccbe637df0be9d6aa3710a605666f135c071402e Mon Sep 17 00:00:00 2001 From: Sterling Augustine Date: Fri, 31 Aug 2018 17:59:03 +0000 Subject: [PATCH] Refactor Addlibgcc to make the when and what logic more straightfoward. Add Android tests. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341231 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChains/CommonArgs.cpp | 43 ++++++++++++++++++++-------- test/Driver/linux-ld.c | 24 ++++++++++++++++ 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/lib/Driver/ToolChains/CommonArgs.cpp b/lib/Driver/ToolChains/CommonArgs.cpp index 1e093b25b9..9e6aeea958 100644 --- a/lib/Driver/ToolChains/CommonArgs.cpp +++ b/lib/Driver/ToolChains/CommonArgs.cpp @@ -1126,23 +1126,42 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, bool IsIAMCU = Triple.isOSIAMCU(); bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || Args.hasArg(options::OPT_static); - if (!D.CCCIsCXX()) + + // The driver ignores -shared-libgcc and therefore treats such cases as + // unspecified. Breaking out the two variables as below makes the current + // behavior explicit. + bool UnspecifiedLibgcc = !StaticLibgcc; + bool SharedLibgcc = !StaticLibgcc; + + // Gcc adds libgcc arguments in various ways: + // + // gcc : -lgcc --as-needed -lgcc_s --no-as-needed + // g++ : -lgcc_s -lgcc + // gcc shared: -lgcc_s -lgcc + // g++ shared: -lgcc_s -lgcc + // gcc static: -lgcc -lgcc_eh + // g++ static: -lgcc -lgcc_eh + // + // Also, certain targets need additional adjustments. + + bool LibGccFirst = (D.CCCIsCC() && UnspecifiedLibgcc) || StaticLibgcc; + if (LibGccFirst) CmdArgs.push_back("-lgcc"); - if (StaticLibgcc || isAndroid) { - if (D.CCCIsCXX()) - CmdArgs.push_back("-lgcc"); - } else { - if (!D.CCCIsCXX() && !isCygMing) - CmdArgs.push_back("--as-needed"); + bool AsNeeded = D.CCCIsCC() && !StaticLibgcc && !isAndroid && !isCygMing; + if (AsNeeded) + CmdArgs.push_back("--as-needed"); + + if ((UnspecifiedLibgcc || SharedLibgcc) && !isAndroid) CmdArgs.push_back("-lgcc_s"); - if (!D.CCCIsCXX() && !isCygMing) - CmdArgs.push_back("--no-as-needed"); - } - if (StaticLibgcc && !isAndroid && !IsIAMCU) + else if (StaticLibgcc && !isAndroid && !IsIAMCU) CmdArgs.push_back("-lgcc_eh"); - else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX()) + + if (AsNeeded) + CmdArgs.push_back("--no-as-needed"); + + if (!LibGccFirst) CmdArgs.push_back("-lgcc"); // According to Android ABI, we have to link with libdl if we are diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 8194b97d3b..6079c7458d 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -230,6 +230,30 @@ // SKIP-CHECK-CLANG-SHARED-LIBGCC-DYNAMIC: "-lc" // SKIP-CHECK-CLANG-SHARED-LIBGCC-DYNAMIC: "-lgcc_s" "-lgcc" // +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=aarch64-linux-android -rtlib=platform \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CLANG-ANDROID-NONE %s +// CHECK-CLANG-ANDROID-NONE: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-CLANG-ANDROID-NONE: "-lgcc" "-ldl" "-lc" +// +// RUN: %clang -shared -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=aarch64-linux-android -rtlib=platform \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CLANG-ANDROID-SHARED %s +// CHECK-CLANG-ANDROID-SHARED: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-CLANG-ANDROID-SHARED: "-lgcc" "-ldl" "-lc" +// +// RUN: %clang -static -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=aarch64-linux-android -rtlib=platform \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-CLANG-ANDROID-STATIC %s +// CHECK-CLANG-ANDROID-STATIC: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-CLANG-ANDROID-STATIC: "--start-group" "-lgcc" "-lc" "--end-group" +// // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: --target=x86_64-unknown-linux -rtlib=platform \ // RUN: -static \ -- 2.40.0