]> granicus.if.org Git - clang/commitdiff
Driver: Add a -stdlib= argument which can be used to select the C++ standard
authorDaniel Dunbar <daniel@zuster.org>
Tue, 14 Sep 2010 23:12:40 +0000 (23:12 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 14 Sep 2010 23:12:40 +0000 (23:12 +0000)
library to use.
 - This is currently useful for testing libc++; you can now use 'clang++
   -stdlib=libc++ t.cpp' to compile using it if installed.

 - In the future could also be used to select other standard library choices if
   alternatives become available (for example, to use an alternate C library).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113891 91177308-0d34-0410-b5e6-96231b3b80d8

docs/tools/clang.pod
include/clang/Basic/DiagnosticDriverKinds.td
include/clang/Driver/Options.td
include/clang/Driver/ToolChain.h
lib/Driver/ToolChain.cpp

index 032efcfcabc5fccdadbdf234e6fe43f9cd25f7ce..8284d319e7b1e393e0a2a229393efb2ac76edd1f 100644 (file)
@@ -14,6 +14,7 @@ B<clang> [B<-c>|B<-S>|B<-E>] B<-std=>I<standard> B<-g>
   B<-f>I<feature-option...>
   B<-m>I<machine-option...>
   B<-o> I<output-file>
+  B<-stdlib=>I<library> 
   I<input-filenames>
 
 =head1 DESCRIPTION
@@ -130,6 +131,11 @@ Treat subsequent input files as having type I<language>.
 
 Specify the language standard to compile for.
 
+=item B<-stdlib>=I<language>
+
+Specify the C++ standard library to use; supported options are libstdc++ and
+libc++.
+
 =item B<-ansi>
 
 Same as B<-std=c89>.
index 34cd6004edee86513246810af365a2ef9e141f22..b6e89bd78b395529da4d6b33da331164c4b1cb2c 100644 (file)
@@ -16,6 +16,8 @@ def err_drv_unknown_stdin_type : Error<
 def err_drv_unknown_language : Error<"language not recognized: '%0'">;
 def err_drv_invalid_arch_name : Error<
   "invalid arch name '%0'">;
+def err_drv_invalid_stdlib_name : Error<
+  "invalid library name in argument '%0'">;
 def err_drv_invalid_opt_with_multiple_archs : Error<
   "option '%0' cannot be used with multiple -arch options">;
 def err_drv_invalid_output_with_multiple_archs : Error<
index c51d12a487695f37736e6f4672b1024bfcb642a1..de8f1769a5f46adc6ba5b053b687f952de08f5da 100644 (file)
@@ -575,6 +575,7 @@ def static_libgcc : Flag<"-static-libgcc">;
 def static : Flag<"-static">, Flags<[NoArgumentUnused]>;
 def std_default_EQ : Joined<"-std-default=">;
 def std_EQ : Joined<"-std=">;
+def stdlib_EQ : Joined<"-stdlib=">;
 def sub__library : JoinedOrSeparate<"-sub_library">;
 def sub__umbrella : JoinedOrSeparate<"-sub_umbrella">;
 def s : Flag<"-s">;
@@ -719,6 +720,8 @@ def _specs : Separate<"--specs">, Alias<specs_EQ>;
 def _static : Flag<"--static">, Alias<static>;
 def _std_EQ : Joined<"--std=">, Alias<std_EQ>;
 def _std : Separate<"--std">, Alias<std_EQ>;
+def _stdlib_EQ : Joined<"--stdlib=">, Alias<std_EQ>;
+def _stdlib : Separate<"--stdlib">, Alias<std_EQ>;
 def _sysroot_EQ : Joined<"--sysroot=">;
 def _sysroot : Separate<"--sysroot">, Alias<_sysroot_EQ>;
 def _target_help : Flag<"--target-help">;
index e2d3b34b66d9affa25fe069cc8228cc806113420..a9de09c9d5e0608b26a1d617cabb6122fde1f595 100644 (file)
@@ -34,6 +34,7 @@ public:
   typedef llvm::SmallVector<std::string, 4> path_list;
 
   enum CXXStdlibType {
+    CST_Libcxx,
     CST_Libstdcxx
   };
 
index 0f630464093a3d5638da465cf326af45e8c8745b..337ea4e8f94b1666fdf7c02f8e1a54b41ba9e02a 100644 (file)
@@ -175,6 +175,16 @@ std::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args) const {
 }
 
 ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
+  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
+    llvm::StringRef Value = A->getValue(Args);
+    if (Value == "libc++")
+      return ToolChain::CST_Libcxx;
+    if (Value == "libstdc++")
+      return ToolChain::CST_Libstdcxx;
+    getDriver().Diag(clang::diag::err_drv_invalid_stdlib_name)
+      << A->getAsString(Args);
+  }
+
   return ToolChain::CST_Libstdcxx;
 }
 
@@ -183,6 +193,11 @@ void ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &Args,
   CXXStdlibType Type = GetCXXStdlibType(Args);
 
   switch (Type) {
+  case ToolChain::CST_Libcxx:
+    CmdArgs.push_back("-cxx-system-include");
+    CmdArgs.push_back("/usr/include/c++/v1");
+    break;
+
   case ToolChain::CST_Libstdcxx:
     // Currently handled by the mass of goop in InitHeaderSearch.
     break;
@@ -194,6 +209,10 @@ void ToolChain::AddClangCXXStdlibLibArgs(const ArgList &Args,
   CXXStdlibType Type = GetCXXStdlibType(Args);
 
   switch (Type) {
+  case ToolChain::CST_Libcxx:
+    CmdArgs.push_back("-lc++");
+    break;
+
   case ToolChain::CST_Libstdcxx:
     CmdArgs.push_back("-lstdc++");
     break;