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