-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SafepointIRVerifier] Add verifier pass for finding GC relocation bugs
Original Patch and summary by Philip Reames. RewriteStatepointsForGC tries to rewrite a function in a manner where the optimizer can't end up using a pointer value after it might have been relocated by a safepoint. This pass checks the invariant that RSForGC is supposed to establish and that (if we constructed semantics correctly) later passes must preserve. This has been a really useful diagnostic tool when initially developing the rewriting scheme and has found numerous bugs. Differential Revision: https://reviews.llvm.org/D15940 Reviewed by: swaroop.sridhar, mjacob Subscribers: llvm-commits llvm-svn: 307112
- Loading branch information
1 parent
a24aa19
commit 740f529
Showing
9 changed files
with
638 additions
and
0 deletions.
There are no files selected for viewing
This file contains 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 |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| //===- SafepointIRVerifier.h - Checks for GC relocation problems *- C++ -*-===// | ||
| // | ||
| // The LLVM Compiler Infrastructure | ||
| // | ||
| // This file is distributed under the University of Illinois Open Source | ||
| // License. See LICENSE.TXT for details. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
| // | ||
| // This file defines a verifier which is useful for enforcing the relocation | ||
| // properties required by a relocating GC. Specifically, it looks for uses of | ||
| // the unrelocated value of pointer SSA values after a possible safepoint. It | ||
| // attempts to report no false negatives, but may end up reporting false | ||
| // positives in rare cases (see the note at the top of the corresponding cpp | ||
| // file.) | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef LLVM_IR_SAFEPOINT_IR_VERIFIER | ||
| #define LLVM_IR_SAFEPOINT_IR_VERIFIER | ||
|
|
||
| namespace llvm { | ||
|
|
||
| class Function; | ||
| class FunctionPass; | ||
|
|
||
| /// Run the safepoint verifier over a single function. Crashes on failure. | ||
| void verifySafepointIR(Function &F); | ||
|
|
||
| /// Create an instance of the safepoint verifier pass which can be added to | ||
| /// a pass pipeline to check for relocation bugs. | ||
| FunctionPass *createSafepointIRVerifierPass(); | ||
| } | ||
|
|
||
| #endif // LLVM_IR_SAFEPOINT_IR_VERIFIER |
This file contains 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
This file contains 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
This file contains 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
Oops, something went wrong.