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