//===------------------------------------------------------------------------=== // LLVM 'DIS' UTILITY // // This utility may be invoked in the following manner: // dis --help - Output information about command line switches // dis [options] - Read LLVM bytecode from stdin, write assembly to stdout // dis [options] x.bc - Read LLVM bytecode from the x.bc file, write assembly // to the x.ll file. // //===------------------------------------------------------------------------=== #include #include #include "llvm/Module.h" #include "llvm/Assembly/Writer.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Tools/CommandLine.h" int main(int argc, char **argv) { ToolCommandLine Opts(argc, argv, false); // We only support the options that the system parser does... if it left any // then we don't know what to do. // if (argc > 1) { for (int i = 1; i < argc; i++) { if (string(argv[i]) != string("--help")) cerr << argv[0] << ": argument not recognized: '" << argv[i] << "'!\n"; } cerr << argv[0] << " usage:\n" << " " << argv[0] << " --help - Print this usage information\n" << " " << argv[0] << " x.bc - Parse file and output " << "assembly to x.ll\n" << " " << argv[0] << " - Parse stdin and write to stdout.\n"; return 1; } ostream *Out = &cout; // Default to printing to stdout... Module *C = ParseBytecodeFile(Opts.getInputFilename()); if (C == 0) { cerr << "bytecode didn't read correctly.\n"; return 1; } if (Opts.getOutputFilename() != "-") { Out = new ofstream(Opts.getOutputFilename().c_str(), (Opts.getForce() ? 0 : ios::noreplace)|ios::out); if (!Out->good()) { cerr << "Error opening " << Opts.getOutputFilename() << ": sending to stdout instead!\n"; Out = &cout; } } // All that dis does is write the assembly out to a file... which is exactly // what the writer library is supposed to do... (*Out) << C; delete C; if (Out != &cout) delete Out; return 0; }