mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Add BasicBlockPassManager_New.
llvm-svn: 31513
This commit is contained in:
parent
54a8f6f998
commit
b7d2cd5ec2
@ -17,6 +17,9 @@
|
||||
#ifndef LLVM_PASSMANAGER_H
|
||||
#define LLVM_PASSMANAGER_H
|
||||
|
||||
#include "llvm/Pass.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class Pass;
|
||||
@ -85,6 +88,26 @@ public:
|
||||
bool doFinalization();
|
||||
};
|
||||
|
||||
/// BasicBlockpassManager_New manages BasicBlockPass. It batches all the
|
||||
/// pass together and sequence them to process one basic block before
|
||||
/// processing next basic block.
|
||||
class BasicBlockPassManager_New: public Pass {
|
||||
|
||||
public:
|
||||
BasicBlockPassManager_New() { }
|
||||
|
||||
/// Add a pass into a passmanager queue.
|
||||
bool addPass(Pass *p);
|
||||
|
||||
/// 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 runOnFunction(Function &F);
|
||||
|
||||
private:
|
||||
// Collection of pass that are not yet scheduled
|
||||
std::vector<Pass *> PassVector;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
56
lib/VMCore/PassManager.cpp
Normal file
56
lib/VMCore/PassManager.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file was developed by the LLVM research group and is distributed under
|
||||
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the LLVM Pass Manager infrastructure.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Module.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
/// BasicBlockPassManager implementation
|
||||
|
||||
/// Add pass P into PassVector and return TRUE. If this pass is not
|
||||
/// manageable by this manager then return FALSE.
|
||||
bool
|
||||
BasicBlockPassManager_New::addPass (Pass *P) {
|
||||
|
||||
BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
|
||||
if (!BP)
|
||||
return false;
|
||||
|
||||
// TODO: Check if it suitable to manage P using this BasicBlockPassManager
|
||||
// or we need another instance of BasicBlockPassManager
|
||||
|
||||
// Add pass
|
||||
PassVector.push_back(BP);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Execute all of the passes scheduled for execution by invoking
|
||||
/// runOnBasicBlock method. Keep track of whether any of the passes modifies
|
||||
/// the function, and if so, return true.
|
||||
bool
|
||||
BasicBlockPassManager_New::runOnFunction(Function &F) {
|
||||
|
||||
bool Changed = false;
|
||||
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
|
||||
for (std::vector<Pass *>::iterator itr = PassVector.begin(),
|
||||
e = PassVector.end(); itr != e; ++itr) {
|
||||
Pass *P = *itr;
|
||||
BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
|
||||
Changed |= BP->runOnBasicBlock(*I);
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user