-
Notifications
You must be signed in to change notification settings - Fork 14.9k
IR: Add verifier plugins for intrinsic verification #159415
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
nhaehnle
wants to merge
1
commit into
llvm:main
Choose a base branch
from
nhaehnle:pub-target-verifier
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+851
−400
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,20 +21,135 @@ | |
#define LLVM_IR_VERIFIER_H | ||
|
||
#include "llvm/ADT/DenseMap.h" | ||
#include "llvm/IR/DebugProgramInstruction.h" | ||
#include "llvm/IR/Metadata.h" | ||
#include "llvm/IR/ModuleSlotTracker.h" | ||
#include "llvm/IR/PassManager.h" | ||
#include "llvm/Support/Compiler.h" | ||
#include "llvm/Support/Printable.h" | ||
#include <utility> | ||
|
||
namespace llvm { | ||
|
||
class APInt; | ||
class Attribute; | ||
class AttributeList; | ||
class AttributeSet; | ||
class CallBase; | ||
class Comdat; | ||
class DataLayout; | ||
class Function; | ||
class FunctionPass; | ||
class Instruction; | ||
class MDNode; | ||
class LLVMContext; | ||
class Module; | ||
class Triple; | ||
class VerifierSupport; | ||
class raw_ostream; | ||
struct VerifierSupport; | ||
|
||
/// Base class for IR verifier plugins. | ||
/// | ||
/// To add a plugin, derive from this class and then instantiate it once. | ||
class VerifierPlugin { | ||
public: | ||
VerifierPlugin(); | ||
virtual ~VerifierPlugin(); | ||
|
||
/// Called when the verifier finds a call (or invoke) to an intrinsic it | ||
/// doesn't understand. | ||
/// | ||
/// If the plugin recognizes the intrinsic, it should report any verifier | ||
/// errors via the given helper object. | ||
virtual void verifyIntrinsicCall(CallBase &Call, VerifierSupport &VS) const; | ||
}; | ||
|
||
class VerifierSupport { | ||
public: | ||
raw_ostream *OS; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can this be a reference? Can the null stream be a substitute for the current null usage? |
||
const Module &M; | ||
ModuleSlotTracker MST; | ||
const Triple &TT; | ||
const DataLayout &DL; | ||
LLVMContext &Context; | ||
|
||
/// Track the brokenness of the module while recursively visiting. | ||
bool Broken = false; | ||
/// Broken debug info can be "recovered" from by stripping the debug info. | ||
bool BrokenDebugInfo = false; | ||
/// Whether to treat broken debug info as an error. | ||
bool TreatBrokenDebugInfoAsError = true; | ||
|
||
explicit VerifierSupport(raw_ostream *OS, const Module &M); | ||
|
||
private: | ||
LLVM_ABI void Write(const Module *M); | ||
LLVM_ABI void Write(const Value *V); | ||
LLVM_ABI void Write(const Value &V); | ||
LLVM_ABI void Write(const DbgRecord *DR); | ||
LLVM_ABI void Write(DbgVariableRecord::LocationType Type); | ||
LLVM_ABI void Write(const Metadata *MD); | ||
|
||
template <class T> void Write(const MDTupleTypedArrayWrapper<T> &MD) { | ||
Write(MD.get()); | ||
} | ||
|
||
LLVM_ABI void Write(const NamedMDNode *NMD); | ||
LLVM_ABI void Write(Type *T); | ||
LLVM_ABI void Write(const Comdat *C); | ||
LLVM_ABI void Write(const APInt *AI); | ||
LLVM_ABI void Write(const unsigned i) { *OS << i << '\n'; } | ||
|
||
// NOLINTNEXTLINE(readability-identifier-naming) | ||
LLVM_ABI void Write(const Attribute *A); | ||
// NOLINTNEXTLINE(readability-identifier-naming) | ||
LLVM_ABI void Write(const AttributeSet *AS); | ||
// NOLINTNEXTLINE(readability-identifier-naming) | ||
LLVM_ABI void Write(const AttributeList *AL); | ||
LLVM_ABI void Write(Printable P) { *OS << P << '\n'; } | ||
|
||
template <typename T> void Write(ArrayRef<T> Vs) { | ||
for (const T &V : Vs) | ||
Write(V); | ||
} | ||
|
||
template <typename T1, typename... Ts> | ||
void WriteTs(const T1 &V1, const Ts &...Vs) { | ||
Write(V1); | ||
WriteTs(Vs...); | ||
} | ||
|
||
template <typename... Ts> void WriteTs() {} | ||
|
||
public: | ||
/// A check failed, so printout out the condition and the message. | ||
/// | ||
/// This provides a nice place to put a breakpoint if you want to see why | ||
/// something is not correct. | ||
LLVM_ABI void CheckFailed(const Twine &Message); | ||
|
||
/// A check failed (with values to print). | ||
/// | ||
/// This calls the Message-only version so that the above is easier to set a | ||
/// breakpoint on. | ||
template <typename T1, typename... Ts> | ||
void CheckFailed(const Twine &Message, const T1 &V1, const Ts &...Vs) { | ||
CheckFailed(Message); | ||
if (OS) | ||
WriteTs(V1, Vs...); | ||
} | ||
|
||
/// A debug info check failed. | ||
LLVM_ABI void DebugInfoCheckFailed(const Twine &Message); | ||
|
||
/// A debug info check failed (with values to print). | ||
template <typename T1, typename... Ts> | ||
void DebugInfoCheckFailed(const Twine &Message, const T1 &V1, | ||
const Ts &...Vs) { | ||
DebugInfoCheckFailed(Message); | ||
if (OS) | ||
WriteTs(V1, Vs...); | ||
} | ||
}; | ||
|
||
/// Verify that the TBAA Metadatas are valid. | ||
class TBAAVerifier { | ||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
protected?