163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//===- BarrierNoopPass.cpp - A barrier pass for the pass manager ----------===//
263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//                     The LLVM Compiler Infrastructure
463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// This file is distributed under the University of Illinois Open Source
663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// License. See LICENSE.TXT for details.
763a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
863a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//===----------------------------------------------------------------------===//
963a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
1063a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// NOTE: DO NOT USE THIS IF AVOIDABLE
1163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
1263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// This pass is a nonce pass intended to allow manipulation of the implicitly
1363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// nesting pass manager. For example, it can be used to cause a CGSCC pass
1463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// manager to be closed prior to running a new collection of function passes.
1563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
1663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// FIXME: This is a huge HACK. This should be removed when the pass manager's
1763a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth// nesting is made explicit instead of implicit.
1863a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//
1963a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth//===----------------------------------------------------------------------===//
2063a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
2163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth#include "llvm/Pass.h"
2263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth#include "llvm/Transforms/IPO.h"
2363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruthusing namespace llvm;
2463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
2563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruthnamespace {
2663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth/// \brief A nonce module pass used to place a barrier in a pass manager.
2763a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth///
2863a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth/// There is no mechanism for ending a CGSCC pass manager once one is started.
2963a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth/// This prevents extension points from having clear deterministic ordering
3063a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth/// when they are phrased as non-module passes.
3163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruthclass BarrierNoop : public ModulePass {
3263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruthpublic:
3363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth  static char ID; // Pass identification.
3463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
3563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth  BarrierNoop() : ModulePass(ID) {
3663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    initializeBarrierNoopPass(*PassRegistry::getPassRegistry());
3763a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth  }
3863a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnModule(Module &M) override { return false; }
4063a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth};
4163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth}
4263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
4363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler CarruthModulePass *llvm::createBarrierNoopPass() { return new BarrierNoop(); }
4463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
4563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruthchar BarrierNoop::ID = 0;
4663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler CarruthINITIALIZE_PASS(BarrierNoop, "barrier", "A No-Op Barrier Pass",
4763a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth                false, false)
48