[clang] [llvm] [llvm][clang] Explicitly pass the VFS to sanitizer passes (PR #165267)
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 27 08:43:16 PDT 2025
https://github.com/jansvoboda11 created https://github.com/llvm/llvm-project/pull/165267
This PR passes the VFS to LLVM's sanitizer passes from Clang, so that the configuration files can be loaded in the same way all other compiler inputs are.
>From c878e89e1059d731e67fc0ac25b0ffda2366e608 Mon Sep 17 00:00:00 2001
From: Jan Svoboda <jan_svoboda at apple.com>
Date: Mon, 27 Oct 2025 08:31:27 -0700
Subject: [PATCH] [llvm][clang] Explicitly pass the VFS to sanitizer passes
---
clang/lib/CodeGen/BackendUtil.cpp | 8 ++++---
.../Instrumentation/SanitizerBinaryMetadata.h | 6 +++++
.../Instrumentation/SanitizerCoverage.h | 22 +++++++------------
.../SanitizerBinaryMetadata.cpp | 11 ++++++----
.../Instrumentation/SanitizerCoverage.cpp | 12 ++++++++++
5 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index 468c930acacbd..aefc262dca17f 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -713,14 +713,16 @@ static void addSanitizers(const Triple &TargetTriple,
ThinOrFullLTOPhase) {
if (CodeGenOpts.hasSanitizeCoverage()) {
auto SancovOpts = getSancovOptsFromCGOpts(CodeGenOpts);
- MPM.addPass(SanitizerCoveragePass(
- SancovOpts, CodeGenOpts.SanitizeCoverageAllowlistFiles,
- CodeGenOpts.SanitizeCoverageIgnorelistFiles));
+ MPM.addPass(
+ SanitizerCoveragePass(SancovOpts, PB.getVirtualFileSystemPtr(),
+ CodeGenOpts.SanitizeCoverageAllowlistFiles,
+ CodeGenOpts.SanitizeCoverageIgnorelistFiles));
}
if (CodeGenOpts.hasSanitizeBinaryMetadata()) {
MPM.addPass(SanitizerBinaryMetadataPass(
getSanitizerBinaryMetadataOptions(CodeGenOpts),
+ PB.getVirtualFileSystemPtr(),
CodeGenOpts.SanitizeMetadataIgnorelistFiles));
}
diff --git a/llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h b/llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h
index 054016622a577..63c5990a41741 100644
--- a/llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h
+++ b/llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h
@@ -13,6 +13,7 @@
#define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERBINARYMETADATA_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
@@ -20,6 +21,9 @@
#include "llvm/Transforms/Utils/Instrumentation.h"
namespace llvm {
+namespace vfs {
+class FileSystem;
+} // namespace vfs
struct SanitizerBinaryMetadataOptions {
bool Covered = false;
@@ -53,12 +57,14 @@ class SanitizerBinaryMetadataPass
public:
LLVM_ABI explicit SanitizerBinaryMetadataPass(
SanitizerBinaryMetadataOptions Opts = {},
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr,
ArrayRef<std::string> IgnorelistFiles = {});
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
static bool isRequired() { return true; }
private:
const SanitizerBinaryMetadataOptions Options;
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS;
const ArrayRef<std::string> IgnorelistFiles;
};
diff --git a/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h b/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h
index f14f5b90a5cc9..a8a09fb95c4bd 100644
--- a/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h
+++ b/llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h
@@ -15,14 +15,17 @@
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
#define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
+#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/SpecialCaseList.h"
-#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Transforms/Utils/Instrumentation.h"
namespace llvm {
class Module;
+namespace vfs {
+class FileSystem;
+} // namespace vfs
/// This is the ModuleSanitizerCoverage pass used in the new pass manager. The
/// pass instruments functions for coverage, adds initialization calls to the
@@ -32,24 +35,15 @@ class SanitizerCoveragePass : public PassInfoMixin<SanitizerCoveragePass> {
public:
explicit SanitizerCoveragePass(
SanitizerCoverageOptions Options = SanitizerCoverageOptions(),
- const std::vector<std::string> &AllowlistFiles =
- std::vector<std::string>(),
- const std::vector<std::string> &BlocklistFiles =
- std::vector<std::string>())
- : Options(Options) {
- if (AllowlistFiles.size() > 0)
- Allowlist = SpecialCaseList::createOrDie(AllowlistFiles,
- *vfs::getRealFileSystem());
- if (BlocklistFiles.size() > 0)
- Blocklist = SpecialCaseList::createOrDie(BlocklistFiles,
- *vfs::getRealFileSystem());
- }
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr,
+ const std::vector<std::string> &AllowlistFiles = {},
+ const std::vector<std::string> &BlocklistFiles = {});
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
static bool isRequired() { return true; }
private:
SanitizerCoverageOptions Options;
-
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS;
std::unique_ptr<SpecialCaseList> Allowlist;
std::unique_ptr<SpecialCaseList> Blocklist;
};
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index 4801ac75f8572..210b1266de23c 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -481,15 +481,18 @@ StringRef SanitizerBinaryMetadata::getSectionEnd(StringRef SectionSuffix) {
} // namespace
SanitizerBinaryMetadataPass::SanitizerBinaryMetadataPass(
- SanitizerBinaryMetadataOptions Opts, ArrayRef<std::string> IgnorelistFiles)
- : Options(std::move(Opts)), IgnorelistFiles(std::move(IgnorelistFiles)) {}
+ SanitizerBinaryMetadataOptions Opts,
+ IntrusiveRefCntPtr<vfs::FileSystem> VFS,
+ ArrayRef<std::string> IgnorelistFiles)
+ : Options(std::move(Opts)),
+ VFS(VFS ? std::move(VFS) : vfs::getRealFileSystem()),
+ IgnorelistFiles(std::move(IgnorelistFiles)) {}
PreservedAnalyses
SanitizerBinaryMetadataPass::run(Module &M, AnalysisManager<Module> &AM) {
std::unique_ptr<SpecialCaseList> Ignorelist;
if (!IgnorelistFiles.empty()) {
- Ignorelist = SpecialCaseList::createOrDie(IgnorelistFiles,
- *vfs::getRealFileSystem());
+ Ignorelist = SpecialCaseList::createOrDie(IgnorelistFiles, *VFS);
if (Ignorelist->inSection("metadata", "src", M.getSourceFileName()))
return PreservedAnalyses::all();
}
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
index b74a0708b67ae..09abf6a33648c 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -318,6 +318,18 @@ class ModuleSanitizerCoverage {
};
} // namespace
+SanitizerCoveragePass::SanitizerCoveragePass(
+ SanitizerCoverageOptions Options, IntrusiveRefCntPtr<vfs::FileSystem> VFS,
+ const std::vector<std::string> &AllowlistFiles,
+ const std::vector<std::string> &BlocklistFiles)
+ : Options(std::move(Options)),
+ VFS(VFS ? std::move(VFS) : vfs::getRealFileSystem()) {
+ if (AllowlistFiles.size() > 0)
+ Allowlist = SpecialCaseList::createOrDie(AllowlistFiles, *this->VFS);
+ if (BlocklistFiles.size() > 0)
+ Blocklist = SpecialCaseList::createOrDie(BlocklistFiles, *this->VFS);
+}
+
PreservedAnalyses SanitizerCoveragePass::run(Module &M,
ModuleAnalysisManager &MAM) {
auto &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
More information about the cfe-commits
mailing list