From c0f5cd1928bd099e407ce0bac43edb830717edb1 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 8 Oct 2012 21:31:38 +0000 Subject: [PATCH] Make Bitrig's clang understand -stdlib= correctly. With this patch Bitrig can use a different c++ library without pain and within the normal commandline parameters. Original patch by David Hill, with lots of fixes and cleanup by me. llvm-svn: 165430 --- clang/lib/Driver/ToolChains.cpp | 40 ++++++++++++++++++++++++++++++++-------- clang/test/Driver/bitrig.c | 14 ++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 clang/test/Driver/bitrig.c diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 7b6e2082..529f7bf 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -1664,19 +1664,43 @@ void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, DriverArgs.hasArg(options::OPT_nostdincxx)) return; - std::string Triple = getTriple().str(); - if (Triple.substr(0, 5) == "amd64") - Triple.replace(0, 5, "x86_64"); - - addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2"); - addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/backward"); - addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/" + Triple); + switch (GetCXXStdlibType(DriverArgs)) { + case ToolChain::CST_Libcxx: + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/usr/include/c++/"); + break; + case ToolChain::CST_Libstdcxx: + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/usr/include/c++/stdc++"); + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/usr/include/c++/stdc++/backward"); + StringRef Triple = getTriple().str(); + if (Triple.startswith("amd64")) + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" + + Triple.substr(5)); + else + addSystemInclude(DriverArgs, CC1Args, + getDriver().SysRoot + "/usr/include/c++/stdc++/" + + Triple); + break; + } } void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const { - CmdArgs.push_back("-lstdc++"); + switch (GetCXXStdlibType(Args)) { + case ToolChain::CST_Libcxx: + CmdArgs.push_back("-lc++"); + CmdArgs.push_back("-lcxxrt"); + // Include supc++ to provide Unwind until provided by libcxx. + CmdArgs.push_back("-lgcc"); + break; + case ToolChain::CST_Libstdcxx: + CmdArgs.push_back("-lstdc++"); + break; + } } /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. diff --git a/clang/test/Driver/bitrig.c b/clang/test/Driver/bitrig.c new file mode 100644 index 0000000..6359bb4 --- /dev/null +++ b/clang/test/Driver/bitrig.c @@ -0,0 +1,14 @@ +// RUN: %clang -no-canonical-prefixes -ccc-clang-archs "" -target amd64-pc-bitrig %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-C %s +// CHECK-LD-C: clang{{.*}}" "-cc1" "-triple" "amd64-pc-bitrig" +// CHECK-LD-C: ld{{.*}}" {{.*}} "-lc" "-lclang_rt.amd64" + +// RUN: %clangxx -no-canonical-prefixes -ccc-clang-archs "" -target amd64-pc-bitrig %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-CXX %s +// CHECK-LD-CXX: clang{{.*}}" "-cc1" "-triple" "amd64-pc-bitrig" +// CHECK-LD-CXX: ld{{.*}}" {{.*}} "-lstdc++" "-lm" "-lc" "-lclang_rt.amd64" + +// RUN: %clangxx -stdlib=libc++ -no-canonical-prefixes -ccc-clang-archs "" -target amd64-pc-bitrig %s -### 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LD-CXX-STDLIB %s +// CHECK-LD-CXX-STDLIB: clang{{.*}}" "-cc1" "-triple" "amd64-pc-bitrig" +// CHECK-LD-CXX-STDLIB: ld{{.*}}" {{.*}} "-lc++" "-lcxxrt" "-lgcc" "-lm" "-lc" "-lclang_rt.amd64" -- 2.7.4