llvm-dis.cpp revision 198090
1//===-- llvm-dis.cpp - The low-level LLVM disassembler --------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This utility may be invoked in the following manner:
11//  llvm-dis [options]      - Read LLVM bitcode from stdin, write asm to stdout
12//  llvm-dis [options] x.bc - Read LLVM bitcode from the x.bc file, write asm
13//                            to the x.ll file.
14//  Options:
15//      --help   - Output information about command line switches
16//
17//===----------------------------------------------------------------------===//
18
19#include "llvm/LLVMContext.h"
20#include "llvm/Module.h"
21#include "llvm/Bitcode/ReaderWriter.h"
22#include "llvm/Support/CommandLine.h"
23#include "llvm/Support/ManagedStatic.h"
24#include "llvm/Support/MemoryBuffer.h"
25#include "llvm/Support/PrettyStackTrace.h"
26#include "llvm/Support/raw_ostream.h"
27#include "llvm/System/Signals.h"
28#include <memory>
29using namespace llvm;
30
31static cl::opt<std::string>
32InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
33
34static cl::opt<std::string>
35OutputFilename("o", cl::desc("Override output filename"),
36               cl::value_desc("filename"));
37
38static cl::opt<bool>
39Force("f", cl::desc("Enable binary output on terminals"));
40
41static cl::opt<bool>
42DontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden);
43
44int main(int argc, char **argv) {
45  // Print a stack trace if we signal out.
46  sys::PrintStackTraceOnErrorSignal();
47  PrettyStackTraceProgram X(argc, argv);
48
49  LLVMContext &Context = getGlobalContext();
50  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
51
52
53  cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .ll disassembler\n");
54
55  std::string ErrorMessage;
56  std::auto_ptr<Module> M;
57
58  if (MemoryBuffer *Buffer
59         = MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage)) {
60    M.reset(ParseBitcodeFile(Buffer, Context, &ErrorMessage));
61    delete Buffer;
62  }
63
64  if (M.get() == 0) {
65    errs() << argv[0] << ": ";
66    if (ErrorMessage.size())
67      errs() << ErrorMessage << "\n";
68    else
69      errs() << "bitcode didn't read correctly.\n";
70    return 1;
71  }
72
73  // Just use stdout.  We won't actually print anything on it.
74  if (DontPrint)
75    OutputFilename = "-";
76
77  if (OutputFilename.empty()) { // Unspecified output, infer it.
78    if (InputFilename == "-") {
79      OutputFilename = "-";
80    } else {
81      const std::string &IFN = InputFilename;
82      int Len = IFN.length();
83      // If the source ends in .bc, strip it off.
84      if (IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c')
85        OutputFilename = std::string(IFN.begin(), IFN.end()-3)+".ll";
86      else
87        OutputFilename = IFN+".ll";
88    }
89  }
90
91  // Make sure that the Out file gets unlinked from the disk if we get a
92  // SIGINT.
93  if (OutputFilename != "-")
94    sys::RemoveFileOnSignal(sys::Path(OutputFilename));
95
96  std::string ErrorInfo;
97  std::auto_ptr<raw_fd_ostream>
98  Out(new raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
99                         raw_fd_ostream::F_Binary));
100  if (!ErrorInfo.empty()) {
101    errs() << ErrorInfo << '\n';
102    return 1;
103  }
104
105  // All that llvm-dis does is write the assembly to a file.
106  if (!DontPrint)
107    *Out << *M;
108
109  return 0;
110}
111
112