Mercurial > hg > CbC > CbC_llvm
comparison tools/bugpoint-passes/TestPasses.cpp @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 54457678186b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 //===- TestPasses.cpp - "buggy" passes used to test bugpoint --------------===// | |
2 // | |
3 // The LLVM Compiler Infrastructure | |
4 // | |
5 // This file is distributed under the University of Illinois Open Source | |
6 // License. See LICENSE.TXT for details. | |
7 // | |
8 //===----------------------------------------------------------------------===// | |
9 // | |
10 // This file contains "buggy" passes that are used to test bugpoint, to check | |
11 // that it is narrowing down testcases correctly. | |
12 // | |
13 //===----------------------------------------------------------------------===// | |
14 | |
15 #include "llvm/IR/BasicBlock.h" | |
16 #include "llvm/IR/Constant.h" | |
17 #include "llvm/IR/Instructions.h" | |
18 #include "llvm/IR/Type.h" | |
19 #include "llvm/InstVisitor.h" | |
20 #include "llvm/Pass.h" | |
21 | |
22 using namespace llvm; | |
23 | |
24 namespace { | |
25 /// CrashOnCalls - This pass is used to test bugpoint. It intentionally | |
26 /// crashes on any call instructions. | |
27 class CrashOnCalls : public BasicBlockPass { | |
28 public: | |
29 static char ID; // Pass ID, replacement for typeid | |
30 CrashOnCalls() : BasicBlockPass(ID) {} | |
31 private: | |
32 virtual void getAnalysisUsage(AnalysisUsage &AU) const { | |
33 AU.setPreservesAll(); | |
34 } | |
35 | |
36 bool runOnBasicBlock(BasicBlock &BB) { | |
37 for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) | |
38 if (isa<CallInst>(*I)) | |
39 abort(); | |
40 | |
41 return false; | |
42 } | |
43 }; | |
44 } | |
45 | |
46 char CrashOnCalls::ID = 0; | |
47 static RegisterPass<CrashOnCalls> | |
48 X("bugpoint-crashcalls", | |
49 "BugPoint Test Pass - Intentionally crash on CallInsts"); | |
50 | |
51 namespace { | |
52 /// DeleteCalls - This pass is used to test bugpoint. It intentionally | |
53 /// deletes some call instructions, "misoptimizing" the program. | |
54 class DeleteCalls : public BasicBlockPass { | |
55 public: | |
56 static char ID; // Pass ID, replacement for typeid | |
57 DeleteCalls() : BasicBlockPass(ID) {} | |
58 private: | |
59 bool runOnBasicBlock(BasicBlock &BB) { | |
60 for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) | |
61 if (CallInst *CI = dyn_cast<CallInst>(I)) { | |
62 if (!CI->use_empty()) | |
63 CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); | |
64 CI->getParent()->getInstList().erase(CI); | |
65 break; | |
66 } | |
67 return false; | |
68 } | |
69 }; | |
70 } | |
71 | |
72 char DeleteCalls::ID = 0; | |
73 static RegisterPass<DeleteCalls> | |
74 Y("bugpoint-deletecalls", | |
75 "BugPoint Test Pass - Intentionally 'misoptimize' CallInsts"); |