blob: 71526dd77f11aab549676aa19edca96d92862ddf [file] [log] [blame]
Chris Lattner5159bbaf2009-09-20 07:41:30 +00001//===-- X86AsmPrinter.cpp - Convert X86 LLVM code to AT&T assembly --------===//
Misha Brukmanc88330a2005-04-21 23:38:14 +00002//
John Criswell482202a2003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanc88330a2005-04-21 23:38:14 +00007//
John Criswell482202a2003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattnerd92fb002002-10-25 22:55:53 +00009//
Chris Lattner5159bbaf2009-09-20 07:41:30 +000010// This file contains a printer that converts from our internal representation
Chris Lattner94a946c2010-01-28 01:02:27 +000011// of machine-dependent LLVM code to X86 machine code.
Chris Lattnerd92fb002002-10-25 22:55:53 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5159bbaf2009-09-20 07:41:30 +000015#include "X86AsmPrinter.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000016#include "InstPrinter/X86ATTInstPrinter.h"
Craig Topperc6d4efa2014-03-19 06:53:25 +000017#include "MCTargetDesc/X86BaseInfo.h"
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000018#include "MCTargetDesc/X86TargetStreamer.h"
Craig Topperc6d4efa2014-03-19 06:53:25 +000019#include "X86InstrInfo.h"
Chris Lattner5159bbaf2009-09-20 07:41:30 +000020#include "X86MachineFunctionInfo.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000021#include "llvm/BinaryFormat/COFF.h"
David Majnemer8bce66b2014-07-14 22:57:27 +000022#include "llvm/CodeGen/MachineConstantPool.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000023#include "llvm/CodeGen/MachineModuleInfoImpls.h"
Craig Topperc6d4efa2014-03-19 06:53:25 +000024#include "llvm/CodeGen/MachineValueType.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000025#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/DerivedTypes.h"
Rafael Espindola894843c2014-01-07 21:19:40 +000027#include "llvm/IR/Mangler.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000028#include "llvm/IR/Module.h"
29#include "llvm/IR/Type.h"
Sanjoy Dasc0441c22016-04-19 05:24:47 +000030#include "llvm/MC/MCCodeEmitter.h"
Chris Lattner5159bbaf2009-09-20 07:41:30 +000031#include "llvm/MC/MCContext.h"
Chris Lattner3bcbdb82010-02-03 06:42:38 +000032#include "llvm/MC/MCExpr.h"
David Majnemer8bce66b2014-07-14 22:57:27 +000033#include "llvm/MC/MCSectionCOFF.h"
Chris Lattner5159bbaf2009-09-20 07:41:30 +000034#include "llvm/MC/MCSectionMachO.h"
35#include "llvm/MC/MCStreamer.h"
36#include "llvm/MC/MCSymbol.h"
Devang Patel2bf0f3c2010-08-04 18:06:05 +000037#include "llvm/Support/Debug.h"
Chris Lattner5159bbaf2009-09-20 07:41:30 +000038#include "llvm/Support/ErrorHandling.h"
Evan Cheng2bb40352011-08-24 18:08:43 +000039#include "llvm/Support/TargetRegistry.h"
Chris Lattner5159bbaf2009-09-20 07:41:30 +000040using namespace llvm;
41
Reid Klecknerec4ff242017-10-11 23:53:12 +000042X86AsmPrinter::X86AsmPrinter(TargetMachine &TM,
43 std::unique_ptr<MCStreamer> Streamer)
44 : AsmPrinter(TM, std::move(Streamer)), SM(*this), FM(*this) {}
45
Chris Lattner5159bbaf2009-09-20 07:41:30 +000046//===----------------------------------------------------------------------===//
47// Primitive Helper Functions.
48//===----------------------------------------------------------------------===//
49
Chris Lattner94a946c2010-01-28 01:02:27 +000050/// runOnMachineFunction - Emit the function body.
Chris Lattner5159bbaf2009-09-20 07:41:30 +000051///
52bool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
Eric Christopherd7dec662015-02-05 19:06:45 +000053 Subtarget = &MF.getSubtarget<X86Subtarget>();
54
Lang Hamesf49bc3f2014-07-24 20:40:55 +000055 SMShadowTracker.startFunction(MF);
Sanjoy Dasc0441c22016-04-19 05:24:47 +000056 CodeEmitter.reset(TM.getTarget().createMCCodeEmitter(
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000057 *Subtarget->getInstrInfo(), *Subtarget->getRegisterInfo(),
Sanjoy Dasc0441c22016-04-19 05:24:47 +000058 MF.getContext()));
Lang Hamesf49bc3f2014-07-24 20:40:55 +000059
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000060 EmitFPOData =
61 Subtarget->isTargetWin32() && MF.getMMI().getModule()->getCodeViewFlag();
62
Chris Lattner5159bbaf2009-09-20 07:41:30 +000063 SetupMachineFunction(MF);
Chris Lattner5159bbaf2009-09-20 07:41:30 +000064
Tim Northover9653eb52013-12-10 16:57:43 +000065 if (Subtarget->isTargetCOFF()) {
Matthias Braunf1caa282017-12-15 22:22:58 +000066 bool Local = MF.getFunction().hasLocalLinkage();
Lang Hames9ff69c82015-04-24 19:11:51 +000067 OutStreamer->BeginCOFFSymbolDef(CurrentFnSym);
Reid Kleckner741d8a22016-10-13 00:55:24 +000068 OutStreamer->EmitCOFFSymbolStorageClass(
69 Local ? COFF::IMAGE_SYM_CLASS_STATIC : COFF::IMAGE_SYM_CLASS_EXTERNAL);
Lang Hames9ff69c82015-04-24 19:11:51 +000070 OutStreamer->EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION
Chris Lattner25485802010-07-14 18:14:33 +000071 << COFF::SCT_COMPLEX_TYPE_SHIFT);
Lang Hames9ff69c82015-04-24 19:11:51 +000072 OutStreamer->EndCOFFSymbolDef();
Chris Lattnerc7b91152010-01-26 23:18:44 +000073 }
Anton Korobeynikovc9276df2010-02-12 15:28:40 +000074
Chris Lattner94a946c2010-01-28 01:02:27 +000075 // Emit the rest of the function body.
76 EmitFunctionBody();
Chris Lattner5159bbaf2009-09-20 07:41:30 +000077
Dean Michael Berris52735fc2016-07-14 04:06:33 +000078 // Emit the XRay table for this function.
Dean Michael Berrisf7e7b932017-01-03 04:30:21 +000079 emitXRayTable();
Dean Michael Berris52735fc2016-07-14 04:06:33 +000080
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000081 EmitFPOData = false;
82
Chris Lattner5159bbaf2009-09-20 07:41:30 +000083 // We didn't modify anything.
84 return false;
85}
86
Reid Kleckner9cdd4df2017-10-11 21:24:33 +000087void X86AsmPrinter::EmitFunctionBodyStart() {
88 if (EmitFPOData) {
89 X86TargetStreamer *XTS =
90 static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
91 unsigned ParamsSize =
92 MF->getInfo<X86MachineFunctionInfo>()->getArgumentStackSize();
93 XTS->emitFPOProc(CurrentFnSym, ParamsSize);
94 }
95}
96
97void X86AsmPrinter::EmitFunctionBodyEnd() {
98 if (EmitFPOData) {
99 X86TargetStreamer *XTS =
100 static_cast<X86TargetStreamer *>(OutStreamer->getTargetStreamer());
101 XTS->emitFPOEndProc();
102 }
103}
104
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000105/// printSymbolOperand - Print a raw symbol reference operand. This handles
106/// jump tables, constant pools, global address and external symbols, all of
107/// which print to a label with various suffixes for relocation types etc.
Rafael Espindola7caa1352013-11-27 07:14:26 +0000108static void printSymbolOperand(X86AsmPrinter &P, const MachineOperand &MO,
109 raw_ostream &O) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000110 switch (MO.getType()) {
111 default: llvm_unreachable("unknown symbol type!");
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000112 case MachineOperand::MO_ConstantPoolIndex:
Matt Arsenault8b643552015-06-09 00:31:39 +0000113 P.GetCPISymbol(MO.getIndex())->print(O, P.MAI);
Rafael Espindola7caa1352013-11-27 07:14:26 +0000114 P.printOffset(MO.getOffset(), O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000115 break;
116 case MachineOperand::MO_GlobalAddress: {
117 const GlobalValue *GV = MO.getGlobal();
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000118
Chris Lattner8c21ffd2010-01-18 00:59:24 +0000119 MCSymbol *GVSym;
Rafael Espindolaa99ccfc2016-06-29 14:59:50 +0000120 if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
121 MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE)
Rafael Espindolaf4e6b292013-12-02 16:25:47 +0000122 GVSym = P.getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
Chris Lattnere6b1bef2010-01-16 00:51:39 +0000123 else
Rafael Espindola7caa1352013-11-27 07:14:26 +0000124 GVSym = P.getSymbol(GV);
Chris Lattnere6b1bef2010-01-16 00:51:39 +0000125
Reid Klecknerc35e7f52015-06-11 01:31:48 +0000126 // Handle dllimport linkage.
127 if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
128 GVSym =
129 P.OutContext.getOrCreateSymbol(Twine("__imp_") + GVSym->getName());
130
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000131 if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
132 MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE) {
Rafael Espindolaf4e6b292013-12-02 16:25:47 +0000133 MCSymbol *Sym = P.getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000134 MachineModuleInfoImpl::StubValueTy &StubSym =
Rafael Espindola7caa1352013-11-27 07:14:26 +0000135 P.MMI->getObjFileInfo<MachineModuleInfoMachO>().getGVStubEntry(Sym);
Craig Topper062a2ba2014-04-25 05:30:21 +0000136 if (!StubSym.getPointer())
Bill Wendlinga810bdf2010-03-10 22:34:10 +0000137 StubSym = MachineModuleInfoImpl::
Rafael Espindola7caa1352013-11-27 07:14:26 +0000138 StubValueTy(P.getSymbol(GV), !GV->hasInternalLinkage());
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000139 }
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000140
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000141 // If the name begins with a dollar-sign, enclose it in parens. We do this
142 // to avoid having it look like an integer immediate to the assembler.
Chris Lattnere6b1bef2010-01-16 00:51:39 +0000143 if (GVSym->getName()[0] != '$')
Matt Arsenault8b643552015-06-09 00:31:39 +0000144 GVSym->print(O, P.MAI);
145 else {
146 O << '(';
147 GVSym->print(O, P.MAI);
148 O << ')';
149 }
Rafael Espindola7caa1352013-11-27 07:14:26 +0000150 P.printOffset(MO.getOffset(), O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000151 break;
152 }
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000153 }
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000154
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000155 switch (MO.getTargetFlags()) {
156 default:
157 llvm_unreachable("Unknown target flag on GV operand");
158 case X86II::MO_NO_FLAG: // No flag.
159 break;
160 case X86II::MO_DARWIN_NONLAZY:
161 case X86II::MO_DLLIMPORT:
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000162 // These affect the name of the symbol, not any suffix.
163 break;
164 case X86II::MO_GOT_ABSOLUTE_ADDRESS:
Matt Arsenault8b643552015-06-09 00:31:39 +0000165 O << " + [.-";
166 P.MF->getPICBaseSymbol()->print(O, P.MAI);
167 O << ']';
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000168 break;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000169 case X86II::MO_PIC_BASE_OFFSET:
170 case X86II::MO_DARWIN_NONLAZY_PIC_BASE:
Matt Arsenault8b643552015-06-09 00:31:39 +0000171 O << '-';
172 P.MF->getPICBaseSymbol()->print(O, P.MAI);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000173 break;
174 case X86II::MO_TLSGD: O << "@TLSGD"; break;
Hans Wennborg789acfb2012-06-01 16:27:21 +0000175 case X86II::MO_TLSLD: O << "@TLSLD"; break;
176 case X86II::MO_TLSLDM: O << "@TLSLDM"; break;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000177 case X86II::MO_GOTTPOFF: O << "@GOTTPOFF"; break;
178 case X86II::MO_INDNTPOFF: O << "@INDNTPOFF"; break;
179 case X86II::MO_TPOFF: O << "@TPOFF"; break;
Hans Wennborg789acfb2012-06-01 16:27:21 +0000180 case X86II::MO_DTPOFF: O << "@DTPOFF"; break;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000181 case X86II::MO_NTPOFF: O << "@NTPOFF"; break;
Hans Wennborgf9d0e442012-05-11 10:11:01 +0000182 case X86II::MO_GOTNTPOFF: O << "@GOTNTPOFF"; break;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000183 case X86II::MO_GOTPCREL: O << "@GOTPCREL"; break;
184 case X86II::MO_GOT: O << "@GOT"; break;
185 case X86II::MO_GOTOFF: O << "@GOTOFF"; break;
186 case X86II::MO_PLT: O << "@PLT"; break;
Eric Christopherb0e1a452010-06-03 04:07:48 +0000187 case X86II::MO_TLVP: O << "@TLVP"; break;
188 case X86II::MO_TLVP_PIC_BASE:
Matt Arsenault8b643552015-06-09 00:31:39 +0000189 O << "@TLVP" << '-';
190 P.MF->getPICBaseSymbol()->print(O, P.MAI);
Eric Christopherb0e1a452010-06-03 04:07:48 +0000191 break;
Benjamin Kramer9c9e0a22013-03-30 16:21:50 +0000192 case X86II::MO_SECREL: O << "@SECREL32"; break;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000193 }
194}
195
Rafael Espindola7caa1352013-11-27 07:14:26 +0000196static void printOperand(X86AsmPrinter &P, const MachineInstr *MI,
197 unsigned OpNo, raw_ostream &O,
Craig Topper062a2ba2014-04-25 05:30:21 +0000198 const char *Modifier = nullptr, unsigned AsmVariant = 0);
Rafael Espindola7caa1352013-11-27 07:14:26 +0000199
Chad Rosier38e05a92012-09-10 22:50:57 +0000200/// printPCRelImm - This is used to print an immediate value that ends up
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000201/// being encoded as a pc-relative value. These print slightly differently, for
202/// example, a $ is not emitted.
Rafael Espindola7caa1352013-11-27 07:14:26 +0000203static void printPCRelImm(X86AsmPrinter &P, const MachineInstr *MI,
204 unsigned OpNo, raw_ostream &O) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000205 const MachineOperand &MO = MI->getOperand(OpNo);
206 switch (MO.getType()) {
207 default: llvm_unreachable("Unknown pcrel immediate operand");
Dale Johannesenda3e05db2010-07-16 18:35:46 +0000208 case MachineOperand::MO_Register:
209 // pc-relativeness was handled when computing the value in the reg.
Rafael Espindola7caa1352013-11-27 07:14:26 +0000210 printOperand(P, MI, OpNo, O);
Dale Johannesenda3e05db2010-07-16 18:35:46 +0000211 return;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000212 case MachineOperand::MO_Immediate:
213 O << MO.getImm();
214 return;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000215 case MachineOperand::MO_GlobalAddress:
Rafael Espindola7caa1352013-11-27 07:14:26 +0000216 printSymbolOperand(P, MO, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000217 return;
218 }
219}
220
Rafael Espindola7caa1352013-11-27 07:14:26 +0000221static void printOperand(X86AsmPrinter &P, const MachineInstr *MI,
222 unsigned OpNo, raw_ostream &O, const char *Modifier,
223 unsigned AsmVariant) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000224 const MachineOperand &MO = MI->getOperand(OpNo);
225 switch (MO.getType()) {
226 default: llvm_unreachable("unknown operand type!");
227 case MachineOperand::MO_Register: {
Chad Rosierdb20a412012-09-10 21:10:49 +0000228 // FIXME: Enumerating AsmVariant, so we can remove magic number.
229 if (AsmVariant == 0) O << '%';
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000230 unsigned Reg = MO.getReg();
231 if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) {
Craig Topper91dab7b2015-12-25 22:09:45 +0000232 unsigned Size = (strcmp(Modifier+6,"64") == 0) ? 64 :
233 (strcmp(Modifier+6,"32") == 0) ? 32 :
234 (strcmp(Modifier+6,"16") == 0) ? 16 : 8;
235 Reg = getX86SubSuperRegister(Reg, Size);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000236 }
237 O << X86ATTInstPrinter::getRegisterName(Reg);
238 return;
239 }
240
241 case MachineOperand::MO_Immediate:
Chad Rosier282edd72013-02-13 21:33:44 +0000242 if (AsmVariant == 0) O << '$';
243 O << MO.getImm();
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000244 return;
245
Rafael Espindolac5c7bb62013-11-27 15:13:06 +0000246 case MachineOperand::MO_GlobalAddress: {
Chad Rosier282edd72013-02-13 21:33:44 +0000247 if (AsmVariant == 0) O << '$';
Rafael Espindola7caa1352013-11-27 07:14:26 +0000248 printSymbolOperand(P, MO, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000249 break;
250 }
251 }
252}
253
Rafael Espindolae3701472013-11-27 07:34:09 +0000254static void printLeaMemReference(X86AsmPrinter &P, const MachineInstr *MI,
255 unsigned Op, raw_ostream &O,
Craig Topper062a2ba2014-04-25 05:30:21 +0000256 const char *Modifier = nullptr) {
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000257 const MachineOperand &BaseReg = MI->getOperand(Op+X86::AddrBaseReg);
258 const MachineOperand &IndexReg = MI->getOperand(Op+X86::AddrIndexReg);
259 const MachineOperand &DispSpec = MI->getOperand(Op+X86::AddrDisp);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000260
261 // If we really don't want to print out (rip), don't.
262 bool HasBaseReg = BaseReg.getReg() != 0;
263 if (HasBaseReg && Modifier && !strcmp(Modifier, "no-rip") &&
264 BaseReg.getReg() == X86::RIP)
265 HasBaseReg = false;
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000266
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000267 // HasParenPart - True if we will print out the () part of the mem ref.
268 bool HasParenPart = IndexReg.getReg() || HasBaseReg;
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000269
Rafael Espindolaed20f472013-11-27 18:18:24 +0000270 switch (DispSpec.getType()) {
271 default:
272 llvm_unreachable("unknown operand type!");
273 case MachineOperand::MO_Immediate: {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000274 int DispVal = DispSpec.getImm();
275 if (DispVal || !HasParenPart)
276 O << DispVal;
Rafael Espindolaed20f472013-11-27 18:18:24 +0000277 break;
278 }
279 case MachineOperand::MO_GlobalAddress:
280 case MachineOperand::MO_ConstantPoolIndex:
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000281 printSymbolOperand(P, DispSpec, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000282 }
283
Rafael Espindolad606e542011-01-01 20:58:46 +0000284 if (Modifier && strcmp(Modifier, "H") == 0)
285 O << "+8";
286
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000287 if (HasParenPart) {
288 assert(IndexReg.getReg() != X86::ESP &&
289 "X86 doesn't allow scaling by ESP");
290
291 O << '(';
292 if (HasBaseReg)
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000293 printOperand(P, MI, Op+X86::AddrBaseReg, O, Modifier);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000294
295 if (IndexReg.getReg()) {
296 O << ',';
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000297 printOperand(P, MI, Op+X86::AddrIndexReg, O, Modifier);
298 unsigned ScaleVal = MI->getOperand(Op+X86::AddrScaleAmt).getImm();
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000299 if (ScaleVal != 1)
300 O << ',' << ScaleVal;
301 }
302 O << ')';
303 }
304}
305
Rafael Espindolae3701472013-11-27 07:34:09 +0000306static void printMemReference(X86AsmPrinter &P, const MachineInstr *MI,
307 unsigned Op, raw_ostream &O,
Craig Topper062a2ba2014-04-25 05:30:21 +0000308 const char *Modifier = nullptr) {
Duncan P. N. Exon Smith9cfc75c2016-06-30 00:01:54 +0000309 assert(isMem(*MI, Op) && "Invalid memory reference!");
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000310 const MachineOperand &Segment = MI->getOperand(Op+X86::AddrSegmentReg);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000311 if (Segment.getReg()) {
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000312 printOperand(P, MI, Op+X86::AddrSegmentReg, O, Modifier);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000313 O << ':';
314 }
Rafael Espindolae3701472013-11-27 07:34:09 +0000315 printLeaMemReference(P, MI, Op, O, Modifier);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000316}
317
Rafael Espindolae3701472013-11-27 07:34:09 +0000318static void printIntelMemReference(X86AsmPrinter &P, const MachineInstr *MI,
319 unsigned Op, raw_ostream &O,
Craig Topper062a2ba2014-04-25 05:30:21 +0000320 const char *Modifier = nullptr,
Rafael Espindolae3701472013-11-27 07:34:09 +0000321 unsigned AsmVariant = 1) {
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000322 const MachineOperand &BaseReg = MI->getOperand(Op+X86::AddrBaseReg);
323 unsigned ScaleVal = MI->getOperand(Op+X86::AddrScaleAmt).getImm();
324 const MachineOperand &IndexReg = MI->getOperand(Op+X86::AddrIndexReg);
325 const MachineOperand &DispSpec = MI->getOperand(Op+X86::AddrDisp);
326 const MachineOperand &SegReg = MI->getOperand(Op+X86::AddrSegmentReg);
Andrew Trickd4d1d9c2013-10-31 17:18:07 +0000327
Chad Rosier271623f2012-10-03 22:06:44 +0000328 // If this has a segment register, print it.
329 if (SegReg.getReg()) {
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000330 printOperand(P, MI, Op+X86::AddrSegmentReg, O, Modifier, AsmVariant);
Chad Rosier271623f2012-10-03 22:06:44 +0000331 O << ':';
332 }
Andrew Trickd4d1d9c2013-10-31 17:18:07 +0000333
Chad Rosier271623f2012-10-03 22:06:44 +0000334 O << '[';
Andrew Trickd4d1d9c2013-10-31 17:18:07 +0000335
Chad Rosier271623f2012-10-03 22:06:44 +0000336 bool NeedPlus = false;
337 if (BaseReg.getReg()) {
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000338 printOperand(P, MI, Op+X86::AddrBaseReg, O, Modifier, AsmVariant);
Chad Rosier271623f2012-10-03 22:06:44 +0000339 NeedPlus = true;
340 }
Andrew Trickd4d1d9c2013-10-31 17:18:07 +0000341
Chad Rosier271623f2012-10-03 22:06:44 +0000342 if (IndexReg.getReg()) {
343 if (NeedPlus) O << " + ";
344 if (ScaleVal != 1)
345 O << ScaleVal << '*';
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000346 printOperand(P, MI, Op+X86::AddrIndexReg, O, Modifier, AsmVariant);
Chad Rosier271623f2012-10-03 22:06:44 +0000347 NeedPlus = true;
348 }
349
Chad Rosier282edd72013-02-13 21:33:44 +0000350 if (!DispSpec.isImm()) {
351 if (NeedPlus) O << " + ";
Manuel Jacobdcb78db2014-03-18 16:14:11 +0000352 printOperand(P, MI, Op+X86::AddrDisp, O, Modifier, AsmVariant);
Chad Rosier282edd72013-02-13 21:33:44 +0000353 } else {
354 int64_t DispVal = DispSpec.getImm();
355 if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) {
356 if (NeedPlus) {
357 if (DispVal > 0)
358 O << " + ";
359 else {
360 O << " - ";
361 DispVal = -DispVal;
362 }
Chad Rosier271623f2012-10-03 22:06:44 +0000363 }
Chad Rosier282edd72013-02-13 21:33:44 +0000364 O << DispVal;
Chad Rosier271623f2012-10-03 22:06:44 +0000365 }
Chad Rosier282edd72013-02-13 21:33:44 +0000366 }
Chad Rosier271623f2012-10-03 22:06:44 +0000367 O << ']';
368}
369
Rafael Espindolae3701472013-11-27 07:34:09 +0000370static bool printAsmMRegister(X86AsmPrinter &P, const MachineOperand &MO,
371 char Mode, raw_ostream &O) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000372 unsigned Reg = MO.getReg();
373 switch (Mode) {
374 default: return true; // Unknown mode.
375 case 'b': // Print QImode register
Craig Topper91dab7b2015-12-25 22:09:45 +0000376 Reg = getX86SubSuperRegister(Reg, 8);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000377 break;
378 case 'h': // Print QImode high register
Craig Topper91dab7b2015-12-25 22:09:45 +0000379 Reg = getX86SubSuperRegister(Reg, 8, true);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000380 break;
381 case 'w': // Print HImode register
Craig Topper91dab7b2015-12-25 22:09:45 +0000382 Reg = getX86SubSuperRegister(Reg, 16);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000383 break;
384 case 'k': // Print SImode register
Craig Topper91dab7b2015-12-25 22:09:45 +0000385 Reg = getX86SubSuperRegister(Reg, 32);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000386 break;
Akira Hatanaka9afbb8c2014-03-28 23:28:07 +0000387 case 'q':
388 // Print 64-bit register names if 64-bit integer registers are available.
389 // Otherwise, print 32-bit register names.
Craig Topper91dab7b2015-12-25 22:09:45 +0000390 Reg = getX86SubSuperRegister(Reg, P.getSubtarget().is64Bit() ? 64 : 32);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000391 break;
392 }
393
394 O << '%' << X86ATTInstPrinter::getRegisterName(Reg);
395 return false;
396}
397
398/// PrintAsmOperand - Print out an operand for an inline asm expression.
399///
400bool X86AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
401 unsigned AsmVariant,
Chris Lattner3bb09762010-04-04 05:29:35 +0000402 const char *ExtraCode, raw_ostream &O) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000403 // Does this asm operand have a single letter operand modifier?
404 if (ExtraCode && ExtraCode[0]) {
405 if (ExtraCode[1] != 0) return true; // Unknown modifier.
406
407 const MachineOperand &MO = MI->getOperand(OpNo);
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000408
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000409 switch (ExtraCode[0]) {
Jack Carter5e69cff2012-06-26 13:49:27 +0000410 default:
411 // See if this is a generic print operand
412 return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000413 case 'a': // This is an address. Currently only 'i' and 'r' are expected.
Rafael Espindola52434f92013-11-27 18:26:51 +0000414 switch (MO.getType()) {
415 default:
416 return true;
417 case MachineOperand::MO_Immediate:
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000418 O << MO.getImm();
419 return false;
Rafael Espindola52434f92013-11-27 18:26:51 +0000420 case MachineOperand::MO_ConstantPoolIndex:
421 case MachineOperand::MO_JumpTableIndex:
422 case MachineOperand::MO_ExternalSymbol:
Rafael Espindola3dc549d2013-11-27 18:38:14 +0000423 llvm_unreachable("unexpected operand type!");
424 case MachineOperand::MO_GlobalAddress:
Rafael Espindola7caa1352013-11-27 07:14:26 +0000425 printSymbolOperand(*this, MO, O);
Dale Johannesence656632010-07-06 23:27:00 +0000426 if (Subtarget->isPICStyleRIPRel())
427 O << "(%rip)";
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000428 return false;
Rafael Espindola52434f92013-11-27 18:26:51 +0000429 case MachineOperand::MO_Register:
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000430 O << '(';
Rafael Espindola7caa1352013-11-27 07:14:26 +0000431 printOperand(*this, MI, OpNo, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000432 O << ')';
433 return false;
434 }
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000435
436 case 'c': // Don't print "$" before a global var name or constant.
Rafael Espindola52434f92013-11-27 18:26:51 +0000437 switch (MO.getType()) {
438 default:
Rafael Espindola7caa1352013-11-27 07:14:26 +0000439 printOperand(*this, MI, OpNo, O);
Rafael Espindola52434f92013-11-27 18:26:51 +0000440 break;
441 case MachineOperand::MO_Immediate:
442 O << MO.getImm();
443 break;
Rafael Espindola52434f92013-11-27 18:26:51 +0000444 case MachineOperand::MO_ConstantPoolIndex:
445 case MachineOperand::MO_JumpTableIndex:
446 case MachineOperand::MO_ExternalSymbol:
Rafael Espindola3dc549d2013-11-27 18:38:14 +0000447 llvm_unreachable("unexpected operand type!");
448 case MachineOperand::MO_GlobalAddress:
Rafael Espindola52434f92013-11-27 18:26:51 +0000449 printSymbolOperand(*this, MO, O);
450 break;
451 }
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000452 return false;
453
454 case 'A': // Print '*' before a register (it must be a register)
455 if (MO.isReg()) {
456 O << '*';
Rafael Espindola7caa1352013-11-27 07:14:26 +0000457 printOperand(*this, MI, OpNo, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000458 return false;
459 }
460 return true;
461
462 case 'b': // Print QImode register
463 case 'h': // Print QImode high register
464 case 'w': // Print HImode register
465 case 'k': // Print SImode register
466 case 'q': // Print DImode register
467 if (MO.isReg())
Rafael Espindolae3701472013-11-27 07:34:09 +0000468 return printAsmMRegister(*this, MO, ExtraCode[0], O);
Rafael Espindola7caa1352013-11-27 07:14:26 +0000469 printOperand(*this, MI, OpNo, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000470 return false;
471
472 case 'P': // This is the operand of a call, treat specially.
Rafael Espindola7caa1352013-11-27 07:14:26 +0000473 printPCRelImm(*this, MI, OpNo, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000474 return false;
475
476 case 'n': // Negate the immediate or print a '-' before the operand.
477 // Note: this is a temporary solution. It should be handled target
478 // independently as part of the 'MC' work.
479 if (MO.isImm()) {
480 O << -MO.getImm();
481 return false;
482 }
483 O << '-';
484 }
485 }
486
Craig Topper062a2ba2014-04-25 05:30:21 +0000487 printOperand(*this, MI, OpNo, O, /*Modifier*/ nullptr, AsmVariant);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000488 return false;
489}
490
491bool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
492 unsigned OpNo, unsigned AsmVariant,
Chris Lattner3bb09762010-04-04 05:29:35 +0000493 const char *ExtraCode,
494 raw_ostream &O) {
Chad Rosier271623f2012-10-03 22:06:44 +0000495 if (AsmVariant) {
Rafael Espindolae3701472013-11-27 07:34:09 +0000496 printIntelMemReference(*this, MI, OpNo, O);
Chad Rosier271623f2012-10-03 22:06:44 +0000497 return false;
498 }
499
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000500 if (ExtraCode && ExtraCode[0]) {
501 if (ExtraCode[1] != 0) return true; // Unknown modifier.
502
503 switch (ExtraCode[0]) {
504 default: return true; // Unknown modifier.
505 case 'b': // Print QImode register
506 case 'h': // Print QImode high register
507 case 'w': // Print HImode register
508 case 'k': // Print SImode register
509 case 'q': // Print SImode register
510 // These only apply to registers, ignore on mem.
511 break;
Rafael Espindolad606e542011-01-01 20:58:46 +0000512 case 'H':
Rafael Espindolae3701472013-11-27 07:34:09 +0000513 printMemReference(*this, MI, OpNo, O, "H");
Rafael Espindolad606e542011-01-01 20:58:46 +0000514 return false;
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000515 case 'P': // Don't print @PLT, but do print as memory.
Rafael Espindolae3701472013-11-27 07:34:09 +0000516 printMemReference(*this, MI, OpNo, O, "no-rip");
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000517 return false;
518 }
519 }
Rafael Espindolae3701472013-11-27 07:34:09 +0000520 printMemReference(*this, MI, OpNo, O);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000521 return false;
522}
523
Chris Lattner81fe45d2010-03-13 02:10:00 +0000524void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
Daniel Sandersc81f4502015-06-16 15:44:21 +0000525 const Triple &TT = TM.getTargetTriple();
Eric Christopherd7dec662015-02-05 19:06:45 +0000526
527 if (TT.isOSBinFormatMachO())
Lang Hames9ff69c82015-04-24 19:11:51 +0000528 OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
Reid Klecknerc1e76212013-09-17 23:18:05 +0000529
Eric Christopherd7dec662015-02-05 19:06:45 +0000530 if (TT.isOSBinFormatCOFF()) {
Reid Klecknerc1e76212013-09-17 23:18:05 +0000531 // Emit an absolute @feat.00 symbol. This appears to be some kind of
532 // compiler features bitfield read by link.exe.
Eric Christopherd7dec662015-02-05 19:06:45 +0000533 if (TT.getArch() == Triple::x86) {
Jim Grosbach6f482002015-05-18 18:43:14 +0000534 MCSymbol *S = MMI->getContext().getOrCreateSymbol(StringRef("@feat.00"));
Lang Hames9ff69c82015-04-24 19:11:51 +0000535 OutStreamer->BeginCOFFSymbolDef(S);
536 OutStreamer->EmitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_STATIC);
537 OutStreamer->EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
538 OutStreamer->EndCOFFSymbolDef();
Reid Klecknerc1e76212013-09-17 23:18:05 +0000539 // According to the PE-COFF spec, the LSB of this value marks the object
540 // for "registered SEH". This means that all SEH handler entry points
541 // must be registered in .sxdata. Use of any unregistered handlers will
542 // cause the process to terminate immediately. LLVM does not know how to
543 // register any SEH handlers, so its object files should be safe.
Lang Hames9ff69c82015-04-24 19:11:51 +0000544 OutStreamer->EmitSymbolAttribute(S, MCSA_Global);
545 OutStreamer->EmitAssignment(
Jim Grosbach13760bd2015-05-30 01:25:56 +0000546 S, MCConstantExpr::create(int64_t(1), MMI->getContext()));
Reid Klecknerc1e76212013-09-17 23:18:05 +0000547 }
548 }
Michael Kuperstein23d952b2015-07-22 10:49:44 +0000549 OutStreamer->EmitSyntaxDirective();
Nirav Dave9a878c42016-04-22 13:36:11 +0000550
551 // If this is not inline asm and we're in 16-bit
552 // mode prefix assembly with .code16.
553 bool is16 = TT.getEnvironment() == Triple::CODE16;
554 if (M.getModuleInlineAsm().empty() && is16)
555 OutStreamer->EmitAssemblerFlag(MCAF_Code16);
Chris Lattner81fe45d2010-03-13 02:10:00 +0000556}
557
Tim Northover9e7782d2014-04-29 10:06:10 +0000558static void
559emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel,
560 MachineModuleInfoImpl::StubValueTy &MCSym) {
561 // L_foo$stub:
562 OutStreamer.EmitLabel(StubLabel);
563 // .indirect_symbol _foo
564 OutStreamer.EmitSymbolAttribute(MCSym.getPointer(), MCSA_IndirectSymbol);
565
566 if (MCSym.getInt())
567 // External to current translation unit.
568 OutStreamer.EmitIntValue(0, 4/*size*/);
569 else
570 // Internal to current translation unit.
571 //
572 // When we place the LSDA into the TEXT section, the type info
573 // pointers need to be indirect and pc-rel. We accomplish this by
574 // using NLPs; however, sometimes the types are local to the file.
575 // We need to fill in the value for the NLP in those cases.
576 OutStreamer.EmitValue(
Jim Grosbach13760bd2015-05-30 01:25:56 +0000577 MCSymbolRefExpr::create(MCSym.getPointer(), OutStreamer.getContext()),
Tim Northover9e7782d2014-04-29 10:06:10 +0000578 4 /*size*/);
579}
580
David Majnemer8bce66b2014-07-14 22:57:27 +0000581MCSymbol *X86AsmPrinter::GetCPISymbol(unsigned CPID) const {
582 if (Subtarget->isTargetKnownWindowsMSVC()) {
583 const MachineConstantPoolEntry &CPE =
584 MF->getConstantPool()->getConstants()[CPID];
585 if (!CPE.isMachineConstantPoolEntry()) {
Mehdi Amini5c0fa582015-07-16 06:04:17 +0000586 const DataLayout &DL = MF->getDataLayout();
587 SectionKind Kind = CPE.getSectionKind(&DL);
David Majnemer8bce66b2014-07-14 22:57:27 +0000588 const Constant *C = CPE.Val.ConstVal;
David Majnemera3ea4072016-02-21 01:30:30 +0000589 unsigned Align = CPE.Alignment;
Josh Klontzfbe17d62014-08-21 12:55:27 +0000590 if (const MCSectionCOFF *S = dyn_cast<MCSectionCOFF>(
David Majnemera3ea4072016-02-21 01:30:30 +0000591 getObjFileLowering().getSectionForConstant(DL, Kind, C, Align))) {
Josh Klontzfbe17d62014-08-21 12:55:27 +0000592 if (MCSymbol *Sym = S->getCOMDATSymbol()) {
593 if (Sym->isUndefined())
Lang Hames9ff69c82015-04-24 19:11:51 +0000594 OutStreamer->EmitSymbolAttribute(Sym, MCSA_Global);
Josh Klontzfbe17d62014-08-21 12:55:27 +0000595 return Sym;
596 }
David Majnemer8bce66b2014-07-14 22:57:27 +0000597 }
598 }
599 }
600
601 return AsmPrinter::GetCPISymbol(CPID);
602}
603
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000604void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {
Daniel Sandersc81f4502015-06-16 15:44:21 +0000605 const Triple &TT = TM.getTargetTriple();
Eric Christopherd7dec662015-02-05 19:06:45 +0000606
607 if (TT.isOSBinFormatMachO()) {
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000608 // All darwin targets use mach-o.
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000609 MachineModuleInfoMachO &MMIMacho =
Eric Christopher21895152014-12-05 00:22:38 +0000610 MMI->getObjFileInfo<MachineModuleInfoMachO>();
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000611
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000612 // Output stubs for dynamically-linked functions.
613 MachineModuleInfoMachO::SymbolListTy Stubs;
614
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000615 // Output stubs for external and common global variables.
616 Stubs = MMIMacho.GetGVStubList();
617 if (!Stubs.empty()) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000618 MCSection *TheSection = OutContext.getMachOSection(
619 "__IMPORT", "__pointers", MachO::S_NON_LAZY_SYMBOL_POINTERS,
620 SectionKind::getMetadata());
Lang Hames9ff69c82015-04-24 19:11:51 +0000621 OutStreamer->SwitchSection(TheSection);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000622
Tim Northover9e7782d2014-04-29 10:06:10 +0000623 for (auto &Stub : Stubs)
Lang Hames9ff69c82015-04-24 19:11:51 +0000624 emitNonLazySymbolPointer(*OutStreamer, Stub.first, Stub.second);
Tim Northover9e7782d2014-04-29 10:06:10 +0000625
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000626 Stubs.clear();
Lang Hames9ff69c82015-04-24 19:11:51 +0000627 OutStreamer->AddBlankLine();
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000628 }
629
Andrew Trick153ebe62013-10-31 22:11:56 +0000630 SM.serializeToStackMapSection();
Sanjoy Dasc63244d2015-06-15 18:44:08 +0000631 FM.serializeToFaultMapSection();
Andrew Trick153ebe62013-10-31 22:11:56 +0000632
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000633 // Funny Darwin hack: This flag tells the linker that no global symbols
634 // contain code that falls through to other global symbols (e.g. the obvious
635 // implementation of multiple entry points). If this doesn't occur, the
636 // linker can safely perform dead code stripping. Since LLVM never
637 // generates code that does this, it is always safe to set.
Lang Hames9ff69c82015-04-24 19:11:51 +0000638 OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
Anton Korobeynikov49e417c2009-10-15 22:36:18 +0000639 }
640
Eric Christopherd7dec662015-02-05 19:06:45 +0000641 if (TT.isKnownWindowsMSVCEnvironment() && MMI->usesVAFloatArgument()) {
642 StringRef SymbolName =
643 (TT.getArch() == Triple::x86_64) ? "_fltused" : "__fltused";
Jim Grosbach6f482002015-05-18 18:43:14 +0000644 MCSymbol *S = MMI->getContext().getOrCreateSymbol(SymbolName);
Lang Hames9ff69c82015-04-24 19:11:51 +0000645 OutStreamer->EmitSymbolAttribute(S, MCSA_Global);
Michael J. Spencer5e683252010-10-16 08:25:41 +0000646 }
647
Eric Christopherd7dec662015-02-05 19:06:45 +0000648 if (TT.isOSBinFormatCOFF()) {
Peter Collingbourneaef36592015-06-29 22:04:09 +0000649 const TargetLoweringObjectFileCOFF &TLOFCOFF =
Nico Rieck7157bb72014-01-14 15:22:47 +0000650 static_cast<const TargetLoweringObjectFileCOFF&>(getObjFileLowering());
651
Peter Collingbourneaef36592015-06-29 22:04:09 +0000652 std::string Flags;
653 raw_string_ostream FlagsOS(Flags);
Anton Korobeynikov49e417c2009-10-15 22:36:18 +0000654
Peter Collingbourneaef36592015-06-29 22:04:09 +0000655 for (const auto &Function : M)
Eric Christopher4367c7f2016-09-16 07:33:15 +0000656 TLOFCOFF.emitLinkerFlagsForGlobal(FlagsOS, &Function);
Peter Collingbourneaef36592015-06-29 22:04:09 +0000657 for (const auto &Global : M.globals())
Eric Christopher4367c7f2016-09-16 07:33:15 +0000658 TLOFCOFF.emitLinkerFlagsForGlobal(FlagsOS, &Global);
Peter Collingbourneaef36592015-06-29 22:04:09 +0000659 for (const auto &Alias : M.aliases())
Eric Christopher4367c7f2016-09-16 07:33:15 +0000660 TLOFCOFF.emitLinkerFlagsForGlobal(FlagsOS, &Alias);
Peter Collingbourneaef36592015-06-29 22:04:09 +0000661
662 FlagsOS.flush();
663
664 // Output collected flags.
665 if (!Flags.empty()) {
666 OutStreamer->SwitchSection(TLOFCOFF.getDrectveSection());
667 OutStreamer->EmitBytes(Flags);
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000668 }
Swaroop Sridhare9247ab2015-06-25 00:28:42 +0000669
670 SM.serializeToStackMapSection();
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000671 }
Anton Korobeynikovae4ccc12010-02-15 22:35:59 +0000672
Sanjoy Dasc63244d2015-06-15 18:44:08 +0000673 if (TT.isOSBinFormatELF()) {
Philip Reames76846182014-08-01 18:47:09 +0000674 SM.serializeToStackMapSection();
Sanjoy Dasc63244d2015-06-15 18:44:08 +0000675 FM.serializeToFaultMapSection();
676 }
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000677}
678
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000679//===----------------------------------------------------------------------===//
680// Target Registry Stuff
681//===----------------------------------------------------------------------===//
682
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000683// Force static initialization.
Jim Grosbach95ede4d2010-09-15 01:01:45 +0000684extern "C" void LLVMInitializeX86AsmPrinter() {
Mehdi Aminif42454b2016-10-09 23:00:34 +0000685 RegisterAsmPrinter<X86AsmPrinter> X(getTheX86_32Target());
686 RegisterAsmPrinter<X86AsmPrinter> Y(getTheX86_64Target());
Chris Lattner5159bbaf2009-09-20 07:41:30 +0000687}