diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-07-25 14:49:26 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-07-25 14:49:26 +0000 |
| commit | 6b6fdc992a826f66c1eb3b1e2a08220e29042891 (patch) | |
| tree | cdab3c206a971a0920102a070a1811a169ea6b54 /llvm/lib/Transforms | |
| parent | 115d2df8a4406959fd0b62b205611bb75773aab3 (diff) | |
| download | bcm5719-llvm-6b6fdc992a826f66c1eb3b1e2a08220e29042891.tar.gz bcm5719-llvm-6b6fdc992a826f66c1eb3b1e2a08220e29042891.zip | |
IPO: Add use-list-order verifier
Add a -verify-use-list-order pass, which shuffles use-list order, writes
to bitcode, reads back, and verifies that the (shuffled) order matches.
- The utility functions live in lib/IR/UseListOrder.cpp.
- Moved (and renamed) the command-line option to enable writing
use-lists, so that this pass can return early if the use-list orders
aren't being serialized.
It's not clear that this pass is the right direction long-term (perhaps
a separate tool instead?), but short-term it's a great way to test the
use-list order prototype. I've added an XFAIL-ed testcase that I'm
hoping to get working pretty quickly.
This is part of PR5680.
llvm-svn: 213945
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; +} |

