IPO: Add use-list-order verifier
[oota-llvm.git] / lib / Transforms / IPO / VerifyUseListOrder.cpp
1 //===- VerifyUseListOrder.cpp - Use List Order Verifier ---------*- C++ -*-===//
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 // Pass to verify use-list order doesn't change after serialization.
11 //
12 // Despite it being a verifier, this pass *does* transform the module, since it
13 // shuffles the use-list of every value.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #include "llvm/Transforms/IPO.h"
18 #include "llvm/IR/UseListOrder.h"
19 #include "llvm/Pass.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/ErrorHandling.h"
22
23 using namespace llvm;
24
25 #define DEBUG_TYPE "use-list-order"
26
27 namespace {
28 class VerifyUseListOrder : public ModulePass {
29 public:
30   static char ID;
31   VerifyUseListOrder();
32   bool runOnModule(Module &M) override;
33 };
34 } // end anonymous namespace
35
36 char VerifyUseListOrder::ID = 0;
37 INITIALIZE_PASS(VerifyUseListOrder, "verify-use-list-order",
38                 "Verify Use List Order", false, false)
39 VerifyUseListOrder::VerifyUseListOrder() : ModulePass(ID) {
40   initializeVerifyUseListOrderPass(*PassRegistry::getPassRegistry());
41 }
42
43 bool VerifyUseListOrder::runOnModule(Module &M) {
44   DEBUG(dbgs() << "*** verify-use-list-order ***\n");
45   if (!shouldPreserveBitcodeUseListOrder()) {
46     // Can't verify if order isn't preserved.
47     DEBUG(dbgs() << "warning: cannot verify bitcode; "
48                     "try -preserve-bc-use-list-order\n");
49     return false;
50   }
51
52   shuffleUseLists(M);
53   if (!verifyBitcodeUseListOrder(M))
54     report_fatal_error("bitcode use-list order changed");
55
56   return true;
57 }
58
59 ModulePass *llvm::createVerifyUseListOrderPass() {
60   return new VerifyUseListOrder;
61 }