diff --git a/llvm/tools/llvm-extract/llvm-extract.cpp b/llvm/tools/llvm-extract/llvm-extract.cpp --- a/llvm/tools/llvm-extract/llvm-extract.cpp +++ b/llvm/tools/llvm-extract/llvm-extract.cpp @@ -31,6 +31,7 @@ #include "llvm/Support/ToolOutputFile.h" #include "llvm/Transforms/IPO.h" #include +#include using namespace llvm; cl::OptionCategory ExtractCat("llvm-extract Options"); @@ -252,8 +253,9 @@ } // Figure out which BasicBlocks we should extract. - SmallVector, 4> GroupOfBBs; + SmallVector>, 2> BBMap; for (StringRef StrPair : ExtractBlocks) { + SmallVector BBNames; auto BBInfo = StrPair.split(':'); // Get the function. Function *F = M->getFunction(BBInfo.first); @@ -264,24 +266,8 @@ } // Do not materialize this function. GVs.insert(F); - // Get the basic blocks. - SmallVector BBs; - SmallVector BBNames; - BBInfo.second.split(BBNames, ';', /*MaxSplit=*/-1, - /*KeepEmpty=*/false); - for (StringRef BBName : BBNames) { - auto Res = llvm::find_if(*F, [&](const BasicBlock &BB) { - return BB.getName().equals(BBName); - }); - if (Res == F->end()) { - errs() << argv[0] << ": function " << F->getName() - << " doesn't contain a basic block named '" << BBInfo.second - << "'!\n"; - return 1; - } - BBs.push_back(&*Res); - } - GroupOfBBs.push_back(BBs); + BBInfo.second.split(BBNames, ';', /*MaxSplit=*/-1, /*KeepEmpty=*/false); + BBMap.push_back({F, std::move(BBNames)}); } // Use *argv instead of argv[0] to work around a wrong GCC warning. @@ -345,6 +331,25 @@ // Extract the specified basic blocks from the module and erase the existing // functions. if (!ExtractBlocks.empty()) { + // Figure out which BasicBlocks we should extract. + SmallVector, 4> GroupOfBBs; + for (auto &P : BBMap) { + SmallVector BBs; + for (StringRef BBName : P.second) { + auto Res = llvm::find_if(*P.first, [&](const BasicBlock &BB) { + return BB.getName().equals(BBName); + }); + if (Res == P.first->end()) { + errs() << argv[0] << ": function " << P.first->getName() + << " doesn't contain a basic block named '" << BBName + << "'!\n"; + return 1; + } + BBs.push_back(&*Res); + } + GroupOfBBs.push_back(BBs); + } + legacy::PassManager PM; PM.add(createBlockExtractorPass(GroupOfBBs, true)); PM.run(*M);