summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
diff options
context:
space:
mode:
authorpascal <pascal@openbsd.org>2016-09-05 12:04:53 +0000
committerpascal <pascal@openbsd.org>2016-09-05 12:04:53 +0000
commit2238f08b8009b3692884dda3604c06d82e8aa1e3 (patch)
tree9fa06d30cfa15a9087dc701a15d7391f6c90feaf /gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
parentuse OSREV and OSrev instead of setting them in the makefile (diff)
downloadwireguard-openbsd-2238f08b8009b3692884dda3604c06d82e8aa1e3.tar.xz
wireguard-openbsd-2238f08b8009b3692884dda3604c06d82e8aa1e3.zip
Let clang use libc++/libc++abi and its header files per default. You can still
use the old libstdc++ by specifying -stdlib=libstdc++. with hints from/looks good to patrick@, ok kettenis@
Diffstat (limited to 'gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp')
-rw-r--r--gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp b/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
index 99c7b8e68c6..45622b22ab5 100644
--- a/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
+++ b/gnu/llvm/tools/clang/lib/Driver/ToolChains.cpp
@@ -2986,6 +2986,58 @@ Tool *OpenBSD::buildAssembler() const {
Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
+ToolChain::CXXStdlibType OpenBSD::GetCXXStdlibType(const ArgList &Args) const {
+ if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
+ StringRef Value = A->getValue();
+ if (Value == "libstdc++")
+ return ToolChain::CST_Libstdcxx;
+ if (Value == "libc++")
+ return ToolChain::CST_Libcxx;
+
+ getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
+ }
+ return ToolChain::CST_Libcxx;
+}
+
+void OpenBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
+ ArgStringList &CC1Args) const {
+ if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
+ DriverArgs.hasArg(options::OPT_nostdincxx))
+ return;
+
+ switch (GetCXXStdlibType(DriverArgs)) {
+ case ToolChain::CST_Libcxx:
+ addSystemInclude(DriverArgs, CC1Args,
+ getDriver().SysRoot + "/usr/include/c++/v1");
+ break;
+ case ToolChain::CST_Libstdcxx:
+ std::string Triple = getTriple().str();
+ if (Triple.substr(0, 6) == "x86_64")
+ Triple.replace(0, 6, "amd64");
+ addSystemInclude(DriverArgs, CC1Args,
+ getDriver().SysRoot + "/usr/include/g++");
+ addSystemInclude(DriverArgs, CC1Args,
+ getDriver().SysRoot + "/usr/include/g++/" + Triple);
+ addSystemInclude(DriverArgs, CC1Args,
+ getDriver().SysRoot + "/usr/include/g++/backward");
+ break;
+ }
+}
+
+void OpenBSD::AddCXXStdlibLibArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const {
+ switch (GetCXXStdlibType(Args)) {
+ case ToolChain::CST_Libcxx:
+ CmdArgs.push_back("-lc++");
+ CmdArgs.push_back("-lc++abi");
+ CmdArgs.push_back("-lpthread");
+ break;
+ case ToolChain::CST_Libstdcxx:
+ CmdArgs.push_back("-lstdc++");
+ break;
+ }
+}
+
/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)