diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/IPO.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp | 61 |
3 files changed, 63 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/CMakeLists.txt b/llvm/lib/Transforms/IPO/CMakeLists.txt index 90c1c33e6dc..070ecfdc143 100644 --- a/llvm/lib/Transforms/IPO/CMakeLists.txt +++ b/llvm/lib/Transforms/IPO/CMakeLists.txt @@ -20,6 +20,7 @@ add_llvm_library(LLVMipo PruneEH.cpp StripDeadPrototypes.cpp StripSymbols.cpp + VerifyUseListOrder.cpp ) add_dependencies(LLVMipo intrinsics_gen) diff --git a/llvm/lib/Transforms/IPO/IPO.cpp b/llvm/lib/Transforms/IPO/IPO.cpp index b4d31d8d6fc..5dce2d6b407 100644 --- a/llvm/lib/Transforms/IPO/IPO.cpp +++ b/llvm/lib/Transforms/IPO/IPO.cpp @@ -44,6 +44,7 @@ void llvm::initializeIPO(PassRegistry &Registry) { initializeStripDebugDeclarePass(Registry); initializeStripDeadDebugInfoPass(Registry); initializeStripNonDebugSymbolsPass(Registry); + initializeVerifyUseListOrderPass(Registry); initializeBarrierNoopPass(Registry); } diff --git a/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp b/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp new file mode 100644 index 00000000000..a48f6c78202 --- /dev/null +++ b/llvm/lib/Transforms/IPO/VerifyUseListOrder.cpp @@ -0,0 +1,61 @@ +//===- VerifyUseListOrder.cpp - Use List Order Verifier ---------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Pass to verify use-list order doesn't change after serialization. +// +// Despite it being a verifier, this pass *does* transform the module, since it +// shuffles the use-list of every value. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/IPO.h" +#include "llvm/IR/UseListOrder.h" +#include "llvm/Pass.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h" + +using namespace llvm; + +#define DEBUG_TYPE "use-list-order" + +namespace { +class VerifyUseListOrder : public ModulePass { +public: + static char ID; + VerifyUseListOrder(); + bool runOnModule(Module &M) override; +}; +} // end anonymous namespace + +char VerifyUseListOrder::ID = 0; +INITIALIZE_PASS(VerifyUseListOrder, "verify-use-list-order", + "Verify Use List Order", false, false) +VerifyUseListOrder::VerifyUseListOrder() : ModulePass(ID) { + initializeVerifyUseListOrderPass(*PassRegistry::getPassRegistry()); +} + +bool VerifyUseListOrder::runOnModule(Module &M) { + DEBUG(dbgs() << "*** verify-use-list-order ***\n"); + if (!shouldPreserveBitcodeUseListOrder()) { + // Can't verify if order isn't preserved. + DEBUG(dbgs() << "warning: cannot verify bitcode; " + "try -preserve-bc-use-list-order\n"); + return false; + } + + shuffleUseLists(M); + if (!verifyBitcodeUseListOrder(M)) + report_fatal_error("bitcode use-list order changed"); + + return true; +} + +ModulePass *llvm::createVerifyUseListOrderPass() { + return new VerifyUseListOrder; +} |

