23 #include "llvm/IR/DataLayout.h"
24 #include "llvm/IR/LLVMContext.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/IRReader/IRReader.h"
27 #include "llvm/CodeGen/CommandFlags.h"
28 #include "llvm/Bitcode/ReaderWriter.h"
29 #include "llvm/Assembly/PrintModulePass.h"
30 #include "llvm/Analysis/Verifier.h"
31 #include "llvm/Analysis/CallGraph.h"
32 #include "llvm/Target/TargetLibraryInfo.h"
33 #include "llvm/Target/TargetMachine.h"
34 #include "llvm/ADT/Triple.h"
35 #include "llvm/Support/SourceMgr.h"
36 #include "llvm/Support/ManagedStatic.h"
37 #include "llvm/Support/PrettyStackTrace.h"
38 #include "llvm/Support/SystemUtils.h"
39 #include "llvm/Support/TargetRegistry.h"
40 #include "llvm/Support/ToolOutputFile.h"
41 #include "llvm/PassManager.h"
47 static cl::opt<std::string>
48 InputFilename(cl::Positional, cl::desc(
"<input bitcode file>"),
49 cl::init(
"-"), cl::value_desc(
"filename"));
51 static cl::opt<std::string>
52 OutputFilename(
"o", cl::desc(
"Override output filename"),
53 cl::value_desc(
"filename"));
56 Force(
"f", cl::desc(
"Enable binary output on terminals"));
59 PrintEachXForm(
"p", cl::desc(
"Print module after each transformation"));
62 OutputAssembly(
"S", cl::desc(
"Write output as LLVM assembly"));
65 SuppressDI(
"suppress-debug-instrumentation",
66 cl::desc(
"Suppress the generation of debug output in instrumentation"));
69 VerifyEach(
"verify-each", cl::desc(
"Verify after each transform"));
72 static inline void addPass(PassManagerBase &PM, Pass *P) {
77 if (VerifyEach) PM.add(createVerifierPass());
80 if (PrintEachXForm) PM.add(createPrintModulePass(&errs()));
85 int main(
int argc,
char **argv) {
86 llvm::PrettyStackTraceProgram X(argc, argv);
89 LLVMContext &Context = getGlobalContext();
91 cl::ParseCommandLineOptions(argc, argv,
"TESLA bitcode instrumenter\n");
101 std::auto_ptr<Module> M;
102 M.reset(ParseIRFile(InputFilename, Err, Context));
105 Err.print(argv[0], errs());
110 OwningPtr<tool_output_file> Out;
111 if (OutputFilename.empty())
112 OutputFilename =
"-";
114 std::string ErrorInfo;
115 Out.reset(
new tool_output_file(OutputFilename.c_str(), ErrorInfo,
116 raw_fd_ostream::F_Binary));
117 if (!ErrorInfo.empty()) {
118 errs() << ErrorInfo <<
'\n';
125 bool NoOutput =
false;
126 if (!Force && !OutputAssembly)
127 if (CheckBitcodeOutputToConsole(Out->os(),
true))
136 TargetLibraryInfo *TLI =
new TargetLibraryInfo(Triple(M->getTargetTriple()));
141 const std::string &ModuleDataLayout = M.get()->getDataLayout();
142 if (!ModuleDataLayout.empty())
143 TD =
new DataLayout(ModuleDataLayout);
157 Passes.add(createPrintModulePass(&Out->os()));
159 Passes.add(createBitcodeWriterPass(Out->os()));
163 cl::PrintOptionValues();
166 Passes.run(*M.get());