-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathextern-statics.cpp
68 lines (52 loc) · 2 KB
/
extern-statics.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "ExternalizePass.h"
#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/IRPrintingPasses.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/ToolOutputFile.h"
static llvm::cl::opt<std::string>
InputFilename("in", llvm::cl::desc("Input bitcode filename"),
llvm::cl::Required, llvm::cl::value_desc("input filename"));
static llvm::cl::opt<std::string>
OutputFilename("out", llvm::cl::desc("Output bitcode filename"),
llvm::cl::Required, llvm::cl::value_desc("output filename"));
int main(int argc, char **argv) {
llvm::llvm_shutdown_obj shutdown; // calls llvm_shutdown() on exit
llvm::cl::ParseCommandLineOptions(
argc, argv, "extern-statics - Externalize static functions\n");
llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
llvm::PrettyStackTraceProgram PSTP(argc, argv);
llvm::EnableDebugBuffering = true;
llvm::SMDiagnostic err;
llvm::LLVMContext Context;
std::unique_ptr<llvm::Module> module =
llvm::parseIRFile(InputFilename, err, Context);
if (!err.getMessage().empty()) {
llvm::errs() << "Problem reading input bitcode/IR: " +
err.getMessage().str()
<< "\n";
return 1;
}
///////////////////////////////
// initialise and run passes //
///////////////////////////////
llvm::legacy::PassManager pass_manager;
pass_manager.add(new externalize::ExternalizePass());
pass_manager.run(*module.get());
std::error_code EC;
auto out = new llvm::ToolOutputFile(OutputFilename.c_str(), EC,
llvm::sys::fs::F_None);
if (EC) {
llvm::errs() << "Could not create output file: " << EC.message() << "\n";
return 1;
}
out->keep();
WriteBitcodeToFile(*module, out->os());
delete out;
return 0;
}