aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-extract
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-05-06 05:13:17 +0000
committerChris Lattner <sabre@nondot.org>2007-05-06 05:13:17 +0000
commitc48e1db2140b3565ef3dea58699a09c5abf36f7f (patch)
tree8ffd0694932559f2f1bfd750d3a3502cee58a074 /tools/llvm-extract
parentc1e6d686986f511774e0f46e21d4cd90f734bed1 (diff)
remove EH cruft, add bitcode support
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36841 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-extract')
-rw-r--r--tools/llvm-extract/Makefile4
-rw-r--r--tools/llvm-extract/llvm-extract.cpp123
2 files changed, 71 insertions, 56 deletions
diff --git a/tools/llvm-extract/Makefile b/tools/llvm-extract/Makefile
index 8efe423a98..51416c6426 100644
--- a/tools/llvm-extract/Makefile
+++ b/tools/llvm-extract/Makefile
@@ -6,10 +6,10 @@
# the University of Illinois Open Source License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
+
LEVEL = ../..
TOOLNAME = llvm-extract
-LINK_COMPONENTS := bcreader bcwriter ipo
-REQUIRES_EH := 1
+LINK_COMPONENTS := bcreader bcwriter ipo bitreader bitwriter
include $(LEVEL)/Makefile.common
diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp
index 60a0134ef7..60171c10e2 100644
--- a/tools/llvm-extract/llvm-extract.cpp
+++ b/tools/llvm-extract/llvm-extract.cpp
@@ -14,6 +14,7 @@
#include "llvm/Module.h"
#include "llvm/PassManager.h"
+#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Bytecode/Reader.h"
#include "llvm/Bytecode/WriteBytecodePass.h"
#include "llvm/Transforms/IPO.h"
@@ -21,6 +22,7 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compressor.h"
#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Streams.h"
#include "llvm/System/Signals.h"
#include <iostream>
@@ -28,6 +30,8 @@
#include <fstream>
using namespace llvm;
+cl::opt<bool> Bitcode("bitcode");
+
// InputFilename - The filename to read from.
static cl::opt<std::string>
InputFilename(cl::Positional, cl::desc("<input bytecode file>"),
@@ -54,65 +58,76 @@ ExtractFunc("func", cl::desc("Specify function to extract"), cl::init("main"),
int main(int argc, char **argv) {
llvm_shutdown_obj X; // Call llvm_shutdown() on exit.
- try {
- cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n");
- sys::PrintStackTraceOnErrorSignal();
-
- std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename,
- Compressor::decompressToNewBuffer));
- if (M.get() == 0) {
- cerr << argv[0] << ": bytecode didn't read correctly.\n";
- return 1;
- }
+ cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n");
+ sys::PrintStackTraceOnErrorSignal();
- // Figure out which function we should extract
- Function *F = M.get()->getFunction(ExtractFunc);
- if (F == 0) {
- cerr << argv[0] << ": program doesn't contain function named '"
- << ExtractFunc << "'!\n";
+ std::auto_ptr<Module> M;
+
+ if (Bitcode) {
+ MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(&InputFilename[0],
+ InputFilename.size());
+ if (Buffer == 0) {
+ cerr << "Error reading file '" + InputFilename + "'";
return 1;
+ } else {
+ M.reset(ParseBitcodeFile(Buffer));
}
+ delete Buffer;
+ } else {
+ M.reset(ParseBytecodeFile(InputFilename,
+ Compressor::decompressToNewBuffer));
+ }
+
+ if (M.get() == 0) {
+ cerr << argv[0] << ": bytecode didn't read correctly.\n";
+ return 1;
+ }
+
+ // Figure out which function we should extract
+ Function *F = M.get()->getFunction(ExtractFunc);
+ if (F == 0) {
+ cerr << argv[0] << ": program doesn't contain function named '"
+ << ExtractFunc << "'!\n";
+ return 1;
+ }
- // 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
- Passes.add(createFunctionExtractionPass(F, DeleteFn, Relink));
- if (!DeleteFn)
- Passes.add(createGlobalDCEPass()); // Delete unreachable globals
- Passes.add(createDeadTypeEliminationPass()); // Remove dead types...
- Passes.add(createStripDeadPrototypesPass()); // Remove dead func decls
-
- std::ostream *Out = 0;
-
- if (OutputFilename != "-") { // Not stdout?
- if (!Force && std::ifstream(OutputFilename.c_str())) {
- // If force is not specified, make sure not to overwrite a file!
- cerr << argv[0] << ": error opening '" << OutputFilename
- << "': file exists!\n"
- << "Use -f command line argument to force output\n";
- return 1;
- }
- std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
- std::ios::binary;
- Out = new std::ofstream(OutputFilename.c_str(), io_mode);
- } else { // Specified stdout
- // FIXME: cout is not binary!
- Out = &std::cout;
+ // 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
+ Passes.add(createFunctionExtractionPass(F, DeleteFn, Relink));
+ if (!DeleteFn)
+ Passes.add(createGlobalDCEPass()); // Delete unreachable globals
+ Passes.add(createDeadTypeEliminationPass()); // Remove dead types...
+ Passes.add(createStripDeadPrototypesPass()); // Remove dead func decls
+
+ std::ostream *Out = 0;
+
+ if (OutputFilename != "-") { // Not stdout?
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
}
+ std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
+ std::ios::binary;
+ Out = new std::ofstream(OutputFilename.c_str(), io_mode);
+ } else { // Specified stdout
+ // FIXME: cout is not binary!
+ Out = &std::cout;
+ }
- OStream L(*Out);
+ OStream L(*Out);
+ if (Bitcode)
+ Passes.add(CreateBitcodeWriterPass(*Out));
+ else
Passes.add(new WriteBytecodePass(&L)); // Write bytecode to file...
- Passes.run(*M.get());
-
- if (Out != &std::cout)
- delete Out;
- return 0;
- } catch (const std::string& msg) {
- cerr << argv[0] << ": " << msg << "\n";
- } catch (...) {
- cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
- }
- return 1;
+ Passes.run(*M.get());
+
+ if (Out != &std::cout)
+ delete Out;
+ return 0;
}