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 #include "ARMAsmPrinter.h"
16 #include "ARM.h"
17 #include "ARMConstantPoolValue.h"
18 #include "ARMMachineFunctionInfo.h"
19 #include "ARMTargetMachine.h"
20 #include "ARMTargetObjectFile.h"
21 #include "InstPrinter/ARMInstPrinter.h"
22 #include "MCTargetDesc/ARMAddressingModes.h"
23 #include "MCTargetDesc/ARMMCExpr.h"
24 #include "llvm/ADT/SetVector.h"
25 #include "llvm/ADT/SmallString.h"
26 #include "llvm/CodeGen/MachineFunctionPass.h"
27 #include "llvm/CodeGen/MachineJumpTableInfo.h"
28 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
29 #include "llvm/IR/Constants.h"
30 #include "llvm/IR/DataLayout.h"
31 #include "llvm/IR/DebugInfo.h"
32 #include "llvm/IR/Mangler.h"
33 #include "llvm/IR/Module.h"
34 #include "llvm/IR/Type.h"
35 #include "llvm/MC/MCAsmInfo.h"
36 #include "llvm/MC/MCAssembler.h"
37 #include "llvm/MC/MCContext.h"
38 #include "llvm/MC/MCELFStreamer.h"
39 #include "llvm/MC/MCInst.h"
40 #include "llvm/MC/MCInstBuilder.h"
41 #include "llvm/MC/MCObjectStreamer.h"
42 #include "llvm/MC/MCSectionMachO.h"
43 #include "llvm/MC/MCStreamer.h"
44 #include "llvm/MC/MCSymbol.h"
45 #include "llvm/Support/ARMBuildAttributes.h"
46 #include "llvm/Support/COFF.h"
47 #include "llvm/Support/Debug.h"
48 #include "llvm/Support/ELF.h"
49 #include "llvm/Support/ErrorHandling.h"
50 #include "llvm/Support/TargetParser.h"
51 #include "llvm/Support/TargetRegistry.h"
52 #include "llvm/Support/raw_ostream.h"
53 #include "llvm/Target/TargetMachine.h"
54 #include <cctype>
55 using namespace llvm;
56 
57 #define DEBUG_TYPE "asm-printer"
58 
59 ARMAsmPrinter::ARMAsmPrinter(TargetMachine &TM,
60                              std::unique_ptr<MCStreamer> Streamer)
61     : AsmPrinter(TM, std::move(Streamer)), AFI(nullptr), MCP(nullptr),
62       InConstantPool(false), OptimizationGoals(-1) {}
63 
64 void ARMAsmPrinter::EmitFunctionBodyEnd() {
65   // Make sure to terminate any constant pools that were at the end
66   // of the function.
67   if (!InConstantPool)
68     return;
69   InConstantPool = false;
70   OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
71 }
72 
73 void ARMAsmPrinter::EmitFunctionEntryLabel() {
74   if (AFI->isThumbFunction()) {
75     OutStreamer->EmitAssemblerFlag(MCAF_Code16);
76     OutStreamer->EmitThumbFunc(CurrentFnSym);
77   } else {
78     OutStreamer->EmitAssemblerFlag(MCAF_Code32);
79   }
80   OutStreamer->EmitLabel(CurrentFnSym);
81 }
82 
83 void ARMAsmPrinter::EmitXXStructor(const DataLayout &DL, const Constant *CV) {
84   uint64_t Size = getDataLayout().getTypeAllocSize(CV->getType());
85   assert(Size && "C++ constructor pointer had zero size!");
86 
87   const GlobalValue *GV = dyn_cast<GlobalValue>(CV->stripPointerCasts());
88   assert(GV && "C++ constructor pointer was not a GlobalValue!");
89 
90   const MCExpr *E = MCSymbolRefExpr::create(GetARMGVSymbol(GV,
91                                                            ARMII::MO_NO_FLAG),
92                                             (Subtarget->isTargetELF()
93                                              ? MCSymbolRefExpr::VK_ARM_TARGET1
94                                              : MCSymbolRefExpr::VK_None),
95                                             OutContext);
96 
97   OutStreamer->EmitValue(E, Size);
98 }
99 
100 /// runOnMachineFunction - This uses the EmitInstruction()
101 /// method to print assembly for each instruction.
102 ///
103 bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
104   AFI = MF.getInfo<ARMFunctionInfo>();
105   MCP = MF.getConstantPool();
106   Subtarget = &MF.getSubtarget<ARMSubtarget>();
107 
108   SetupMachineFunction(MF);
109   const Function* F = MF.getFunction();
110   const TargetMachine& TM = MF.getTarget();
111 
112   // Calculate this function's optimization goal.
113   unsigned OptimizationGoal;
114   if (F->hasFnAttribute(Attribute::OptimizeNone))
115     // For best debugging illusion, speed and small size sacrificed
116     OptimizationGoal = 6;
117   else if (F->optForMinSize())
118     // Aggressively for small size, speed and debug illusion sacrificed
119     OptimizationGoal = 4;
120   else if (F->optForSize())
121     // For small size, but speed and debugging illusion preserved
122     OptimizationGoal = 3;
123   else if (TM.getOptLevel() == CodeGenOpt::Aggressive)
124     // Aggressively for speed, small size and debug illusion sacrificed
125     OptimizationGoal = 2;
126   else if (TM.getOptLevel() > CodeGenOpt::None)
127     // For speed, but small size and good debug illusion preserved
128     OptimizationGoal = 1;
129   else // TM.getOptLevel() == CodeGenOpt::None
130     // For good debugging, but speed and small size preserved
131     OptimizationGoal = 5;
132 
133   // Combine a new optimization goal with existing ones.
134   if (OptimizationGoals == -1) // uninitialized goals
135     OptimizationGoals = OptimizationGoal;
136   else if (OptimizationGoals != (int)OptimizationGoal) // conflicting goals
137     OptimizationGoals = 0;
138 
139   if (Subtarget->isTargetCOFF()) {
140     bool Internal = F->hasInternalLinkage();
141     COFF::SymbolStorageClass Scl = Internal ? COFF::IMAGE_SYM_CLASS_STATIC
142                                             : COFF::IMAGE_SYM_CLASS_EXTERNAL;
143     int Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT;
144 
145     OutStreamer->BeginCOFFSymbolDef(CurrentFnSym);
146     OutStreamer->EmitCOFFSymbolStorageClass(Scl);
147     OutStreamer->EmitCOFFSymbolType(Type);
148     OutStreamer->EndCOFFSymbolDef();
149   }
150 
151   // Emit the rest of the function body.
152   EmitFunctionBody();
153 
154   // Emit the XRay table for this function.
155   EmitXRayTable();
156 
157   // If we need V4T thumb mode Register Indirect Jump pads, emit them.
158   // These are created per function, rather than per TU, since it's
159   // relatively easy to exceed the thumb branch range within a TU.
160   if (! ThumbIndirectPads.empty()) {
161     OutStreamer->EmitAssemblerFlag(MCAF_Code16);
162     EmitAlignment(1);
163     for (unsigned i = 0, e = ThumbIndirectPads.size(); i < e; i++) {
164       OutStreamer->EmitLabel(ThumbIndirectPads[i].second);
165       EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tBX)
166         .addReg(ThumbIndirectPads[i].first)
167         // Add predicate operands.
168         .addImm(ARMCC::AL)
169         .addReg(0));
170     }
171     ThumbIndirectPads.clear();
172   }
173 
174   // We didn't modify anything.
175   return false;
176 }
177 
178 void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
179                                  raw_ostream &O) {
180   const MachineOperand &MO = MI->getOperand(OpNum);
181   unsigned TF = MO.getTargetFlags();
182 
183   switch (MO.getType()) {
184   default: llvm_unreachable("<unknown operand type>");
185   case MachineOperand::MO_Register: {
186     unsigned Reg = MO.getReg();
187     assert(TargetRegisterInfo::isPhysicalRegister(Reg));
188     assert(!MO.getSubReg() && "Subregs should be eliminated!");
189     if(ARM::GPRPairRegClass.contains(Reg)) {
190       const MachineFunction &MF = *MI->getParent()->getParent();
191       const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
192       Reg = TRI->getSubReg(Reg, ARM::gsub_0);
193     }
194     O << ARMInstPrinter::getRegisterName(Reg);
195     break;
196   }
197   case MachineOperand::MO_Immediate: {
198     int64_t Imm = MO.getImm();
199     O << '#';
200     if (TF == ARMII::MO_LO16)
201       O << ":lower16:";
202     else if (TF == ARMII::MO_HI16)
203       O << ":upper16:";
204     O << Imm;
205     break;
206   }
207   case MachineOperand::MO_MachineBasicBlock:
208     MO.getMBB()->getSymbol()->print(O, MAI);
209     return;
210   case MachineOperand::MO_GlobalAddress: {
211     const GlobalValue *GV = MO.getGlobal();
212     if (TF & ARMII::MO_LO16)
213       O << ":lower16:";
214     else if (TF & ARMII::MO_HI16)
215       O << ":upper16:";
216     GetARMGVSymbol(GV, TF)->print(O, MAI);
217 
218     printOffset(MO.getOffset(), O);
219     break;
220   }
221   case MachineOperand::MO_ConstantPoolIndex:
222     GetCPISymbol(MO.getIndex())->print(O, MAI);
223     break;
224   }
225 }
226 
227 //===--------------------------------------------------------------------===//
228 
229 MCSymbol *ARMAsmPrinter::
230 GetARMJTIPICJumpTableLabel(unsigned uid) const {
231   const DataLayout &DL = getDataLayout();
232   SmallString<60> Name;
233   raw_svector_ostream(Name) << DL.getPrivateGlobalPrefix() << "JTI"
234                             << getFunctionNumber() << '_' << uid;
235   return OutContext.getOrCreateSymbol(Name);
236 }
237 
238 bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
239                                     unsigned AsmVariant, const char *ExtraCode,
240                                     raw_ostream &O) {
241   // Does this asm operand have a single letter operand modifier?
242   if (ExtraCode && ExtraCode[0]) {
243     if (ExtraCode[1] != 0) return true; // Unknown modifier.
244 
245     switch (ExtraCode[0]) {
246     default:
247       // See if this is a generic print operand
248       return AsmPrinter::PrintAsmOperand(MI, OpNum, AsmVariant, ExtraCode, O);
249     case 'a': // Print as a memory address.
250       if (MI->getOperand(OpNum).isReg()) {
251         O << "["
252           << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg())
253           << "]";
254         return false;
255       }
256       LLVM_FALLTHROUGH;
257     case 'c': // Don't print "#" before an immediate operand.
258       if (!MI->getOperand(OpNum).isImm())
259         return true;
260       O << MI->getOperand(OpNum).getImm();
261       return false;
262     case 'P': // Print a VFP double precision register.
263     case 'q': // Print a NEON quad precision register.
264       printOperand(MI, OpNum, O);
265       return false;
266     case 'y': // Print a VFP single precision register as indexed double.
267       if (MI->getOperand(OpNum).isReg()) {
268         unsigned Reg = MI->getOperand(OpNum).getReg();
269         const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
270         // Find the 'd' register that has this 's' register as a sub-register,
271         // and determine the lane number.
272         for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR) {
273           if (!ARM::DPRRegClass.contains(*SR))
274             continue;
275           bool Lane0 = TRI->getSubReg(*SR, ARM::ssub_0) == Reg;
276           O << ARMInstPrinter::getRegisterName(*SR) << (Lane0 ? "[0]" : "[1]");
277           return false;
278         }
279       }
280       return true;
281     case 'B': // Bitwise inverse of integer or symbol without a preceding #.
282       if (!MI->getOperand(OpNum).isImm())
283         return true;
284       O << ~(MI->getOperand(OpNum).getImm());
285       return false;
286     case 'L': // The low 16 bits of an immediate constant.
287       if (!MI->getOperand(OpNum).isImm())
288         return true;
289       O << (MI->getOperand(OpNum).getImm() & 0xffff);
290       return false;
291     case 'M': { // A register range suitable for LDM/STM.
292       if (!MI->getOperand(OpNum).isReg())
293         return true;
294       const MachineOperand &MO = MI->getOperand(OpNum);
295       unsigned RegBegin = MO.getReg();
296       // This takes advantage of the 2 operand-ness of ldm/stm and that we've
297       // already got the operands in registers that are operands to the
298       // inline asm statement.
299       O << "{";
300       if (ARM::GPRPairRegClass.contains(RegBegin)) {
301         const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
302         unsigned Reg0 = TRI->getSubReg(RegBegin, ARM::gsub_0);
303         O << ARMInstPrinter::getRegisterName(Reg0) << ", ";
304         RegBegin = TRI->getSubReg(RegBegin, ARM::gsub_1);
305       }
306       O << ARMInstPrinter::getRegisterName(RegBegin);
307 
308       // FIXME: The register allocator not only may not have given us the
309       // registers in sequence, but may not be in ascending registers. This
310       // will require changes in the register allocator that'll need to be
311       // propagated down here if the operands change.
312       unsigned RegOps = OpNum + 1;
313       while (MI->getOperand(RegOps).isReg()) {
314         O << ", "
315           << ARMInstPrinter::getRegisterName(MI->getOperand(RegOps).getReg());
316         RegOps++;
317       }
318 
319       O << "}";
320 
321       return false;
322     }
323     case 'R': // The most significant register of a pair.
324     case 'Q': { // The least significant register of a pair.
325       if (OpNum == 0)
326         return true;
327       const MachineOperand &FlagsOP = MI->getOperand(OpNum - 1);
328       if (!FlagsOP.isImm())
329         return true;
330       unsigned Flags = FlagsOP.getImm();
331 
332       // This operand may not be the one that actually provides the register. If
333       // it's tied to a previous one then we should refer instead to that one
334       // for registers and their classes.
335       unsigned TiedIdx;
336       if (InlineAsm::isUseOperandTiedToDef(Flags, TiedIdx)) {
337         for (OpNum = InlineAsm::MIOp_FirstOperand; TiedIdx; --TiedIdx) {
338           unsigned OpFlags = MI->getOperand(OpNum).getImm();
339           OpNum += InlineAsm::getNumOperandRegisters(OpFlags) + 1;
340         }
341         Flags = MI->getOperand(OpNum).getImm();
342 
343         // Later code expects OpNum to be pointing at the register rather than
344         // the flags.
345         OpNum += 1;
346       }
347 
348       unsigned NumVals = InlineAsm::getNumOperandRegisters(Flags);
349       unsigned RC;
350       InlineAsm::hasRegClassConstraint(Flags, RC);
351       if (RC == ARM::GPRPairRegClassID) {
352         if (NumVals != 1)
353           return true;
354         const MachineOperand &MO = MI->getOperand(OpNum);
355         if (!MO.isReg())
356           return true;
357         const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
358         unsigned Reg = TRI->getSubReg(MO.getReg(), ExtraCode[0] == 'Q' ?
359             ARM::gsub_0 : ARM::gsub_1);
360         O << ARMInstPrinter::getRegisterName(Reg);
361         return false;
362       }
363       if (NumVals != 2)
364         return true;
365       unsigned RegOp = ExtraCode[0] == 'Q' ? OpNum : OpNum + 1;
366       if (RegOp >= MI->getNumOperands())
367         return true;
368       const MachineOperand &MO = MI->getOperand(RegOp);
369       if (!MO.isReg())
370         return true;
371       unsigned Reg = MO.getReg();
372       O << ARMInstPrinter::getRegisterName(Reg);
373       return false;
374     }
375 
376     case 'e': // The low doubleword register of a NEON quad register.
377     case 'f': { // The high doubleword register of a NEON quad register.
378       if (!MI->getOperand(OpNum).isReg())
379         return true;
380       unsigned Reg = MI->getOperand(OpNum).getReg();
381       if (!ARM::QPRRegClass.contains(Reg))
382         return true;
383       const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
384       unsigned SubReg = TRI->getSubReg(Reg, ExtraCode[0] == 'e' ?
385                                        ARM::dsub_0 : ARM::dsub_1);
386       O << ARMInstPrinter::getRegisterName(SubReg);
387       return false;
388     }
389 
390     // This modifier is not yet supported.
391     case 'h': // A range of VFP/NEON registers suitable for VLD1/VST1.
392       return true;
393     case 'H': { // The highest-numbered register of a pair.
394       const MachineOperand &MO = MI->getOperand(OpNum);
395       if (!MO.isReg())
396         return true;
397       const MachineFunction &MF = *MI->getParent()->getParent();
398       const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
399       unsigned Reg = MO.getReg();
400       if(!ARM::GPRPairRegClass.contains(Reg))
401         return false;
402       Reg = TRI->getSubReg(Reg, ARM::gsub_1);
403       O << ARMInstPrinter::getRegisterName(Reg);
404       return false;
405     }
406     }
407   }
408 
409   printOperand(MI, OpNum, O);
410   return false;
411 }
412 
413 bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
414                                           unsigned OpNum, unsigned AsmVariant,
415                                           const char *ExtraCode,
416                                           raw_ostream &O) {
417   // Does this asm operand have a single letter operand modifier?
418   if (ExtraCode && ExtraCode[0]) {
419     if (ExtraCode[1] != 0) return true; // Unknown modifier.
420 
421     switch (ExtraCode[0]) {
422       case 'A': // A memory operand for a VLD1/VST1 instruction.
423       default: return true;  // Unknown modifier.
424       case 'm': // The base register of a memory operand.
425         if (!MI->getOperand(OpNum).isReg())
426           return true;
427         O << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg());
428         return false;
429     }
430   }
431 
432   const MachineOperand &MO = MI->getOperand(OpNum);
433   assert(MO.isReg() && "unexpected inline asm memory operand");
434   O << "[" << ARMInstPrinter::getRegisterName(MO.getReg()) << "]";
435   return false;
436 }
437 
438 static bool isThumb(const MCSubtargetInfo& STI) {
439   return STI.getFeatureBits()[ARM::ModeThumb];
440 }
441 
442 void ARMAsmPrinter::emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
443                                      const MCSubtargetInfo *EndInfo) const {
444   // If either end mode is unknown (EndInfo == NULL) or different than
445   // the start mode, then restore the start mode.
446   const bool WasThumb = isThumb(StartInfo);
447   if (!EndInfo || WasThumb != isThumb(*EndInfo)) {
448     OutStreamer->EmitAssemblerFlag(WasThumb ? MCAF_Code16 : MCAF_Code32);
449   }
450 }
451 
452 void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
453   const Triple &TT = TM.getTargetTriple();
454   // Use unified assembler syntax.
455   OutStreamer->EmitAssemblerFlag(MCAF_SyntaxUnified);
456 
457   // Emit ARM Build Attributes
458   if (TT.isOSBinFormatELF())
459     emitAttributes();
460 
461   // Use the triple's architecture and subarchitecture to determine
462   // if we're thumb for the purposes of the top level code16 assembler
463   // flag.
464   bool isThumb = TT.getArch() == Triple::thumb ||
465                  TT.getArch() == Triple::thumbeb ||
466                  TT.getSubArch() == Triple::ARMSubArch_v7m ||
467                  TT.getSubArch() == Triple::ARMSubArch_v6m;
468   if (!M.getModuleInlineAsm().empty() && isThumb)
469     OutStreamer->EmitAssemblerFlag(MCAF_Code16);
470 }
471 
472 static void
473 emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel,
474                          MachineModuleInfoImpl::StubValueTy &MCSym) {
475   // L_foo$stub:
476   OutStreamer.EmitLabel(StubLabel);
477   //   .indirect_symbol _foo
478   OutStreamer.EmitSymbolAttribute(MCSym.getPointer(), MCSA_IndirectSymbol);
479 
480   if (MCSym.getInt())
481     // External to current translation unit.
482     OutStreamer.EmitIntValue(0, 4/*size*/);
483   else
484     // Internal to current translation unit.
485     //
486     // When we place the LSDA into the TEXT section, the type info
487     // pointers need to be indirect and pc-rel. We accomplish this by
488     // using NLPs; however, sometimes the types are local to the file.
489     // We need to fill in the value for the NLP in those cases.
490     OutStreamer.EmitValue(
491         MCSymbolRefExpr::create(MCSym.getPointer(), OutStreamer.getContext()),
492         4 /*size*/);
493 }
494 
495 
496 void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
497   const Triple &TT = TM.getTargetTriple();
498   if (TT.isOSBinFormatMachO()) {
499     // All darwin targets use mach-o.
500     const TargetLoweringObjectFileMachO &TLOFMacho =
501       static_cast<const TargetLoweringObjectFileMachO &>(getObjFileLowering());
502     MachineModuleInfoMachO &MMIMacho =
503       MMI->getObjFileInfo<MachineModuleInfoMachO>();
504 
505     // Output non-lazy-pointers for external and common global variables.
506     MachineModuleInfoMachO::SymbolListTy Stubs = MMIMacho.GetGVStubList();
507 
508     if (!Stubs.empty()) {
509       // Switch with ".non_lazy_symbol_pointer" directive.
510       OutStreamer->SwitchSection(TLOFMacho.getNonLazySymbolPointerSection());
511       EmitAlignment(2);
512 
513       for (auto &Stub : Stubs)
514         emitNonLazySymbolPointer(*OutStreamer, Stub.first, Stub.second);
515 
516       Stubs.clear();
517       OutStreamer->AddBlankLine();
518     }
519 
520     Stubs = MMIMacho.GetThreadLocalGVStubList();
521     if (!Stubs.empty()) {
522       // Switch with ".non_lazy_symbol_pointer" directive.
523       OutStreamer->SwitchSection(TLOFMacho.getThreadLocalPointerSection());
524       EmitAlignment(2);
525 
526       for (auto &Stub : Stubs)
527         emitNonLazySymbolPointer(*OutStreamer, Stub.first, Stub.second);
528 
529       Stubs.clear();
530       OutStreamer->AddBlankLine();
531     }
532 
533     // Funny Darwin hack: This flag tells the linker that no global symbols
534     // contain code that falls through to other global symbols (e.g. the obvious
535     // implementation of multiple entry points).  If this doesn't occur, the
536     // linker can safely perform dead code stripping.  Since LLVM never
537     // generates code that does this, it is always safe to set.
538     OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
539   }
540 
541   if (TT.isOSBinFormatCOFF()) {
542     const auto &TLOF =
543         static_cast<const TargetLoweringObjectFileCOFF &>(getObjFileLowering());
544 
545     std::string Flags;
546     raw_string_ostream OS(Flags);
547 
548     for (const auto &Function : M)
549       TLOF.emitLinkerFlagsForGlobal(OS, &Function);
550     for (const auto &Global : M.globals())
551       TLOF.emitLinkerFlagsForGlobal(OS, &Global);
552     for (const auto &Alias : M.aliases())
553       TLOF.emitLinkerFlagsForGlobal(OS, &Alias);
554 
555     OS.flush();
556 
557     // Output collected flags
558     if (!Flags.empty()) {
559       OutStreamer->SwitchSection(TLOF.getDrectveSection());
560       OutStreamer->EmitBytes(Flags);
561     }
562   }
563 
564   // The last attribute to be emitted is ABI_optimization_goals
565   MCTargetStreamer &TS = *OutStreamer->getTargetStreamer();
566   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
567 
568   if (OptimizationGoals > 0 &&
569       (Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI() ||
570        Subtarget->isTargetMuslAEABI()))
571     ATS.emitAttribute(ARMBuildAttrs::ABI_optimization_goals, OptimizationGoals);
572   OptimizationGoals = -1;
573 
574   ATS.finishAttributeSection();
575 }
576 
577 static bool isV8M(const ARMSubtarget *Subtarget) {
578   // Note that v8M Baseline is a subset of v6T2!
579   return (Subtarget->hasV8MBaselineOps() && !Subtarget->hasV6T2Ops()) ||
580          Subtarget->hasV8MMainlineOps();
581 }
582 
583 //===----------------------------------------------------------------------===//
584 // Helper routines for EmitStartOfAsmFile() and EmitEndOfAsmFile()
585 // FIXME:
586 // The following seem like one-off assembler flags, but they actually need
587 // to appear in the .ARM.attributes section in ELF.
588 // Instead of subclassing the MCELFStreamer, we do the work here.
589 
590 static ARMBuildAttrs::CPUArch getArchForCPU(StringRef CPU,
591                                             const ARMSubtarget *Subtarget) {
592   if (CPU == "xscale")
593     return ARMBuildAttrs::v5TEJ;
594 
595   if (Subtarget->hasV8Ops())
596     return ARMBuildAttrs::v8_A;
597   else if (Subtarget->hasV8MMainlineOps())
598     return ARMBuildAttrs::v8_M_Main;
599   else if (Subtarget->hasV7Ops()) {
600     if (Subtarget->isMClass() && Subtarget->hasDSP())
601       return ARMBuildAttrs::v7E_M;
602     return ARMBuildAttrs::v7;
603   } else if (Subtarget->hasV6T2Ops())
604     return ARMBuildAttrs::v6T2;
605   else if (Subtarget->hasV8MBaselineOps())
606     return ARMBuildAttrs::v8_M_Base;
607   else if (Subtarget->hasV6MOps())
608     return ARMBuildAttrs::v6S_M;
609   else if (Subtarget->hasV6Ops())
610     return ARMBuildAttrs::v6;
611   else if (Subtarget->hasV5TEOps())
612     return ARMBuildAttrs::v5TE;
613   else if (Subtarget->hasV5TOps())
614     return ARMBuildAttrs::v5T;
615   else if (Subtarget->hasV4TOps())
616     return ARMBuildAttrs::v4T;
617   else
618     return ARMBuildAttrs::v4;
619 }
620 
621 // Returns true if all functions have the same function attribute value
622 static bool haveAllFunctionsAttribute(const Module &M, StringRef Attr,
623                                       StringRef Value) {
624   for (auto &F : M)
625     if (F.getFnAttribute(Attr).getValueAsString() != Value)
626       return false;
627 
628   return true;
629 }
630 
631 
632 void ARMAsmPrinter::emitAttributes() {
633   MCTargetStreamer &TS = *OutStreamer->getTargetStreamer();
634   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
635 
636   ATS.emitTextAttribute(ARMBuildAttrs::conformance, "2.09");
637 
638   ATS.switchVendor("aeabi");
639 
640   // Compute ARM ELF Attributes based on the default subtarget that
641   // we'd have constructed. The existing ARM behavior isn't LTO clean
642   // anyhow.
643   // FIXME: For ifunc related functions we could iterate over and look
644   // for a feature string that doesn't match the default one.
645   const Triple &TT = TM.getTargetTriple();
646   StringRef CPU = TM.getTargetCPU();
647   StringRef FS = TM.getTargetFeatureString();
648   std::string ArchFS = ARM_MC::ParseARMTriple(TT, CPU);
649   if (!FS.empty()) {
650     if (!ArchFS.empty())
651       ArchFS = (Twine(ArchFS) + "," + FS).str();
652     else
653       ArchFS = FS;
654   }
655   const ARMBaseTargetMachine &ATM =
656       static_cast<const ARMBaseTargetMachine &>(TM);
657   const ARMSubtarget STI(TT, CPU, ArchFS, ATM, ATM.isLittleEndian());
658 
659   const std::string &CPUString = STI.getCPUString();
660 
661   if (!StringRef(CPUString).startswith("generic")) {
662     // FIXME: remove krait check when GNU tools support krait cpu
663     if (STI.isKrait()) {
664       ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, "cortex-a9");
665       // We consider krait as a "cortex-a9" + hwdiv CPU
666       // Enable hwdiv through ".arch_extension idiv"
667       if (STI.hasDivide() || STI.hasDivideInARMMode())
668         ATS.emitArchExtension(ARM::AEK_HWDIV | ARM::AEK_HWDIVARM);
669     } else
670       ATS.emitTextAttribute(ARMBuildAttrs::CPU_name, CPUString);
671   }
672 
673   ATS.emitAttribute(ARMBuildAttrs::CPU_arch, getArchForCPU(CPUString, &STI));
674 
675   // Tag_CPU_arch_profile must have the default value of 0 when "Architecture
676   // profile is not applicable (e.g. pre v7, or cross-profile code)".
677   if (STI.hasV7Ops() || isV8M(&STI)) {
678     if (STI.isAClass()) {
679       ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
680                         ARMBuildAttrs::ApplicationProfile);
681     } else if (STI.isRClass()) {
682       ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
683                         ARMBuildAttrs::RealTimeProfile);
684     } else if (STI.isMClass()) {
685       ATS.emitAttribute(ARMBuildAttrs::CPU_arch_profile,
686                         ARMBuildAttrs::MicroControllerProfile);
687     }
688   }
689 
690   ATS.emitAttribute(ARMBuildAttrs::ARM_ISA_use,
691                     STI.hasARMOps() ? ARMBuildAttrs::Allowed
692                                     : ARMBuildAttrs::Not_Allowed);
693   if (isV8M(&STI)) {
694     ATS.emitAttribute(ARMBuildAttrs::THUMB_ISA_use,
695                       ARMBuildAttrs::AllowThumbDerived);
696   } else if (STI.isThumb1Only()) {
697     ATS.emitAttribute(ARMBuildAttrs::THUMB_ISA_use, ARMBuildAttrs::Allowed);
698   } else if (STI.hasThumb2()) {
699     ATS.emitAttribute(ARMBuildAttrs::THUMB_ISA_use,
700                       ARMBuildAttrs::AllowThumb32);
701   }
702 
703   if (STI.hasNEON()) {
704     /* NEON is not exactly a VFP architecture, but GAS emit one of
705      * neon/neon-fp-armv8/neon-vfpv4/vfpv3/vfpv2 for .fpu parameters */
706     if (STI.hasFPARMv8()) {
707       if (STI.hasCrypto())
708         ATS.emitFPU(ARM::FK_CRYPTO_NEON_FP_ARMV8);
709       else
710         ATS.emitFPU(ARM::FK_NEON_FP_ARMV8);
711     } else if (STI.hasVFP4())
712       ATS.emitFPU(ARM::FK_NEON_VFPV4);
713     else
714       ATS.emitFPU(STI.hasFP16() ? ARM::FK_NEON_FP16 : ARM::FK_NEON);
715     // Emit Tag_Advanced_SIMD_arch for ARMv8 architecture
716     if (STI.hasV8Ops())
717       ATS.emitAttribute(ARMBuildAttrs::Advanced_SIMD_arch,
718                         STI.hasV8_1aOps() ? ARMBuildAttrs::AllowNeonARMv8_1a:
719                                             ARMBuildAttrs::AllowNeonARMv8);
720   } else {
721     if (STI.hasFPARMv8())
722       // FPv5 and FP-ARMv8 have the same instructions, so are modeled as one
723       // FPU, but there are two different names for it depending on the CPU.
724       ATS.emitFPU(STI.hasD16()
725                   ? (STI.isFPOnlySP() ? ARM::FK_FPV5_SP_D16 : ARM::FK_FPV5_D16)
726                   : ARM::FK_FP_ARMV8);
727     else if (STI.hasVFP4())
728       ATS.emitFPU(STI.hasD16()
729                   ? (STI.isFPOnlySP() ? ARM::FK_FPV4_SP_D16 : ARM::FK_VFPV4_D16)
730                   : ARM::FK_VFPV4);
731     else if (STI.hasVFP3())
732       ATS.emitFPU(STI.hasD16()
733                   // +d16
734                   ? (STI.isFPOnlySP()
735                      ? (STI.hasFP16() ? ARM::FK_VFPV3XD_FP16 : ARM::FK_VFPV3XD)
736                      : (STI.hasFP16() ? ARM::FK_VFPV3_D16_FP16 : ARM::FK_VFPV3_D16))
737                   // -d16
738                   : (STI.hasFP16() ? ARM::FK_VFPV3_FP16 : ARM::FK_VFPV3));
739     else if (STI.hasVFP2())
740       ATS.emitFPU(ARM::FK_VFPV2);
741   }
742 
743   // RW data addressing.
744   if (isPositionIndependent()) {
745     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_RW_data,
746                       ARMBuildAttrs::AddressRWPCRel);
747   } else if (STI.isRWPI()) {
748     // RWPI specific attributes.
749     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_RW_data,
750                       ARMBuildAttrs::AddressRWSBRel);
751   }
752 
753   // RO data addressing.
754   if (isPositionIndependent() || STI.isROPI()) {
755     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_RO_data,
756                       ARMBuildAttrs::AddressROPCRel);
757   }
758 
759   // GOT use.
760   if (isPositionIndependent()) {
761     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_GOT_use,
762                       ARMBuildAttrs::AddressGOT);
763   } else {
764     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_GOT_use,
765                       ARMBuildAttrs::AddressDirect);
766   }
767 
768   // Set FP Denormals.
769   if (haveAllFunctionsAttribute(*MMI->getModule(), "denormal-fp-math",
770                                 "preserve-sign") ||
771       TM.Options.FPDenormalType == FPDenormal::PreserveSign)
772     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal,
773                       ARMBuildAttrs::PreserveFPSign);
774   else if (haveAllFunctionsAttribute(*MMI->getModule(), "denormal-fp-math",
775                                      "positive-zero") ||
776            TM.Options.FPDenormalType == FPDenormal::PositiveZero)
777     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal,
778                       ARMBuildAttrs::PositiveZero);
779   else if (!TM.Options.UnsafeFPMath)
780     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal,
781                       ARMBuildAttrs::IEEEDenormals);
782   else {
783     if (!STI.hasVFP2()) {
784       // When the target doesn't have an FPU (by design or
785       // intention), the assumptions made on the software support
786       // mirror that of the equivalent hardware support *if it
787       // existed*. For v7 and better we indicate that denormals are
788       // flushed preserving sign, and for V6 we indicate that
789       // denormals are flushed to positive zero.
790       if (STI.hasV7Ops())
791         ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal,
792                           ARMBuildAttrs::PreserveFPSign);
793     } else if (STI.hasVFP3()) {
794       // In VFPv4, VFPv4U, VFPv3, or VFPv3U, it is preserved. That is,
795       // the sign bit of the zero matches the sign bit of the input or
796       // result that is being flushed to zero.
797       ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal,
798                         ARMBuildAttrs::PreserveFPSign);
799     }
800     // For VFPv2 implementations it is implementation defined as
801     // to whether denormals are flushed to positive zero or to
802     // whatever the sign of zero is (ARM v7AR ARM 2.7.5). Historically
803     // LLVM has chosen to flush this to positive zero (most likely for
804     // GCC compatibility), so that's the chosen value here (the
805     // absence of its emission implies zero).
806   }
807 
808   // Set FP exceptions and rounding
809   if (haveAllFunctionsAttribute(*MMI->getModule(), "no-trapping-math", "true") ||
810       TM.Options.NoTrappingFPMath)
811     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions,
812                       ARMBuildAttrs::Not_Allowed);
813   else if (!TM.Options.UnsafeFPMath) {
814     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, ARMBuildAttrs::Allowed);
815 
816     // If the user has permitted this code to choose the IEEE 754
817     // rounding at run-time, emit the rounding attribute.
818     if (TM.Options.HonorSignDependentRoundingFPMathOption)
819       ATS.emitAttribute(ARMBuildAttrs::ABI_FP_rounding, ARMBuildAttrs::Allowed);
820   }
821 
822   // TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath is the
823   // equivalent of GCC's -ffinite-math-only flag.
824   if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath)
825     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model,
826                       ARMBuildAttrs::Allowed);
827   else
828     ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model,
829                       ARMBuildAttrs::AllowIEE754);
830 
831   if (STI.allowsUnalignedMem())
832     ATS.emitAttribute(ARMBuildAttrs::CPU_unaligned_access,
833                       ARMBuildAttrs::Allowed);
834   else
835     ATS.emitAttribute(ARMBuildAttrs::CPU_unaligned_access,
836                       ARMBuildAttrs::Not_Allowed);
837 
838   // FIXME: add more flags to ARMBuildAttributes.h
839   // 8-bytes alignment stuff.
840   ATS.emitAttribute(ARMBuildAttrs::ABI_align_needed, 1);
841   ATS.emitAttribute(ARMBuildAttrs::ABI_align_preserved, 1);
842 
843   // ABI_HardFP_use attribute to indicate single precision FP.
844   if (STI.isFPOnlySP())
845     ATS.emitAttribute(ARMBuildAttrs::ABI_HardFP_use,
846                       ARMBuildAttrs::HardFPSinglePrecision);
847 
848   // Hard float.  Use both S and D registers and conform to AAPCS-VFP.
849   if (STI.isAAPCS_ABI() && TM.Options.FloatABIType == FloatABI::Hard)
850     ATS.emitAttribute(ARMBuildAttrs::ABI_VFP_args, ARMBuildAttrs::HardFPAAPCS);
851 
852   // FIXME: Should we signal R9 usage?
853 
854   if (STI.hasFP16())
855     ATS.emitAttribute(ARMBuildAttrs::FP_HP_extension, ARMBuildAttrs::AllowHPFP);
856 
857   // FIXME: To support emitting this build attribute as GCC does, the
858   // -mfp16-format option and associated plumbing must be
859   // supported. For now the __fp16 type is exposed by default, so this
860   // attribute should be emitted with value 1.
861   ATS.emitAttribute(ARMBuildAttrs::ABI_FP_16bit_format,
862                     ARMBuildAttrs::FP16FormatIEEE);
863 
864   if (STI.hasMPExtension())
865     ATS.emitAttribute(ARMBuildAttrs::MPextension_use, ARMBuildAttrs::AllowMP);
866 
867   // Hardware divide in ARM mode is part of base arch, starting from ARMv8.
868   // If only Thumb hwdiv is present, it must also be in base arch (ARMv7-R/M).
869   // It is not possible to produce DisallowDIV: if hwdiv is present in the base
870   // arch, supplying -hwdiv downgrades the effective arch, via ClearImpliedBits.
871   // AllowDIVExt is only emitted if hwdiv isn't available in the base arch;
872   // otherwise, the default value (AllowDIVIfExists) applies.
873   if (STI.hasDivideInARMMode() && !STI.hasV8Ops())
874     ATS.emitAttribute(ARMBuildAttrs::DIV_use, ARMBuildAttrs::AllowDIVExt);
875 
876   if (STI.hasDSP() && isV8M(&STI))
877     ATS.emitAttribute(ARMBuildAttrs::DSP_extension, ARMBuildAttrs::Allowed);
878 
879   if (MMI) {
880     if (const Module *SourceModule = MMI->getModule()) {
881       // ABI_PCS_wchar_t to indicate wchar_t width
882       // FIXME: There is no way to emit value 0 (wchar_t prohibited).
883       if (auto WCharWidthValue = mdconst::extract_or_null<ConstantInt>(
884               SourceModule->getModuleFlag("wchar_size"))) {
885         int WCharWidth = WCharWidthValue->getZExtValue();
886         assert((WCharWidth == 2 || WCharWidth == 4) &&
887                "wchar_t width must be 2 or 4 bytes");
888         ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_wchar_t, WCharWidth);
889       }
890 
891       // ABI_enum_size to indicate enum width
892       // FIXME: There is no way to emit value 0 (enums prohibited) or value 3
893       //        (all enums contain a value needing 32 bits to encode).
894       if (auto EnumWidthValue = mdconst::extract_or_null<ConstantInt>(
895               SourceModule->getModuleFlag("min_enum_size"))) {
896         int EnumWidth = EnumWidthValue->getZExtValue();
897         assert((EnumWidth == 1 || EnumWidth == 4) &&
898                "Minimum enum width must be 1 or 4 bytes");
899         int EnumBuildAttr = EnumWidth == 1 ? 1 : 2;
900         ATS.emitAttribute(ARMBuildAttrs::ABI_enum_size, EnumBuildAttr);
901       }
902     }
903   }
904 
905   // We currently do not support using R9 as the TLS pointer.
906   if (STI.isRWPI())
907     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_R9_use,
908                       ARMBuildAttrs::R9IsSB);
909   else if (STI.isR9Reserved())
910     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_R9_use,
911                       ARMBuildAttrs::R9Reserved);
912   else
913     ATS.emitAttribute(ARMBuildAttrs::ABI_PCS_R9_use,
914                       ARMBuildAttrs::R9IsGPR);
915 
916   if (STI.hasTrustZone() && STI.hasVirtualization())
917     ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
918                       ARMBuildAttrs::AllowTZVirtualization);
919   else if (STI.hasTrustZone())
920     ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
921                       ARMBuildAttrs::AllowTZ);
922   else if (STI.hasVirtualization())
923     ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,
924                       ARMBuildAttrs::AllowVirtualization);
925 }
926 
927 //===----------------------------------------------------------------------===//
928 
929 static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber,
930                              unsigned LabelId, MCContext &Ctx) {
931 
932   MCSymbol *Label = Ctx.getOrCreateSymbol(Twine(Prefix)
933                        + "PC" + Twine(FunctionNumber) + "_" + Twine(LabelId));
934   return Label;
935 }
936 
937 static MCSymbolRefExpr::VariantKind
938 getModifierVariantKind(ARMCP::ARMCPModifier Modifier) {
939   switch (Modifier) {
940   case ARMCP::no_modifier:
941     return MCSymbolRefExpr::VK_None;
942   case ARMCP::TLSGD:
943     return MCSymbolRefExpr::VK_TLSGD;
944   case ARMCP::TPOFF:
945     return MCSymbolRefExpr::VK_TPOFF;
946   case ARMCP::GOTTPOFF:
947     return MCSymbolRefExpr::VK_GOTTPOFF;
948   case ARMCP::SBREL:
949     return MCSymbolRefExpr::VK_ARM_SBREL;
950   case ARMCP::GOT_PREL:
951     return MCSymbolRefExpr::VK_ARM_GOT_PREL;
952   case ARMCP::SECREL:
953     return MCSymbolRefExpr::VK_SECREL;
954   }
955   llvm_unreachable("Invalid ARMCPModifier!");
956 }
957 
958 MCSymbol *ARMAsmPrinter::GetARMGVSymbol(const GlobalValue *GV,
959                                         unsigned char TargetFlags) {
960   if (Subtarget->isTargetMachO()) {
961     bool IsIndirect =
962         (TargetFlags & ARMII::MO_NONLAZY) && Subtarget->isGVIndirectSymbol(GV);
963 
964     if (!IsIndirect)
965       return getSymbol(GV);
966 
967     // FIXME: Remove this when Darwin transition to @GOT like syntax.
968     MCSymbol *MCSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr");
969     MachineModuleInfoMachO &MMIMachO =
970       MMI->getObjFileInfo<MachineModuleInfoMachO>();
971     MachineModuleInfoImpl::StubValueTy &StubSym =
972         GV->isThreadLocal() ? MMIMachO.getThreadLocalGVStubEntry(MCSym)
973                             : MMIMachO.getGVStubEntry(MCSym);
974 
975     if (!StubSym.getPointer())
976       StubSym = MachineModuleInfoImpl::StubValueTy(getSymbol(GV),
977                                                    !GV->hasInternalLinkage());
978     return MCSym;
979   } else if (Subtarget->isTargetCOFF()) {
980     assert(Subtarget->isTargetWindows() &&
981            "Windows is the only supported COFF target");
982 
983     bool IsIndirect = (TargetFlags & ARMII::MO_DLLIMPORT);
984     if (!IsIndirect)
985       return getSymbol(GV);
986 
987     SmallString<128> Name;
988     Name = "__imp_";
989     getNameWithPrefix(Name, GV);
990 
991     return OutContext.getOrCreateSymbol(Name);
992   } else if (Subtarget->isTargetELF()) {
993     return getSymbol(GV);
994   }
995   llvm_unreachable("unexpected target");
996 }
997 
998 void ARMAsmPrinter::
999 EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
1000   const DataLayout &DL = getDataLayout();
1001   int Size = DL.getTypeAllocSize(MCPV->getType());
1002 
1003   ARMConstantPoolValue *ACPV = static_cast<ARMConstantPoolValue*>(MCPV);
1004 
1005   MCSymbol *MCSym;
1006   if (ACPV->isLSDA()) {
1007     MCSym = getCurExceptionSym();
1008   } else if (ACPV->isBlockAddress()) {
1009     const BlockAddress *BA =
1010       cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
1011     MCSym = GetBlockAddressSymbol(BA);
1012   } else if (ACPV->isGlobalValue()) {
1013     const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
1014 
1015     // On Darwin, const-pool entries may get the "FOO$non_lazy_ptr" mangling, so
1016     // flag the global as MO_NONLAZY.
1017     unsigned char TF = Subtarget->isTargetMachO() ? ARMII::MO_NONLAZY : 0;
1018     MCSym = GetARMGVSymbol(GV, TF);
1019   } else if (ACPV->isMachineBasicBlock()) {
1020     const MachineBasicBlock *MBB = cast<ARMConstantPoolMBB>(ACPV)->getMBB();
1021     MCSym = MBB->getSymbol();
1022   } else {
1023     assert(ACPV->isExtSymbol() && "unrecognized constant pool value");
1024     const char *Sym = cast<ARMConstantPoolSymbol>(ACPV)->getSymbol();
1025     MCSym = GetExternalSymbolSymbol(Sym);
1026   }
1027 
1028   // Create an MCSymbol for the reference.
1029   const MCExpr *Expr =
1030     MCSymbolRefExpr::create(MCSym, getModifierVariantKind(ACPV->getModifier()),
1031                             OutContext);
1032 
1033   if (ACPV->getPCAdjustment()) {
1034     MCSymbol *PCLabel =
1035         getPICLabel(DL.getPrivateGlobalPrefix(), getFunctionNumber(),
1036                     ACPV->getLabelId(), OutContext);
1037     const MCExpr *PCRelExpr = MCSymbolRefExpr::create(PCLabel, OutContext);
1038     PCRelExpr =
1039       MCBinaryExpr::createAdd(PCRelExpr,
1040                               MCConstantExpr::create(ACPV->getPCAdjustment(),
1041                                                      OutContext),
1042                               OutContext);
1043     if (ACPV->mustAddCurrentAddress()) {
1044       // We want "(<expr> - .)", but MC doesn't have a concept of the '.'
1045       // label, so just emit a local label end reference that instead.
1046       MCSymbol *DotSym = OutContext.createTempSymbol();
1047       OutStreamer->EmitLabel(DotSym);
1048       const MCExpr *DotExpr = MCSymbolRefExpr::create(DotSym, OutContext);
1049       PCRelExpr = MCBinaryExpr::createSub(PCRelExpr, DotExpr, OutContext);
1050     }
1051     Expr = MCBinaryExpr::createSub(Expr, PCRelExpr, OutContext);
1052   }
1053   OutStreamer->EmitValue(Expr, Size);
1054 }
1055 
1056 void ARMAsmPrinter::EmitJumpTableAddrs(const MachineInstr *MI) {
1057   const MachineOperand &MO1 = MI->getOperand(1);
1058   unsigned JTI = MO1.getIndex();
1059 
1060   // Make sure the Thumb jump table is 4-byte aligned. This will be a nop for
1061   // ARM mode tables.
1062   EmitAlignment(2);
1063 
1064   // Emit a label for the jump table.
1065   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1066   OutStreamer->EmitLabel(JTISymbol);
1067 
1068   // Mark the jump table as data-in-code.
1069   OutStreamer->EmitDataRegion(MCDR_DataRegionJT32);
1070 
1071   // Emit each entry of the table.
1072   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
1073   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
1074   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1075 
1076   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
1077     MachineBasicBlock *MBB = JTBBs[i];
1078     // Construct an MCExpr for the entry. We want a value of the form:
1079     // (BasicBlockAddr - TableBeginAddr)
1080     //
1081     // For example, a table with entries jumping to basic blocks BB0 and BB1
1082     // would look like:
1083     // LJTI_0_0:
1084     //    .word (LBB0 - LJTI_0_0)
1085     //    .word (LBB1 - LJTI_0_0)
1086     const MCExpr *Expr = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
1087 
1088     if (isPositionIndependent() || Subtarget->isROPI())
1089       Expr = MCBinaryExpr::createSub(Expr, MCSymbolRefExpr::create(JTISymbol,
1090                                                                    OutContext),
1091                                      OutContext);
1092     // If we're generating a table of Thumb addresses in static relocation
1093     // model, we need to add one to keep interworking correctly.
1094     else if (AFI->isThumbFunction())
1095       Expr = MCBinaryExpr::createAdd(Expr, MCConstantExpr::create(1,OutContext),
1096                                      OutContext);
1097     OutStreamer->EmitValue(Expr, 4);
1098   }
1099   // Mark the end of jump table data-in-code region.
1100   OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
1101 }
1102 
1103 void ARMAsmPrinter::EmitJumpTableInsts(const MachineInstr *MI) {
1104   const MachineOperand &MO1 = MI->getOperand(1);
1105   unsigned JTI = MO1.getIndex();
1106 
1107   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1108   OutStreamer->EmitLabel(JTISymbol);
1109 
1110   // Emit each entry of the table.
1111   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
1112   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
1113   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1114 
1115   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
1116     MachineBasicBlock *MBB = JTBBs[i];
1117     const MCExpr *MBBSymbolExpr = MCSymbolRefExpr::create(MBB->getSymbol(),
1118                                                           OutContext);
1119     // If this isn't a TBB or TBH, the entries are direct branch instructions.
1120     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::t2B)
1121         .addExpr(MBBSymbolExpr)
1122         .addImm(ARMCC::AL)
1123         .addReg(0));
1124   }
1125 }
1126 
1127 void ARMAsmPrinter::EmitJumpTableTBInst(const MachineInstr *MI,
1128                                         unsigned OffsetWidth) {
1129   assert((OffsetWidth == 1 || OffsetWidth == 2) && "invalid tbb/tbh width");
1130   const MachineOperand &MO1 = MI->getOperand(1);
1131   unsigned JTI = MO1.getIndex();
1132 
1133   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1134   OutStreamer->EmitLabel(JTISymbol);
1135 
1136   // Emit each entry of the table.
1137   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
1138   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
1139   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1140 
1141   // Mark the jump table as data-in-code.
1142   OutStreamer->EmitDataRegion(OffsetWidth == 1 ? MCDR_DataRegionJT8
1143                                                : MCDR_DataRegionJT16);
1144 
1145   for (auto MBB : JTBBs) {
1146     const MCExpr *MBBSymbolExpr = MCSymbolRefExpr::create(MBB->getSymbol(),
1147                                                           OutContext);
1148     // Otherwise it's an offset from the dispatch instruction. Construct an
1149     // MCExpr for the entry. We want a value of the form:
1150     // (BasicBlockAddr - TBBInstAddr + 4) / 2
1151     //
1152     // For example, a TBB table with entries jumping to basic blocks BB0 and BB1
1153     // would look like:
1154     // LJTI_0_0:
1155     //    .byte (LBB0 - (LCPI0_0 + 4)) / 2
1156     //    .byte (LBB1 - (LCPI0_0 + 4)) / 2
1157     // where LCPI0_0 is a label defined just before the TBB instruction using
1158     // this table.
1159     MCSymbol *TBInstPC = GetCPISymbol(MI->getOperand(0).getImm());
1160     const MCExpr *Expr = MCBinaryExpr::createAdd(
1161         MCSymbolRefExpr::create(TBInstPC, OutContext),
1162         MCConstantExpr::create(4, OutContext), OutContext);
1163     Expr = MCBinaryExpr::createSub(MBBSymbolExpr, Expr, OutContext);
1164     Expr = MCBinaryExpr::createDiv(Expr, MCConstantExpr::create(2, OutContext),
1165                                    OutContext);
1166     OutStreamer->EmitValue(Expr, OffsetWidth);
1167   }
1168   // Mark the end of jump table data-in-code region. 32-bit offsets use
1169   // actual branch instructions here, so we don't mark those as a data-region
1170   // at all.
1171   OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
1172 
1173   // Make sure the next instruction is 2-byte aligned.
1174   EmitAlignment(1);
1175 }
1176 
1177 void ARMAsmPrinter::EmitUnwindingInstruction(const MachineInstr *MI) {
1178   assert(MI->getFlag(MachineInstr::FrameSetup) &&
1179       "Only instruction which are involved into frame setup code are allowed");
1180 
1181   MCTargetStreamer &TS = *OutStreamer->getTargetStreamer();
1182   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
1183   const MachineFunction &MF = *MI->getParent()->getParent();
1184   const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo();
1185   const ARMFunctionInfo &AFI = *MF.getInfo<ARMFunctionInfo>();
1186 
1187   unsigned FramePtr = RegInfo->getFrameRegister(MF);
1188   unsigned Opc = MI->getOpcode();
1189   unsigned SrcReg, DstReg;
1190 
1191   if (Opc == ARM::tPUSH || Opc == ARM::tLDRpci) {
1192     // Two special cases:
1193     // 1) tPUSH does not have src/dst regs.
1194     // 2) for Thumb1 code we sometimes materialize the constant via constpool
1195     // load. Yes, this is pretty fragile, but for now I don't see better
1196     // way... :(
1197     SrcReg = DstReg = ARM::SP;
1198   } else {
1199     SrcReg = MI->getOperand(1).getReg();
1200     DstReg = MI->getOperand(0).getReg();
1201   }
1202 
1203   // Try to figure out the unwinding opcode out of src / dst regs.
1204   if (MI->mayStore()) {
1205     // Register saves.
1206     assert(DstReg == ARM::SP &&
1207            "Only stack pointer as a destination reg is supported");
1208 
1209     SmallVector<unsigned, 4> RegList;
1210     // Skip src & dst reg, and pred ops.
1211     unsigned StartOp = 2 + 2;
1212     // Use all the operands.
1213     unsigned NumOffset = 0;
1214 
1215     switch (Opc) {
1216     default:
1217       MI->dump();
1218       llvm_unreachable("Unsupported opcode for unwinding information");
1219     case ARM::tPUSH:
1220       // Special case here: no src & dst reg, but two extra imp ops.
1221       StartOp = 2; NumOffset = 2;
1222     case ARM::STMDB_UPD:
1223     case ARM::t2STMDB_UPD:
1224     case ARM::VSTMDDB_UPD:
1225       assert(SrcReg == ARM::SP &&
1226              "Only stack pointer as a source reg is supported");
1227       for (unsigned i = StartOp, NumOps = MI->getNumOperands() - NumOffset;
1228            i != NumOps; ++i) {
1229         const MachineOperand &MO = MI->getOperand(i);
1230         // Actually, there should never be any impdef stuff here. Skip it
1231         // temporary to workaround PR11902.
1232         if (MO.isImplicit())
1233           continue;
1234         RegList.push_back(MO.getReg());
1235       }
1236       break;
1237     case ARM::STR_PRE_IMM:
1238     case ARM::STR_PRE_REG:
1239     case ARM::t2STR_PRE:
1240       assert(MI->getOperand(2).getReg() == ARM::SP &&
1241              "Only stack pointer as a source reg is supported");
1242       RegList.push_back(SrcReg);
1243       break;
1244     }
1245     if (MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
1246       ATS.emitRegSave(RegList, Opc == ARM::VSTMDDB_UPD);
1247   } else {
1248     // Changes of stack / frame pointer.
1249     if (SrcReg == ARM::SP) {
1250       int64_t Offset = 0;
1251       switch (Opc) {
1252       default:
1253         MI->dump();
1254         llvm_unreachable("Unsupported opcode for unwinding information");
1255       case ARM::MOVr:
1256       case ARM::tMOVr:
1257         Offset = 0;
1258         break;
1259       case ARM::ADDri:
1260       case ARM::t2ADDri:
1261         Offset = -MI->getOperand(2).getImm();
1262         break;
1263       case ARM::SUBri:
1264       case ARM::t2SUBri:
1265         Offset = MI->getOperand(2).getImm();
1266         break;
1267       case ARM::tSUBspi:
1268         Offset = MI->getOperand(2).getImm()*4;
1269         break;
1270       case ARM::tADDspi:
1271       case ARM::tADDrSPi:
1272         Offset = -MI->getOperand(2).getImm()*4;
1273         break;
1274       case ARM::tLDRpci: {
1275         // Grab the constpool index and check, whether it corresponds to
1276         // original or cloned constpool entry.
1277         unsigned CPI = MI->getOperand(1).getIndex();
1278         const MachineConstantPool *MCP = MF.getConstantPool();
1279         if (CPI >= MCP->getConstants().size())
1280           CPI = AFI.getOriginalCPIdx(CPI);
1281         assert(CPI != -1U && "Invalid constpool index");
1282 
1283         // Derive the actual offset.
1284         const MachineConstantPoolEntry &CPE = MCP->getConstants()[CPI];
1285         assert(!CPE.isMachineConstantPoolEntry() && "Invalid constpool entry");
1286         // FIXME: Check for user, it should be "add" instruction!
1287         Offset = -cast<ConstantInt>(CPE.Val.ConstVal)->getSExtValue();
1288         break;
1289       }
1290       }
1291 
1292       if (MAI->getExceptionHandlingType() == ExceptionHandling::ARM) {
1293         if (DstReg == FramePtr && FramePtr != ARM::SP)
1294           // Set-up of the frame pointer. Positive values correspond to "add"
1295           // instruction.
1296           ATS.emitSetFP(FramePtr, ARM::SP, -Offset);
1297         else if (DstReg == ARM::SP) {
1298           // Change of SP by an offset. Positive values correspond to "sub"
1299           // instruction.
1300           ATS.emitPad(Offset);
1301         } else {
1302           // Move of SP to a register.  Positive values correspond to an "add"
1303           // instruction.
1304           ATS.emitMovSP(DstReg, -Offset);
1305         }
1306       }
1307     } else if (DstReg == ARM::SP) {
1308       MI->dump();
1309       llvm_unreachable("Unsupported opcode for unwinding information");
1310     }
1311     else {
1312       MI->dump();
1313       llvm_unreachable("Unsupported opcode for unwinding information");
1314     }
1315   }
1316 }
1317 
1318 // Simple pseudo-instructions have their lowering (with expansion to real
1319 // instructions) auto-generated.
1320 #include "ARMGenMCPseudoLowering.inc"
1321 
1322 void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
1323   const DataLayout &DL = getDataLayout();
1324   MCTargetStreamer &TS = *OutStreamer->getTargetStreamer();
1325   ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS);
1326 
1327   // If we just ended a constant pool, mark it as such.
1328   if (InConstantPool && MI->getOpcode() != ARM::CONSTPOOL_ENTRY) {
1329     OutStreamer->EmitDataRegion(MCDR_DataRegionEnd);
1330     InConstantPool = false;
1331   }
1332 
1333   // Emit unwinding stuff for frame-related instructions
1334   if (Subtarget->isTargetEHABICompatible() &&
1335        MI->getFlag(MachineInstr::FrameSetup))
1336     EmitUnwindingInstruction(MI);
1337 
1338   // Do any auto-generated pseudo lowerings.
1339   if (emitPseudoExpansionLowering(*OutStreamer, MI))
1340     return;
1341 
1342   assert(!convertAddSubFlagsOpcode(MI->getOpcode()) &&
1343          "Pseudo flag setting opcode should be expanded early");
1344 
1345   // Check for manual lowerings.
1346   unsigned Opc = MI->getOpcode();
1347   switch (Opc) {
1348   case ARM::t2MOVi32imm: llvm_unreachable("Should be lowered by thumb2it pass");
1349   case ARM::DBG_VALUE: llvm_unreachable("Should be handled by generic printing");
1350   case ARM::LEApcrel:
1351   case ARM::tLEApcrel:
1352   case ARM::t2LEApcrel: {
1353     // FIXME: Need to also handle globals and externals
1354     MCSymbol *CPISymbol = GetCPISymbol(MI->getOperand(1).getIndex());
1355     EmitToStreamer(*OutStreamer, MCInstBuilder(MI->getOpcode() ==
1356                                                ARM::t2LEApcrel ? ARM::t2ADR
1357                   : (MI->getOpcode() == ARM::tLEApcrel ? ARM::tADR
1358                      : ARM::ADR))
1359       .addReg(MI->getOperand(0).getReg())
1360       .addExpr(MCSymbolRefExpr::create(CPISymbol, OutContext))
1361       // Add predicate operands.
1362       .addImm(MI->getOperand(2).getImm())
1363       .addReg(MI->getOperand(3).getReg()));
1364     return;
1365   }
1366   case ARM::LEApcrelJT:
1367   case ARM::tLEApcrelJT:
1368   case ARM::t2LEApcrelJT: {
1369     MCSymbol *JTIPICSymbol =
1370       GetARMJTIPICJumpTableLabel(MI->getOperand(1).getIndex());
1371     EmitToStreamer(*OutStreamer, MCInstBuilder(MI->getOpcode() ==
1372                                                ARM::t2LEApcrelJT ? ARM::t2ADR
1373                   : (MI->getOpcode() == ARM::tLEApcrelJT ? ARM::tADR
1374                      : ARM::ADR))
1375       .addReg(MI->getOperand(0).getReg())
1376       .addExpr(MCSymbolRefExpr::create(JTIPICSymbol, OutContext))
1377       // Add predicate operands.
1378       .addImm(MI->getOperand(2).getImm())
1379       .addReg(MI->getOperand(3).getReg()));
1380     return;
1381   }
1382   // Darwin call instructions are just normal call instructions with different
1383   // clobber semantics (they clobber R9).
1384   case ARM::BX_CALL: {
1385     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVr)
1386       .addReg(ARM::LR)
1387       .addReg(ARM::PC)
1388       // Add predicate operands.
1389       .addImm(ARMCC::AL)
1390       .addReg(0)
1391       // Add 's' bit operand (always reg0 for this)
1392       .addReg(0));
1393 
1394     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::BX)
1395       .addReg(MI->getOperand(0).getReg()));
1396     return;
1397   }
1398   case ARM::tBX_CALL: {
1399     if (Subtarget->hasV5TOps())
1400       llvm_unreachable("Expected BLX to be selected for v5t+");
1401 
1402     // On ARM v4t, when doing a call from thumb mode, we need to ensure
1403     // that the saved lr has its LSB set correctly (the arch doesn't
1404     // have blx).
1405     // So here we generate a bl to a small jump pad that does bx rN.
1406     // The jump pads are emitted after the function body.
1407 
1408     unsigned TReg = MI->getOperand(0).getReg();
1409     MCSymbol *TRegSym = nullptr;
1410     for (unsigned i = 0, e = ThumbIndirectPads.size(); i < e; i++) {
1411       if (ThumbIndirectPads[i].first == TReg) {
1412         TRegSym = ThumbIndirectPads[i].second;
1413         break;
1414       }
1415     }
1416 
1417     if (!TRegSym) {
1418       TRegSym = OutContext.createTempSymbol();
1419       ThumbIndirectPads.push_back(std::make_pair(TReg, TRegSym));
1420     }
1421 
1422     // Create a link-saving branch to the Reg Indirect Jump Pad.
1423     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tBL)
1424         // Predicate comes first here.
1425         .addImm(ARMCC::AL).addReg(0)
1426         .addExpr(MCSymbolRefExpr::create(TRegSym, OutContext)));
1427     return;
1428   }
1429   case ARM::BMOVPCRX_CALL: {
1430     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVr)
1431       .addReg(ARM::LR)
1432       .addReg(ARM::PC)
1433       // Add predicate operands.
1434       .addImm(ARMCC::AL)
1435       .addReg(0)
1436       // Add 's' bit operand (always reg0 for this)
1437       .addReg(0));
1438 
1439     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVr)
1440       .addReg(ARM::PC)
1441       .addReg(MI->getOperand(0).getReg())
1442       // Add predicate operands.
1443       .addImm(ARMCC::AL)
1444       .addReg(0)
1445       // Add 's' bit operand (always reg0 for this)
1446       .addReg(0));
1447     return;
1448   }
1449   case ARM::BMOVPCB_CALL: {
1450     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVr)
1451       .addReg(ARM::LR)
1452       .addReg(ARM::PC)
1453       // Add predicate operands.
1454       .addImm(ARMCC::AL)
1455       .addReg(0)
1456       // Add 's' bit operand (always reg0 for this)
1457       .addReg(0));
1458 
1459     const MachineOperand &Op = MI->getOperand(0);
1460     const GlobalValue *GV = Op.getGlobal();
1461     const unsigned TF = Op.getTargetFlags();
1462     MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1463     const MCExpr *GVSymExpr = MCSymbolRefExpr::create(GVSym, OutContext);
1464     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::Bcc)
1465       .addExpr(GVSymExpr)
1466       // Add predicate operands.
1467       .addImm(ARMCC::AL)
1468       .addReg(0));
1469     return;
1470   }
1471   case ARM::MOVi16_ga_pcrel:
1472   case ARM::t2MOVi16_ga_pcrel: {
1473     MCInst TmpInst;
1474     TmpInst.setOpcode(Opc == ARM::MOVi16_ga_pcrel? ARM::MOVi16 : ARM::t2MOVi16);
1475     TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
1476 
1477     unsigned TF = MI->getOperand(1).getTargetFlags();
1478     const GlobalValue *GV = MI->getOperand(1).getGlobal();
1479     MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1480     const MCExpr *GVSymExpr = MCSymbolRefExpr::create(GVSym, OutContext);
1481 
1482     MCSymbol *LabelSym =
1483         getPICLabel(DL.getPrivateGlobalPrefix(), getFunctionNumber(),
1484                     MI->getOperand(2).getImm(), OutContext);
1485     const MCExpr *LabelSymExpr= MCSymbolRefExpr::create(LabelSym, OutContext);
1486     unsigned PCAdj = (Opc == ARM::MOVi16_ga_pcrel) ? 8 : 4;
1487     const MCExpr *PCRelExpr =
1488       ARMMCExpr::createLower16(MCBinaryExpr::createSub(GVSymExpr,
1489                                       MCBinaryExpr::createAdd(LabelSymExpr,
1490                                       MCConstantExpr::create(PCAdj, OutContext),
1491                                       OutContext), OutContext), OutContext);
1492       TmpInst.addOperand(MCOperand::createExpr(PCRelExpr));
1493 
1494     // Add predicate operands.
1495     TmpInst.addOperand(MCOperand::createImm(ARMCC::AL));
1496     TmpInst.addOperand(MCOperand::createReg(0));
1497     // Add 's' bit operand (always reg0 for this)
1498     TmpInst.addOperand(MCOperand::createReg(0));
1499     EmitToStreamer(*OutStreamer, TmpInst);
1500     return;
1501   }
1502   case ARM::MOVTi16_ga_pcrel:
1503   case ARM::t2MOVTi16_ga_pcrel: {
1504     MCInst TmpInst;
1505     TmpInst.setOpcode(Opc == ARM::MOVTi16_ga_pcrel
1506                       ? ARM::MOVTi16 : ARM::t2MOVTi16);
1507     TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
1508     TmpInst.addOperand(MCOperand::createReg(MI->getOperand(1).getReg()));
1509 
1510     unsigned TF = MI->getOperand(2).getTargetFlags();
1511     const GlobalValue *GV = MI->getOperand(2).getGlobal();
1512     MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1513     const MCExpr *GVSymExpr = MCSymbolRefExpr::create(GVSym, OutContext);
1514 
1515     MCSymbol *LabelSym =
1516         getPICLabel(DL.getPrivateGlobalPrefix(), getFunctionNumber(),
1517                     MI->getOperand(3).getImm(), OutContext);
1518     const MCExpr *LabelSymExpr= MCSymbolRefExpr::create(LabelSym, OutContext);
1519     unsigned PCAdj = (Opc == ARM::MOVTi16_ga_pcrel) ? 8 : 4;
1520     const MCExpr *PCRelExpr =
1521         ARMMCExpr::createUpper16(MCBinaryExpr::createSub(GVSymExpr,
1522                                    MCBinaryExpr::createAdd(LabelSymExpr,
1523                                       MCConstantExpr::create(PCAdj, OutContext),
1524                                           OutContext), OutContext), OutContext);
1525       TmpInst.addOperand(MCOperand::createExpr(PCRelExpr));
1526     // Add predicate operands.
1527     TmpInst.addOperand(MCOperand::createImm(ARMCC::AL));
1528     TmpInst.addOperand(MCOperand::createReg(0));
1529     // Add 's' bit operand (always reg0 for this)
1530     TmpInst.addOperand(MCOperand::createReg(0));
1531     EmitToStreamer(*OutStreamer, TmpInst);
1532     return;
1533   }
1534   case ARM::tPICADD: {
1535     // This is a pseudo op for a label + instruction sequence, which looks like:
1536     // LPC0:
1537     //     add r0, pc
1538     // This adds the address of LPC0 to r0.
1539 
1540     // Emit the label.
1541     OutStreamer->EmitLabel(getPICLabel(DL.getPrivateGlobalPrefix(),
1542                                        getFunctionNumber(),
1543                                        MI->getOperand(2).getImm(), OutContext));
1544 
1545     // Form and emit the add.
1546     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tADDhirr)
1547       .addReg(MI->getOperand(0).getReg())
1548       .addReg(MI->getOperand(0).getReg())
1549       .addReg(ARM::PC)
1550       // Add predicate operands.
1551       .addImm(ARMCC::AL)
1552       .addReg(0));
1553     return;
1554   }
1555   case ARM::PICADD: {
1556     // This is a pseudo op for a label + instruction sequence, which looks like:
1557     // LPC0:
1558     //     add r0, pc, r0
1559     // This adds the address of LPC0 to r0.
1560 
1561     // Emit the label.
1562     OutStreamer->EmitLabel(getPICLabel(DL.getPrivateGlobalPrefix(),
1563                                        getFunctionNumber(),
1564                                        MI->getOperand(2).getImm(), OutContext));
1565 
1566     // Form and emit the add.
1567     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::ADDrr)
1568       .addReg(MI->getOperand(0).getReg())
1569       .addReg(ARM::PC)
1570       .addReg(MI->getOperand(1).getReg())
1571       // Add predicate operands.
1572       .addImm(MI->getOperand(3).getImm())
1573       .addReg(MI->getOperand(4).getReg())
1574       // Add 's' bit operand (always reg0 for this)
1575       .addReg(0));
1576     return;
1577   }
1578   case ARM::PICSTR:
1579   case ARM::PICSTRB:
1580   case ARM::PICSTRH:
1581   case ARM::PICLDR:
1582   case ARM::PICLDRB:
1583   case ARM::PICLDRH:
1584   case ARM::PICLDRSB:
1585   case ARM::PICLDRSH: {
1586     // This is a pseudo op for a label + instruction sequence, which looks like:
1587     // LPC0:
1588     //     OP r0, [pc, r0]
1589     // The LCP0 label is referenced by a constant pool entry in order to get
1590     // a PC-relative address at the ldr instruction.
1591 
1592     // Emit the label.
1593     OutStreamer->EmitLabel(getPICLabel(DL.getPrivateGlobalPrefix(),
1594                                        getFunctionNumber(),
1595                                        MI->getOperand(2).getImm(), OutContext));
1596 
1597     // Form and emit the load
1598     unsigned Opcode;
1599     switch (MI->getOpcode()) {
1600     default:
1601       llvm_unreachable("Unexpected opcode!");
1602     case ARM::PICSTR:   Opcode = ARM::STRrs; break;
1603     case ARM::PICSTRB:  Opcode = ARM::STRBrs; break;
1604     case ARM::PICSTRH:  Opcode = ARM::STRH; break;
1605     case ARM::PICLDR:   Opcode = ARM::LDRrs; break;
1606     case ARM::PICLDRB:  Opcode = ARM::LDRBrs; break;
1607     case ARM::PICLDRH:  Opcode = ARM::LDRH; break;
1608     case ARM::PICLDRSB: Opcode = ARM::LDRSB; break;
1609     case ARM::PICLDRSH: Opcode = ARM::LDRSH; break;
1610     }
1611     EmitToStreamer(*OutStreamer, MCInstBuilder(Opcode)
1612       .addReg(MI->getOperand(0).getReg())
1613       .addReg(ARM::PC)
1614       .addReg(MI->getOperand(1).getReg())
1615       .addImm(0)
1616       // Add predicate operands.
1617       .addImm(MI->getOperand(3).getImm())
1618       .addReg(MI->getOperand(4).getReg()));
1619 
1620     return;
1621   }
1622   case ARM::CONSTPOOL_ENTRY: {
1623     /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool
1624     /// in the function.  The first operand is the ID# for this instruction, the
1625     /// second is the index into the MachineConstantPool that this is, the third
1626     /// is the size in bytes of this constant pool entry.
1627     /// The required alignment is specified on the basic block holding this MI.
1628     unsigned LabelId = (unsigned)MI->getOperand(0).getImm();
1629     unsigned CPIdx   = (unsigned)MI->getOperand(1).getIndex();
1630 
1631     // If this is the first entry of the pool, mark it.
1632     if (!InConstantPool) {
1633       OutStreamer->EmitDataRegion(MCDR_DataRegion);
1634       InConstantPool = true;
1635     }
1636 
1637     OutStreamer->EmitLabel(GetCPISymbol(LabelId));
1638 
1639     const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx];
1640     if (MCPE.isMachineConstantPoolEntry())
1641       EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal);
1642     else
1643       EmitGlobalConstant(DL, MCPE.Val.ConstVal);
1644     return;
1645   }
1646   case ARM::JUMPTABLE_ADDRS:
1647     EmitJumpTableAddrs(MI);
1648     return;
1649   case ARM::JUMPTABLE_INSTS:
1650     EmitJumpTableInsts(MI);
1651     return;
1652   case ARM::JUMPTABLE_TBB:
1653   case ARM::JUMPTABLE_TBH:
1654     EmitJumpTableTBInst(MI, MI->getOpcode() == ARM::JUMPTABLE_TBB ? 1 : 2);
1655     return;
1656   case ARM::t2BR_JT: {
1657     // Lower and emit the instruction itself, then the jump table following it.
1658     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tMOVr)
1659       .addReg(ARM::PC)
1660       .addReg(MI->getOperand(0).getReg())
1661       // Add predicate operands.
1662       .addImm(ARMCC::AL)
1663       .addReg(0));
1664     return;
1665   }
1666   case ARM::t2TBB_JT:
1667   case ARM::t2TBH_JT: {
1668     unsigned Opc = MI->getOpcode() == ARM::t2TBB_JT ? ARM::t2TBB : ARM::t2TBH;
1669     // Lower and emit the PC label, then the instruction itself.
1670     OutStreamer->EmitLabel(GetCPISymbol(MI->getOperand(3).getImm()));
1671     EmitToStreamer(*OutStreamer, MCInstBuilder(Opc)
1672                                      .addReg(MI->getOperand(0).getReg())
1673                                      .addReg(MI->getOperand(1).getReg())
1674                                      // Add predicate operands.
1675                                      .addImm(ARMCC::AL)
1676                                      .addReg(0));
1677     return;
1678   }
1679   case ARM::tBR_JTr:
1680   case ARM::BR_JTr: {
1681     // Lower and emit the instruction itself, then the jump table following it.
1682     // mov pc, target
1683     MCInst TmpInst;
1684     unsigned Opc = MI->getOpcode() == ARM::BR_JTr ?
1685       ARM::MOVr : ARM::tMOVr;
1686     TmpInst.setOpcode(Opc);
1687     TmpInst.addOperand(MCOperand::createReg(ARM::PC));
1688     TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
1689     // Add predicate operands.
1690     TmpInst.addOperand(MCOperand::createImm(ARMCC::AL));
1691     TmpInst.addOperand(MCOperand::createReg(0));
1692     // Add 's' bit operand (always reg0 for this)
1693     if (Opc == ARM::MOVr)
1694       TmpInst.addOperand(MCOperand::createReg(0));
1695     EmitToStreamer(*OutStreamer, TmpInst);
1696     return;
1697   }
1698   case ARM::BR_JTm: {
1699     // Lower and emit the instruction itself, then the jump table following it.
1700     // ldr pc, target
1701     MCInst TmpInst;
1702     if (MI->getOperand(1).getReg() == 0) {
1703       // literal offset
1704       TmpInst.setOpcode(ARM::LDRi12);
1705       TmpInst.addOperand(MCOperand::createReg(ARM::PC));
1706       TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
1707       TmpInst.addOperand(MCOperand::createImm(MI->getOperand(2).getImm()));
1708     } else {
1709       TmpInst.setOpcode(ARM::LDRrs);
1710       TmpInst.addOperand(MCOperand::createReg(ARM::PC));
1711       TmpInst.addOperand(MCOperand::createReg(MI->getOperand(0).getReg()));
1712       TmpInst.addOperand(MCOperand::createReg(MI->getOperand(1).getReg()));
1713       TmpInst.addOperand(MCOperand::createImm(0));
1714     }
1715     // Add predicate operands.
1716     TmpInst.addOperand(MCOperand::createImm(ARMCC::AL));
1717     TmpInst.addOperand(MCOperand::createReg(0));
1718     EmitToStreamer(*OutStreamer, TmpInst);
1719     return;
1720   }
1721   case ARM::BR_JTadd: {
1722     // Lower and emit the instruction itself, then the jump table following it.
1723     // add pc, target, idx
1724     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::ADDrr)
1725       .addReg(ARM::PC)
1726       .addReg(MI->getOperand(0).getReg())
1727       .addReg(MI->getOperand(1).getReg())
1728       // Add predicate operands.
1729       .addImm(ARMCC::AL)
1730       .addReg(0)
1731       // Add 's' bit operand (always reg0 for this)
1732       .addReg(0));
1733     return;
1734   }
1735   case ARM::SPACE:
1736     OutStreamer->EmitZeros(MI->getOperand(1).getImm());
1737     return;
1738   case ARM::TRAP: {
1739     // Non-Darwin binutils don't yet support the "trap" mnemonic.
1740     // FIXME: Remove this special case when they do.
1741     if (!Subtarget->isTargetMachO()) {
1742       uint32_t Val = 0xe7ffdefeUL;
1743       OutStreamer->AddComment("trap");
1744       ATS.emitInst(Val);
1745       return;
1746     }
1747     break;
1748   }
1749   case ARM::TRAPNaCl: {
1750     uint32_t Val = 0xe7fedef0UL;
1751     OutStreamer->AddComment("trap");
1752     ATS.emitInst(Val);
1753     return;
1754   }
1755   case ARM::tTRAP: {
1756     // Non-Darwin binutils don't yet support the "trap" mnemonic.
1757     // FIXME: Remove this special case when they do.
1758     if (!Subtarget->isTargetMachO()) {
1759       uint16_t Val = 0xdefe;
1760       OutStreamer->AddComment("trap");
1761       ATS.emitInst(Val, 'n');
1762       return;
1763     }
1764     break;
1765   }
1766   case ARM::t2Int_eh_sjlj_setjmp:
1767   case ARM::t2Int_eh_sjlj_setjmp_nofp:
1768   case ARM::tInt_eh_sjlj_setjmp: {
1769     // Two incoming args: GPR:$src, GPR:$val
1770     // mov $val, pc
1771     // adds $val, #7
1772     // str $val, [$src, #4]
1773     // movs r0, #0
1774     // b LSJLJEH
1775     // movs r0, #1
1776     // LSJLJEH:
1777     unsigned SrcReg = MI->getOperand(0).getReg();
1778     unsigned ValReg = MI->getOperand(1).getReg();
1779     MCSymbol *Label = OutContext.createTempSymbol("SJLJEH", false, true);
1780     OutStreamer->AddComment("eh_setjmp begin");
1781     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tMOVr)
1782       .addReg(ValReg)
1783       .addReg(ARM::PC)
1784       // Predicate.
1785       .addImm(ARMCC::AL)
1786       .addReg(0));
1787 
1788     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tADDi3)
1789       .addReg(ValReg)
1790       // 's' bit operand
1791       .addReg(ARM::CPSR)
1792       .addReg(ValReg)
1793       .addImm(7)
1794       // Predicate.
1795       .addImm(ARMCC::AL)
1796       .addReg(0));
1797 
1798     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tSTRi)
1799       .addReg(ValReg)
1800       .addReg(SrcReg)
1801       // The offset immediate is #4. The operand value is scaled by 4 for the
1802       // tSTR instruction.
1803       .addImm(1)
1804       // Predicate.
1805       .addImm(ARMCC::AL)
1806       .addReg(0));
1807 
1808     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tMOVi8)
1809       .addReg(ARM::R0)
1810       .addReg(ARM::CPSR)
1811       .addImm(0)
1812       // Predicate.
1813       .addImm(ARMCC::AL)
1814       .addReg(0));
1815 
1816     const MCExpr *SymbolExpr = MCSymbolRefExpr::create(Label, OutContext);
1817     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tB)
1818       .addExpr(SymbolExpr)
1819       .addImm(ARMCC::AL)
1820       .addReg(0));
1821 
1822     OutStreamer->AddComment("eh_setjmp end");
1823     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tMOVi8)
1824       .addReg(ARM::R0)
1825       .addReg(ARM::CPSR)
1826       .addImm(1)
1827       // Predicate.
1828       .addImm(ARMCC::AL)
1829       .addReg(0));
1830 
1831     OutStreamer->EmitLabel(Label);
1832     return;
1833   }
1834 
1835   case ARM::Int_eh_sjlj_setjmp_nofp:
1836   case ARM::Int_eh_sjlj_setjmp: {
1837     // Two incoming args: GPR:$src, GPR:$val
1838     // add $val, pc, #8
1839     // str $val, [$src, #+4]
1840     // mov r0, #0
1841     // add pc, pc, #0
1842     // mov r0, #1
1843     unsigned SrcReg = MI->getOperand(0).getReg();
1844     unsigned ValReg = MI->getOperand(1).getReg();
1845 
1846     OutStreamer->AddComment("eh_setjmp begin");
1847     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::ADDri)
1848       .addReg(ValReg)
1849       .addReg(ARM::PC)
1850       .addImm(8)
1851       // Predicate.
1852       .addImm(ARMCC::AL)
1853       .addReg(0)
1854       // 's' bit operand (always reg0 for this).
1855       .addReg(0));
1856 
1857     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::STRi12)
1858       .addReg(ValReg)
1859       .addReg(SrcReg)
1860       .addImm(4)
1861       // Predicate.
1862       .addImm(ARMCC::AL)
1863       .addReg(0));
1864 
1865     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVi)
1866       .addReg(ARM::R0)
1867       .addImm(0)
1868       // Predicate.
1869       .addImm(ARMCC::AL)
1870       .addReg(0)
1871       // 's' bit operand (always reg0 for this).
1872       .addReg(0));
1873 
1874     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::ADDri)
1875       .addReg(ARM::PC)
1876       .addReg(ARM::PC)
1877       .addImm(0)
1878       // Predicate.
1879       .addImm(ARMCC::AL)
1880       .addReg(0)
1881       // 's' bit operand (always reg0 for this).
1882       .addReg(0));
1883 
1884     OutStreamer->AddComment("eh_setjmp end");
1885     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::MOVi)
1886       .addReg(ARM::R0)
1887       .addImm(1)
1888       // Predicate.
1889       .addImm(ARMCC::AL)
1890       .addReg(0)
1891       // 's' bit operand (always reg0 for this).
1892       .addReg(0));
1893     return;
1894   }
1895   case ARM::Int_eh_sjlj_longjmp: {
1896     // ldr sp, [$src, #8]
1897     // ldr $scratch, [$src, #4]
1898     // ldr r7, [$src]
1899     // bx $scratch
1900     unsigned SrcReg = MI->getOperand(0).getReg();
1901     unsigned ScratchReg = MI->getOperand(1).getReg();
1902     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::LDRi12)
1903       .addReg(ARM::SP)
1904       .addReg(SrcReg)
1905       .addImm(8)
1906       // Predicate.
1907       .addImm(ARMCC::AL)
1908       .addReg(0));
1909 
1910     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::LDRi12)
1911       .addReg(ScratchReg)
1912       .addReg(SrcReg)
1913       .addImm(4)
1914       // Predicate.
1915       .addImm(ARMCC::AL)
1916       .addReg(0));
1917 
1918     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::LDRi12)
1919       .addReg(ARM::R7)
1920       .addReg(SrcReg)
1921       .addImm(0)
1922       // Predicate.
1923       .addImm(ARMCC::AL)
1924       .addReg(0));
1925 
1926     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::BX)
1927       .addReg(ScratchReg)
1928       // Predicate.
1929       .addImm(ARMCC::AL)
1930       .addReg(0));
1931     return;
1932   }
1933   case ARM::tInt_eh_sjlj_longjmp: {
1934     // ldr $scratch, [$src, #8]
1935     // mov sp, $scratch
1936     // ldr $scratch, [$src, #4]
1937     // ldr r7, [$src]
1938     // bx $scratch
1939     unsigned SrcReg = MI->getOperand(0).getReg();
1940     unsigned ScratchReg = MI->getOperand(1).getReg();
1941 
1942     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tLDRi)
1943       .addReg(ScratchReg)
1944       .addReg(SrcReg)
1945       // The offset immediate is #8. The operand value is scaled by 4 for the
1946       // tLDR instruction.
1947       .addImm(2)
1948       // Predicate.
1949       .addImm(ARMCC::AL)
1950       .addReg(0));
1951 
1952     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tMOVr)
1953       .addReg(ARM::SP)
1954       .addReg(ScratchReg)
1955       // Predicate.
1956       .addImm(ARMCC::AL)
1957       .addReg(0));
1958 
1959     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tLDRi)
1960       .addReg(ScratchReg)
1961       .addReg(SrcReg)
1962       .addImm(1)
1963       // Predicate.
1964       .addImm(ARMCC::AL)
1965       .addReg(0));
1966 
1967     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tLDRi)
1968       .addReg(ARM::R7)
1969       .addReg(SrcReg)
1970       .addImm(0)
1971       // Predicate.
1972       .addImm(ARMCC::AL)
1973       .addReg(0));
1974 
1975     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::tBX)
1976       .addReg(ScratchReg)
1977       // Predicate.
1978       .addImm(ARMCC::AL)
1979       .addReg(0));
1980     return;
1981   }
1982   case ARM::tInt_WIN_eh_sjlj_longjmp: {
1983     // ldr.w r11, [$src, #0]
1984     // ldr.w  sp, [$src, #8]
1985     // ldr.w  pc, [$src, #4]
1986 
1987     unsigned SrcReg = MI->getOperand(0).getReg();
1988 
1989     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::t2LDRi12)
1990                                      .addReg(ARM::R11)
1991                                      .addReg(SrcReg)
1992                                      .addImm(0)
1993                                      // Predicate
1994                                      .addImm(ARMCC::AL)
1995                                      .addReg(0));
1996     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::t2LDRi12)
1997                                      .addReg(ARM::SP)
1998                                      .addReg(SrcReg)
1999                                      .addImm(8)
2000                                      // Predicate
2001                                      .addImm(ARMCC::AL)
2002                                      .addReg(0));
2003     EmitToStreamer(*OutStreamer, MCInstBuilder(ARM::t2LDRi12)
2004                                      .addReg(ARM::PC)
2005                                      .addReg(SrcReg)
2006                                      .addImm(4)
2007                                      // Predicate
2008                                      .addImm(ARMCC::AL)
2009                                      .addReg(0));
2010     return;
2011   }
2012   case ARM::PATCHABLE_FUNCTION_ENTER:
2013     LowerPATCHABLE_FUNCTION_ENTER(*MI);
2014     return;
2015   case ARM::PATCHABLE_FUNCTION_EXIT:
2016     LowerPATCHABLE_FUNCTION_EXIT(*MI);
2017     return;
2018   }
2019 
2020   MCInst TmpInst;
2021   LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
2022 
2023   EmitToStreamer(*OutStreamer, TmpInst);
2024 }
2025 
2026 //===----------------------------------------------------------------------===//
2027 // Target Registry Stuff
2028 //===----------------------------------------------------------------------===//
2029 
2030 // Force static initialization.
2031 extern "C" void LLVMInitializeARMAsmPrinter() {
2032   RegisterAsmPrinter<ARMAsmPrinter> X(TheARMLETarget);
2033   RegisterAsmPrinter<ARMAsmPrinter> Y(TheARMBETarget);
2034   RegisterAsmPrinter<ARMAsmPrinter> A(TheThumbLETarget);
2035   RegisterAsmPrinter<ARMAsmPrinter> B(TheThumbBETarget);
2036 }
2037