[ARM] Add Virtualization subtarget feature and more build attributes in this area
[oota-llvm.git] / lib / Target / ARM / ARMAsmPrinter.cpp
1 //===-- ARMAsmPrinter.cpp - Print machine code to an ARM .s file ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains a printer that converts from our internal representation
11 // of machine-dependent LLVM code to GAS-format ARM assembly language.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #define DEBUG_TYPE "asm-printer"
16 #include "ARMAsmPrinter.h"
17 #include "ARM.h"
18 #include "ARMBuildAttrs.h"
19 #include "ARMConstantPoolValue.h"
20 #include "ARMFPUName.h"
21 #include "ARMMachineFunctionInfo.h"
22 #include "ARMTargetMachine.h"
23 #include "ARMTargetObjectFile.h"
24 #include "InstPrinter/ARMInstPrinter.h"
25 #include "MCTargetDesc/ARMAddressingModes.h"
26 #include "MCTargetDesc/ARMMCExpr.h"
27 #include "llvm/ADT/SetVector.h"
28 #include "llvm/ADT/SmallString.h"
29 #include "llvm/Assembly/Writer.h"
30 #include "llvm/CodeGen/MachineFunctionPass.h"
31 #include "llvm/CodeGen/MachineJumpTableInfo.h"
32 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
33 #include "llvm/DebugInfo.h"
34 #include "llvm/IR/Constants.h"
35 #include "llvm/IR/DataLayout.h"
36 #include "llvm/IR/Module.h"
37 #include "llvm/IR/Type.h"
38 #include "llvm/MC/MCAsmInfo.h"
39 #include "llvm/MC/MCAssembler.h"
40 #include "llvm/MC/MCContext.h"
41 #include "llvm/MC/MCELFStreamer.h"
42 #include "llvm/MC/MCInst.h"
43 #include "llvm/MC/MCInstBuilder.h"
44 #include "llvm/MC/MCObjectStreamer.h"
45 #include "llvm/MC/MCSectionMachO.h"
46 #include "llvm/MC/MCStreamer.h"
47 #include "llvm/MC/MCSymbol.h"
48 #include "llvm/Support/CommandLine.h"
49 #include "llvm/Support/Debug.h"
50 #include "llvm/Support/ELF.h"
51 #include "llvm/Support/ErrorHandling.h"
52 #include "llvm/Support/TargetRegistry.h"
53 #include "llvm/Support/raw_ostream.h"
54 #include "llvm/Target/Mangler.h"
55 #include "llvm/Target/TargetMachine.h"
56 #include <cctype>
57 using namespace llvm;
58
59 /// EmitDwarfRegOp - Emit dwarf register operation.
60 void ARMAsmPrinter::EmitDwarfRegOp(const MachineLocation &MLoc,
61                                    bool Indirect) const {
62   const TargetRegisterInfo *RI = TM.getRegisterInfo();
63   if (RI->getDwarfRegNum(MLoc.getReg(), false) != -1) {
64     AsmPrinter::EmitDwarfRegOp(MLoc, Indirect);
65     return;
66   }
67   assert(MLoc.isReg() && !Indirect &&
68          "This doesn't support offset/indirection - implement it if needed");
69   unsigned Reg = MLoc.getReg();
70   if (Reg >= ARM::S0 && Reg <= ARM::S31) {
71     assert(ARM::S0 + 31 == ARM::S31 && "Unexpected ARM S register numbering");
72     // S registers are described as bit-pieces of a register
73     // S[2x] = DW_OP_regx(256 + (x>>1)) DW_OP_bit_piece(32, 0)
74     // S[2x+1] = DW_OP_regx(256 + (x>>1)) DW_OP_bit_piece(32, 32)
75
76     unsigned SReg = Reg - ARM::S0;
77     bool odd = SReg & 0x1;
78     unsigned Rx = 256 + (SReg >> 1);
79
80     OutStreamer.AddComment("DW_OP_regx for S register");
81     EmitInt8(dwarf::DW_OP_regx);
82
83     OutStreamer.AddComment(Twine(SReg));
84     EmitULEB128(Rx);
85
86     if (odd) {
87       OutStreamer.AddComment("DW_OP_bit_piece 32 32");
88       EmitInt8(dwarf::DW_OP_bit_piece);
89       EmitULEB128(32);
90       EmitULEB128(32);
91     } else {
92       OutStreamer.AddComment("DW_OP_bit_piece 32 0");
93       EmitInt8(dwarf::DW_OP_bit_piece);
94       EmitULEB128(32);
95       EmitULEB128(0);
96     }
97   } else if (Reg >= ARM::Q0 && Reg <= ARM::Q15) {
98     assert(ARM::Q0 + 15 == ARM::Q15 && "Unexpected ARM Q register numbering");
99     // Q registers Q0-Q15 are described by composing two D registers together.
100     // Qx = DW_OP_regx(256+2x) DW_OP_piece(8) DW_OP_regx(256+2x+1)
101     // DW_OP_piece(8)
102
103     unsigned QReg = Reg - ARM::Q0;
104     unsigned D1 = 256 + 2 * QReg;
105     unsigned D2 = D1 + 1;
106
107     OutStreamer.AddComment("DW_OP_regx for Q register: D1");
108     EmitInt8(dwarf::DW_OP_regx);
109     EmitULEB128(D1);
110     OutStreamer.AddComment("DW_OP_piece 8");
111     EmitInt8(dwarf::DW_OP_piece);
112     EmitULEB128(8);
113
114     OutStreamer.AddComment("DW_OP_regx for Q register: D2");
115     EmitInt8(dwarf::DW_OP_regx);
116     EmitULEB128(D2);
117     OutStreamer.AddComment("DW_OP_piece 8");
118     EmitInt8(dwarf::DW_OP_piece);
119     EmitULEB128(8);
120   }
121 }
122
123 void ARMAsmPrinter::EmitFunctionBodyEnd() {
124   // Make sure to terminate any constant pools that were at the end
125   // of the function.
126   if (!InConstantPool)
127     return;
128   InConstantPool = false;
129   OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
130 }
131
132 void ARMAsmPrinter::EmitFunctionEntryLabel() {
133   if (AFI->isThumbFunction()) {
134     OutStreamer.EmitAssemblerFlag(MCAF_Code16);
135     OutStreamer.EmitThumbFunc(CurrentFnSym);
136   }
137
138   OutStreamer.EmitLabel(CurrentFnSym);
139 }
140
141 void ARMAsmPrinter::EmitXXStructor(const Constant *CV) {
142   uint64_t Size = TM.getDataLayout()->getTypeAllocSize(CV->getType());
143   assert(Size && "C++ constructor pointer had zero size!");
144
145   const GlobalValue *GV = dyn_cast<GlobalValue>(CV->stripPointerCasts());
146   assert(GV && "C++ constructor pointer was not a GlobalValue!");
147
148   const MCExpr *E = MCSymbolRefExpr::Create(getSymbol(GV),
149                                             (Subtarget->isTargetDarwin()
150                                              ? MCSymbolRefExpr::VK_None
151                                              : MCSymbolRefExpr::VK_ARM_TARGET1),
152                                             OutContext);
153   
154   OutStreamer.EmitValue(E, Size);
155 }
156
157 /// runOnMachineFunction - This uses the EmitInstruction()
158 /// method to print assembly for each instruction.
159 ///
160 bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
161   AFI = MF.getInfo<ARMFunctionInfo>();
162   MCP = MF.getConstantPool();
163
164   return AsmPrinter::runOnMachineFunction(MF);
165 }
166
167 void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
168                                  raw_ostream &O, const char *Modifier) {
169   const MachineOperand &MO = MI->getOperand(OpNum);
170   unsigned TF = MO.getTargetFlags();
171
172   switch (MO.getType()) {
173   default: llvm_unreachable("<unknown operand type>");
174   case MachineOperand::MO_Register: {
175     unsigned Reg = MO.getReg();
176     assert(TargetRegisterInfo::isPhysicalRegister(Reg));
177     assert(!MO.getSubReg() && "Subregs should be eliminated!");
178     if(ARM::GPRPairRegClass.contains(Reg)) {
179       const MachineFunction &MF = *MI->getParent()->getParent();
180       const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
181       Reg = TRI->getSubReg(Reg, ARM::gsub_0);
182     }
183     O << ARMInstPrinter::getRegisterName(Reg);
184     break;
185   }
186   case MachineOperand::MO_Immediate: {
187     int64_t Imm = MO.getImm();
188     O << '#';
189     if ((Modifier && strcmp(Modifier, "lo16") == 0) ||
190         (TF == ARMII::MO_LO16))
191       O << ":lower16:";
192     else if ((Modifier && strcmp(Modifier, "hi16") == 0) ||
193              (TF == ARMII::MO_HI16))
194       O << ":upper16:";
195     O << Imm;
196     break;
197   }
198   case MachineOperand::MO_MachineBasicBlock:
199     O << *MO.getMBB()->getSymbol();
200     return;
201   case MachineOperand::MO_GlobalAddress: {
202     const GlobalValue *GV = MO.getGlobal();
203     if ((Modifier && strcmp(Modifier, "lo16") == 0) ||
204         (TF & ARMII::MO_LO16))
205       O << ":lower16:";
206     else if ((Modifier && strcmp(Modifier, "hi16") == 0) ||
207              (TF & ARMII::MO_HI16))
208       O << ":upper16:";
209     O << *getSymbol(GV);
210
211     printOffset(MO.getOffset(), O);
212     if (TF == ARMII::MO_PLT)
213       O << "(PLT)";
214     break;
215   }
216   case MachineOperand::MO_ExternalSymbol: {
217     O << *GetExternalSymbolSymbol(MO.getSymbolName());
218     if (TF == ARMII::MO_PLT)
219       O << "(PLT)";
220     break;
221   }
222   case MachineOperand::MO_ConstantPoolIndex:
223     O << *GetCPISymbol(MO.getIndex());
224     break;
225   case MachineOperand::MO_JumpTableIndex:
226     O << *GetJTISymbol(MO.getIndex());
227     break;
228   }
229 }
230
231 //===--------------------------------------------------------------------===//
232
233 MCSymbol *ARMAsmPrinter::
234 GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const {
235   SmallString<60> Name;
236   raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "JTI"
237     << getFunctionNumber() << '_' << uid << '_' << uid2;
238   return OutContext.GetOrCreateSymbol(Name.str());
239 }
240
241
242 MCSymbol *ARMAsmPrinter::GetARMSJLJEHLabel() const {
243   SmallString<60> Name;
244   raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "SJLJEH"
245     << getFunctionNumber();
246   return OutContext.GetOrCreateSymbol(Name.str());
247 }
248
249 bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
250                                     unsigned AsmVariant, const char *ExtraCode,
251                                     raw_ostream &O) {
252   // Does this asm operand have a single letter operand modifier?
253   if (ExtraCode && ExtraCode[0]) {
254     if (ExtraCode[1] != 0) return true; // Unknown modifier.
255
256     switch (ExtraCode[0]) {
257     default:
258       // See if this is a generic print operand
259       return AsmPrinter::PrintAsmOperand(MI, OpNum, AsmVariant, ExtraCode, O);
260     case 'a': // Print as a memory address.
261       if (MI->getOperand(OpNum).isReg()) {
262         O << "["
263           << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg())
264           << "]";
265         return false;
266       }
267       // Fallthrough
268     case 'c': // Don't print "#" before an immediate operand.
269       if (!MI->getOperand(OpNum).isImm())
270         return true;
271       O << MI->getOperand(OpNum).getImm();
272       return false;
273     case 'P': // Print a VFP double precision register.
274     case 'q': // Print a NEON quad precision register.
275       printOperand(MI, OpNum, O);
276       return false;
277     case 'y': // Print a VFP single precision register as indexed double.
278       if (MI->getOperand(OpNum).isReg()) {
279         unsigned Reg = MI->getOperand(OpNum).getReg();
280         const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo();
281         // Find the 'd' register that has this 's' register as a sub-register,
282         // and determine the lane number.
283         for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR) {
284           if (!ARM::DPRRegClass.contains(*SR))
285             continue;
286           bool Lane0 = TRI->getSubReg(*SR, ARM::ssub_0) == Reg;
287           O << ARMInstPrinter::getRegisterName(*SR) << (Lane0 ? "[0]" : "[1]");
288           return false;
289         }
290       }
291       return true;
292     case 'B': // Bitwise inverse of integer or symbol without a preceding #.
293       if (!MI->getOperand(OpNum).isImm())
294         return true;
295       O << ~(MI->getOperand(OpNum).getImm());
296       return false;
297     case 'L': // The low 16 bits of an immediate constant.
298       if (!MI->getOperand(OpNum).isImm())
299         return true;
300       O << (MI->getOperand(OpNum).getImm() & 0xffff);
301       return false;
302     case 'M': { // A register range suitable for LDM/STM.
303       if (!MI->getOperand(OpNum).isReg())
304         return true;
305       const MachineOperand &MO = MI->getOperand(OpNum);
306       unsigned RegBegin = MO.getReg();
307       // This takes advantage of the 2 operand-ness of ldm/stm and that we've
308       // already got the operands in registers that are operands to the
309       // inline asm statement.
310       O << "{";
311       if (ARM::GPRPairRegClass.contains(RegBegin)) {
312         const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo();
313         unsigned Reg0 = TRI->getSubReg(RegBegin, ARM::gsub_0);
314         O << ARMInstPrinter::getRegisterName(Reg0) << ", ";;
315         RegBegin = TRI->getSubReg(RegBegin, ARM::gsub_1);
316       }
317       O << ARMInstPrinter::getRegisterName(RegBegin);
318
319       // FIXME: The register allocator not only may not have given us the
320       // registers in sequence, but may not be in ascending registers. This
321       // will require changes in the register allocator that'll need to be
322       // propagated down here if the operands change.
323       unsigned RegOps = OpNum + 1;
324       while (MI->getOperand(RegOps).isReg()) {
325         O << ", "
326           << ARMInstPrinter::getRegisterName(MI->getOperand(RegOps).getReg());
327         RegOps++;
328       }
329
330       O << "}";
331
332       return false;
333     }
334     case 'R': // The most significant register of a pair.
335     case 'Q': { // The least significant register of a pair.
336       if (OpNum == 0)
337         return true;
338       const MachineOperand &FlagsOP = MI->getOperand(OpNum - 1);
339       if (!FlagsOP.isImm())
340         return true;
341       unsigned Flags = FlagsOP.getImm();
342
343       // This operand may not be the one that actually provides the register. If
344       // it's tied to a previous one then we should refer instead to that one
345       // for registers and their classes.
346       unsigned TiedIdx;
347       if (InlineAsm::isUseOperandTiedToDef(Flags, TiedIdx)) {
348         for (OpNum = InlineAsm::MIOp_FirstOperand; TiedIdx; --TiedIdx) {
349           unsigned OpFlags = MI->getOperand(OpNum).getImm();
350           OpNum += InlineAsm::getNumOperandRegisters(OpFlags) + 1;
351         }
352         Flags = MI->getOperand(OpNum).getImm();
353
354         // Later code expects OpNum to be pointing at the register rather than
355         // the flags.
356         OpNum += 1;
357       }
358
359       unsigned NumVals = InlineAsm::getNumOperandRegisters(Flags);
360       unsigned RC;
361       InlineAsm::hasRegClassConstraint(Flags, RC);
362       if (RC == ARM::GPRPairRegClassID) {
363         if (NumVals != 1)
364           return true;
365         const MachineOperand &MO = MI->getOperand(OpNum);
366         if (!MO.isReg())
367           return true;
368         const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo();
369         unsigned Reg = TRI->getSubReg(MO.getReg(), ExtraCode[0] == 'Q' ?
370             ARM::gsub_0 : ARM::gsub_1);
371         O << ARMInstPrinter::getRegisterName(Reg);
372         return false;
373       }
374       if (NumVals != 2)
375         return true;
376       unsigned RegOp = ExtraCode[0] == 'Q' ? OpNum : OpNum + 1;
377       if (RegOp >= MI->getNumOperands())
378         return true;
379       const MachineOperand &MO = MI->getOperand(RegOp);
380       if (!MO.isReg())
381         return true;
382       unsigned Reg = MO.getReg();
383       O << ARMInstPrinter::getRegisterName(Reg);
384       return false;
385     }
386
387     case 'e': // The low doubleword register of a NEON quad register.
388     case 'f': { // The high doubleword register of a NEON quad register.
389       if (!MI->getOperand(OpNum).isReg())
390         return true;
391       unsigned Reg = MI->getOperand(OpNum).getReg();
392       if (!ARM::QPRRegClass.contains(Reg))
393         return true;
394       const TargetRegisterInfo *TRI = MF->getTarget().getRegisterInfo();
395       unsigned SubReg = TRI->getSubReg(Reg, ExtraCode[0] == 'e' ?
396                                        ARM::dsub_0 : ARM::dsub_1);
397       O << ARMInstPrinter::getRegisterName(SubReg);
398       return false;
399     }
400
401     // This modifier is not yet supported.
402     case 'h': // A range of VFP/NEON registers suitable for VLD1/VST1.
403       return true;
404     case 'H': { // The highest-numbered register of a pair.
405       const MachineOperand &MO = MI->getOperand(OpNum);
406       if (!MO.isReg())
407         return true;
408       const MachineFunction &MF = *MI->getParent()->getParent();
409       const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
410       unsigned Reg = MO.getReg();
411       if(!ARM::GPRPairRegClass.contains(Reg))
412         return false;
413       Reg = TRI->getSubReg(Reg, ARM::gsub_1);
414       O << ARMInstPrinter::getRegisterName(Reg);
415       return false;
416     }
417     }
418   }
419
420   printOperand(MI, OpNum, O);
421   return false;
422 }
423
424 bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
425                                           unsigned OpNum, unsigned AsmVariant,
426                                           const char *ExtraCode,
427                                           raw_ostream &O) {
428   // Does this asm operand have a single letter operand modifier?
429   if (ExtraCode && ExtraCode[0]) {
430     if (ExtraCode[1] != 0) return true; // Unknown modifier.
431
432     switch (ExtraCode[0]) {
433       case 'A': // A memory operand for a VLD1/VST1 instruction.
434       default: return true;  // Unknown modifier.
435       case 'm': // The base register of a memory operand.
436         if (!MI->getOperand(OpNum).isReg())
437           return true;
438         O << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg());
439         return false;
440     }
441   }
442
443   const MachineOperand &MO = MI->getOperand(OpNum);
444   assert(MO.isReg() && "unexpected inline asm memory operand");
445   O << "[" << ARMInstPrinter::getRegisterName(MO.getReg()) << "]";
446   return false;
447 }
448
449 void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
450   if (Subtarget->isTargetDarwin()) {
451     Reloc::Model RelocM = TM.getRelocationModel();
452     if (RelocM == Reloc::PIC_ || RelocM == Reloc::DynamicNoPIC) {
453       // Declare all the text sections up front (before the DWARF sections
454       // emitted by AsmPrinter::doInitialization) so the assembler will keep
455       // them together at the beginning of the object file.  This helps
456       // avoid out-of-range branches that are due a fundamental limitation of
457       // the way symbol offsets are encoded with the current Darwin ARM
458       // relocations.
459       const TargetLoweringObjectFileMachO &TLOFMacho =
460         static_cast<const TargetLoweringObjectFileMachO &>(
461           getObjFileLowering());
462
463       // Collect the set of sections our functions will go into.
464       SetVector<const MCSection *, SmallVector<const MCSection *, 8>,
465         SmallPtrSet<const MCSection *, 8> > TextSections;
466       // Default text section comes first.
467       TextSections.insert(TLOFMacho.getTextSection());
468       // Now any user defined text sections from function attributes.
469       for (Module::iterator F = M.begin(), e = M.end(); F != e; ++F)
470         if (!F->isDeclaration() && !F->hasAvailableExternallyLinkage())
471           TextSections.insert(TLOFMacho.SectionForGlobal(F, Mang, TM));
472       // Now the coalescable sections.
473       TextSections.insert(TLOFMacho.getTextCoalSection());
474       TextSections.insert(TLOFMacho.getConstTextCoalSection());
475
476       // Emit the sections in the .s file header to fix the order.
477       for (unsigned i = 0, e = TextSections.size(); i != e; ++i)
478         OutStreamer.SwitchSection(TextSections[i]);
479
480       if (RelocM == Reloc::DynamicNoPIC) {
481         const MCSection *sect =
482           OutContext.getMachOSection("__TEXT", "__symbol_stub4",
483                                      MCSectionMachO::S_SYMBOL_STUBS,
484                                      12, SectionKind::getText());
485         OutStreamer.SwitchSection(sect);
486       } else {
487         const MCSection *sect =
488           OutContext.getMachOSection("__TEXT", "__picsymbolstub4",
489                                      MCSectionMachO::S_SYMBOL_STUBS,
490                                      16, SectionKind::getText());
491         OutStreamer.SwitchSection(sect);
492       }
493       const MCSection *StaticInitSect =
494         OutContext.getMachOSection("__TEXT", "__StaticInit",
495                                    MCSectionMachO::S_REGULAR |
496                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
497                                    SectionKind::getText());
498       OutStreamer.SwitchSection(StaticInitSect);
499     }
500   }
501
502   // Use unified assembler syntax.
503   OutStreamer.EmitAssemblerFlag(MCAF_SyntaxUnified);
504
505   // Emit ARM Build Attributes
506   if (Subtarget->isTargetELF())
507     emitAttributes();
508 }
509
510
511 void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
512   if (Subtarget->isTargetDarwin()) {
513     // All darwin targets use mach-o.
514     const TargetLoweringObjectFileMachO &TLOFMacho =
515       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
516     MachineModuleInfoMachO &MMIMacho =
517       MMI->getObjFileInfo<MachineModuleInfoMachO>();
518
519     // Output non-lazy-pointers for external and common global variables.
520     MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList();
521
522     if (!Stubs.empty()) {
523       // Switch with ".non_lazy_symbol_pointer" directive.
524       OutStreamer.SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
525       EmitAlignment(2);
526       for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
527         // L_foo$stub:
528         OutStreamer.EmitLabel(Stubs[i].first);
529         //   .indirect_symbol _foo
530         MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second;
531         OutStreamer.EmitSymbolAttribute(MCSym.getPointer(),MCSA_IndirectSymbol);
532
533         if (MCSym.getInt())
534           // External to current translation unit.
535           OutStreamer.EmitIntValue(0, 4/*size*/);
536         else
537           // Internal to current translation unit.
538           //
539           // When we place the LSDA into the TEXT section, the type info
540           // pointers need to be indirect and pc-rel. We accomplish this by
541           // using NLPs; however, sometimes the types are local to the file.
542           // We need to fill in the value for the NLP in those cases.
543           OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(),
544                                                         OutContext),
545                                 4/*size*/);
546       }
547
548       Stubs.clear();
549       OutStreamer.AddBlankLine();
550     }
551
552     Stubs = MMIMacho.GetHiddenGVStubList();
553     if (!Stubs.empty()) {
554       OutStreamer.SwitchSection(getObjFileLowering().getDataSection());
555       EmitAlignment(2);
556       for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
557         // L_foo$stub:
558         OutStreamer.EmitLabel(Stubs[i].first);
559         //   .long _foo
560         OutStreamer.EmitValue(MCSymbolRefExpr::
561                               Create(Stubs[i].second.getPointer(),
562                                      OutContext),
563                               4/*size*/);
564       }
565
566       Stubs.clear();
567       OutStreamer.AddBlankLine();
568     }
569
570     // Funny Darwin hack: This flag tells the linker that no global symbols
571     // contain code that falls through to other global symbols (e.g. the obvious
572     // implementation of multiple entry points).  If this doesn't occur, the
573     // linker can safely perform dead code stripping.  Since LLVM never
574     // generates code that does this, it is always safe to set.
575     OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
576   }
577 }
578
579 //===----------------------------------------------------------------------===//
580 // Helper routines for EmitStartOfAsmFile() and EmitEndOfAsmFile()
581 // FIXME:
582 // The following seem like one-off assembler flags, but they actually need
583 // to appear in the .ARM.attributes section in ELF.
584 // Instead of subclassing the MCELFStreamer, we do the work here.
585
586 static ARMBuildAttrs::CPUArch getArchForCPU(StringRef CPU,
587                                             const ARMSubtarget *Subtarget) {
588   if (CPU == "xscale")
589     return ARMBuildAttrs::v5TEJ;
590
591   if (Subtarget->hasV8Ops())
592     return ARMBuildAttrs::v8;
593   else if (Subtarget->hasV7Ops()) {
594     if (Subtarget->isMClass() && Subtarget->hasThumb2DSP())
595       return ARMBuildAttrs::v7E_M;
596     return ARMBuildAttrs::v7;
597   } else if (Subtarget->hasV6T2Ops())
598     return ARMBuildAttrs::v6T2;
599   else if (Subtarget->hasV6MOps())
600     return ARMBuildAttrs::v6S_M;
601   else if (Subtarget->hasV6Ops())
602     return ARMBuildAttrs::v6;
603   else if (Subtarget->hasV5TEOps())
604     return ARMBuildAttrs::v5TE;
605   else if (Subtarget->hasV5TOps())
606     return ARMBuildAttrs::v5T;
607   else if (Subtarget->hasV4TOps())
608     return ARMBuildAttrs::v4T;
609   else
610     return ARMBuildAttrs::v4;
611 }
612
613 void ARMAsmPrinter::emitAttributes() {
614   MCTargetStreamer &TS = OutStreamer.getTargetStreamer();
615   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
616
617   ATS.switchVendor("aeabi");
618
619   std::string CPUString = Subtarget->getCPUString();
620
621   if (CPUString != "generic")
622     ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, CPUString);
623
624   ATS.emitAttribute(ARMBuildAttrs::CPU_arch,
625                     getArchForCPU(CPUString, Subtarget));
626
627   if (Subtarget->isAClass()) {
628     ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
629                       ARMBuildAttrs::ApplicationProfile);
630   } else if (Subtarget->isRClass()) {
631     ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
632                       ARMBuildAttrs::RealTimeProfile);
633   } else if (Subtarget->isMClass()){
634     ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
635                       ARMBuildAttrs::MicroControllerProfile);
636   }
637
638   ATS.emitAttribute(ARMBuildAttrs::ARM_ISA_use, Subtarget->hasARMOps() ?
639                       ARMBuildAttrs::Allowed : ARMBuildAttrs::Not_Allowed);
640   if (Subtarget->isThumb1Only()) {
641     ATS.emitAttribute(ARMBuildAttrs::THUMB_ISA_use,
642                       ARMBuildAttrs::Allowed);
643   } else if (Subtarget->hasThumb2()) {
644     ATS.emitAttribute(ARMBuildAttrs::THUMB_ISA_use,
645                       ARMBuildAttrs::AllowThumb32);
646   }
647
648   if (Subtarget->hasNEON()) {
649     /* NEON is not exactly a VFP architecture, but GAS emit one of
650      * neon/neon-fp-armv8/neon-vfpv4/vfpv3/vfpv2 for .fpu parameters */
651     if (Subtarget->hasFPARMv8()) {
652       if (Subtarget->hasCrypto())
653         ATS.emitFPU(ARM::CRYPTO_NEON_FP_ARMV8);
654       else
655         ATS.emitFPU(ARM::NEON_FP_ARMV8);
656     }
657     else if (Subtarget->hasVFP4())
658       ATS.emitFPU(ARM::NEON_VFPV4);
659     else
660       ATS.emitFPU(ARM::NEON);
661     // Emit Tag_Advanced_SIMD_arch for ARMv8 architecture
662     if (Subtarget->hasV8Ops())
663       ATS.emitAttribute(ARMBuildAttrs::Advanced_SIMD_arch,
664                         ARMBuildAttrs::AllowNeonARMv8);
665   } else {
666     if (Subtarget->hasFPARMv8())
667       ATS.emitFPU(ARM::FP_ARMV8);
668     else if (Subtarget->hasVFP4())
669       ATS.emitFPU(Subtarget->hasD16() ? ARM::VFPV4_D16 : ARM::VFPV4);
670     else if (Subtarget->hasVFP3())
671       ATS.emitFPU(Subtarget->hasD16() ? ARM::VFPV3_D16 : ARM::VFPV3);
672     else if (Subtarget->hasVFP2())
673       ATS.emitFPU(ARM::VFPV2);
674   }
675
676   // Signal various FP modes.
677   if (!TM.Options.UnsafeFPMath) {
678     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, ARMBuildAttrs::Allowed);
679     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions,
680                       ARMBuildAttrs::Allowed);
681   }
682
683   if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath)
684     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model,
685                       ARMBuildAttrs::Allowed);
686   else
687     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model,
688                       ARMBuildAttrs::AllowIEE754);
689
690   // FIXME: add more flags to ARMBuildAttrs.h
691   // 8-bytes alignment stuff.
692   ATS.emitAttribute(ARMBuildAttrs::ABI_align8_needed, 1);
693   ATS.emitAttribute(ARMBuildAttrs::ABI_align8_preserved, 1);
694
695   // ABI_HardFP_use attribute to indicate single precision FP.
696   if (Subtarget->isFPOnlySP())
697     ATS.emitAttribute(ARMBuildAttrs::ABI_HardFP_use,
698                       ARMBuildAttrs::HardFPSinglePrecision);
699
700   // Hard float.  Use both S and D registers and conform to AAPCS-VFP.
701   if (Subtarget->isAAPCS_ABI() && TM.Options.FloatABIType == FloatABI::Hard)
702     ATS.emitAttribute(ARMBuildAttrs::ABI_VFP_args, ARMBuildAttrs::HardFPAAPCS);
703
704   // FIXME: Should we signal R9 usage?
705
706   if (Subtarget->hasMPExtension())
707       ATS.emitAttribute(ARMBuildAttrs::MPextension_use, ARMBuildAttrs::AllowMP);
708
709   if (Subtarget->hasDivide()) {
710     // Check if hardware divide is only available in thumb2 or ARM as well.
711     ATS.emitAttribute(ARMBuildAttrs::DIV_use,
712       Subtarget->hasDivideInARMMode() ? ARMBuildAttrs::AllowDIVExt :
713                                         ARMBuildAttrs::AllowDIVIfExists);
714   }
715
716   if (Subtarget->hasTrustZone() && Subtarget->hasVirtualization())
717       ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
718                         ARMBuildAttrs::AllowTZVirtualization);
719   else if (Subtarget->hasTrustZone())
720       ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
721                         ARMBuildAttrs::AllowTZ);
722   else if (Subtarget->hasVirtualization())
723       ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
724                         ARMBuildAttrs::AllowVirtualization);
725
726   ATS.finishAttributeSection();
727 }
728
729 void ARMAsmPrinter::emitARMAttributeSection() {
730   // <format-version>
731   // [ <section-length> "vendor-name"
732   // [ <file-tag> <size> <attribute>*
733   //   | <section-tag> <size> <section-number>* 0 <attribute>*
734   //   | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
735   //   ]+
736   // ]*
737
738   if (OutStreamer.hasRawTextSupport())
739     return;
740
741   const ARMElfTargetObjectFile &TLOFELF =
742     static_cast<const ARMElfTargetObjectFile &>
743     (getObjFileLowering());
744
745   OutStreamer.SwitchSection(TLOFELF.getAttributesSection());
746
747   // Format version
748   OutStreamer.EmitIntValue(0x41, 1);
749 }
750
751 //===----------------------------------------------------------------------===//
752
753 static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber,
754                              unsigned LabelId, MCContext &Ctx) {
755
756   MCSymbol *Label = Ctx.GetOrCreateSymbol(Twine(Prefix)
757                        + "PC" + Twine(FunctionNumber) + "_" + Twine(LabelId));
758   return Label;
759 }
760
761 static MCSymbolRefExpr::VariantKind
762 getModifierVariantKind(ARMCP::ARMCPModifier Modifier) {
763   switch (Modifier) {
764   case ARMCP::no_modifier: return MCSymbolRefExpr::VK_None;
765   case ARMCP::TLSGD:       return MCSymbolRefExpr::VK_ARM_TLSGD;
766   case ARMCP::TPOFF:       return MCSymbolRefExpr::VK_ARM_TPOFF;
767   case ARMCP::GOTTPOFF:    return MCSymbolRefExpr::VK_ARM_GOTTPOFF;
768   case ARMCP::GOT:         return MCSymbolRefExpr::VK_ARM_GOT;
769   case ARMCP::GOTOFF:      return MCSymbolRefExpr::VK_ARM_GOTOFF;
770   }
771   llvm_unreachable("Invalid ARMCPModifier!");
772 }
773
774 MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV) {
775   bool isIndirect = Subtarget->isTargetDarwin() &&
776     Subtarget->GVIsIndirectSymbol(GV, TM.getRelocationModel());
777   if (!isIndirect)
778     return getSymbol(GV);
779
780   // FIXME: Remove this when Darwin transition to @GOT like syntax.
781   MCSymbol *MCSym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
782   MachineModuleInfoMachO &MMIMachO =
783     MMI->getObjFileInfo<MachineModuleInfoMachO>();
784   MachineModuleInfoImpl::StubValueTy &StubSym =
785     GV->hasHiddenVisibility() ? MMIMachO.getHiddenGVStubEntry(MCSym) :
786     MMIMachO.getGVStubEntry(MCSym);
787   if (StubSym.getPointer() == 0)
788     StubSym = MachineModuleInfoImpl::
789       StubValueTy(getSymbol(GV), !GV->hasInternalLinkage());
790   return MCSym;
791 }
792
793 void ARMAsmPrinter::
794 EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
795   int Size = TM.getDataLayout()->getTypeAllocSize(MCPV->getType());
796
797   ARMConstantPoolValue *ACPV = static_cast<ARMConstantPoolValue*>(MCPV);
798
799   MCSymbol *MCSym;
800   if (ACPV->isLSDA()) {
801     SmallString<128> Str;
802     raw_svector_ostream OS(Str);
803     OS << MAI->getPrivateGlobalPrefix() << "_LSDA_" << getFunctionNumber();
804     MCSym = OutContext.GetOrCreateSymbol(OS.str());
805   } else if (ACPV->isBlockAddress()) {
806     const BlockAddress *BA =
807       cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
808     MCSym = GetBlockAddressSymbol(BA);
809   } else if (ACPV->isGlobalValue()) {
810     const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
811     MCSym = GetARMGVSymbol(GV);
812   } else if (ACPV->isMachineBasicBlock()) {
813     const MachineBasicBlock *MBB = cast<ARMConstantPoolMBB>(ACPV)->getMBB();
814     MCSym = MBB->getSymbol();
815   } else {
816     assert(ACPV->isExtSymbol() && "unrecognized constant pool value");
817     const char *Sym = cast<ARMConstantPoolSymbol>(ACPV)->getSymbol();
818     MCSym = GetExternalSymbolSymbol(Sym);
819   }
820
821   // Create an MCSymbol for the reference.
822   const MCExpr *Expr =
823     MCSymbolRefExpr::Create(MCSym, getModifierVariantKind(ACPV->getModifier()),
824                             OutContext);
825
826   if (ACPV->getPCAdjustment()) {
827     MCSymbol *PCLabel = getPICLabel(MAI->getPrivateGlobalPrefix(),
828                                     getFunctionNumber(),
829                                     ACPV->getLabelId(),
830                                     OutContext);
831     const MCExpr *PCRelExpr = MCSymbolRefExpr::Create(PCLabel, OutContext);
832     PCRelExpr =
833       MCBinaryExpr::CreateAdd(PCRelExpr,
834                               MCConstantExpr::Create(ACPV->getPCAdjustment(),
835                                                      OutContext),
836                               OutContext);
837     if (ACPV->mustAddCurrentAddress()) {
838       // We want "(<expr> - .)", but MC doesn't have a concept of the '.'
839       // label, so just emit a local label end reference that instead.
840       MCSymbol *DotSym = OutContext.CreateTempSymbol();
841       OutStreamer.EmitLabel(DotSym);
842       const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext);
843       PCRelExpr = MCBinaryExpr::CreateSub(PCRelExpr, DotExpr, OutContext);
844     }
845     Expr = MCBinaryExpr::CreateSub(Expr, PCRelExpr, OutContext);
846   }
847   OutStreamer.EmitValue(Expr, Size);
848 }
849
850 void ARMAsmPrinter::EmitJumpTable(const MachineInstr *MI) {
851   unsigned Opcode = MI->getOpcode();
852   int OpNum = 1;
853   if (Opcode == ARM::BR_JTadd)
854     OpNum = 2;
855   else if (Opcode == ARM::BR_JTm)
856     OpNum = 3;
857
858   const MachineOperand &MO1 = MI->getOperand(OpNum);
859   const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
860   unsigned JTI = MO1.getIndex();
861
862   // Emit a label for the jump table.
863   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm());
864   OutStreamer.EmitLabel(JTISymbol);
865
866   // Mark the jump table as data-in-code.
867   OutStreamer.EmitDataRegion(MCDR_DataRegionJT32);
868
869   // Emit each entry of the table.
870   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
871   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
872   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
873
874   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
875     MachineBasicBlock *MBB = JTBBs[i];
876     // Construct an MCExpr for the entry. We want a value of the form:
877     // (BasicBlockAddr - TableBeginAddr)
878     //
879     // For example, a table with entries jumping to basic blocks BB0 and BB1
880     // would look like:
881     // LJTI_0_0:
882     //    .word (LBB0 - LJTI_0_0)
883     //    .word (LBB1 - LJTI_0_0)
884     const MCExpr *Expr = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
885
886     if (TM.getRelocationModel() == Reloc::PIC_)
887       Expr = MCBinaryExpr::CreateSub(Expr, MCSymbolRefExpr::Create(JTISymbol,
888                                                                    OutContext),
889                                      OutContext);
890     // If we're generating a table of Thumb addresses in static relocation
891     // model, we need to add one to keep interworking correctly.
892     else if (AFI->isThumbFunction())
893       Expr = MCBinaryExpr::CreateAdd(Expr, MCConstantExpr::Create(1,OutContext),
894                                      OutContext);
895     OutStreamer.EmitValue(Expr, 4);
896   }
897   // Mark the end of jump table data-in-code region.
898   OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
899 }
900
901 void ARMAsmPrinter::EmitJump2Table(const MachineInstr *MI) {
902   unsigned Opcode = MI->getOpcode();
903   int OpNum = (Opcode == ARM::t2BR_JT) ? 2 : 1;
904   const MachineOperand &MO1 = MI->getOperand(OpNum);
905   const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
906   unsigned JTI = MO1.getIndex();
907
908   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm());
909   OutStreamer.EmitLabel(JTISymbol);
910
911   // Emit each entry of the table.
912   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
913   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
914   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
915   unsigned OffsetWidth = 4;
916   if (MI->getOpcode() == ARM::t2TBB_JT) {
917     OffsetWidth = 1;
918     // Mark the jump table as data-in-code.
919     OutStreamer.EmitDataRegion(MCDR_DataRegionJT8);
920   } else if (MI->getOpcode() == ARM::t2TBH_JT) {
921     OffsetWidth = 2;
922     // Mark the jump table as data-in-code.
923     OutStreamer.EmitDataRegion(MCDR_DataRegionJT16);
924   }
925
926   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
927     MachineBasicBlock *MBB = JTBBs[i];
928     const MCExpr *MBBSymbolExpr = MCSymbolRefExpr::Create(MBB->getSymbol(),
929                                                       OutContext);
930     // If this isn't a TBB or TBH, the entries are direct branch instructions.
931     if (OffsetWidth == 4) {
932       OutStreamer.EmitInstruction(MCInstBuilder(ARM::t2B)
933         .addExpr(MBBSymbolExpr)
934         .addImm(ARMCC::AL)
935         .addReg(0));
936       continue;
937     }
938     // Otherwise it's an offset from the dispatch instruction. Construct an
939     // MCExpr for the entry. We want a value of the form:
940     // (BasicBlockAddr - TableBeginAddr) / 2
941     //
942     // For example, a TBB table with entries jumping to basic blocks BB0 and BB1
943     // would look like:
944     // LJTI_0_0:
945     //    .byte (LBB0 - LJTI_0_0) / 2
946     //    .byte (LBB1 - LJTI_0_0) / 2
947     const MCExpr *Expr =
948       MCBinaryExpr::CreateSub(MBBSymbolExpr,
949                               MCSymbolRefExpr::Create(JTISymbol, OutContext),
950                               OutContext);
951     Expr = MCBinaryExpr::CreateDiv(Expr, MCConstantExpr::Create(2, OutContext),
952                                    OutContext);
953     OutStreamer.EmitValue(Expr, OffsetWidth);
954   }
955   // Mark the end of jump table data-in-code region. 32-bit offsets use
956   // actual branch instructions here, so we don't mark those as a data-region
957   // at all.
958   if (OffsetWidth != 4)
959     OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
960 }
961
962 void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
963   assert(MI->getFlag(MachineInstr::FrameSetup) &&
964       "Only instruction which are involved into frame setup code are allowed");
965
966   MCTargetStreamer &TS = OutStreamer.getTargetStreamer();
967   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
968   const MachineFunction &MF = *MI->getParent()->getParent();
969   const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
970   const ARMFunctionInfo &AFI = *MF.getInfo<ARMFunctionInfo>();
971
972   unsigned FramePtr = RegInfo->getFrameRegister(MF);
973   unsigned Opc = MI->getOpcode();
974   unsigned SrcReg, DstReg;
975
976   if (Opc == ARM::tPUSH || Opc == ARM::tLDRpci) {
977     // Two special cases:
978     // 1) tPUSH does not have src/dst regs.
979     // 2) for Thumb1 code we sometimes materialize the constant via constpool
980     // load. Yes, this is pretty fragile, but for now I don't see better
981     // way... :(
982     SrcReg = DstReg = ARM::SP;
983   } else {
984     SrcReg = MI->getOperand(1).getReg();
985     DstReg = MI->getOperand(0).getReg();
986   }
987
988   // Try to figure out the unwinding opcode out of src / dst regs.
989   if (MI->mayStore()) {
990     // Register saves.
991     assert(DstReg == ARM::SP &&
992            "Only stack pointer as a destination reg is supported");
993
994     SmallVector<unsigned, 4> RegList;
995     // Skip src & dst reg, and pred ops.
996     unsigned StartOp = 2 + 2;
997     // Use all the operands.
998     unsigned NumOffset = 0;
999
1000     switch (Opc) {
1001     default:
1002       MI->dump();
1003       llvm_unreachable("Unsupported opcode for unwinding information");
1004     case ARM::tPUSH:
1005       // Special case here: no src & dst reg, but two extra imp ops.
1006       StartOp = 2; NumOffset = 2;
1007     case ARM::STMDB_UPD:
1008     case ARM::t2STMDB_UPD:
1009     case ARM::VSTMDDB_UPD:
1010       assert(SrcReg == ARM::SP &&
1011              "Only stack pointer as a source reg is supported");
1012       for (unsigned i = StartOp, NumOps = MI->getNumOperands() - NumOffset;
1013            i != NumOps; ++i) {
1014         const MachineOperand &MO = MI->getOperand(i);
1015         // Actually, there should never be any impdef stuff here. Skip it
1016         // temporary to workaround PR11902.
1017         if (MO.isImplicit())
1018           continue;
1019         RegList.push_back(MO.getReg());
1020       }
1021       break;
1022     case ARM::STR_PRE_IMM:
1023     case ARM::STR_PRE_REG:
1024     case ARM::t2STR_PRE:
1025       assert(MI->getOperand(2).getReg() == ARM::SP &&
1026              "Only stack pointer as a source reg is supported");
1027       RegList.push_back(SrcReg);
1028       break;
1029     }
1030     ATS.emitRegSave(RegList, Opc == ARM::VSTMDDB_UPD);
1031   } else {
1032     // Changes of stack / frame pointer.
1033     if (SrcReg == ARM::SP) {
1034       int64_t Offset = 0;
1035       switch (Opc) {
1036       default:
1037         MI->dump();
1038         llvm_unreachable("Unsupported opcode for unwinding information");
1039       case ARM::MOVr:
1040       case ARM::tMOVr:
1041         Offset = 0;
1042         break;
1043       case ARM::ADDri:
1044         Offset = -MI->getOperand(2).getImm();
1045         break;
1046       case ARM::SUBri:
1047       case ARM::t2SUBri:
1048         Offset = MI->getOperand(2).getImm();
1049         break;
1050       case ARM::tSUBspi:
1051         Offset = MI->getOperand(2).getImm()*4;
1052         break;
1053       case ARM::tADDspi:
1054       case ARM::tADDrSPi:
1055         Offset = -MI->getOperand(2).getImm()*4;
1056         break;
1057       case ARM::tLDRpci: {
1058         // Grab the constpool index and check, whether it corresponds to
1059         // original or cloned constpool entry.
1060         unsigned CPI = MI->getOperand(1).getIndex();
1061         const MachineConstantPool *MCP = MF.getConstantPool();
1062         if (CPI >= MCP->getConstants().size())
1063           CPI = AFI.getOriginalCPIdx(CPI);
1064         assert(CPI != -1U && "Invalid constpool index");
1065
1066         // Derive the actual offset.
1067         const MachineConstantPoolEntry &CPE = MCP->getConstants()[CPI];
1068         assert(!CPE.isMachineConstantPoolEntry() && "Invalid constpool entry");
1069         // FIXME: Check for user, it should be "add" instruction!
1070         Offset = -cast<ConstantInt>(CPE.Val.ConstVal)->getSExtValue();
1071         break;
1072       }
1073       }
1074
1075       if (DstReg == FramePtr && FramePtr != ARM::SP)
1076         // Set-up of the frame pointer. Positive values correspond to "add"
1077         // instruction.
1078         ATS.emitSetFP(FramePtr, ARM::SP, -Offset);
1079       else if (DstReg == ARM::SP) {
1080         // Change of SP by an offset. Positive values correspond to "sub"
1081         // instruction.
1082         ATS.emitPad(Offset);
1083       } else {
1084         MI->dump();
1085         llvm_unreachable("Unsupported opcode for unwinding information");
1086       }
1087     } else if (DstReg == ARM::SP) {
1088       // FIXME: .movsp goes here
1089       MI->dump();
1090       llvm_unreachable("Unsupported opcode for unwinding information");
1091     }
1092     else {
1093       MI->dump();
1094       llvm_unreachable("Unsupported opcode for unwinding information");
1095     }
1096   }
1097 }
1098
1099 extern cl::opt<bool> EnableARMEHABI;
1100
1101 // Simple pseudo-instructions have their lowering (with expansion to real
1102 // instructions) auto-generated.
1103 #include "ARMGenMCPseudoLowering.inc"
1104
1105 void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
1106   // If we just ended a constant pool, mark it as such.
1107   if (InConstantPool && MI->getOpcode() != ARM::CONSTPOOL_ENTRY) {
1108     OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
1109     InConstantPool = false;
1110   }
1111
1112   // Emit unwinding stuff for frame-related instructions
1113   if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup))
1114     EmitUnwindingInstruction(MI);
1115
1116   // Do any auto-generated pseudo lowerings.
1117   if (emitPseudoExpansionLowering(OutStreamer, MI))
1118     return;
1119
1120   assert(!convertAddSubFlagsOpcode(MI->getOpcode()) &&
1121          "Pseudo flag setting opcode should be expanded early");
1122
1123   // Check for manual lowerings.
1124   unsigned Opc = MI->getOpcode();
1125   switch (Opc) {
1126   case ARM::t2MOVi32imm: llvm_unreachable("Should be lowered by thumb2it pass");
1127   case ARM::DBG_VALUE: llvm_unreachable("Should be handled by generic printing");
1128   case ARM::LEApcrel:
1129   case ARM::tLEApcrel:
1130   case ARM::t2LEApcrel: {
1131     // FIXME: Need to also handle globals and externals
1132     MCSymbol *CPISymbol = GetCPISymbol(MI->getOperand(1).getIndex());
1133     OutStreamer.EmitInstruction(MCInstBuilder(MI->getOpcode() ==
1134                                               ARM::t2LEApcrel ? ARM::t2ADR
1135                   : (MI->getOpcode() == ARM::tLEApcrel ? ARM::tADR
1136                      : ARM::ADR))
1137       .addReg(MI->getOperand(0).getReg())
1138       .addExpr(MCSymbolRefExpr::Create(CPISymbol, OutContext))
1139       // Add predicate operands.
1140       .addImm(MI->getOperand(2).getImm())
1141       .addReg(MI->getOperand(3).getReg()));
1142     return;
1143   }
1144   case ARM::LEApcrelJT:
1145   case ARM::tLEApcrelJT:
1146   case ARM::t2LEApcrelJT: {
1147     MCSymbol *JTIPICSymbol =
1148       GetARMJTIPICJumpTableLabel2(MI->getOperand(1).getIndex(),
1149                                   MI->getOperand(2).getImm());
1150     OutStreamer.EmitInstruction(MCInstBuilder(MI->getOpcode() ==
1151                                               ARM::t2LEApcrelJT ? ARM::t2ADR
1152                   : (MI->getOpcode() == ARM::tLEApcrelJT ? ARM::tADR
1153                      : ARM::ADR))
1154       .addReg(MI->getOperand(0).getReg())
1155       .addExpr(MCSymbolRefExpr::Create(JTIPICSymbol, OutContext))
1156       // Add predicate operands.
1157       .addImm(MI->getOperand(3).getImm())
1158       .addReg(MI->getOperand(4).getReg()));
1159     return;
1160   }
1161   // Darwin call instructions are just normal call instructions with different
1162   // clobber semantics (they clobber R9).
1163   case ARM::BX_CALL: {
1164     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVr)
1165       .addReg(ARM::LR)
1166       .addReg(ARM::PC)
1167       // Add predicate operands.
1168       .addImm(ARMCC::AL)
1169       .addReg(0)
1170       // Add 's' bit operand (always reg0 for this)
1171       .addReg(0));
1172
1173     OutStreamer.EmitInstruction(MCInstBuilder(ARM::BX)
1174       .addReg(MI->getOperand(0).getReg()));
1175     return;
1176   }
1177   case ARM::tBX_CALL: {
1178     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVr)
1179       .addReg(ARM::LR)
1180       .addReg(ARM::PC)
1181       // Add predicate operands.
1182       .addImm(ARMCC::AL)
1183       .addReg(0));
1184
1185     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tBX)
1186       .addReg(MI->getOperand(0).getReg())
1187       // Add predicate operands.
1188       .addImm(ARMCC::AL)
1189       .addReg(0));
1190     return;
1191   }
1192   case ARM::BMOVPCRX_CALL: {
1193     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVr)
1194       .addReg(ARM::LR)
1195       .addReg(ARM::PC)
1196       // Add predicate operands.
1197       .addImm(ARMCC::AL)
1198       .addReg(0)
1199       // Add 's' bit operand (always reg0 for this)
1200       .addReg(0));
1201
1202     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVr)
1203       .addReg(ARM::PC)
1204       .addReg(MI->getOperand(0).getReg())
1205       // Add predicate operands.
1206       .addImm(ARMCC::AL)
1207       .addReg(0)
1208       // Add 's' bit operand (always reg0 for this)
1209       .addReg(0));
1210     return;
1211   }
1212   case ARM::BMOVPCB_CALL: {
1213     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVr)
1214       .addReg(ARM::LR)
1215       .addReg(ARM::PC)
1216       // Add predicate operands.
1217       .addImm(ARMCC::AL)
1218       .addReg(0)
1219       // Add 's' bit operand (always reg0 for this)
1220       .addReg(0));
1221
1222     const GlobalValue *GV = MI->getOperand(0).getGlobal();
1223     MCSymbol *GVSym = getSymbol(GV);
1224     const MCExpr *GVSymExpr = MCSymbolRefExpr::Create(GVSym, OutContext);
1225     OutStreamer.EmitInstruction(MCInstBuilder(ARM::Bcc)
1226       .addExpr(GVSymExpr)
1227       // Add predicate operands.
1228       .addImm(ARMCC::AL)
1229       .addReg(0));
1230     return;
1231   }
1232   case ARM::MOVi16_ga_pcrel:
1233   case ARM::t2MOVi16_ga_pcrel: {
1234     MCInst TmpInst;
1235     TmpInst.setOpcode(Opc == ARM::MOVi16_ga_pcrel? ARM::MOVi16 : ARM::t2MOVi16);
1236     TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
1237
1238     unsigned TF = MI->getOperand(1).getTargetFlags();
1239     bool isPIC = TF == ARMII::MO_LO16_NONLAZY_PIC;
1240     const GlobalValue *GV = MI->getOperand(1).getGlobal();
1241     MCSymbol *GVSym = GetARMGVSymbol(GV);
1242     const MCExpr *GVSymExpr = MCSymbolRefExpr::Create(GVSym, OutContext);
1243     if (isPIC) {
1244       MCSymbol *LabelSym = getPICLabel(MAI->getPrivateGlobalPrefix(),
1245                                        getFunctionNumber(),
1246                                        MI->getOperand(2).getImm(), OutContext);
1247       const MCExpr *LabelSymExpr= MCSymbolRefExpr::Create(LabelSym, OutContext);
1248       unsigned PCAdj = (Opc == ARM::MOVi16_ga_pcrel) ? 8 : 4;
1249       const MCExpr *PCRelExpr =
1250         ARMMCExpr::CreateLower16(MCBinaryExpr::CreateSub(GVSymExpr,
1251                                   MCBinaryExpr::CreateAdd(LabelSymExpr,
1252                                       MCConstantExpr::Create(PCAdj, OutContext),
1253                                           OutContext), OutContext), OutContext);
1254       TmpInst.addOperand(MCOperand::CreateExpr(PCRelExpr));
1255     } else {
1256       const MCExpr *RefExpr= ARMMCExpr::CreateLower16(GVSymExpr, OutContext);
1257       TmpInst.addOperand(MCOperand::CreateExpr(RefExpr));
1258     }
1259
1260     // Add predicate operands.
1261     TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
1262     TmpInst.addOperand(MCOperand::CreateReg(0));
1263     // Add 's' bit operand (always reg0 for this)
1264     TmpInst.addOperand(MCOperand::CreateReg(0));
1265     OutStreamer.EmitInstruction(TmpInst);
1266     return;
1267   }
1268   case ARM::MOVTi16_ga_pcrel:
1269   case ARM::t2MOVTi16_ga_pcrel: {
1270     MCInst TmpInst;
1271     TmpInst.setOpcode(Opc == ARM::MOVTi16_ga_pcrel
1272                       ? ARM::MOVTi16 : ARM::t2MOVTi16);
1273     TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
1274     TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg()));
1275
1276     unsigned TF = MI->getOperand(2).getTargetFlags();
1277     bool isPIC = TF == ARMII::MO_HI16_NONLAZY_PIC;
1278     const GlobalValue *GV = MI->getOperand(2).getGlobal();
1279     MCSymbol *GVSym = GetARMGVSymbol(GV);
1280     const MCExpr *GVSymExpr = MCSymbolRefExpr::Create(GVSym, OutContext);
1281     if (isPIC) {
1282       MCSymbol *LabelSym = getPICLabel(MAI->getPrivateGlobalPrefix(),
1283                                        getFunctionNumber(),
1284                                        MI->getOperand(3).getImm(), OutContext);
1285       const MCExpr *LabelSymExpr= MCSymbolRefExpr::Create(LabelSym, OutContext);
1286       unsigned PCAdj = (Opc == ARM::MOVTi16_ga_pcrel) ? 8 : 4;
1287       const MCExpr *PCRelExpr =
1288         ARMMCExpr::CreateUpper16(MCBinaryExpr::CreateSub(GVSymExpr,
1289                                    MCBinaryExpr::CreateAdd(LabelSymExpr,
1290                                       MCConstantExpr::Create(PCAdj, OutContext),
1291                                           OutContext), OutContext), OutContext);
1292       TmpInst.addOperand(MCOperand::CreateExpr(PCRelExpr));
1293     } else {
1294       const MCExpr *RefExpr= ARMMCExpr::CreateUpper16(GVSymExpr, OutContext);
1295       TmpInst.addOperand(MCOperand::CreateExpr(RefExpr));
1296     }
1297     // Add predicate operands.
1298     TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
1299     TmpInst.addOperand(MCOperand::CreateReg(0));
1300     // Add 's' bit operand (always reg0 for this)
1301     TmpInst.addOperand(MCOperand::CreateReg(0));
1302     OutStreamer.EmitInstruction(TmpInst);
1303     return;
1304   }
1305   case ARM::tPICADD: {
1306     // This is a pseudo op for a label + instruction sequence, which looks like:
1307     // LPC0:
1308     //     add r0, pc
1309     // This adds the address of LPC0 to r0.
1310
1311     // Emit the label.
1312     OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(),
1313                           getFunctionNumber(), MI->getOperand(2).getImm(),
1314                           OutContext));
1315
1316     // Form and emit the add.
1317     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tADDhirr)
1318       .addReg(MI->getOperand(0).getReg())
1319       .addReg(MI->getOperand(0).getReg())
1320       .addReg(ARM::PC)
1321       // Add predicate operands.
1322       .addImm(ARMCC::AL)
1323       .addReg(0));
1324     return;
1325   }
1326   case ARM::PICADD: {
1327     // This is a pseudo op for a label + instruction sequence, which looks like:
1328     // LPC0:
1329     //     add r0, pc, r0
1330     // This adds the address of LPC0 to r0.
1331
1332     // Emit the label.
1333     OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(),
1334                           getFunctionNumber(), MI->getOperand(2).getImm(),
1335                           OutContext));
1336
1337     // Form and emit the add.
1338     OutStreamer.EmitInstruction(MCInstBuilder(ARM::ADDrr)
1339       .addReg(MI->getOperand(0).getReg())
1340       .addReg(ARM::PC)
1341       .addReg(MI->getOperand(1).getReg())
1342       // Add predicate operands.
1343       .addImm(MI->getOperand(3).getImm())
1344       .addReg(MI->getOperand(4).getReg())
1345       // Add 's' bit operand (always reg0 for this)
1346       .addReg(0));
1347     return;
1348   }
1349   case ARM::PICSTR:
1350   case ARM::PICSTRB:
1351   case ARM::PICSTRH:
1352   case ARM::PICLDR:
1353   case ARM::PICLDRB:
1354   case ARM::PICLDRH:
1355   case ARM::PICLDRSB:
1356   case ARM::PICLDRSH: {
1357     // This is a pseudo op for a label + instruction sequence, which looks like:
1358     // LPC0:
1359     //     OP r0, [pc, r0]
1360     // The LCP0 label is referenced by a constant pool entry in order to get
1361     // a PC-relative address at the ldr instruction.
1362
1363     // Emit the label.
1364     OutStreamer.EmitLabel(getPICLabel(MAI->getPrivateGlobalPrefix(),
1365                           getFunctionNumber(), MI->getOperand(2).getImm(),
1366                           OutContext));
1367
1368     // Form and emit the load
1369     unsigned Opcode;
1370     switch (MI->getOpcode()) {
1371     default:
1372       llvm_unreachable("Unexpected opcode!");
1373     case ARM::PICSTR:   Opcode = ARM::STRrs; break;
1374     case ARM::PICSTRB:  Opcode = ARM::STRBrs; break;
1375     case ARM::PICSTRH:  Opcode = ARM::STRH; break;
1376     case ARM::PICLDR:   Opcode = ARM::LDRrs; break;
1377     case ARM::PICLDRB:  Opcode = ARM::LDRBrs; break;
1378     case ARM::PICLDRH:  Opcode = ARM::LDRH; break;
1379     case ARM::PICLDRSB: Opcode = ARM::LDRSB; break;
1380     case ARM::PICLDRSH: Opcode = ARM::LDRSH; break;
1381     }
1382     OutStreamer.EmitInstruction(MCInstBuilder(Opcode)
1383       .addReg(MI->getOperand(0).getReg())
1384       .addReg(ARM::PC)
1385       .addReg(MI->getOperand(1).getReg())
1386       .addImm(0)
1387       // Add predicate operands.
1388       .addImm(MI->getOperand(3).getImm())
1389       .addReg(MI->getOperand(4).getReg()));
1390
1391     return;
1392   }
1393   case ARM::CONSTPOOL_ENTRY: {
1394     /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool
1395     /// in the function.  The first operand is the ID# for this instruction, the
1396     /// second is the index into the MachineConstantPool that this is, the third
1397     /// is the size in bytes of this constant pool entry.
1398     /// The required alignment is specified on the basic block holding this MI.
1399     unsigned LabelId = (unsigned)MI->getOperand(0).getImm();
1400     unsigned CPIdx   = (unsigned)MI->getOperand(1).getIndex();
1401
1402     // If this is the first entry of the pool, mark it.
1403     if (!InConstantPool) {
1404       OutStreamer.EmitDataRegion(MCDR_DataRegion);
1405       InConstantPool = true;
1406     }
1407
1408     OutStreamer.EmitLabel(GetCPISymbol(LabelId));
1409
1410     const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx];
1411     if (MCPE.isMachineConstantPoolEntry())
1412       EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal);
1413     else
1414       EmitGlobalConstant(MCPE.Val.ConstVal);
1415     return;
1416   }
1417   case ARM::t2BR_JT: {
1418     // Lower and emit the instruction itself, then the jump table following it.
1419     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVr)
1420       .addReg(ARM::PC)
1421       .addReg(MI->getOperand(0).getReg())
1422       // Add predicate operands.
1423       .addImm(ARMCC::AL)
1424       .addReg(0));
1425
1426     // Output the data for the jump table itself
1427     EmitJump2Table(MI);
1428     return;
1429   }
1430   case ARM::t2TBB_JT: {
1431     // Lower and emit the instruction itself, then the jump table following it.
1432     OutStreamer.EmitInstruction(MCInstBuilder(ARM::t2TBB)
1433       .addReg(ARM::PC)
1434       .addReg(MI->getOperand(0).getReg())
1435       // Add predicate operands.
1436       .addImm(ARMCC::AL)
1437       .addReg(0));
1438
1439     // Output the data for the jump table itself
1440     EmitJump2Table(MI);
1441     // Make sure the next instruction is 2-byte aligned.
1442     EmitAlignment(1);
1443     return;
1444   }
1445   case ARM::t2TBH_JT: {
1446     // Lower and emit the instruction itself, then the jump table following it.
1447     OutStreamer.EmitInstruction(MCInstBuilder(ARM::t2TBH)
1448       .addReg(ARM::PC)
1449       .addReg(MI->getOperand(0).getReg())
1450       // Add predicate operands.
1451       .addImm(ARMCC::AL)
1452       .addReg(0));
1453
1454     // Output the data for the jump table itself
1455     EmitJump2Table(MI);
1456     return;
1457   }
1458   case ARM::tBR_JTr:
1459   case ARM::BR_JTr: {
1460     // Lower and emit the instruction itself, then the jump table following it.
1461     // mov pc, target
1462     MCInst TmpInst;
1463     unsigned Opc = MI->getOpcode() == ARM::BR_JTr ?
1464       ARM::MOVr : ARM::tMOVr;
1465     TmpInst.setOpcode(Opc);
1466     TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
1467     TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
1468     // Add predicate operands.
1469     TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
1470     TmpInst.addOperand(MCOperand::CreateReg(0));
1471     // Add 's' bit operand (always reg0 for this)
1472     if (Opc == ARM::MOVr)
1473       TmpInst.addOperand(MCOperand::CreateReg(0));
1474     OutStreamer.EmitInstruction(TmpInst);
1475
1476     // Make sure the Thumb jump table is 4-byte aligned.
1477     if (Opc == ARM::tMOVr)
1478       EmitAlignment(2);
1479
1480     // Output the data for the jump table itself
1481     EmitJumpTable(MI);
1482     return;
1483   }
1484   case ARM::BR_JTm: {
1485     // Lower and emit the instruction itself, then the jump table following it.
1486     // ldr pc, target
1487     MCInst TmpInst;
1488     if (MI->getOperand(1).getReg() == 0) {
1489       // literal offset
1490       TmpInst.setOpcode(ARM::LDRi12);
1491       TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
1492       TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
1493       TmpInst.addOperand(MCOperand::CreateImm(MI->getOperand(2).getImm()));
1494     } else {
1495       TmpInst.setOpcode(ARM::LDRrs);
1496       TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
1497       TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
1498       TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(1).getReg()));
1499       TmpInst.addOperand(MCOperand::CreateImm(0));
1500     }
1501     // Add predicate operands.
1502     TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
1503     TmpInst.addOperand(MCOperand::CreateReg(0));
1504     OutStreamer.EmitInstruction(TmpInst);
1505
1506     // Output the data for the jump table itself
1507     EmitJumpTable(MI);
1508     return;
1509   }
1510   case ARM::BR_JTadd: {
1511     // Lower and emit the instruction itself, then the jump table following it.
1512     // add pc, target, idx
1513     OutStreamer.EmitInstruction(MCInstBuilder(ARM::ADDrr)
1514       .addReg(ARM::PC)
1515       .addReg(MI->getOperand(0).getReg())
1516       .addReg(MI->getOperand(1).getReg())
1517       // Add predicate operands.
1518       .addImm(ARMCC::AL)
1519       .addReg(0)
1520       // Add 's' bit operand (always reg0 for this)
1521       .addReg(0));
1522
1523     // Output the data for the jump table itself
1524     EmitJumpTable(MI);
1525     return;
1526   }
1527   case ARM::TRAP: {
1528     // Non-Darwin binutils don't yet support the "trap" mnemonic.
1529     // FIXME: Remove this special case when they do.
1530     if (!Subtarget->isTargetDarwin()) {
1531       //.long 0xe7ffdefe @ trap
1532       uint32_t Val = 0xe7ffdefeUL;
1533       OutStreamer.AddComment("trap");
1534       OutStreamer.EmitIntValue(Val, 4);
1535       return;
1536     }
1537     break;
1538   }
1539   case ARM::TRAPNaCl: {
1540     //.long 0xe7fedef0 @ trap
1541     uint32_t Val = 0xe7fedef0UL;
1542     OutStreamer.AddComment("trap");
1543     OutStreamer.EmitIntValue(Val, 4);
1544     return;
1545   }
1546   case ARM::tTRAP: {
1547     // Non-Darwin binutils don't yet support the "trap" mnemonic.
1548     // FIXME: Remove this special case when they do.
1549     if (!Subtarget->isTargetDarwin()) {
1550       //.short 57086 @ trap
1551       uint16_t Val = 0xdefe;
1552       OutStreamer.AddComment("trap");
1553       OutStreamer.EmitIntValue(Val, 2);
1554       return;
1555     }
1556     break;
1557   }
1558   case ARM::t2Int_eh_sjlj_setjmp:
1559   case ARM::t2Int_eh_sjlj_setjmp_nofp:
1560   case ARM::tInt_eh_sjlj_setjmp: {
1561     // Two incoming args: GPR:$src, GPR:$val
1562     // mov $val, pc
1563     // adds $val, #7
1564     // str $val, [$src, #4]
1565     // movs r0, #0
1566     // b 1f
1567     // movs r0, #1
1568     // 1:
1569     unsigned SrcReg = MI->getOperand(0).getReg();
1570     unsigned ValReg = MI->getOperand(1).getReg();
1571     MCSymbol *Label = GetARMSJLJEHLabel();
1572     OutStreamer.AddComment("eh_setjmp begin");
1573     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVr)
1574       .addReg(ValReg)
1575       .addReg(ARM::PC)
1576       // Predicate.
1577       .addImm(ARMCC::AL)
1578       .addReg(0));
1579
1580     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tADDi3)
1581       .addReg(ValReg)
1582       // 's' bit operand
1583       .addReg(ARM::CPSR)
1584       .addReg(ValReg)
1585       .addImm(7)
1586       // Predicate.
1587       .addImm(ARMCC::AL)
1588       .addReg(0));
1589
1590     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tSTRi)
1591       .addReg(ValReg)
1592       .addReg(SrcReg)
1593       // The offset immediate is #4. The operand value is scaled by 4 for the
1594       // tSTR instruction.
1595       .addImm(1)
1596       // Predicate.
1597       .addImm(ARMCC::AL)
1598       .addReg(0));
1599
1600     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVi8)
1601       .addReg(ARM::R0)
1602       .addReg(ARM::CPSR)
1603       .addImm(0)
1604       // Predicate.
1605       .addImm(ARMCC::AL)
1606       .addReg(0));
1607
1608     const MCExpr *SymbolExpr = MCSymbolRefExpr::Create(Label, OutContext);
1609     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tB)
1610       .addExpr(SymbolExpr)
1611       .addImm(ARMCC::AL)
1612       .addReg(0));
1613
1614     OutStreamer.AddComment("eh_setjmp end");
1615     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVi8)
1616       .addReg(ARM::R0)
1617       .addReg(ARM::CPSR)
1618       .addImm(1)
1619       // Predicate.
1620       .addImm(ARMCC::AL)
1621       .addReg(0));
1622
1623     OutStreamer.EmitLabel(Label);
1624     return;
1625   }
1626
1627   case ARM::Int_eh_sjlj_setjmp_nofp:
1628   case ARM::Int_eh_sjlj_setjmp: {
1629     // Two incoming args: GPR:$src, GPR:$val
1630     // add $val, pc, #8
1631     // str $val, [$src, #+4]
1632     // mov r0, #0
1633     // add pc, pc, #0
1634     // mov r0, #1
1635     unsigned SrcReg = MI->getOperand(0).getReg();
1636     unsigned ValReg = MI->getOperand(1).getReg();
1637
1638     OutStreamer.AddComment("eh_setjmp begin");
1639     OutStreamer.EmitInstruction(MCInstBuilder(ARM::ADDri)
1640       .addReg(ValReg)
1641       .addReg(ARM::PC)
1642       .addImm(8)
1643       // Predicate.
1644       .addImm(ARMCC::AL)
1645       .addReg(0)
1646       // 's' bit operand (always reg0 for this).
1647       .addReg(0));
1648
1649     OutStreamer.EmitInstruction(MCInstBuilder(ARM::STRi12)
1650       .addReg(ValReg)
1651       .addReg(SrcReg)
1652       .addImm(4)
1653       // Predicate.
1654       .addImm(ARMCC::AL)
1655       .addReg(0));
1656
1657     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVi)
1658       .addReg(ARM::R0)
1659       .addImm(0)
1660       // Predicate.
1661       .addImm(ARMCC::AL)
1662       .addReg(0)
1663       // 's' bit operand (always reg0 for this).
1664       .addReg(0));
1665
1666     OutStreamer.EmitInstruction(MCInstBuilder(ARM::ADDri)
1667       .addReg(ARM::PC)
1668       .addReg(ARM::PC)
1669       .addImm(0)
1670       // Predicate.
1671       .addImm(ARMCC::AL)
1672       .addReg(0)
1673       // 's' bit operand (always reg0 for this).
1674       .addReg(0));
1675
1676     OutStreamer.AddComment("eh_setjmp end");
1677     OutStreamer.EmitInstruction(MCInstBuilder(ARM::MOVi)
1678       .addReg(ARM::R0)
1679       .addImm(1)
1680       // Predicate.
1681       .addImm(ARMCC::AL)
1682       .addReg(0)
1683       // 's' bit operand (always reg0 for this).
1684       .addReg(0));
1685     return;
1686   }
1687   case ARM::Int_eh_sjlj_longjmp: {
1688     // ldr sp, [$src, #8]
1689     // ldr $scratch, [$src, #4]
1690     // ldr r7, [$src]
1691     // bx $scratch
1692     unsigned SrcReg = MI->getOperand(0).getReg();
1693     unsigned ScratchReg = MI->getOperand(1).getReg();
1694     OutStreamer.EmitInstruction(MCInstBuilder(ARM::LDRi12)
1695       .addReg(ARM::SP)
1696       .addReg(SrcReg)
1697       .addImm(8)
1698       // Predicate.
1699       .addImm(ARMCC::AL)
1700       .addReg(0));
1701
1702     OutStreamer.EmitInstruction(MCInstBuilder(ARM::LDRi12)
1703       .addReg(ScratchReg)
1704       .addReg(SrcReg)
1705       .addImm(4)
1706       // Predicate.
1707       .addImm(ARMCC::AL)
1708       .addReg(0));
1709
1710     OutStreamer.EmitInstruction(MCInstBuilder(ARM::LDRi12)
1711       .addReg(ARM::R7)
1712       .addReg(SrcReg)
1713       .addImm(0)
1714       // Predicate.
1715       .addImm(ARMCC::AL)
1716       .addReg(0));
1717
1718     OutStreamer.EmitInstruction(MCInstBuilder(ARM::BX)
1719       .addReg(ScratchReg)
1720       // Predicate.
1721       .addImm(ARMCC::AL)
1722       .addReg(0));
1723     return;
1724   }
1725   case ARM::tInt_eh_sjlj_longjmp: {
1726     // ldr $scratch, [$src, #8]
1727     // mov sp, $scratch
1728     // ldr $scratch, [$src, #4]
1729     // ldr r7, [$src]
1730     // bx $scratch
1731     unsigned SrcReg = MI->getOperand(0).getReg();
1732     unsigned ScratchReg = MI->getOperand(1).getReg();
1733     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tLDRi)
1734       .addReg(ScratchReg)
1735       .addReg(SrcReg)
1736       // The offset immediate is #8. The operand value is scaled by 4 for the
1737       // tLDR instruction.
1738       .addImm(2)
1739       // Predicate.
1740       .addImm(ARMCC::AL)
1741       .addReg(0));
1742
1743     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tMOVr)
1744       .addReg(ARM::SP)
1745       .addReg(ScratchReg)
1746       // Predicate.
1747       .addImm(ARMCC::AL)
1748       .addReg(0));
1749
1750     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tLDRi)
1751       .addReg(ScratchReg)
1752       .addReg(SrcReg)
1753       .addImm(1)
1754       // Predicate.
1755       .addImm(ARMCC::AL)
1756       .addReg(0));
1757
1758     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tLDRi)
1759       .addReg(ARM::R7)
1760       .addReg(SrcReg)
1761       .addImm(0)
1762       // Predicate.
1763       .addImm(ARMCC::AL)
1764       .addReg(0));
1765
1766     OutStreamer.EmitInstruction(MCInstBuilder(ARM::tBX)
1767       .addReg(ScratchReg)
1768       // Predicate.
1769       .addImm(ARMCC::AL)
1770       .addReg(0));
1771     return;
1772   }
1773   }
1774
1775   MCInst TmpInst;
1776   LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
1777
1778   OutStreamer.EmitInstruction(TmpInst);
1779 }
1780
1781 //===----------------------------------------------------------------------===//
1782 // Target Registry Stuff
1783 //===----------------------------------------------------------------------===//
1784
1785 // Force static initialization.
1786 extern "C" void LLVMInitializeARMAsmPrinter() {
1787   RegisterAsmPrinter<ARMAsmPrinter> X(TheARMTarget);
1788   RegisterAsmPrinter<ARMAsmPrinter> Y(TheThumbTarget);
1789 }