[PATCH] D53487: [Driver] Support sanitized libraries on Fuchsia
This revision was automatically updated to reflect the committed changes. Closed by commit rC345537: [Driver] Support sanitized libraries on Fuchsia (authored by phosek, committed by ). Changed prior to commit: https://reviews.llvm.org/D53487?vs=170805=171564#toc Repository: rC Clang https://reviews.llvm.org/D53487 Files: lib/Driver/ToolChains/CommonArgs.cpp lib/Driver/ToolChains/CommonArgs.h lib/Driver/ToolChains/Fuchsia.cpp test/Driver/fuchsia.c Index: lib/Driver/ToolChains/CommonArgs.h === --- lib/Driver/ToolChains/CommonArgs.h +++ lib/Driver/ToolChains/CommonArgs.h @@ -32,6 +32,10 @@ bool addSanitizerRuntimes(const ToolChain , const llvm::opt::ArgList , llvm::opt::ArgStringList ); +void addSanitizerPathLibArgs(const ToolChain , + const llvm::opt::ArgList , + llvm::opt::ArgStringList ); + void linkSanitizerRuntimeDeps(const ToolChain , llvm::opt::ArgStringList ); Index: lib/Driver/ToolChains/Fuchsia.cpp === --- lib/Driver/ToolChains/Fuchsia.cpp +++ lib/Driver/ToolChains/Fuchsia.cpp @@ -76,10 +76,11 @@ else if (Args.hasArg(options::OPT_shared)) CmdArgs.push_back("-shared"); + const SanitizerArgs = ToolChain.getSanitizerArgs(); + if (!Args.hasArg(options::OPT_shared)) { std::string Dyld = D.DyldPrefix; -if (ToolChain.getSanitizerArgs().needsAsanRt() && -ToolChain.getSanitizerArgs().needsSharedRt()) +if (SanArgs.needsAsanRt() && SanArgs.needsSharedRt()) Dyld += "asan/"; Dyld += "ld.so.1"; CmdArgs.push_back("-dynamic-linker"); @@ -98,6 +99,8 @@ Args.AddAllArgs(CmdArgs, options::OPT_L); Args.AddAllArgs(CmdArgs, options::OPT_u); + addSanitizerPathLibArgs(ToolChain, Args, CmdArgs); + ToolChain.AddFilePathLibArgs(Args, CmdArgs); if (D.isUsingLTO()) { Index: lib/Driver/ToolChains/CommonArgs.cpp === --- lib/Driver/ToolChains/CommonArgs.cpp +++ lib/Driver/ToolChains/CommonArgs.cpp @@ -560,6 +560,40 @@ return false; } +static void addSanitizerLibPath(const ToolChain , const ArgList , +ArgStringList , StringRef Name) { + for (const auto : TC.getLibraryPaths()) { +if (!LibPath.empty()) { + SmallString<128> P(LibPath); + llvm::sys::path::append(P, Name); + if (TC.getVFS().exists(P)) +CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P)); +} + } +} + +void tools::addSanitizerPathLibArgs(const ToolChain , const ArgList , +ArgStringList ) { + const SanitizerArgs = TC.getSanitizerArgs(); + if (SanArgs.needsAsanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "asan"); + } + if (SanArgs.needsHwasanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "hwasan"); + } + if (SanArgs.needsLsanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "lsan"); + } + if (SanArgs.needsMsanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "msan"); + } + if (SanArgs.needsTsanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "tsan"); + } +} + + + void tools::linkSanitizerRuntimeDeps(const ToolChain , ArgStringList ) { // Force linking against the system libraries sanitizers depends on Index: test/Driver/fuchsia.c === --- test/Driver/fuchsia.c +++ test/Driver/fuchsia.c @@ -66,22 +66,28 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-X86 +// CHECK-ASAN-X86: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-X86: "-fsanitize=address" // CHECK-ASAN-X86: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-X86: "-dynamic-linker" "asan/ld.so.1" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan.so" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan-preinit.a" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}asan" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan.so" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan-preinit.a" // RUN: %clang %s -### --target=aarch64-fuchsia \ // RUN: -fsanitize=address 2>&1 \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-AARCH64 +// CHECK-ASAN-AARCH64: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-AARCH64: "-fsanitize=address" // CHECK-ASAN-AARCH64: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-AARCH64: "-dynamic-linker"
[PATCH] D53487: [Driver] Support sanitized libraries on Fuchsia
phosek updated this revision to Diff 170805. phosek marked an inline comment as done. Repository: rC Clang https://reviews.llvm.org/D53487 Files: clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.h clang/lib/Driver/ToolChains/Fuchsia.cpp clang/test/Driver/fuchsia.c Index: clang/test/Driver/fuchsia.c === --- clang/test/Driver/fuchsia.c +++ clang/test/Driver/fuchsia.c @@ -66,22 +66,28 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-X86 +// CHECK-ASAN-X86: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-X86: "-fsanitize=address" // CHECK-ASAN-X86: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-X86: "-dynamic-linker" "asan/ld.so.1" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan.so" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan-preinit.a" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}asan" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan.so" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan-preinit.a" // RUN: %clang %s -### --target=aarch64-fuchsia \ // RUN: -fsanitize=address 2>&1 \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-AARCH64 +// CHECK-ASAN-AARCH64: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-AARCH64: "-fsanitize=address" // CHECK-ASAN-AARCH64: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-AARCH64: "-dynamic-linker" "asan/ld.so.1" -// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan.so" -// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan-preinit.a" +// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}asan" +// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib" +// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan.so" +// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan-preinit.a" // RUN: %clang %s -### --target=x86_64-fuchsia \ // RUN: -fsanitize=address -fPIC -shared 2>&1 \ Index: clang/lib/Driver/ToolChains/Fuchsia.cpp === --- clang/lib/Driver/ToolChains/Fuchsia.cpp +++ clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -76,10 +76,11 @@ else if (Args.hasArg(options::OPT_shared)) CmdArgs.push_back("-shared"); + const SanitizerArgs = ToolChain.getSanitizerArgs(); + if (!Args.hasArg(options::OPT_shared)) { std::string Dyld = D.DyldPrefix; -if (ToolChain.getSanitizerArgs().needsAsanRt() && -ToolChain.getSanitizerArgs().needsSharedRt()) +if (SanArgs.needsAsanRt() && SanArgs.needsSharedRt()) Dyld += "asan/"; Dyld += "ld.so.1"; CmdArgs.push_back("-dynamic-linker"); @@ -98,6 +99,8 @@ Args.AddAllArgs(CmdArgs, options::OPT_L); Args.AddAllArgs(CmdArgs, options::OPT_u); + addSanitizerPathLibArgs(ToolChain, Args, CmdArgs); + ToolChain.AddFilePathLibArgs(Args, CmdArgs); if (D.isUsingLTO()) { Index: clang/lib/Driver/ToolChains/CommonArgs.h === --- clang/lib/Driver/ToolChains/CommonArgs.h +++ clang/lib/Driver/ToolChains/CommonArgs.h @@ -32,6 +32,10 @@ bool addSanitizerRuntimes(const ToolChain , const llvm::opt::ArgList , llvm::opt::ArgStringList ); +void addSanitizerPathLibArgs(const ToolChain , + const llvm::opt::ArgList , + llvm::opt::ArgStringList ); + void linkSanitizerRuntimeDeps(const ToolChain , llvm::opt::ArgStringList ); Index: clang/lib/Driver/ToolChains/CommonArgs.cpp === --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -560,6 +560,40 @@ return false; } +static void addSanitizerLibPath(const ToolChain , const ArgList , +ArgStringList , StringRef Name) { + for (const auto : TC.getLibraryPaths()) { +if (!LibPath.empty()) { + SmallString<128> P(LibPath); + llvm::sys::path::append(P, Name); + if (TC.getVFS().exists(P)) +CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P)); +} + } +} + +void tools::addSanitizerPathLibArgs(const ToolChain , const ArgList , +ArgStringList ) { + const SanitizerArgs = TC.getSanitizerArgs(); + if (SanArgs.needsAsanRt()) { +addSanitizerLibPath(TC, Args, CmdArgs, "asan");
[PATCH] D53487: [Driver] Support sanitized libraries on Fuchsia
mcgrathr accepted this revision. mcgrathr added a comment. This revision is now accepted and ready to land. lgtm Comment at: clang/lib/Driver/ToolChains/CommonArgs.cpp:566 + for (const auto : TC.getLibraryPaths()) { +if(LibPath.length() > 0) { + SmallString<128> P(LibPath); `!LibPath.empty()`? Repository: rC Clang https://reviews.llvm.org/D53487 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D53487: [Driver] Support sanitized libraries on Fuchsia
phosek created this revision. phosek added a reviewer: mcgrathr. Herald added a subscriber: cfe-commits. When using sanitizers, add //lib/ to the list of library paths to support using sanitized version of runtime libraries if available. Repository: rC Clang https://reviews.llvm.org/D53487 Files: clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.h clang/lib/Driver/ToolChains/Fuchsia.cpp clang/test/Driver/fuchsia.c Index: clang/test/Driver/fuchsia.c === --- clang/test/Driver/fuchsia.c +++ clang/test/Driver/fuchsia.c @@ -66,22 +66,28 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-X86 +// CHECK-ASAN-X86: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-X86: "-fsanitize=address" // CHECK-ASAN-X86: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-X86: "-dynamic-linker" "asan/ld.so.1" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan.so" -// CHECK-ASAN-X86: "{{.*[/\\]}}libclang_rt.asan-preinit.a" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}asan" +// CHECK-ASAN-X86: "-L[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan.so" +// CHECK-ASAN-X86: "[[RESOURCE_DIR]]{{/|}}x86_64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan-preinit.a" // RUN: %clang %s -### --target=aarch64-fuchsia \ // RUN: -fsanitize=address 2>&1 \ // RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ // RUN: -fuse-ld=lld \ // RUN: | FileCheck %s -check-prefix=CHECK-ASAN-AARCH64 +// CHECK-ASAN-AARCH64: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]" // CHECK-ASAN-AARCH64: "-fsanitize=address" // CHECK-ASAN-AARCH64: "-fsanitize-address-globals-dead-stripping" // CHECK-ASAN-AARCH64: "-dynamic-linker" "asan/ld.so.1" -// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan.so" -// CHECK-ASAN-AARCH64: "{{.*[/\\]}}libclang_rt.asan-preinit.a" +// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}asan" +// CHECK-ASAN-AARCH64: "-L[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib" +// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan.so" +// CHECK-ASAN-AARCH64: "[[RESOURCE_DIR]]{{/|}}aarch64-fuchsia{{/|}}lib{{/|}}libclang_rt.asan-preinit.a" // RUN: %clang %s -### --target=x86_64-fuchsia \ // RUN: -fsanitize=address -fPIC -shared 2>&1 \ Index: clang/lib/Driver/ToolChains/Fuchsia.cpp === --- clang/lib/Driver/ToolChains/Fuchsia.cpp +++ clang/lib/Driver/ToolChains/Fuchsia.cpp @@ -9,7 +9,6 @@ #include "Fuchsia.h" #include "CommonArgs.h" -#include "clang/Basic/VirtualFileSystem.h" #include "clang/Config/config.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" @@ -100,16 +99,7 @@ Args.AddAllArgs(CmdArgs, options::OPT_L); Args.AddAllArgs(CmdArgs, options::OPT_u); - if (SanArgs.needsAsanRt()) { -for (const auto : ToolChain.getLibraryPaths()) { - if(LibPath.length() > 0) { -SmallString<128> P(LibPath); -llvm::sys::path::append(P, "asan"); -if (ToolChain.getVFS().exists(P)) - CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath)); - } -} - } + addSanitizerPathLibArgs(ToolChain, Args, CmdArgs); ToolChain.AddFilePathLibArgs(Args, CmdArgs); Index: clang/lib/Driver/ToolChains/CommonArgs.h === --- clang/lib/Driver/ToolChains/CommonArgs.h +++ clang/lib/Driver/ToolChains/CommonArgs.h @@ -32,6 +32,10 @@ bool addSanitizerRuntimes(const ToolChain , const llvm::opt::ArgList , llvm::opt::ArgStringList ); +void addSanitizerPathLibArgs(const ToolChain , + const llvm::opt::ArgList , + llvm::opt::ArgStringList ); + void linkSanitizerRuntimeDeps(const ToolChain , llvm::opt::ArgStringList ); Index: clang/lib/Driver/ToolChains/CommonArgs.cpp === --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -560,6 +560,40 @@ return false; } +static void addSanitizerLibPath(const ToolChain , const ArgList , +ArgStringList , StringRef Name) { + for (const auto : TC.getLibraryPaths()) { +if(LibPath.length() > 0) { + SmallString<128> P(LibPath); + llvm::sys::path::append(P, Name); + if (TC.getVFS().exists(P)) +CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + P)); +} + } +} + +void tools::addSanitizerPathLibArgs(const ToolChain , const