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