Add support to llvm-extract for extracting multiple functions and/or

multiple global variables at a time.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95825 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2010-02-10 23:58:53 +00:00
parent f7ea6c3ee8
commit a499d20e8d
2 changed files with 35 additions and 23 deletions

View File

@ -34,7 +34,13 @@ B<llvm-extract> will write raw bitcode regardless of the output device.
=item B<--func> I<function-name>
Extract the function named I<function-name> from the LLVM bitcode.
Extract the function named I<function-name> from the LLVM bitcode. May be
specified multiple times to extract multiple functions at once.
=item B<--glob> I<global-name>
Extract the global variable named I<global-name> from the LLVM bitcode. May be
specified multiple times to extract multiple global variables at once.
=item B<--help>

View File

@ -49,15 +49,15 @@ static cl::opt<bool>
Relink("relink",
cl::desc("Turn external linkage for callees of function to delete"));
// ExtractFunc - The function to extract from the module...
static cl::opt<std::string>
ExtractFunc("func", cl::desc("Specify function to extract"), cl::init(""),
cl::value_desc("function"));
// ExtractFuncs - The functions to extract from the module...
static cl::list<std::string>
ExtractFuncs("func", cl::desc("Specify function to extract"),
cl::ZeroOrMore, cl::value_desc("function"));
// ExtractGlobal - The global to extract from the module...
static cl::opt<std::string>
ExtractGlobal("glob", cl::desc("Specify global to extract"), cl::init(""),
cl::value_desc("global"));
// ExtractGlobals - The globals to extract from the module...
static cl::list<std::string>
ExtractGlobals("glob", cl::desc("Specify global to extract"),
cl::ZeroOrMore, cl::value_desc("global"));
static cl::opt<bool>
OutputAssembly("S",
@ -81,28 +81,34 @@ int main(int argc, char **argv) {
return 1;
}
// Figure out which function we should extract
GlobalVariable *G = !ExtractGlobal.empty() ?
M.get()->getNamedGlobal(ExtractGlobal) : 0;
std::vector<GlobalValue *> GVs;
// Figure out which function we should extract
if (ExtractFunc.empty() && ExtractGlobal.empty()) ExtractFunc = "main";
Function *F = M.get()->getFunction(ExtractFunc);
// Figure out which globals we should extract.
for (size_t i = 0, e = ExtractGlobals.size(); i != e; ++i) {
GlobalValue *GV = M.get()->getNamedGlobal(ExtractGlobals[i]);
if (!GV) {
errs() << argv[0] << ": program doesn't contain global named '"
<< ExtractGlobals[i] << "'!\n";
return 1;
}
GVs.push_back(GV);
}
if (F == 0 && G == 0) {
errs() << argv[0] << ": program doesn't contain function named '"
<< ExtractFunc << "' or a global named '" << ExtractGlobal << "'!\n";
return 1;
// Figure out which functions we should extract.
for (size_t i = 0, e = ExtractFuncs.size(); i != e; ++i) {
GlobalValue *GV = M.get()->getFunction(ExtractFuncs[i]);
if (!GV) {
errs() << argv[0] << ": program doesn't contain function named '"
<< ExtractFuncs[i] << "'!\n";
return 1;
}
GVs.push_back(GV);
}
// In addition to deleting all other functions, we also want to spiff it
// up a little bit. Do this now.
PassManager Passes;
Passes.add(new TargetData(M.get())); // Use correct TargetData
// Either isolate the function or delete it from the Module
std::vector<GlobalValue*> GVs;
if (F) GVs.push_back(F);
if (G) GVs.push_back(G);
Passes.add(createGVExtractionPass(GVs, DeleteFn, Relink));
if (!DeleteFn)