mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-18 10:08:34 +00:00
f0356fe140
Modules and ModuleProviders. Because the "ModuleProvider" simply materializes GlobalValues now, and doesn't provide modules, it's renamed to "GVMaterializer". Code that used to need a ModuleProvider to materialize Functions can now materialize the Functions directly. Functions no longer use a magic linkage to record that they're materializable; they simply ask the GVMaterializer. Because the C ABI must never change, we can't remove LLVMModuleProviderRef or the functions that refer to it. Instead, because Module now exposes the same functionality ModuleProvider used to, we store a Module* in any LLVMModuleProviderRef and translate in the wrapper methods. The bindings to other languages still use the ModuleProvider concept. It would probably be worth some time to update them to follow the C++ more closely, but I don't intend to do it. Fixes http://llvm.org/PR5737 and http://llvm.org/PR5735. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94686 91177308-0d34-0410-b5e6-96231b3b80d8
106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
//===- llvm/PassManager.h - 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 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_PASSMANAGER_H
|
|
#define LLVM_PASSMANAGER_H
|
|
|
|
#include "llvm/Pass.h"
|
|
|
|
namespace llvm {
|
|
|
|
class Pass;
|
|
class ModulePass;
|
|
class Module;
|
|
|
|
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. (TODO delete passes.)
|
|
/// 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 llvm namespace
|
|
|
|
#endif
|