diff options
author | Petr Hosek <phosek@chromium.org> | 2018-11-21 20:33:12 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2018-11-21 20:33:12 +0000 |
commit | 584d9353519f80f526ec9118ca4845226ee1ae3f (patch) | |
tree | a283e24ecaf61f6ee922706d94b3aa15e6487044 | |
parent | 839a0cb8e092d9045600f9d93b5f769dc8fa2b04 (diff) | |
download | bcm5719-llvm-584d9353519f80f526ec9118ca4845226ee1ae3f.tar.gz bcm5719-llvm-584d9353519f80f526ec9118ca4845226ee1ae3f.zip |
[Driver] Use --push/pop-state with Sanitizer link deps
Sanitizer runtime link deps handling passes --no-as-needed because of
PR15823, but it never undoes it and this flag may affect other libraries
that come later on the link line. To avoid this, wrap Sanitizer link
deps in --push/pop-state.
Differential Revision: https://reviews.llvm.org/D54805
llvm-svn: 347413
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 | ||||
-rw-r--r-- | clang/test/Driver/sanitizer-ld.c | 14 |
2 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 03298a17c37..4f342964882 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -598,6 +598,7 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC, ArgStringList &CmdArgs) { // Force linking against the system libraries sanitizers depends on // (see PR15823 why this is necessary). + CmdArgs.push_back("--push-state"); CmdArgs.push_back("--no-as-needed"); // There's no libpthread or librt on RTEMS & Android. if (TC.getTriple().getOS() != llvm::Triple::RTEMS && @@ -617,6 +618,7 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC, if (TC.getTriple().getOS() == llvm::Triple::NetBSD || TC.getTriple().getOS() == llvm::Triple::FreeBSD) CmdArgs.push_back("-lexecinfo"); + CmdArgs.push_back("--pop-state"); } static void diff --git a/clang/test/Driver/sanitizer-ld.c b/clang/test/Driver/sanitizer-ld.c index 9ce05996fdd..d0408eb8c6e 100644 --- a/clang/test/Driver/sanitizer-ld.c +++ b/clang/test/Driver/sanitizer-ld.c @@ -220,6 +220,20 @@ // CHECK-ASAN-MYRIAD-NOT: "-lc" // CHECK-ASAN-MYRIAD: libclang_rt.asan-sparcel.a" +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target i386-unknown-linux -fuse-ld=ld -fsanitize=address -static \ +// RUN: -resource-dir=%S/Inputs/resource_dir \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ +// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-STATIC %s +// +// CHECK-ASAN-LINUX-STATIC: "--push-state" +// CHECK-ASAN-LINUX-STATIC: "--no-as-needed" +// CHECK-ASAN-LINUX-STATIC: "-lpthread" +// CHECK-ASAN-LINUX-STATIC: "-lrt" +// CHECK-ASAN-LINUX-STATIC: "-lm" +// CHECK-ASAN-LINUX-STATIC: "-ldl" +// CHECK-ASAN-LINUX-STATIC: "--pop-state" + // RUN: %clangxx -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-unknown-linux -fuse-ld=ld -stdlib=platform -lstdc++ \ // RUN: -fsanitize=thread \ |