beanz updated this revision to Diff 69926.
beanz added a comment.

- Changed warning text based on feedback from bruno
- Made the warning apply to -nostdlib as well as -nodefaultlibs based on 
offline discussion with Anna


https://reviews.llvm.org/D24091

Files:
  include/clang/Basic/DiagnosticDriverKinds.td
  include/clang/Driver/SanitizerArgs.h
  lib/Driver/Driver.cpp
  lib/Driver/ToolChains.cpp
  lib/Driver/Tools.cpp
  test/Driver/nodefaultlib.c
  test/Driver/nostdlib.c

Index: test/Driver/nostdlib.c
===================================================================
--- test/Driver/nostdlib.c
+++ test/Driver/nostdlib.c
@@ -29,3 +29,12 @@
 // CHECK-LINUX-NOSTDLIB: "{{(.*[^.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
 // CHECK-LINUX-NOSTDLIB-NOT: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}linux{{/|\\\\}}libclang_rt.builtins-i686.a"
 // CHECK-MSVC-NOSTDLIB: warning: argument unused during compilation: '--rtlib=compiler-rt'
+
+// RUN: %clang -target i686-pc-linux-gnu -nostdlib -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST3 %s
+// RUN: %clang -target i686-unknown-freebsd -nodefaultlibs -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST3 %s
+// TEST3: warning: -nodefaultlibs and -nostdlib do not skip sanitizer runtime libs when used with -fsanitize.
+// TEST3: libclang_rt.asan-i686.a
+
+// RUN: %clang -target i686-apple-darwin -nostdlib -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST4 %s
+// TEST4: warning: -nodefaultlibs and -nostdlib do not skip sanitizer runtime libs when used with -fsanitize.
+// TEST4: libclang_rt.asan_osx_dynamic.dylib
Index: test/Driver/nodefaultlib.c
===================================================================
--- test/Driver/nodefaultlib.c
+++ test/Driver/nodefaultlib.c
@@ -8,3 +8,12 @@
 // RUN: %clang -target i686-pc-linux-gnu -stdlib=libc++ -nodefaultlibs -lstdc++ -### %s 2>&1 | FileCheck -check-prefix=TEST2 %s
 // TEST2-NOT: "-lc++"
 // TEST2: "-lstdc++"
+
+// RUN: %clang -target i686-pc-linux-gnu -nodefaultlibs -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST3 %s
+// RUN: %clang -target i686-unknown-freebsd -nodefaultlibs -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST3 %s
+// TEST3: warning: -nodefaultlibs and -nostdlib do not skip sanitizer runtime libs when used with -fsanitize.
+// TEST3: libclang_rt.asan-i686.a
+
+// RUN: %clang -target i686-apple-darwin -nodefaultlibs -fsanitize=address -### %s 2>&1 | FileCheck -check-prefix=TEST4 %s
+// TEST4: warning: -nodefaultlibs and -nostdlib do not skip sanitizer runtime libs when used with -fsanitize.
+// TEST4: libclang_rt.asan_osx_dynamic.dylib
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -8768,6 +8768,10 @@
     AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
 
   bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+
+  if (NeedsSanitizerDeps &&
+      Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
+    D.Diag(clang::diag::warn_drv_sanitizers_and_nodefaultlibs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
 
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
@@ -9604,6 +9608,11 @@
     CmdArgs.push_back("--no-demangle");
 
   bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
+
+  if (NeedsSanitizerDeps &&
+      Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
+    D.Diag(clang::diag::warn_drv_sanitizers_and_nodefaultlibs);
+
   bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
   AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
   // The profile runtime also needs access to system libraries.
Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -321,6 +321,8 @@
     CmdArgs.push_back("-rpath");
     CmdArgs.push_back(Args.MakeArgString(Dir));
   }
+  if (Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
+    getDriver().Diag(clang::diag::warn_drv_sanitizers_and_nodefaultlibs);
 }
 
 StringRef Darwin::getPlatformFamily() const {
Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp
+++ lib/Driver/Driver.cpp
@@ -1546,9 +1546,8 @@
   Arg *FinalPhaseArg;
   phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg);
 
-  if (FinalPhase == phases::Link && Args.hasArg(options::OPT_emit_llvm)) {
+  if (FinalPhase == phases::Link && Args.hasArg(options::OPT_emit_llvm))
     Diag(clang::diag::err_drv_emit_llvm_link);
-  }
 
   // Reject -Z* at the top level, these options should never have been exposed
   // by gcc.
Index: include/clang/Driver/SanitizerArgs.h
===================================================================
--- include/clang/Driver/SanitizerArgs.h
+++ include/clang/Driver/SanitizerArgs.h
@@ -63,6 +63,8 @@
     return Sanitizers.hasOneOf(SanitizerKind::Efficiency);
   }
 
+  bool hasSanitizers() const { return !Sanitizers.empty(); }
+
   bool requiresPIE() const;
   bool needsUnwindTables() const;
   bool linkCXXRuntimes() const { return LinkCXXRuntimes; }
Index: include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- include/clang/Basic/DiagnosticDriverKinds.td
+++ include/clang/Basic/DiagnosticDriverKinds.td
@@ -271,4 +271,8 @@
   InGroup<InvalidOrNonExistentDirectory>;
 
 def err_drv_unsupported_linker : Error<"unsupported value '%0' for -linker option">;
+
+def warn_drv_sanitizers_and_nodefaultlibs : Warning<
+  "-nodefaultlibs and -nostdlib do not skip sanitizer runtime libs when used with -fsanitize.">,
+  InGroup<DiagGroup<"unexpected-driver-behavior">>;
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to