diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2007-11-14 06:47:06 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2007-11-14 06:47:06 +0000 |
commit | 43e736db4de7378b461f6602c58fa5127dacb81b (patch) | |
tree | ef75560e2e1562553eae17c28b034bd7b3e64f4d /lib/Transforms/IPO/LoopExtractor.cpp | |
parent | 6d79e88da922791ae36b92259f4d9d90cac8578f (diff) | |
download | external_llvm-43e736db4de7378b461f6602c58fa5127dacb81b.zip external_llvm-43e736db4de7378b461f6602c58fa5127dacb81b.tar.gz external_llvm-43e736db4de7378b461f6602c58fa5127dacb81b.tar.bz2 |
Allow the block extractor take to take a list of basic blocks to not extract
from a file containing Function/BasicBlock pairings. This is not safe against
anonymous or abnormally-named Funcs or BBs.
Make bugpoint use this interface to pass the BBs list to the child bugpoint.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44101 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO/LoopExtractor.cpp')
-rw-r--r-- | lib/Transforms/IPO/LoopExtractor.cpp | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/lib/Transforms/IPO/LoopExtractor.cpp b/lib/Transforms/IPO/LoopExtractor.cpp index a6787fe..80ce1fd 100644 --- a/lib/Transforms/IPO/LoopExtractor.cpp +++ b/lib/Transforms/IPO/LoopExtractor.cpp @@ -21,10 +21,13 @@ #include "llvm/Pass.h" #include "llvm/Analysis/Dominators.h" #include "llvm/Analysis/LoopInfo.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/FunctionUtils.h" #include "llvm/ADT/Statistic.h" +#include <fstream> +#include <set> using namespace llvm; STATISTIC(NumExtracted, "Number of loops extracted"); @@ -144,15 +147,28 @@ FunctionPass *llvm::createSingleLoopExtractorPass() { namespace { + // BlockFile - A file which contains a list of blocks that should not be + // extracted. + cl::opt<std::string> + BlockFile("extract-blocks-file", cl::value_desc("filename"), + cl::desc("A file containing list of basic blocks to not extract"), + cl::Hidden); + /// BlockExtractorPass - This pass is used by bugpoint to extract all blocks /// from the module into their own functions except for those specified by the /// BlocksToNotExtract list. class BlockExtractorPass : public ModulePass { + void LoadFile(const char *Filename); + std::vector<BasicBlock*> BlocksToNotExtract; + std::vector<std::pair<std::string, std::string> > BlocksToNotExtractByName; public: static char ID; // Pass identification, replacement for typeid explicit BlockExtractorPass(const std::vector<BasicBlock*> &B) - : ModulePass((intptr_t)&ID), BlocksToNotExtract(B) {} + : ModulePass((intptr_t)&ID), BlocksToNotExtract(B) { + if (!BlockFile.empty()) + LoadFile(BlockFile.c_str()); + } BlockExtractorPass() : ModulePass((intptr_t)&ID) {} bool runOnModule(Module &M); @@ -171,6 +187,24 @@ ModulePass *llvm::createBlockExtractorPass(const std::vector<BasicBlock*> &BTNE) return new BlockExtractorPass(BTNE); } +void BlockExtractorPass::LoadFile(const char *Filename) { + // Load the BlockFile... + std::ifstream In(Filename); + if (!In.good()) { + cerr << "WARNING: BlockExtractor couldn't load file '" << Filename + << "'!\n"; + return; + } + while (In) { + std::string FunctionName, BlockName; + In >> FunctionName; + In >> BlockName; + if (!BlockName.empty()) + BlocksToNotExtractByName.push_back( + std::make_pair(FunctionName, BlockName)); + } +} + bool BlockExtractorPass::runOnModule(Module &M) { std::set<BasicBlock*> TranslatedBlocksToNotExtract; for (unsigned i = 0, e = BlocksToNotExtract.size(); i != e; ++i) { @@ -187,6 +221,29 @@ bool BlockExtractorPass::runOnModule(Module &M) { TranslatedBlocksToNotExtract.insert(BBI); } + while (!BlocksToNotExtractByName.empty()) { + // There's no way to find BBs by name without looking at every BB inside + // every Function. Fortunately, this is always empty except when used by + // bugpoint in which case correctness is more important than performance. + + std::string &FuncName = BlocksToNotExtractByName.back().first; + std::string &BlockName = BlocksToNotExtractByName.back().second; + + for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) { + Function &F = *FI; + if (F.getName() != FuncName) continue; + + for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) { + BasicBlock &BB = *BI; + if (BB.getName() != BlockName) continue; + + TranslatedBlocksToNotExtract.insert(BI); + } + } + + BlocksToNotExtractByName.pop_back(); + } + // Now that we know which blocks to not extract, figure out which ones we WANT // to extract. std::vector<BasicBlock*> BlocksToExtract; |