1*9880d681SAndroid Build Coastguard Worker //===-- llvm-mc.cpp - Machine Code Hacking Driver ---------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This utility is a simple driver that allows command line hacking on machine
11*9880d681SAndroid Build Coastguard Worker // code.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "Disassembler.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmBackend.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstPrinter.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCObjectFileInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCParser/AsmLexer.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCParser/MCTargetAsmParser.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionMachO.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCTargetOptionsCommandFlags.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Compression.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileUtilities.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FormattedStream.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Host.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/PrettyStackTrace.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
38*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
39*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
40*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetSelect.h"
41*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ToolOutputFile.h"
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker using namespace llvm;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
46*9880d681SAndroid Build Coastguard Worker InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
49*9880d681SAndroid Build Coastguard Worker OutputFilename("o", cl::desc("Output filename"),
50*9880d681SAndroid Build Coastguard Worker cl::value_desc("filename"));
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
53*9880d681SAndroid Build Coastguard Worker ShowEncoding("show-encoding", cl::desc("Show instruction encodings"));
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> RelaxELFRel(
56*9880d681SAndroid Build Coastguard Worker "relax-relocations", cl::init(true),
57*9880d681SAndroid Build Coastguard Worker cl::desc("Emit R_X86_64_GOTPCRELX instead of R_X86_64_GOTPCREL"));
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker static cl::opt<DebugCompressionType>
60*9880d681SAndroid Build Coastguard Worker CompressDebugSections("compress-debug-sections", cl::ValueOptional,
61*9880d681SAndroid Build Coastguard Worker cl::init(DebugCompressionType::DCT_None),
62*9880d681SAndroid Build Coastguard Worker cl::desc("Choose DWARF debug sections compression:"),
63*9880d681SAndroid Build Coastguard Worker cl::values(
64*9880d681SAndroid Build Coastguard Worker clEnumValN(DebugCompressionType::DCT_None, "none",
65*9880d681SAndroid Build Coastguard Worker "No compression"),
66*9880d681SAndroid Build Coastguard Worker clEnumValN(DebugCompressionType::DCT_Zlib, "zlib",
67*9880d681SAndroid Build Coastguard Worker "Use zlib compression"),
68*9880d681SAndroid Build Coastguard Worker clEnumValN(DebugCompressionType::DCT_ZlibGnu, "zlib-gnu",
69*9880d681SAndroid Build Coastguard Worker "Use zlib-gnu compression (depricated)"),
70*9880d681SAndroid Build Coastguard Worker clEnumValEnd));
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
73*9880d681SAndroid Build Coastguard Worker ShowInst("show-inst", cl::desc("Show internal instruction representation"));
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
76*9880d681SAndroid Build Coastguard Worker ShowInstOperands("show-inst-operands",
77*9880d681SAndroid Build Coastguard Worker cl::desc("Show instructions operands as parsed"));
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned>
80*9880d681SAndroid Build Coastguard Worker OutputAsmVariant("output-asm-variant",
81*9880d681SAndroid Build Coastguard Worker cl::desc("Syntax variant to use for output printing"));
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
84*9880d681SAndroid Build Coastguard Worker PrintImmHex("print-imm-hex", cl::init(false),
85*9880d681SAndroid Build Coastguard Worker cl::desc("Prefer hex format for immediate values"));
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
88*9880d681SAndroid Build Coastguard Worker DefineSymbol("defsym", cl::desc("Defines a symbol to be an integer constant"));
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
91*9880d681SAndroid Build Coastguard Worker PreserveComments("preserve-comments",
92*9880d681SAndroid Build Coastguard Worker cl::desc("Preserve Comments in outputted assembly"));
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker enum OutputFileType {
95*9880d681SAndroid Build Coastguard Worker OFT_Null,
96*9880d681SAndroid Build Coastguard Worker OFT_AssemblyFile,
97*9880d681SAndroid Build Coastguard Worker OFT_ObjectFile
98*9880d681SAndroid Build Coastguard Worker };
99*9880d681SAndroid Build Coastguard Worker static cl::opt<OutputFileType>
100*9880d681SAndroid Build Coastguard Worker FileType("filetype", cl::init(OFT_AssemblyFile),
101*9880d681SAndroid Build Coastguard Worker cl::desc("Choose an output file type:"),
102*9880d681SAndroid Build Coastguard Worker cl::values(
103*9880d681SAndroid Build Coastguard Worker clEnumValN(OFT_AssemblyFile, "asm",
104*9880d681SAndroid Build Coastguard Worker "Emit an assembly ('.s') file"),
105*9880d681SAndroid Build Coastguard Worker clEnumValN(OFT_Null, "null",
106*9880d681SAndroid Build Coastguard Worker "Don't emit anything (for timing purposes)"),
107*9880d681SAndroid Build Coastguard Worker clEnumValN(OFT_ObjectFile, "obj",
108*9880d681SAndroid Build Coastguard Worker "Emit a native object ('.o') file"),
109*9880d681SAndroid Build Coastguard Worker clEnumValEnd));
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
112*9880d681SAndroid Build Coastguard Worker IncludeDirs("I", cl::desc("Directory of include files"),
113*9880d681SAndroid Build Coastguard Worker cl::value_desc("directory"), cl::Prefix);
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
116*9880d681SAndroid Build Coastguard Worker ArchName("arch", cl::desc("Target arch to assemble for, "
117*9880d681SAndroid Build Coastguard Worker "see -version for available targets"));
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
120*9880d681SAndroid Build Coastguard Worker TripleName("triple", cl::desc("Target triple to assemble for, "
121*9880d681SAndroid Build Coastguard Worker "see -version for available targets"));
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
124*9880d681SAndroid Build Coastguard Worker MCPU("mcpu",
125*9880d681SAndroid Build Coastguard Worker cl::desc("Target a specific cpu type (-mcpu=help for details)"),
126*9880d681SAndroid Build Coastguard Worker cl::value_desc("cpu-name"),
127*9880d681SAndroid Build Coastguard Worker cl::init(""));
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
130*9880d681SAndroid Build Coastguard Worker MAttrs("mattr",
131*9880d681SAndroid Build Coastguard Worker cl::CommaSeparated,
132*9880d681SAndroid Build Coastguard Worker cl::desc("Target specific attributes (-mattr=help for details)"),
133*9880d681SAndroid Build Coastguard Worker cl::value_desc("a1,+a2,-a3,..."));
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> PIC("position-independent",
136*9880d681SAndroid Build Coastguard Worker cl::desc("Position independent"), cl::init(false));
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker static cl::opt<llvm::CodeModel::Model>
139*9880d681SAndroid Build Coastguard Worker CMModel("code-model",
140*9880d681SAndroid Build Coastguard Worker cl::desc("Choose code model"),
141*9880d681SAndroid Build Coastguard Worker cl::init(CodeModel::Default),
142*9880d681SAndroid Build Coastguard Worker cl::values(clEnumValN(CodeModel::Default, "default",
143*9880d681SAndroid Build Coastguard Worker "Target default code model"),
144*9880d681SAndroid Build Coastguard Worker clEnumValN(CodeModel::Small, "small",
145*9880d681SAndroid Build Coastguard Worker "Small code model"),
146*9880d681SAndroid Build Coastguard Worker clEnumValN(CodeModel::Kernel, "kernel",
147*9880d681SAndroid Build Coastguard Worker "Kernel code model"),
148*9880d681SAndroid Build Coastguard Worker clEnumValN(CodeModel::Medium, "medium",
149*9880d681SAndroid Build Coastguard Worker "Medium code model"),
150*9880d681SAndroid Build Coastguard Worker clEnumValN(CodeModel::Large, "large",
151*9880d681SAndroid Build Coastguard Worker "Large code model"),
152*9880d681SAndroid Build Coastguard Worker clEnumValEnd));
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
155*9880d681SAndroid Build Coastguard Worker NoInitialTextSection("n", cl::desc("Don't assume assembly file starts "
156*9880d681SAndroid Build Coastguard Worker "in the text section"));
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
159*9880d681SAndroid Build Coastguard Worker GenDwarfForAssembly("g", cl::desc("Generate dwarf debugging info for assembly "
160*9880d681SAndroid Build Coastguard Worker "source files"));
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
163*9880d681SAndroid Build Coastguard Worker DebugCompilationDir("fdebug-compilation-dir",
164*9880d681SAndroid Build Coastguard Worker cl::desc("Specifies the debug info's compilation dir"));
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
167*9880d681SAndroid Build Coastguard Worker MainFileName("main-file-name",
168*9880d681SAndroid Build Coastguard Worker cl::desc("Specifies the name we should consider the input file"));
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> SaveTempLabels("save-temp-labels",
171*9880d681SAndroid Build Coastguard Worker cl::desc("Don't discard temporary labels"));
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> NoExecStack("no-exec-stack",
174*9880d681SAndroid Build Coastguard Worker cl::desc("File doesn't need an exec stack"));
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker enum ActionType {
177*9880d681SAndroid Build Coastguard Worker AC_AsLex,
178*9880d681SAndroid Build Coastguard Worker AC_Assemble,
179*9880d681SAndroid Build Coastguard Worker AC_Disassemble,
180*9880d681SAndroid Build Coastguard Worker AC_MDisassemble,
181*9880d681SAndroid Build Coastguard Worker };
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker static cl::opt<ActionType>
184*9880d681SAndroid Build Coastguard Worker Action(cl::desc("Action to perform:"),
185*9880d681SAndroid Build Coastguard Worker cl::init(AC_Assemble),
186*9880d681SAndroid Build Coastguard Worker cl::values(clEnumValN(AC_AsLex, "as-lex",
187*9880d681SAndroid Build Coastguard Worker "Lex tokens from a .s file"),
188*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_Assemble, "assemble",
189*9880d681SAndroid Build Coastguard Worker "Assemble a .s file (default)"),
190*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_Disassemble, "disassemble",
191*9880d681SAndroid Build Coastguard Worker "Disassemble strings of hex bytes"),
192*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_MDisassemble, "mdis",
193*9880d681SAndroid Build Coastguard Worker "Marked up disassembly of strings of hex bytes"),
194*9880d681SAndroid Build Coastguard Worker clEnumValEnd));
195*9880d681SAndroid Build Coastguard Worker
GetTarget(const char * ProgName)196*9880d681SAndroid Build Coastguard Worker static const Target *GetTarget(const char *ProgName) {
197*9880d681SAndroid Build Coastguard Worker // Figure out the target triple.
198*9880d681SAndroid Build Coastguard Worker if (TripleName.empty())
199*9880d681SAndroid Build Coastguard Worker TripleName = sys::getDefaultTargetTriple();
200*9880d681SAndroid Build Coastguard Worker Triple TheTriple(Triple::normalize(TripleName));
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker // Get the target specific parser.
203*9880d681SAndroid Build Coastguard Worker std::string Error;
204*9880d681SAndroid Build Coastguard Worker const Target *TheTarget = TargetRegistry::lookupTarget(ArchName, TheTriple,
205*9880d681SAndroid Build Coastguard Worker Error);
206*9880d681SAndroid Build Coastguard Worker if (!TheTarget) {
207*9880d681SAndroid Build Coastguard Worker errs() << ProgName << ": " << Error;
208*9880d681SAndroid Build Coastguard Worker return nullptr;
209*9880d681SAndroid Build Coastguard Worker }
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker // Update the triple name and return the found target.
212*9880d681SAndroid Build Coastguard Worker TripleName = TheTriple.getTriple();
213*9880d681SAndroid Build Coastguard Worker return TheTarget;
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker
GetOutputStream()216*9880d681SAndroid Build Coastguard Worker static std::unique_ptr<tool_output_file> GetOutputStream() {
217*9880d681SAndroid Build Coastguard Worker if (OutputFilename == "")
218*9880d681SAndroid Build Coastguard Worker OutputFilename = "-";
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker std::error_code EC;
221*9880d681SAndroid Build Coastguard Worker auto Out = llvm::make_unique<tool_output_file>(OutputFilename, EC,
222*9880d681SAndroid Build Coastguard Worker sys::fs::F_None);
223*9880d681SAndroid Build Coastguard Worker if (EC) {
224*9880d681SAndroid Build Coastguard Worker errs() << EC.message() << '\n';
225*9880d681SAndroid Build Coastguard Worker return nullptr;
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker return Out;
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker static std::string DwarfDebugFlags;
setDwarfDebugFlags(int argc,char ** argv)232*9880d681SAndroid Build Coastguard Worker static void setDwarfDebugFlags(int argc, char **argv) {
233*9880d681SAndroid Build Coastguard Worker if (!getenv("RC_DEBUG_OPTIONS"))
234*9880d681SAndroid Build Coastguard Worker return;
235*9880d681SAndroid Build Coastguard Worker for (int i = 0; i < argc; i++) {
236*9880d681SAndroid Build Coastguard Worker DwarfDebugFlags += argv[i];
237*9880d681SAndroid Build Coastguard Worker if (i + 1 < argc)
238*9880d681SAndroid Build Coastguard Worker DwarfDebugFlags += " ";
239*9880d681SAndroid Build Coastguard Worker }
240*9880d681SAndroid Build Coastguard Worker }
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker static std::string DwarfDebugProducer;
setDwarfDebugProducer()243*9880d681SAndroid Build Coastguard Worker static void setDwarfDebugProducer() {
244*9880d681SAndroid Build Coastguard Worker if(!getenv("DEBUG_PRODUCER"))
245*9880d681SAndroid Build Coastguard Worker return;
246*9880d681SAndroid Build Coastguard Worker DwarfDebugProducer += getenv("DEBUG_PRODUCER");
247*9880d681SAndroid Build Coastguard Worker }
248*9880d681SAndroid Build Coastguard Worker
AsLexInput(SourceMgr & SrcMgr,MCAsmInfo & MAI,raw_ostream & OS)249*9880d681SAndroid Build Coastguard Worker static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI,
250*9880d681SAndroid Build Coastguard Worker raw_ostream &OS) {
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker AsmLexer Lexer(MAI);
253*9880d681SAndroid Build Coastguard Worker Lexer.setBuffer(SrcMgr.getMemoryBuffer(SrcMgr.getMainFileID())->getBuffer());
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker bool Error = false;
256*9880d681SAndroid Build Coastguard Worker while (Lexer.Lex().isNot(AsmToken::Eof)) {
257*9880d681SAndroid Build Coastguard Worker const AsmToken &Tok = Lexer.getTok();
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker switch (Tok.getKind()) {
260*9880d681SAndroid Build Coastguard Worker default:
261*9880d681SAndroid Build Coastguard Worker SrcMgr.PrintMessage(Lexer.getLoc(), SourceMgr::DK_Warning,
262*9880d681SAndroid Build Coastguard Worker "unknown token");
263*9880d681SAndroid Build Coastguard Worker Error = true;
264*9880d681SAndroid Build Coastguard Worker break;
265*9880d681SAndroid Build Coastguard Worker case AsmToken::Error:
266*9880d681SAndroid Build Coastguard Worker Error = true; // error already printed.
267*9880d681SAndroid Build Coastguard Worker break;
268*9880d681SAndroid Build Coastguard Worker case AsmToken::Identifier:
269*9880d681SAndroid Build Coastguard Worker OS << "identifier: " << Lexer.getTok().getString();
270*9880d681SAndroid Build Coastguard Worker break;
271*9880d681SAndroid Build Coastguard Worker case AsmToken::Integer:
272*9880d681SAndroid Build Coastguard Worker OS << "int: " << Lexer.getTok().getString();
273*9880d681SAndroid Build Coastguard Worker break;
274*9880d681SAndroid Build Coastguard Worker case AsmToken::Real:
275*9880d681SAndroid Build Coastguard Worker OS << "real: " << Lexer.getTok().getString();
276*9880d681SAndroid Build Coastguard Worker break;
277*9880d681SAndroid Build Coastguard Worker case AsmToken::String:
278*9880d681SAndroid Build Coastguard Worker OS << "string: " << Lexer.getTok().getString();
279*9880d681SAndroid Build Coastguard Worker break;
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker case AsmToken::Amp: OS << "Amp"; break;
282*9880d681SAndroid Build Coastguard Worker case AsmToken::AmpAmp: OS << "AmpAmp"; break;
283*9880d681SAndroid Build Coastguard Worker case AsmToken::At: OS << "At"; break;
284*9880d681SAndroid Build Coastguard Worker case AsmToken::Caret: OS << "Caret"; break;
285*9880d681SAndroid Build Coastguard Worker case AsmToken::Colon: OS << "Colon"; break;
286*9880d681SAndroid Build Coastguard Worker case AsmToken::Comma: OS << "Comma"; break;
287*9880d681SAndroid Build Coastguard Worker case AsmToken::Dollar: OS << "Dollar"; break;
288*9880d681SAndroid Build Coastguard Worker case AsmToken::Dot: OS << "Dot"; break;
289*9880d681SAndroid Build Coastguard Worker case AsmToken::EndOfStatement: OS << "EndOfStatement"; break;
290*9880d681SAndroid Build Coastguard Worker case AsmToken::Eof: OS << "Eof"; break;
291*9880d681SAndroid Build Coastguard Worker case AsmToken::Equal: OS << "Equal"; break;
292*9880d681SAndroid Build Coastguard Worker case AsmToken::EqualEqual: OS << "EqualEqual"; break;
293*9880d681SAndroid Build Coastguard Worker case AsmToken::Exclaim: OS << "Exclaim"; break;
294*9880d681SAndroid Build Coastguard Worker case AsmToken::ExclaimEqual: OS << "ExclaimEqual"; break;
295*9880d681SAndroid Build Coastguard Worker case AsmToken::Greater: OS << "Greater"; break;
296*9880d681SAndroid Build Coastguard Worker case AsmToken::GreaterEqual: OS << "GreaterEqual"; break;
297*9880d681SAndroid Build Coastguard Worker case AsmToken::GreaterGreater: OS << "GreaterGreater"; break;
298*9880d681SAndroid Build Coastguard Worker case AsmToken::Hash: OS << "Hash"; break;
299*9880d681SAndroid Build Coastguard Worker case AsmToken::LBrac: OS << "LBrac"; break;
300*9880d681SAndroid Build Coastguard Worker case AsmToken::LCurly: OS << "LCurly"; break;
301*9880d681SAndroid Build Coastguard Worker case AsmToken::LParen: OS << "LParen"; break;
302*9880d681SAndroid Build Coastguard Worker case AsmToken::Less: OS << "Less"; break;
303*9880d681SAndroid Build Coastguard Worker case AsmToken::LessEqual: OS << "LessEqual"; break;
304*9880d681SAndroid Build Coastguard Worker case AsmToken::LessGreater: OS << "LessGreater"; break;
305*9880d681SAndroid Build Coastguard Worker case AsmToken::LessLess: OS << "LessLess"; break;
306*9880d681SAndroid Build Coastguard Worker case AsmToken::Minus: OS << "Minus"; break;
307*9880d681SAndroid Build Coastguard Worker case AsmToken::Percent: OS << "Percent"; break;
308*9880d681SAndroid Build Coastguard Worker case AsmToken::Pipe: OS << "Pipe"; break;
309*9880d681SAndroid Build Coastguard Worker case AsmToken::PipePipe: OS << "PipePipe"; break;
310*9880d681SAndroid Build Coastguard Worker case AsmToken::Plus: OS << "Plus"; break;
311*9880d681SAndroid Build Coastguard Worker case AsmToken::RBrac: OS << "RBrac"; break;
312*9880d681SAndroid Build Coastguard Worker case AsmToken::RCurly: OS << "RCurly"; break;
313*9880d681SAndroid Build Coastguard Worker case AsmToken::RParen: OS << "RParen"; break;
314*9880d681SAndroid Build Coastguard Worker case AsmToken::Slash: OS << "Slash"; break;
315*9880d681SAndroid Build Coastguard Worker case AsmToken::Star: OS << "Star"; break;
316*9880d681SAndroid Build Coastguard Worker case AsmToken::Tilde: OS << "Tilde"; break;
317*9880d681SAndroid Build Coastguard Worker }
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker // Print the token string.
320*9880d681SAndroid Build Coastguard Worker OS << " (\"";
321*9880d681SAndroid Build Coastguard Worker OS.write_escaped(Tok.getString());
322*9880d681SAndroid Build Coastguard Worker OS << "\")\n";
323*9880d681SAndroid Build Coastguard Worker }
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker return Error;
326*9880d681SAndroid Build Coastguard Worker }
327*9880d681SAndroid Build Coastguard Worker
fillCommandLineSymbols(MCAsmParser & Parser)328*9880d681SAndroid Build Coastguard Worker static int fillCommandLineSymbols(MCAsmParser &Parser){
329*9880d681SAndroid Build Coastguard Worker for(auto &I: DefineSymbol){
330*9880d681SAndroid Build Coastguard Worker auto Pair = StringRef(I).split('=');
331*9880d681SAndroid Build Coastguard Worker if(Pair.second.empty()){
332*9880d681SAndroid Build Coastguard Worker errs() << "error: defsym must be of the form: sym=value: " << I;
333*9880d681SAndroid Build Coastguard Worker return 1;
334*9880d681SAndroid Build Coastguard Worker }
335*9880d681SAndroid Build Coastguard Worker int64_t Value;
336*9880d681SAndroid Build Coastguard Worker if(Pair.second.getAsInteger(0, Value)){
337*9880d681SAndroid Build Coastguard Worker errs() << "error: Value is not an integer: " << Pair.second;
338*9880d681SAndroid Build Coastguard Worker return 1;
339*9880d681SAndroid Build Coastguard Worker }
340*9880d681SAndroid Build Coastguard Worker auto &Context = Parser.getContext();
341*9880d681SAndroid Build Coastguard Worker auto Symbol = Context.getOrCreateSymbol(Pair.first);
342*9880d681SAndroid Build Coastguard Worker Parser.getStreamer().EmitAssignment(Symbol,
343*9880d681SAndroid Build Coastguard Worker MCConstantExpr::create(Value, Context));
344*9880d681SAndroid Build Coastguard Worker }
345*9880d681SAndroid Build Coastguard Worker return 0;
346*9880d681SAndroid Build Coastguard Worker }
347*9880d681SAndroid Build Coastguard Worker
AssembleInput(const char * ProgName,const Target * TheTarget,SourceMgr & SrcMgr,MCContext & Ctx,MCStreamer & Str,MCAsmInfo & MAI,MCSubtargetInfo & STI,MCInstrInfo & MCII,MCTargetOptions & MCOptions)348*9880d681SAndroid Build Coastguard Worker static int AssembleInput(const char *ProgName, const Target *TheTarget,
349*9880d681SAndroid Build Coastguard Worker SourceMgr &SrcMgr, MCContext &Ctx, MCStreamer &Str,
350*9880d681SAndroid Build Coastguard Worker MCAsmInfo &MAI, MCSubtargetInfo &STI,
351*9880d681SAndroid Build Coastguard Worker MCInstrInfo &MCII, MCTargetOptions &MCOptions) {
352*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCAsmParser> Parser(
353*9880d681SAndroid Build Coastguard Worker createMCAsmParser(SrcMgr, Ctx, Str, MAI));
354*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCTargetAsmParser> TAP(
355*9880d681SAndroid Build Coastguard Worker TheTarget->createMCAsmParser(STI, *Parser, MCII, MCOptions));
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker if (!TAP) {
358*9880d681SAndroid Build Coastguard Worker errs() << ProgName
359*9880d681SAndroid Build Coastguard Worker << ": error: this target does not support assembly parsing.\n";
360*9880d681SAndroid Build Coastguard Worker return 1;
361*9880d681SAndroid Build Coastguard Worker }
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker int SymbolResult = fillCommandLineSymbols(*Parser);
364*9880d681SAndroid Build Coastguard Worker if(SymbolResult)
365*9880d681SAndroid Build Coastguard Worker return SymbolResult;
366*9880d681SAndroid Build Coastguard Worker Parser->setShowParsedOperands(ShowInstOperands);
367*9880d681SAndroid Build Coastguard Worker Parser->setTargetParser(*TAP);
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker int Res = Parser->Run(NoInitialTextSection);
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker return Res;
372*9880d681SAndroid Build Coastguard Worker }
373*9880d681SAndroid Build Coastguard Worker
main(int argc,char ** argv)374*9880d681SAndroid Build Coastguard Worker int main(int argc, char **argv) {
375*9880d681SAndroid Build Coastguard Worker // Print a stack trace if we signal out.
376*9880d681SAndroid Build Coastguard Worker sys::PrintStackTraceOnErrorSignal(argv[0]);
377*9880d681SAndroid Build Coastguard Worker PrettyStackTraceProgram X(argc, argv);
378*9880d681SAndroid Build Coastguard Worker llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker // Initialize targets and assembly printers/parsers.
381*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllTargetInfos();
382*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllTargetMCs();
383*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllAsmParsers();
384*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllDisassemblers();
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker // Register the target printer for --version.
387*9880d681SAndroid Build Coastguard Worker cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion);
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n");
390*9880d681SAndroid Build Coastguard Worker MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags();
391*9880d681SAndroid Build Coastguard Worker TripleName = Triple::normalize(TripleName);
392*9880d681SAndroid Build Coastguard Worker setDwarfDebugFlags(argc, argv);
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker setDwarfDebugProducer();
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker const char *ProgName = argv[0];
397*9880d681SAndroid Build Coastguard Worker const Target *TheTarget = GetTarget(ProgName);
398*9880d681SAndroid Build Coastguard Worker if (!TheTarget)
399*9880d681SAndroid Build Coastguard Worker return 1;
400*9880d681SAndroid Build Coastguard Worker // Now that GetTarget() has (potentially) replaced TripleName, it's safe to
401*9880d681SAndroid Build Coastguard Worker // construct the Triple object.
402*9880d681SAndroid Build Coastguard Worker Triple TheTriple(TripleName);
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> BufferPtr =
405*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(InputFilename);
406*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = BufferPtr.getError()) {
407*9880d681SAndroid Build Coastguard Worker errs() << InputFilename << ": " << EC.message() << '\n';
408*9880d681SAndroid Build Coastguard Worker return 1;
409*9880d681SAndroid Build Coastguard Worker }
410*9880d681SAndroid Build Coastguard Worker MemoryBuffer *Buffer = BufferPtr->get();
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Worker SourceMgr SrcMgr;
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker // Tell SrcMgr about this buffer, which is what the parser will pick up.
415*9880d681SAndroid Build Coastguard Worker SrcMgr.AddNewSourceBuffer(std::move(*BufferPtr), SMLoc());
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker // Record the location of the include directories so that the lexer can find
418*9880d681SAndroid Build Coastguard Worker // it later.
419*9880d681SAndroid Build Coastguard Worker SrcMgr.setIncludeDirs(IncludeDirs);
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName));
422*9880d681SAndroid Build Coastguard Worker assert(MRI && "Unable to create target register info!");
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(*MRI, TripleName));
425*9880d681SAndroid Build Coastguard Worker assert(MAI && "Unable to create target asm info!");
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker MAI->setRelaxELFRelocations(RelaxELFRel);
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker if (CompressDebugSections != DebugCompressionType::DCT_None) {
430*9880d681SAndroid Build Coastguard Worker if (!zlib::isAvailable()) {
431*9880d681SAndroid Build Coastguard Worker errs() << ProgName
432*9880d681SAndroid Build Coastguard Worker << ": build tools with zlib to enable -compress-debug-sections";
433*9880d681SAndroid Build Coastguard Worker return 1;
434*9880d681SAndroid Build Coastguard Worker }
435*9880d681SAndroid Build Coastguard Worker MAI->setCompressDebugSections(CompressDebugSections);
436*9880d681SAndroid Build Coastguard Worker }
437*9880d681SAndroid Build Coastguard Worker MAI->setPreserveAsmComments(PreserveComments);
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and
440*9880d681SAndroid Build Coastguard Worker // MCObjectFileInfo needs a MCContext reference in order to initialize itself.
441*9880d681SAndroid Build Coastguard Worker MCObjectFileInfo MOFI;
442*9880d681SAndroid Build Coastguard Worker MCContext Ctx(MAI.get(), MRI.get(), &MOFI, &SrcMgr);
443*9880d681SAndroid Build Coastguard Worker MOFI.InitMCObjectFileInfo(TheTriple, PIC, CMModel, Ctx);
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Worker if (SaveTempLabels)
446*9880d681SAndroid Build Coastguard Worker Ctx.setAllowTemporaryLabels(false);
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker Ctx.setGenDwarfForAssembly(GenDwarfForAssembly);
449*9880d681SAndroid Build Coastguard Worker // Default to 4 for dwarf version.
450*9880d681SAndroid Build Coastguard Worker unsigned DwarfVersion = MCOptions.DwarfVersion ? MCOptions.DwarfVersion : 4;
451*9880d681SAndroid Build Coastguard Worker if (DwarfVersion < 2 || DwarfVersion > 4) {
452*9880d681SAndroid Build Coastguard Worker errs() << ProgName << ": Dwarf version " << DwarfVersion
453*9880d681SAndroid Build Coastguard Worker << " is not supported." << '\n';
454*9880d681SAndroid Build Coastguard Worker return 1;
455*9880d681SAndroid Build Coastguard Worker }
456*9880d681SAndroid Build Coastguard Worker Ctx.setDwarfVersion(DwarfVersion);
457*9880d681SAndroid Build Coastguard Worker if (!DwarfDebugFlags.empty())
458*9880d681SAndroid Build Coastguard Worker Ctx.setDwarfDebugFlags(StringRef(DwarfDebugFlags));
459*9880d681SAndroid Build Coastguard Worker if (!DwarfDebugProducer.empty())
460*9880d681SAndroid Build Coastguard Worker Ctx.setDwarfDebugProducer(StringRef(DwarfDebugProducer));
461*9880d681SAndroid Build Coastguard Worker if (!DebugCompilationDir.empty())
462*9880d681SAndroid Build Coastguard Worker Ctx.setCompilationDir(DebugCompilationDir);
463*9880d681SAndroid Build Coastguard Worker else {
464*9880d681SAndroid Build Coastguard Worker // If no compilation dir is set, try to use the current directory.
465*9880d681SAndroid Build Coastguard Worker SmallString<128> CWD;
466*9880d681SAndroid Build Coastguard Worker if (!sys::fs::current_path(CWD))
467*9880d681SAndroid Build Coastguard Worker Ctx.setCompilationDir(CWD);
468*9880d681SAndroid Build Coastguard Worker }
469*9880d681SAndroid Build Coastguard Worker if (!MainFileName.empty())
470*9880d681SAndroid Build Coastguard Worker Ctx.setMainFileName(MainFileName);
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Worker // Package up features to be passed to target/subtarget
473*9880d681SAndroid Build Coastguard Worker std::string FeaturesStr;
474*9880d681SAndroid Build Coastguard Worker if (MAttrs.size()) {
475*9880d681SAndroid Build Coastguard Worker SubtargetFeatures Features;
476*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != MAttrs.size(); ++i)
477*9880d681SAndroid Build Coastguard Worker Features.AddFeature(MAttrs[i]);
478*9880d681SAndroid Build Coastguard Worker FeaturesStr = Features.getString();
479*9880d681SAndroid Build Coastguard Worker }
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Worker std::unique_ptr<tool_output_file> Out = GetOutputStream();
482*9880d681SAndroid Build Coastguard Worker if (!Out)
483*9880d681SAndroid Build Coastguard Worker return 1;
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker std::unique_ptr<buffer_ostream> BOS;
486*9880d681SAndroid Build Coastguard Worker raw_pwrite_stream *OS = &Out->os();
487*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCStreamer> Str;
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo());
490*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCSubtargetInfo> STI(
491*9880d681SAndroid Build Coastguard Worker TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr));
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker MCInstPrinter *IP = nullptr;
494*9880d681SAndroid Build Coastguard Worker if (FileType == OFT_AssemblyFile) {
495*9880d681SAndroid Build Coastguard Worker IP = TheTarget->createMCInstPrinter(Triple(TripleName), OutputAsmVariant,
496*9880d681SAndroid Build Coastguard Worker *MAI, *MCII, *MRI);
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Worker // Set the display preference for hex vs. decimal immediates.
499*9880d681SAndroid Build Coastguard Worker IP->setPrintImmHex(PrintImmHex);
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker // Set up the AsmStreamer.
502*9880d681SAndroid Build Coastguard Worker MCCodeEmitter *CE = nullptr;
503*9880d681SAndroid Build Coastguard Worker MCAsmBackend *MAB = nullptr;
504*9880d681SAndroid Build Coastguard Worker if (ShowEncoding) {
505*9880d681SAndroid Build Coastguard Worker CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);
506*9880d681SAndroid Build Coastguard Worker MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU);
507*9880d681SAndroid Build Coastguard Worker }
508*9880d681SAndroid Build Coastguard Worker auto FOut = llvm::make_unique<formatted_raw_ostream>(*OS);
509*9880d681SAndroid Build Coastguard Worker Str.reset(TheTarget->createAsmStreamer(
510*9880d681SAndroid Build Coastguard Worker Ctx, std::move(FOut), /*asmverbose*/ true,
511*9880d681SAndroid Build Coastguard Worker /*useDwarfDirectory*/ true, IP, CE, MAB, ShowInst));
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker } else if (FileType == OFT_Null) {
514*9880d681SAndroid Build Coastguard Worker Str.reset(TheTarget->createNullStreamer(Ctx));
515*9880d681SAndroid Build Coastguard Worker } else {
516*9880d681SAndroid Build Coastguard Worker assert(FileType == OFT_ObjectFile && "Invalid file type!");
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker // Don't waste memory on names of temp labels.
519*9880d681SAndroid Build Coastguard Worker Ctx.setUseNamesOnTempLabels(false);
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker if (!Out->os().supportsSeeking()) {
522*9880d681SAndroid Build Coastguard Worker BOS = make_unique<buffer_ostream>(Out->os());
523*9880d681SAndroid Build Coastguard Worker OS = BOS.get();
524*9880d681SAndroid Build Coastguard Worker }
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);
527*9880d681SAndroid Build Coastguard Worker MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU);
528*9880d681SAndroid Build Coastguard Worker Str.reset(TheTarget->createMCObjectStreamer(
529*9880d681SAndroid Build Coastguard Worker TheTriple, Ctx, *MAB, *OS, CE, *STI, MCOptions.MCRelaxAll,
530*9880d681SAndroid Build Coastguard Worker MCOptions.MCIncrementalLinkerCompatible,
531*9880d681SAndroid Build Coastguard Worker /*DWARFMustBeAtTheEnd*/ false));
532*9880d681SAndroid Build Coastguard Worker if (NoExecStack)
533*9880d681SAndroid Build Coastguard Worker Str->InitSections(true);
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker
536*9880d681SAndroid Build Coastguard Worker int Res = 1;
537*9880d681SAndroid Build Coastguard Worker bool disassemble = false;
538*9880d681SAndroid Build Coastguard Worker switch (Action) {
539*9880d681SAndroid Build Coastguard Worker case AC_AsLex:
540*9880d681SAndroid Build Coastguard Worker Res = AsLexInput(SrcMgr, *MAI, Out->os());
541*9880d681SAndroid Build Coastguard Worker break;
542*9880d681SAndroid Build Coastguard Worker case AC_Assemble:
543*9880d681SAndroid Build Coastguard Worker Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI,
544*9880d681SAndroid Build Coastguard Worker *MCII, MCOptions);
545*9880d681SAndroid Build Coastguard Worker break;
546*9880d681SAndroid Build Coastguard Worker case AC_MDisassemble:
547*9880d681SAndroid Build Coastguard Worker assert(IP && "Expected assembly output");
548*9880d681SAndroid Build Coastguard Worker IP->setUseMarkup(1);
549*9880d681SAndroid Build Coastguard Worker disassemble = true;
550*9880d681SAndroid Build Coastguard Worker break;
551*9880d681SAndroid Build Coastguard Worker case AC_Disassemble:
552*9880d681SAndroid Build Coastguard Worker disassemble = true;
553*9880d681SAndroid Build Coastguard Worker break;
554*9880d681SAndroid Build Coastguard Worker }
555*9880d681SAndroid Build Coastguard Worker if (disassemble)
556*9880d681SAndroid Build Coastguard Worker Res = Disassembler::disassemble(*TheTarget, TripleName, *STI, *Str,
557*9880d681SAndroid Build Coastguard Worker *Buffer, SrcMgr, Out->os());
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker // Keep output if no errors.
560*9880d681SAndroid Build Coastguard Worker if (Res == 0) Out->keep();
561*9880d681SAndroid Build Coastguard Worker return Res;
562*9880d681SAndroid Build Coastguard Worker }
563