11dd27b157bbe7d9e44fa72abbc8b0f08eba804ecChris Lattner//===-- llvm-dis.cpp - The low-level LLVM disassembler --------------------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// This utility may be invoked in the following manner:
11a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif//  llvm-dis [options]      - Read LLVM bitcode from stdin, write asm to stdout
12a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif//  llvm-dis [options] x.bc - Read LLVM bitcode from the x.bc file, write asm
13ad0bf0fc0cead2c714d6a0e164d3bdb2864eb8e1Misha Brukman//                            to the x.ll file.
149bff2e952226a80b65a993a81e87abe5216ffc48Chris Lattner//  Options:
159bff2e952226a80b65a993a81e87abe5216ffc48Chris Lattner//      --help   - Output information about command line switches
16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
171d7b50b4f823012dc283e46c2bd8036d32b402f4Chris Lattner//===----------------------------------------------------------------------===//
18009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
20f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Bitcode/ReaderWriter.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/AssemblyAnnotationWriter.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/DiagnosticInfo.h"
24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/DiagnosticPrinter.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
28551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
292ea93875b2f2900b9d244dfd7649c9ed02a34cd7Derek Schuff#include "llvm/Support/DataStream.h"
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Error.h"
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h"
326cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner#include "llvm/Support/FormattedStream.h"
33c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
34c453f76e2b4d7fd1e042b5b6d4c20556779186dfChris Lattner#include "llvm/Support/MemoryBuffer.h"
35cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
361f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h"
37f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/ToolOutputFile.h"
38c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <system_error>
39d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
40d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
41c7a0985995631025fbe9a4fe9fc435c3ba7387e4Chris Lattnerstatic cl::opt<std::string>
42a99be51bf5cdac1438069d4b01766c47704961c8Gabor GreifInputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-"));
435ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
44c7a0985995631025fbe9a4fe9fc435c3ba7387e4Chris Lattnerstatic cl::opt<std::string>
453da94aec4d429b2ba0f65fa040c33650cade196bMisha BrukmanOutputFilename("o", cl::desc("Override output filename"),
465ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner               cl::value_desc("filename"));
475ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
485ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
49baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals"));
505ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
514d544cd646440fb99131206d6f074fa32dc308dcChris Lattnerstatic cl::opt<bool>
524d544cd646440fb99131206d6f074fa32dc308dcChris LattnerDontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden);
534d544cd646440fb99131206d6f074fa32dc308dcChris Lattner
546cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattnerstatic cl::opt<bool>
556cd71f0c4026217a501e09dcc2198c6c7a462e44Chris LattnerShowAnnotations("show-annotations",
566cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner                cl::desc("Add informational comments to the .ll file"));
576cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner
580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic cl::opt<bool> PreserveAssemblyUseListOrder(
590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    "preserve-ll-uselistorder",
600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    cl::desc("Preserve use-list order when writing LLVM assembly."),
610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    cl::init(false), cl::Hidden);
620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic cl::opt<bool>
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MaterializeMetadata("materialize-metadata",
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                        cl::desc("Load module without materializing metadata, "
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                 "then materialize only the metadata"));
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
686cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattnernamespace {
697aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
70027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patelstatic void printDebugLoc(const DebugLoc &DL, formatted_raw_ostream &OS) {
71027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel  OS << DL.getLine() << ":" << DL.getCol();
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (DILocation *IDL = DL.getInlinedAt()) {
730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    OS << "@";
740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    printDebugLoc(IDL, OS);
75027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel  }
76027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel}
776cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattnerclass CommentWriter : public AssemblyAnnotationWriter {
786cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattnerpublic:
796cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner  void emitFunctionAnnot(const Function *F,
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         formatted_raw_ostream &OS) override {
816cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner    OS << "; [#uses=" << F->getNumUses() << ']';  // Output # uses
826cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner    OS << '\n';
836cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner  }
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printInfoComment(const Value &V, formatted_raw_ostream &OS) override {
85027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel    bool Padded = false;
86027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel    if (!V.getType()->isVoidTy()) {
87027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      OS.PadToColumn(50);
88027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      Padded = true;
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // Output # uses and type
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      OS << "; [#uses=" << V.getNumUses() << " type=" << *V.getType() << "]";
91027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel    }
92027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel    if (const Instruction *I = dyn_cast<Instruction>(&V)) {
930c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar      if (const DebugLoc &DL = I->getDebugLoc()) {
94027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        if (!Padded) {
95027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS.PadToColumn(50);
96027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          Padded = true;
97027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS << ";";
98027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        }
99027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        OS << " [debug line = ";
100027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        printDebugLoc(DL,OS);
101027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        OS << "]";
102027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      }
103027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I)) {
104027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        if (!Padded) {
105027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS.PadToColumn(50);
106027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS << ";";
107027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        }
1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        OS << " [debug variable = " << DDI->getVariable()->getName() << "]";
109027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      }
110027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      else if (const DbgValueInst *DVI = dyn_cast<DbgValueInst>(I)) {
111027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        if (!Padded) {
112027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS.PadToColumn(50);
113027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel          OS << ";";
114027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel        }
1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        OS << " [debug variable = " << DVI->getVariable()->getName() << "]";
116027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel      }
117027f0995d4f2a73836fe3225514c507f5c63deaeDevang Patel    }
1186cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner  }
1196cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner};
1207aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
1216cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner} // end anon namespace
1226cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  raw_ostream &OS = errs();
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  OS << (char *)Context << ": ";
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  switch (DI.getSeverity()) {
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case DS_Error: OS << "error: "; break;
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case DS_Warning: OS << "warning: "; break;
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case DS_Remark: OS << "remark: "; break;
130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case DS_Note: OS << "note: "; break;
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
132ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
133ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DiagnosticPrinterRawOStream DP(OS);
134ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  DI.print(DP);
135ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  OS << '\n';
136ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (DI.getSeverity() == DS_Error)
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    exit(1);
139ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
140ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic Expected<std::unique_ptr<Module>> openInputFile(LLVMContext &Context) {
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (MaterializeMetadata) {
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        MemoryBuffer::getFileOrSTDIN(InputFilename);
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!MBOrErr)
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return errorCodeToError(MBOrErr.getError());
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ErrorOr<std::unique_ptr<Module>> MOrErr =
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getLazyBitcodeModule(std::move(*MBOrErr), Context,
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             /*ShouldLazyLoadMetadata=*/true);
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!MOrErr)
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return errorCodeToError(MOrErr.getError());
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    (*MOrErr)->materializeMetadata();
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::move(*MOrErr);
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else {
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::string ErrorMessage;
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::unique_ptr<DataStreamer> Streamer =
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getDataFileStreamer(InputFilename, &ErrorMessage);
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (!Streamer)
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return make_error<StringError>(ErrorMessage, inconvertibleErrorCode());
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::string DisplayFilename;
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (InputFilename == "-")
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DisplayFilename = "<stdin>";
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    else
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      DisplayFilename = InputFilename;
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ErrorOr<std::unique_ptr<Module>> MOrErr =
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getStreamedBitcodeModule(DisplayFilename, std::move(Streamer), Context);
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    (*MOrErr)->materializeAll();
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::move(*MOrErr);
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1728f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) {
173cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  // Print a stack trace if we signal out.
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  sys::PrintStackTraceOnErrorSignal(argv[0]);
175cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  PrettyStackTraceProgram X(argc, argv);
1767aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  LLVMContext Context;
178cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
1797aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
180ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  Context.setDiagnosticHandler(diagnosticHandler, argv[0]);
1817aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
18217e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .ll disassembler\n");
183009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Expected<std::unique_ptr<Module>> MOrErr = openInputFile(Context);
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!MOrErr) {
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    handleAllErrors(MOrErr.takeError(), [&](ErrorInfoBase &EIB) {
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << argv[0] << ": ";
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      EIB.log(errs());
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      errs() << '\n';
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    });
1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return 1;
19217e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  }
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<Module> M = std::move(*MOrErr);
1947aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
19517e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  // Just use stdout.  We won't actually print anything on it.
19617e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  if (DontPrint)
19717e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner    OutputFilename = "-";
1987aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
19917e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  if (OutputFilename.empty()) { // Unspecified output, infer it.
20017e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner    if (InputFilename == "-") {
20117e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner      OutputFilename = "-";
2021ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer    } else {
2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      StringRef IFN = InputFilename;
2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      OutputFilename = (IFN.endswith(".bc") ? IFN.drop_back(3) : IFN).str();
2056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      OutputFilename += ".ll";
2061ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer    }
20717e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  }
208ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman
20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  std::error_code EC;
21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<tool_output_file> Out(
21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      new tool_output_file(OutputFilename, EC, sys::fs::F_None));
21237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (EC) {
21337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    errs() << EC.message() << '\n';
21417e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner    return 1;
21517e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  }
2168f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattner
21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<AssemblyAnnotationWriter> Annotator;
2186cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner  if (ShowAnnotations)
2196cd71f0c4026217a501e09dcc2198c6c7a462e44Chris Lattner    Annotator.reset(new CommentWriter());
2207aa48441911e903803b75dfbcc148fbf80113819Michael J. Spencer
22117e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  // All that llvm-dis does is write the assembly to a file.
22204fc8c8d335af7c54d9a4fb8409748d2c84402f3Dan Gohman  if (!DontPrint)
2230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    M->print(Out->os(), Annotator.get(), PreserveAssemblyUseListOrder);
224c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner
225d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  // Declare success.
226d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  Out->keep();
227d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman
22817e9edc4a7bbeadf756494cf39fcacc9eff72202Chris Lattner  return 0;
229009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
230