20
20
#include " llvm/Target/TargetVerifier.h"
21
21
#include " llvm/Target/TargetVerify/AMDGPUTargetVerifier.h"
22
22
23
+ #include " llvm/InitializePasses.h"
23
24
#include " llvm/Analysis/UniformityAnalysis.h"
24
25
#include " llvm/Analysis/PostDominators.h"
25
26
#include " llvm/Support/Debug.h"
32
33
33
34
namespace llvm {
34
35
35
- void TargetVerify::run (Function &F, FunctionAnalysisManager &AM) {
36
+ bool TargetVerify::run (Function &F) {
37
+ if (TT.isAMDGPU ()) {
38
+ AMDGPUTargetVerify TV (Mod);
39
+ TV.run (F);
40
+
41
+ dbgs () << TV.MessagesStr .str ();
42
+ if (!TV.MessagesStr .str ().empty ()) {
43
+ TV.IsValid = false ;
44
+ return false ;
45
+ }
46
+ return true ;
47
+ }
48
+ report_fatal_error (" Target has no verification method\n " );
49
+ }
50
+
51
+ bool TargetVerify::run (Function &F, FunctionAnalysisManager &AM) {
36
52
if (TT.isAMDGPU ()) {
37
53
auto *UA = &AM.getResult <UniformityInfoAnalysis>(F);
38
54
auto *DT = &AM.getResult <DominatorTreeAnalysis>(F);
@@ -44,8 +60,77 @@ void TargetVerify::run(Function &F, FunctionAnalysisManager &AM) {
44
60
dbgs () << TV.MessagesStr .str ();
45
61
if (!TV.MessagesStr .str ().empty ()) {
46
62
TV.IsValid = false ;
63
+ return false ;
64
+ }
65
+ return true ;
66
+ }
67
+ report_fatal_error (" Target has no verification method\n " );
68
+ }
69
+
70
+ PreservedAnalyses TargetVerifierPass::run (Function &F, FunctionAnalysisManager &AM) {
71
+ auto TT = F.getParent ()->getTargetTriple ();
72
+
73
+ if (TT.isAMDGPU ()) {
74
+ auto *Mod = F.getParent ();
75
+
76
+ auto UA = &AM.getResult <UniformityInfoAnalysis>(F);
77
+ auto *DT = &AM.getResult <DominatorTreeAnalysis>(F);
78
+ auto *PDT = &AM.getResult <PostDominatorTreeAnalysis>(F);
79
+
80
+ AMDGPUTargetVerify TV (Mod, DT, PDT, UA);
81
+ TV.run (F);
82
+
83
+ dbgs () << TV.MessagesStr .str ();
84
+ if (!TV.MessagesStr .str ().empty ()) {
85
+ TV.IsValid = false ;
86
+ return PreservedAnalyses::none ();
47
87
}
88
+ return PreservedAnalyses::all ();
48
89
}
90
+ report_fatal_error (" Target has no verification method\n " );
49
91
}
50
92
93
+ struct TargetVerifierLegacyPass : public FunctionPass {
94
+ static char ID;
95
+
96
+ std::unique_ptr<TargetVerify> TV;
97
+
98
+ TargetVerifierLegacyPass () : FunctionPass(ID) {
99
+ initializeTargetVerifierLegacyPassPass (*PassRegistry::getPassRegistry ());
100
+ }
101
+
102
+ bool doInitialization (Module &M) override {
103
+ TV = std::make_unique<TargetVerify>(&M);
104
+ return false ;
105
+ }
106
+
107
+ bool runOnFunction (Function &F) override {
108
+ if (!TV->run (F)) {
109
+ errs () << " in function " << F.getName () << ' \n ' ;
110
+ report_fatal_error (" broken function found, compilation aborted!" );
111
+ }
112
+ return false ;
113
+ }
114
+
115
+ bool doFinalization (Module &M) override {
116
+ bool IsValid = true ;
117
+ for (Function &F : M)
118
+ if (F.isDeclaration ())
119
+ IsValid &= TV->run (F);
120
+
121
+ if (!IsValid)
122
+ report_fatal_error (" broken module found, compilation aborted!" );
123
+ return false ;
124
+ }
125
+
126
+ void getAnalysisUsage (AnalysisUsage &AU) const override {
127
+ AU.setPreservesAll ();
128
+ }
129
+ };
130
+ char TargetVerifierLegacyPass::ID = 0 ;
131
+ FunctionPass *createTargetVerifierLegacyPass () {
132
+ return new TargetVerifierLegacyPass ();
133
+ }
51
134
} // namespace llvm
135
+ using namespace llvm ;
136
+ INITIALIZE_PASS (TargetVerifierLegacyPass, " tgtverifier" , " Target Verifier" , false , false )
0 commit comments