xref: /aosp_15_r20/external/llvm/tools/llvm-mc/llvm-mc.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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