Skip to content

Commit c1f6528

Browse files
authored
[llvm][clang] Explicitly pass the VFS to sanitizer passes (#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.
1 parent 30f2bf7 commit c1f6528

File tree

5 files changed

+38
-21
lines changed

5 files changed

+38
-21
lines changed

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -713,14 +713,16 @@ static void addSanitizers(const Triple &TargetTriple,
713713
ThinOrFullLTOPhase) {
714714
if (CodeGenOpts.hasSanitizeCoverage()) {
715715
auto SancovOpts = getSancovOptsFromCGOpts(CodeGenOpts);
716-
MPM.addPass(SanitizerCoveragePass(
717-
SancovOpts, CodeGenOpts.SanitizeCoverageAllowlistFiles,
718-
CodeGenOpts.SanitizeCoverageIgnorelistFiles));
716+
MPM.addPass(
717+
SanitizerCoveragePass(SancovOpts, PB.getVirtualFileSystemPtr(),
718+
CodeGenOpts.SanitizeCoverageAllowlistFiles,
719+
CodeGenOpts.SanitizeCoverageIgnorelistFiles));
719720
}
720721

721722
if (CodeGenOpts.hasSanitizeBinaryMetadata()) {
722723
MPM.addPass(SanitizerBinaryMetadataPass(
723724
getSanitizerBinaryMetadataOptions(CodeGenOpts),
725+
PB.getVirtualFileSystemPtr(),
724726
CodeGenOpts.SanitizeMetadataIgnorelistFiles));
725727
}
726728

llvm/include/llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@
1313
#define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERBINARYMETADATA_H
1414

1515
#include "llvm/ADT/ArrayRef.h"
16+
#include "llvm/ADT/IntrusiveRefCntPtr.h"
1617
#include "llvm/IR/Function.h"
1718
#include "llvm/IR/Module.h"
1819
#include "llvm/IR/PassManager.h"
1920
#include "llvm/Support/Compiler.h"
2021
#include "llvm/Transforms/Utils/Instrumentation.h"
2122

2223
namespace llvm {
24+
namespace vfs {
25+
class FileSystem;
26+
} // namespace vfs
2327

2428
struct SanitizerBinaryMetadataOptions {
2529
bool Covered = false;
@@ -53,12 +57,14 @@ class SanitizerBinaryMetadataPass
5357
public:
5458
LLVM_ABI explicit SanitizerBinaryMetadataPass(
5559
SanitizerBinaryMetadataOptions Opts = {},
60+
IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr,
5661
ArrayRef<std::string> IgnorelistFiles = {});
5762
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
5863
static bool isRequired() { return true; }
5964

6065
private:
6166
const SanitizerBinaryMetadataOptions Options;
67+
IntrusiveRefCntPtr<vfs::FileSystem> VFS;
6268
const ArrayRef<std::string> IgnorelistFiles;
6369
};
6470

llvm/include/llvm/Transforms/Instrumentation/SanitizerCoverage.h

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@
1515
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
1616
#define LLVM_TRANSFORMS_INSTRUMENTATION_SANITIZERCOVERAGE_H
1717

18+
#include "llvm/ADT/IntrusiveRefCntPtr.h"
1819
#include "llvm/IR/PassManager.h"
1920
#include "llvm/Support/Compiler.h"
2021
#include "llvm/Support/SpecialCaseList.h"
21-
#include "llvm/Support/VirtualFileSystem.h"
2222
#include "llvm/Transforms/Utils/Instrumentation.h"
2323

2424
namespace llvm {
2525
class Module;
26+
namespace vfs {
27+
class FileSystem;
28+
} // namespace vfs
2629

2730
/// This is the ModuleSanitizerCoverage pass used in the new pass manager. The
2831
/// pass instruments functions for coverage, adds initialization calls to the
@@ -32,24 +35,15 @@ class SanitizerCoveragePass : public PassInfoMixin<SanitizerCoveragePass> {
3235
public:
3336
explicit SanitizerCoveragePass(
3437
SanitizerCoverageOptions Options = SanitizerCoverageOptions(),
35-
const std::vector<std::string> &AllowlistFiles =
36-
std::vector<std::string>(),
37-
const std::vector<std::string> &BlocklistFiles =
38-
std::vector<std::string>())
39-
: Options(Options) {
40-
if (AllowlistFiles.size() > 0)
41-
Allowlist = SpecialCaseList::createOrDie(AllowlistFiles,
42-
*vfs::getRealFileSystem());
43-
if (BlocklistFiles.size() > 0)
44-
Blocklist = SpecialCaseList::createOrDie(BlocklistFiles,
45-
*vfs::getRealFileSystem());
46-
}
38+
IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr,
39+
const std::vector<std::string> &AllowlistFiles = {},
40+
const std::vector<std::string> &BlocklistFiles = {});
4741
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
4842
static bool isRequired() { return true; }
4943

5044
private:
5145
SanitizerCoverageOptions Options;
52-
46+
IntrusiveRefCntPtr<vfs::FileSystem> VFS;
5347
std::unique_ptr<SpecialCaseList> Allowlist;
5448
std::unique_ptr<SpecialCaseList> Blocklist;
5549
};

llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -481,15 +481,18 @@ StringRef SanitizerBinaryMetadata::getSectionEnd(StringRef SectionSuffix) {
481481
} // namespace
482482

483483
SanitizerBinaryMetadataPass::SanitizerBinaryMetadataPass(
484-
SanitizerBinaryMetadataOptions Opts, ArrayRef<std::string> IgnorelistFiles)
485-
: Options(std::move(Opts)), IgnorelistFiles(std::move(IgnorelistFiles)) {}
484+
SanitizerBinaryMetadataOptions Opts,
485+
IntrusiveRefCntPtr<vfs::FileSystem> VFS,
486+
ArrayRef<std::string> IgnorelistFiles)
487+
: Options(std::move(Opts)),
488+
VFS(VFS ? std::move(VFS) : vfs::getRealFileSystem()),
489+
IgnorelistFiles(std::move(IgnorelistFiles)) {}
486490

487491
PreservedAnalyses
488492
SanitizerBinaryMetadataPass::run(Module &M, AnalysisManager<Module> &AM) {
489493
std::unique_ptr<SpecialCaseList> Ignorelist;
490494
if (!IgnorelistFiles.empty()) {
491-
Ignorelist = SpecialCaseList::createOrDie(IgnorelistFiles,
492-
*vfs::getRealFileSystem());
495+
Ignorelist = SpecialCaseList::createOrDie(IgnorelistFiles, *VFS);
493496
if (Ignorelist->inSection("metadata", "src", M.getSourceFileName()))
494497
return PreservedAnalyses::all();
495498
}

llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,18 @@ class ModuleSanitizerCoverage {
318318
};
319319
} // namespace
320320

321+
SanitizerCoveragePass::SanitizerCoveragePass(
322+
SanitizerCoverageOptions Options, IntrusiveRefCntPtr<vfs::FileSystem> VFS,
323+
const std::vector<std::string> &AllowlistFiles,
324+
const std::vector<std::string> &BlocklistFiles)
325+
: Options(std::move(Options)),
326+
VFS(VFS ? std::move(VFS) : vfs::getRealFileSystem()) {
327+
if (AllowlistFiles.size() > 0)
328+
Allowlist = SpecialCaseList::createOrDie(AllowlistFiles, *this->VFS);
329+
if (BlocklistFiles.size() > 0)
330+
Blocklist = SpecialCaseList::createOrDie(BlocklistFiles, *this->VFS);
331+
}
332+
321333
PreservedAnalyses SanitizerCoveragePass::run(Module &M,
322334
ModuleAnalysisManager &MAM) {
323335
auto &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();

0 commit comments

Comments
 (0)