1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Move the old pass manager infrastructure into a legacy namespace and

give the files a legacy prefix in the right directory. Use forwarding
headers in the old locations to paper over the name change for most
clients during the transitional period.

No functionality changed here! This is just clearing some space to
reduce renaming churn later on with a new system.

Even when the new stuff starts to go in, it is going to be hidden behind
a flag and off-by-default as it is still WIP and under development.

This patch is specifically designed so that very little out-of-tree code
has to change. I'm going to work as hard as I can to keep that the case.
Only direct forward declarations of the PassManager class are impacted
by this change.

llvm-svn: 194324
This commit is contained in:
Chandler Carruth 2013-11-09 12:26:54 +00:00
parent 821ddf0c78
commit f2e7a23acb
13 changed files with 185 additions and 111 deletions

View File

@ -16,8 +16,8 @@
#define LLVM_ANALYSIS_LOOPPASS_H #define LLVM_ANALYSIS_LOOPPASS_H
#include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopInfo.h"
#include "llvm/IR/LegacyPassManagers.h"
#include "llvm/Pass.h" #include "llvm/Pass.h"
#include "llvm/PassManagers.h"
#include <deque> #include <deque>
namespace llvm { namespace llvm {

View File

@ -18,8 +18,8 @@
#include "llvm/Analysis/RegionInfo.h" #include "llvm/Analysis/RegionInfo.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/LegacyPassManagers.h"
#include "llvm/Pass.h" #include "llvm/Pass.h"
#include "llvm/PassManagers.h"
#include <deque> #include <deque>
namespace llvm { namespace llvm {

View File

@ -25,7 +25,6 @@ class FunctionPass;
class MachineFunctionPass; class MachineFunctionPass;
class PassConfigImpl; class PassConfigImpl;
class PassInfo; class PassInfo;
class PassManagerBase;
class ScheduleDAGInstrs; class ScheduleDAGInstrs;
class TargetLowering; class TargetLowering;
class TargetLoweringBase; class TargetLoweringBase;
@ -33,6 +32,12 @@ class TargetRegisterClass;
class raw_ostream; class raw_ostream;
struct MachineSchedContext; struct MachineSchedContext;
// The old pass manager infrastructure is hidden in a legacy namespace now.
namespace legacy {
class PassManagerBase;
}
using legacy::PassManagerBase;
/// Discriminated union of Pass ID types. /// Discriminated union of Pass ID types.
/// ///
/// The PassConfig API prefers dealing with IDs because they are safer and more /// The PassConfig API prefers dealing with IDs because they are safer and more

View File

@ -0,0 +1,111 @@
//===- LegacyPassManager.h - Legacy Container for Passes --------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the legacy PassManager class. This class is used to hold,
// maintain, and optimize execution of Passes. The PassManager class ensures
// that analysis results are available before a pass runs, and that Pass's are
// destroyed when the PassManager is destroyed.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_IR_LEGACYPASSMANAGER_H
#define LLVM_IR_LEGACYPASSMANAGER_H
#include "llvm/Pass.h"
#include "llvm/Support/CBindingWrapping.h"
namespace llvm {
class Pass;
class Module;
namespace legacy {
class PassManagerImpl;
class FunctionPassManagerImpl;
/// PassManagerBase - An abstract interface to allow code to add passes to
/// a pass manager without having to hard-code what kind of pass manager
/// it is.
class PassManagerBase {
public:
virtual ~PassManagerBase();
/// add - Add a pass to the queue of passes to run. This passes ownership of
/// the Pass to the PassManager. When the PassManager is destroyed, the pass
/// will be destroyed as well, so there is no need to delete the pass. This
/// implies that all passes MUST be allocated with 'new'.
virtual void add(Pass *P) = 0;
};
/// PassManager manages ModulePassManagers
class PassManager : public PassManagerBase {
public:
PassManager();
~PassManager();
/// add - Add a pass to the queue of passes to run. This passes ownership of
/// the Pass to the PassManager. When the PassManager is destroyed, the pass
/// will be destroyed as well, so there is no need to delete the pass. This
/// implies that all passes MUST be allocated with 'new'.
void add(Pass *P);
/// run - Execute all of the passes scheduled for execution. Keep track of
/// whether any of the passes modifies the module, and if so, return true.
bool run(Module &M);
private:
/// PassManagerImpl_New is the actual class. PassManager is just the
/// wraper to publish simple pass manager interface
PassManagerImpl *PM;
};
/// FunctionPassManager manages FunctionPasses and BasicBlockPassManagers.
class FunctionPassManager : public PassManagerBase {
public:
/// FunctionPassManager ctor - This initializes the pass manager. It needs,
/// but does not take ownership of, the specified Module.
explicit FunctionPassManager(Module *M);
~FunctionPassManager();
/// add - Add a pass to the queue of passes to run. This passes
/// ownership of the Pass to the PassManager. When the
/// PassManager_X is destroyed, the pass will be destroyed as well, so
/// there is no need to delete the pass.
/// This implies that all passes MUST be allocated with 'new'.
void add(Pass *P);
/// run - Execute all of the passes scheduled for execution. Keep
/// track of whether any of the passes modifies the function, and if
/// so, return true.
///
bool run(Function &F);
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization();
/// doFinalization - Run all of the finalizers for the function passes.
///
bool doFinalization();
private:
FunctionPassManagerImpl *FPM;
Module *M;
};
} // End legacy namespace
// Create wrappers for C Binding types (see CBindingWrapping.h).
DEFINE_STDCXX_CONVERSION_FUNCTIONS(legacy::PassManagerBase, LLVMPassManagerRef)
} // End llvm namespace
#endif

View File

@ -1,4 +1,4 @@
//===- llvm/PassManagers.h - Pass Infrastructure classes -------*- C++ -*-===// //===- LegacyPassManagers.h - Legacy Pass Infrastructure --------*- C++ -*-===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //

View File

@ -7,101 +7,33 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
// This file defines the PassManager class. This class is used to hold, // This is a legacy redirect header for the old PassManager. It is intended to
// maintain, and optimize execution of Passes. The PassManager class ensures // be used by clients that have not been converted to be aware of the new pass
// that analysis results are available before a pass runs, and that Pass's are // management infrastructure being built for LLVM, which is every client
// destroyed when the PassManager is destroyed. // initially. Eventually this header (and the legacy management layer) will go
// away, but we want to minimize changes to out-of-tree users of LLVM in the
// interim.
//
// Note that this header *must not* be included into the same file as the new
// pass management infrastructure is included. Things will break spectacularly.
// If you are starting that conversion, you should switch to explicitly
// including LegacyPassManager.h and using the legacy namespace.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#ifndef LLVM_PASSMANAGER_H #ifndef LLVM_PASSMANAGER_H
#define LLVM_PASSMANAGER_H #define LLVM_PASSMANAGER_H
#include "llvm/Pass.h" #include "llvm/IR/LegacyPassManager.h"
#include "llvm/Support/CBindingWrapping.h"
namespace llvm { namespace llvm {
class Pass; // Pull these into the llvm namespace so that existing code that expects it
class Module; // there can find it.
using legacy::PassManagerBase;
using legacy::PassManager;
using legacy::FunctionPassManager;
class PassManagerImpl; }
class FunctionPassManagerImpl;
/// PassManagerBase - An abstract interface to allow code to add passes to
/// a pass manager without having to hard-code what kind of pass manager
/// it is.
class PassManagerBase {
public:
virtual ~PassManagerBase();
/// add - Add a pass to the queue of passes to run. This passes ownership of
/// the Pass to the PassManager. When the PassManager is destroyed, the pass
/// will be destroyed as well, so there is no need to delete the pass. This
/// implies that all passes MUST be allocated with 'new'.
virtual void add(Pass *P) = 0;
};
/// PassManager manages ModulePassManagers
class PassManager : public PassManagerBase {
public:
PassManager();
~PassManager();
/// add - Add a pass to the queue of passes to run. This passes ownership of
/// the Pass to the PassManager. When the PassManager is destroyed, the pass
/// will be destroyed as well, so there is no need to delete the pass. This
/// implies that all passes MUST be allocated with 'new'.
void add(Pass *P);
/// run - Execute all of the passes scheduled for execution. Keep track of
/// whether any of the passes modifies the module, and if so, return true.
bool run(Module &M);
private:
/// PassManagerImpl_New is the actual class. PassManager is just the
/// wraper to publish simple pass manager interface
PassManagerImpl *PM;
};
/// FunctionPassManager manages FunctionPasses and BasicBlockPassManagers.
class FunctionPassManager : public PassManagerBase {
public:
/// FunctionPassManager ctor - This initializes the pass manager. It needs,
/// but does not take ownership of, the specified Module.
explicit FunctionPassManager(Module *M);
~FunctionPassManager();
/// add - Add a pass to the queue of passes to run. This passes
/// ownership of the Pass to the PassManager. When the
/// PassManager_X is destroyed, the pass will be destroyed as well, so
/// there is no need to delete the pass.
/// This implies that all passes MUST be allocated with 'new'.
void add(Pass *P);
/// run - Execute all of the passes scheduled for execution. Keep
/// track of whether any of the passes modifies the function, and if
/// so, return true.
///
bool run(Function &F);
/// doInitialization - Run all of the initializers for the function passes.
///
bool doInitialization();
/// doFinalization - Run all of the finalizers for the function passes.
///
bool doFinalization();
private:
FunctionPassManagerImpl *FPM;
Module *M;
};
// Create wrappers for C Binding types (see CBindingWrapping.h).
DEFINE_STDCXX_CONVERSION_FUNCTIONS(PassManagerBase, LLVMPassManagerRef)
} // End llvm namespace
#endif #endif

View File

@ -29,7 +29,6 @@ class GlobalValue;
class MCAsmInfo; class MCAsmInfo;
class MCCodeGenInfo; class MCCodeGenInfo;
class MCContext; class MCContext;
class PassManagerBase;
class Target; class Target;
class DataLayout; class DataLayout;
class TargetLibraryInfo; class TargetLibraryInfo;
@ -47,6 +46,12 @@ class VectorTargetTransformInfo;
class formatted_raw_ostream; class formatted_raw_ostream;
class raw_ostream; class raw_ostream;
// The old pass manager infrastructure is hidden in a legacy namespace now.
namespace legacy {
class PassManagerBase;
}
using legacy::PassManagerBase;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
/// ///
/// TargetMachine - Primary interface to the complete machine description for /// TargetMachine - Primary interface to the complete machine description for

View File

@ -18,10 +18,16 @@
#include <vector> #include <vector>
namespace llvm { namespace llvm {
class TargetLibraryInfo; class TargetLibraryInfo;
class PassManagerBase; class Pass;
class Pass;
class FunctionPassManager; // The old pass manager infrastructure is hidden in a legacy namespace now.
namespace legacy {
class PassManagerBase;
class FunctionPassManager;
}
using legacy::PassManagerBase;
using legacy::FunctionPassManager;
/// PassManagerBuilder - This class is used to set up a standard optimization /// PassManagerBuilder - This class is used to set up a standard optimization
/// sequence for languages like C and C++, allowing some APIs to customize the /// sequence for languages like C and C++, allowing some APIs to customize the

View File

@ -22,7 +22,7 @@
#include "llvm/Analysis/CallGraph.h" #include "llvm/Analysis/CallGraph.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/IntrinsicInst.h"
#include "llvm/PassManagers.h" #include "llvm/IR/LegacyPassManagers.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/Timer.h" #include "llvm/Support/Timer.h"

View File

@ -6,10 +6,10 @@ add_llvm_library(LLVMCore
ConstantFold.cpp ConstantFold.cpp
Constants.cpp Constants.cpp
Core.cpp Core.cpp
DIBuilder.cpp
DataLayout.cpp DataLayout.cpp
DebugInfo.cpp DebugInfo.cpp
DebugLoc.cpp DebugLoc.cpp
DIBuilder.cpp
Dominators.cpp Dominators.cpp
Function.cpp Function.cpp
GCOV.cpp GCOV.cpp
@ -23,10 +23,10 @@ add_llvm_library(LLVMCore
LLVMContext.cpp LLVMContext.cpp
LLVMContextImpl.cpp LLVMContextImpl.cpp
LeakDetector.cpp LeakDetector.cpp
LegacyPassManager.cpp
Metadata.cpp Metadata.cpp
Module.cpp Module.cpp
Pass.cpp Pass.cpp
PassManager.cpp
PassRegistry.cpp PassRegistry.cpp
PrintModulePass.cpp PrintModulePass.cpp
Type.cpp Type.cpp

View File

@ -1,4 +1,4 @@
//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===// //===- LegacyPassManager.cpp - LLVM Pass Infrastructure Implementation ----===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //
@ -7,16 +7,16 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
// This file implements the LLVM Pass Manager infrastructure. // This file implements the legacy LLVM Pass Manager infrastructure.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "llvm/PassManagers.h"
#include "llvm/Assembly/PrintModulePass.h" #include "llvm/Assembly/PrintModulePass.h"
#include "llvm/Assembly/Writer.h" #include "llvm/Assembly/Writer.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
#include "llvm/PassManager.h" #include "llvm/IR/LegacyPassManagers.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
@ -28,11 +28,10 @@
#include <algorithm> #include <algorithm>
#include <map> #include <map>
using namespace llvm; using namespace llvm;
using namespace llvm::legacy;
// See PassManagers.h for Pass Manager infrastructure overview. // See PassManagers.h for Pass Manager infrastructure overview.
namespace llvm {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Pass debugging information. Often it is useful to find out what pass is // Pass debugging information. Often it is useful to find out what pass is
// running when a crash occurs in a utility. When this library is compiled with // running when a crash occurs in a utility. When this library is compiled with
@ -40,10 +39,12 @@ namespace llvm {
// pass name to be printed before it executes. // pass name to be printed before it executes.
// //
namespace {
// Different debug levels that can be enabled... // Different debug levels that can be enabled...
enum PassDebugLevel { enum PassDebugLevel {
Disabled, Arguments, Structure, Executions, Details Disabled, Arguments, Structure, Executions, Details
}; };
}
static cl::opt<enum PassDebugLevel> static cl::opt<enum PassDebugLevel>
PassDebugging("debug-pass", cl::Hidden, PassDebugging("debug-pass", cl::Hidden,
@ -56,8 +57,10 @@ PassDebugging("debug-pass", cl::Hidden,
clEnumVal(Details , "print pass details when it is executed"), clEnumVal(Details , "print pass details when it is executed"),
clEnumValEnd)); clEnumValEnd));
namespace {
typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser> typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser>
PassOptionList; PassOptionList;
}
// Print IR out before/after specified passes. // Print IR out before/after specified passes.
static PassOptionList static PassOptionList
@ -106,8 +109,6 @@ static bool ShouldPrintAfterPass(const PassInfo *PI) {
return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter); return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter);
} }
} // End of llvm namespace
/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions
/// or higher is specified. /// or higher is specified.
bool PMDataManager::isPassDebuggingExecutionsOrMore() const { bool PMDataManager::isPassDebuggingExecutionsOrMore() const {
@ -149,7 +150,6 @@ void PassManagerPrettyStackEntry::print(raw_ostream &OS) const {
namespace { namespace {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// BBPassManager // BBPassManager
// //
@ -206,10 +206,10 @@ public:
}; };
char BBPassManager::ID = 0; char BBPassManager::ID = 0;
} } // End anonymous namespace
namespace llvm { namespace llvm {
namespace legacy {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// FunctionPassManagerImpl // FunctionPassManagerImpl
// //
@ -277,7 +277,10 @@ public:
void FunctionPassManagerImpl::anchor() {} void FunctionPassManagerImpl::anchor() {}
char FunctionPassManagerImpl::ID = 0; char FunctionPassManagerImpl::ID = 0;
} // End of legacy namespace
} // End of llvm namespace
namespace {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// MPPassManager // MPPassManager
// //
@ -372,6 +375,10 @@ public:
}; };
char MPPassManager::ID = 0; char MPPassManager::ID = 0;
} // End anonymous namespace
namespace llvm {
namespace legacy {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// PassManagerImpl // PassManagerImpl
// //
@ -437,6 +444,7 @@ public:
void PassManagerImpl::anchor() {} void PassManagerImpl::anchor() {}
char PassManagerImpl::ID = 0; char PassManagerImpl::ID = 0;
} // End of legacy namespace
} // End of llvm namespace } // End of llvm namespace
namespace { namespace {

View File

@ -10,9 +10,9 @@ set(IRSources
DominatorTreeTest.cpp DominatorTreeTest.cpp
IRBuilderTest.cpp IRBuilderTest.cpp
InstructionsTest.cpp InstructionsTest.cpp
LegacyPassManagerTest.cpp
MDBuilderTest.cpp MDBuilderTest.cpp
MetadataTest.cpp MetadataTest.cpp
PassManagerTest.cpp
PatternMatch.cpp PatternMatch.cpp
TypeBuilderTest.cpp TypeBuilderTest.cpp
TypesTest.cpp TypesTest.cpp

View File

@ -1,4 +1,4 @@
//===- llvm/unittest/IR/PassManager.cpp - PassManager unit tests ----------===// //===- llvm/unittest/IR/LegacyPassManager.cpp - Legacy PassManager tests --===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //
@ -6,6 +6,13 @@
// License. See LICENSE.TXT for details. // License. See LICENSE.TXT for details.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
//
// This unit test exercises the legacy pass manager infrastructure. We use the
// old names as well to ensure that the source-level compatibility wrapper
// works for out-of-tree code that expects to include llvm/PassManager.h and
// subclass the core pass classes.
//
//===----------------------------------------------------------------------===//
#include "llvm/PassManager.h" #include "llvm/PassManager.h"
#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallVector.h"