Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -271,4 +271,8 @@ InGroup; 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>; } 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: 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: 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/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: 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: 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