Hahnfeld added a comment.

There is also the other way round: `CLANG_DEFAULT_RTLIB=libgcc` shows that 
Darwin doesn't support that and gets a `SIGSEGV` (because it doesn't expect it 
to be `libgcc` without an option to be set, hehe)
Based on some `GetCXXStdlibType` for toolchains that only support one 
`-stdlib`, I think we can just override `GetRuntimeLibType` here

  diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
  index f05261a..610285e 100644
  --- a/lib/Driver/ToolChains.cpp
  +++ b/lib/Driver/ToolChains.cpp
  @@ -403,18 +403,23 @@ void DarwinClang::AddLinkSanitizerLibArgs(const ArgList 
&Args,
         /*AddRPath*/ true);
   }
   
  +ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType(
  +    const ArgList &Args) const {
  +  if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
  +    StringRef Value = A->getValue();
  +    if (Value != "compiler-rt")
  +      getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
  +          << Value << "darwin";
  +  }
  +
  +  return ToolChain::RLT_CompilerRT;
  +}
  +
   void DarwinClang::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
                                           const ArgList &Args,
                                           ArgStringList &CmdArgs) const {
  -  // Darwin only supports the compiler-rt based runtime libraries.
  -  switch (GetRuntimeLibType(Args)) {
  -  case ToolChain::RLT_CompilerRT:
  -    break;
  -  default:
  -    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
  -        << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
  -    return;
  -  }
  +  // Call once to ensure diagnostic is printed if wrong value was specified
  +  GetRuntimeLibType(Args);
   
     // Darwin doesn't support real static executables, don't link any runtime
     // libraries with -static.
  diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
  index 25dae72..d36a799 100644
  --- a/lib/Driver/ToolChains.h
  +++ b/lib/Driver/ToolChains.h
  @@ -575,6 +575,8 @@ public:
     /// @name Apple ToolChain Implementation
     /// {
   
  +  RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const 
override;
  +
     void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple,
                                const llvm::opt::ArgList &Args,
                                llvm::opt::ArgStringList &CmdArgs) const 
override;
  diff --git a/test/Driver/mips-mti-linux.c b/test/Driver/mips-mti-linux.c
  index e3560e2..4835d79 100644
  --- a/test/Driver/mips-mti-linux.c
  +++ b/test/Driver/mips-mti-linux.c
  @@ -8,7 +8,7 @@
   
   // = Big-endian, mips32r2, hard float
   // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
  -// RUN:     --target=mips-mti-linux -mips32r2 -mhard-float \
  +// RUN:     --target=mips-mti-linux -mips32r2 -mhard-float -rtlib=platform \
   // RUN:     --sysroot=%S/Inputs/mips_mti_linux/sysroot \
   // RUN:   | FileCheck --check-prefix=CHECK-BE-HF-32R2 %s
   //
  @@ -26,7 +26,7 @@
   
   // = Little-endian, mips32r2, hard float
   // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
  -// RUN:     --target=mips-mti-linux -mips32r2 -EL -mhard-float \
  +// RUN:     --target=mips-mti-linux -mips32r2 -EL -mhard-float 
-rtlib=platform \
   // RUN:     --sysroot=%S/Inputs/mips_mti_linux/sysroot \
   // RUN:   | FileCheck --check-prefix=CHECK-LE-HF-32R2 %s
   //


================
Comment at: CMakeLists.txt:210
@@ -202,3 +209,3 @@
 
 set(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
   "Vendor-specific text for showing with version information.")
----------------
zlei wrote:
> Hahnfeld wrote:
> > zlei wrote:
> > > I think the original code for resetting `CLANG_DEFAULT_CXX_STDLIB` 
> > > doesn't work as expected, as beanz pointed out.
> > > 
> > > In this revision, I just disable invalid values for both 
> > > `CLANG_DEFAULT_CXX_STDLIB` and `CLANG_DEFAULT_RTLIB`. Users will get a 
> > > error message when assigning unsupported values to them.
> > I tested it this morning and it works as (at least I) expected: It will 
> > temporarily reset the value and warn the user that the parameter is not 
> > valid.
> > 
> > I'm against erroring out here because there actually is a sane default 
> > value...
> I don't have a strong opinion on this, but the problem is the original line 
> `set(CLANG_DEFAULT_CXX_STDLIB "")` doesn't have actual effect (it seems to 
> me).
> 
> I'm not sure what you mean by "temporarily reset the value". Last time I 
> tested it, `-DCLANG_DEFAULT_CXX_STDLIB=blah` doesn't reset the value to an 
> empty string (as expected?)
> 
> Anyway, I'm fine with either warning or erroring :)
It means that you will still see `CLANG_DEFAULT_CXX_STDLIB=blah` in 
`CMakeCache.txt` but it will be temporarily set to `""` when CMake builds the 
Makefiles.

Let's have @beanz decide on that: He is the master of CMake and I can only say 
that it is working as I wanted it to do ;-)


https://reviews.llvm.org/D22663



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to