diff options
author | paperchalice <liujunchang97@outlook.com> | 2024-07-15 12:42:44 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-15 12:42:44 +0800 |
commit | c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2 (patch) | |
tree | ded226b4178238857616012f6e065cf5eb2a80da /llvm/lib/CodeGen/MachineVerifier.cpp | |
parent | e025e5ef44b736b48b8a2ee230a11f674b734b32 (diff) | |
download | llvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.zip llvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.tar.gz llvm-c09ed6a29e392e406623f7c4dc0a8240d2cbc9f2.tar.bz2 |
[CodeGen][NewPM] Port `MachineVerifier` to new pass manager (#98628)
- Add `MachineVerifierPass`.
- Use complete `MachineVerifierPass` in `VerifyInstrumentation` if
possible.
`LiveStacksAnalysis` will be added in future, all other analyses are
done.
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index d0d3af0..0a5b8bd 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -20,6 +20,7 @@ // -verify-machineinstrs. //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/MachineVerifier.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" @@ -93,6 +94,9 @@ using namespace llvm; namespace { struct MachineVerifier { + MachineVerifier(MachineFunctionAnalysisManager &MFAM, const char *b) + : MFAM(&MFAM), Banner(b) {} + MachineVerifier(Pass *pass, const char *b) : PASS(pass), Banner(b) {} MachineVerifier(const char *b, LiveVariables *LiveVars, @@ -103,6 +107,7 @@ namespace { unsigned verify(const MachineFunction &MF); + MachineFunctionAnalysisManager *MFAM = nullptr; Pass *const PASS = nullptr; const char *Banner; const MachineFunction *MF = nullptr; @@ -302,15 +307,15 @@ namespace { void verifyProperties(const MachineFunction &MF); }; - struct MachineVerifierPass : public MachineFunctionPass { + struct MachineVerifierLegacyPass : public MachineFunctionPass { static char ID; // Pass ID, replacement for typeid const std::string Banner; - MachineVerifierPass(std::string banner = std::string()) - : MachineFunctionPass(ID), Banner(std::move(banner)) { - initializeMachineVerifierPassPass(*PassRegistry::getPassRegistry()); - } + MachineVerifierLegacyPass(std::string banner = std::string()) + : MachineFunctionPass(ID), Banner(std::move(banner)) { + initializeMachineVerifierLegacyPassPass(*PassRegistry::getPassRegistry()); + } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addUsedIfAvailable<LiveStacks>(); @@ -338,13 +343,28 @@ namespace { } // end anonymous namespace -char MachineVerifierPass::ID = 0; +PreservedAnalyses +MachineVerifierPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &MFAM) { + // Skip functions that have known verification problems. + // FIXME: Remove this mechanism when all problematic passes have been + // fixed. + if (MF.getProperties().hasProperty( + MachineFunctionProperties::Property::FailsVerification)) + return PreservedAnalyses::all(); + unsigned FoundErrors = MachineVerifier(MFAM, Banner.c_str()).verify(MF); + if (FoundErrors) + report_fatal_error("Found " + Twine(FoundErrors) + " machine code errors."); + return PreservedAnalyses::all(); +} + +char MachineVerifierLegacyPass::ID = 0; -INITIALIZE_PASS(MachineVerifierPass, "machineverifier", +INITIALIZE_PASS(MachineVerifierLegacyPass, "machineverifier", "Verify generated machine code", false, false) FunctionPass *llvm::createMachineVerifierPass(const std::string &Banner) { - return new MachineVerifierPass(Banner); + return new MachineVerifierLegacyPass(Banner); } void llvm::verifyMachineFunction(const std::string &Banner, @@ -438,6 +458,14 @@ unsigned MachineVerifier::verify(const MachineFunction &MF) { auto *SIWrapper = PASS->getAnalysisIfAvailable<SlotIndexesWrapperPass>(); Indexes = SIWrapper ? &SIWrapper->getSI() : nullptr; } + if (MFAM) { + MachineFunction &Func = const_cast<MachineFunction &>(MF); + LiveInts = MFAM->getCachedResult<LiveIntervalsAnalysis>(Func); + if (!LiveInts) + LiveVars = MFAM->getCachedResult<LiveVariablesAnalysis>(Func); + // TODO: LiveStks = MFAM->getCachedResult<LiveStacksAnalysis>(Func); + Indexes = MFAM->getCachedResult<SlotIndexesAnalysis>(Func); + } verifySlotIndexes(); |