1 //===-- X86AsmBackend.cpp - X86 Assembler Backend -------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "MCTargetDesc/X86BaseInfo.h"
10 #include "MCTargetDesc/X86FixupKinds.h"
11 #include "llvm/ADT/StringSwitch.h"
12 #include "llvm/BinaryFormat/ELF.h"
13 #include "llvm/BinaryFormat/MachO.h"
14 #include "llvm/MC/MCAsmBackend.h"
15 #include "llvm/MC/MCAsmLayout.h"
16 #include "llvm/MC/MCAssembler.h"
17 #include "llvm/MC/MCCodeEmitter.h"
18 #include "llvm/MC/MCContext.h"
19 #include "llvm/MC/MCDwarf.h"
20 #include "llvm/MC/MCELFObjectWriter.h"
21 #include "llvm/MC/MCExpr.h"
22 #include "llvm/MC/MCFixupKindInfo.h"
23 #include "llvm/MC/MCInst.h"
24 #include "llvm/MC/MCInstrInfo.h"
25 #include "llvm/MC/MCMachObjectWriter.h"
26 #include "llvm/MC/MCObjectStreamer.h"
27 #include "llvm/MC/MCObjectWriter.h"
28 #include "llvm/MC/MCRegisterInfo.h"
29 #include "llvm/MC/MCSectionMachO.h"
30 #include "llvm/MC/MCSubtargetInfo.h"
31 #include "llvm/MC/MCValue.h"
32 #include "llvm/Support/CommandLine.h"
33 #include "llvm/Support/ErrorHandling.h"
34 #include "llvm/Support/TargetRegistry.h"
35 #include "llvm/Support/raw_ostream.h"
36 
37 using namespace llvm;
38 
39 namespace {
40 /// A wrapper for holding a mask of the values from X86::AlignBranchBoundaryKind
41 class X86AlignBranchKind {
42 private:
43   uint8_t AlignBranchKind = 0;
44 
45 public:
46   void operator=(const std::string &Val) {
47     if (Val.empty())
48       return;
49     SmallVector<StringRef, 6> BranchTypes;
50     StringRef(Val).split(BranchTypes, '+', -1, false);
51     for (auto BranchType : BranchTypes) {
52       if (BranchType == "fused")
53         addKind(X86::AlignBranchFused);
54       else if (BranchType == "jcc")
55         addKind(X86::AlignBranchJcc);
56       else if (BranchType == "jmp")
57         addKind(X86::AlignBranchJmp);
58       else if (BranchType == "call")
59         addKind(X86::AlignBranchCall);
60       else if (BranchType == "ret")
61         addKind(X86::AlignBranchRet);
62       else if (BranchType == "indirect")
63         addKind(X86::AlignBranchIndirect);
64       else {
65         errs() << "invalid argument " << BranchType.str()
66                << " to -x86-align-branch=; each element must be one of: fused, "
67                   "jcc, jmp, call, ret, indirect.(plus separated)\n";
68       }
69     }
70   }
71 
72   operator uint8_t() const { return AlignBranchKind; }
73   void addKind(X86::AlignBranchBoundaryKind Value) { AlignBranchKind |= Value; }
74 };
75 
76 X86AlignBranchKind X86AlignBranchKindLoc;
77 
78 cl::opt<unsigned> X86AlignBranchBoundary(
79     "x86-align-branch-boundary", cl::init(0),
80     cl::desc(
81         "Control how the assembler should align branches with NOP. If the "
82         "boundary's size is not 0, it should be a power of 2 and no less "
83         "than 32. Branches will be aligned to prevent from being across or "
84         "against the boundary of specified size. The default value 0 does not "
85         "align branches."));
86 
87 cl::opt<X86AlignBranchKind, true, cl::parser<std::string>> X86AlignBranch(
88     "x86-align-branch",
89     cl::desc(
90         "Specify types of branches to align (plus separated list of types):"
91              "\njcc      indicates conditional jumps"
92              "\nfused    indicates fused conditional jumps"
93              "\njmp      indicates direct unconditional jumps"
94              "\ncall     indicates direct and indirect calls"
95              "\nret      indicates rets"
96              "\nindirect indicates indirect unconditional jumps"),
97     cl::location(X86AlignBranchKindLoc));
98 
99 cl::opt<bool> X86AlignBranchWithin32BBoundaries(
100     "x86-branches-within-32B-boundaries", cl::init(false),
101     cl::desc(
102         "Align selected instructions to mitigate negative performance impact "
103         "of Intel's micro code update for errata skx102.  May break "
104         "assumptions about labels corresponding to particular instructions, "
105         "and should be used with caution."));
106 
107 cl::opt<unsigned> X86PadMaxPrefixSize(
108     "x86-pad-max-prefix-size", cl::init(0),
109     cl::desc("Maximum number of prefixes to use for padding"));
110 
111 cl::opt<bool> X86PadForAlign(
112     "x86-pad-for-align", cl::init(false), cl::Hidden,
113     cl::desc("Pad previous instructions to implement align directives"));
114 
115 cl::opt<bool> X86PadForBranchAlign(
116     "x86-pad-for-branch-align", cl::init(true), cl::Hidden,
117     cl::desc("Pad previous instructions to implement branch alignment"));
118 
119 class X86ELFObjectWriter : public MCELFObjectTargetWriter {
120 public:
121   X86ELFObjectWriter(bool is64Bit, uint8_t OSABI, uint16_t EMachine,
122                      bool HasRelocationAddend, bool foobar)
123     : MCELFObjectTargetWriter(is64Bit, OSABI, EMachine, HasRelocationAddend) {}
124 };
125 
126 class X86AsmBackend : public MCAsmBackend {
127   const MCSubtargetInfo &STI;
128   std::unique_ptr<const MCInstrInfo> MCII;
129   X86AlignBranchKind AlignBranchType;
130   Align AlignBoundary;
131   unsigned TargetPrefixMax = 0;
132 
133   MCInst PrevInst;
134   MCBoundaryAlignFragment *PendingBA = nullptr;
135   std::pair<MCFragment *, size_t> PrevInstPosition;
136   bool CanPadInst;
137 
138   uint8_t determinePaddingPrefix(const MCInst &Inst) const;
139   bool isMacroFused(const MCInst &Cmp, const MCInst &Jcc) const;
140   bool needAlign(const MCInst &Inst) const;
141   bool canPadBranches(MCObjectStreamer &OS) const;
142   bool canPadInst(const MCInst &Inst, MCObjectStreamer &OS) const;
143 
144 public:
145   X86AsmBackend(const Target &T, const MCSubtargetInfo &STI)
146       : MCAsmBackend(support::little), STI(STI),
147         MCII(T.createMCInstrInfo()) {
148     if (X86AlignBranchWithin32BBoundaries) {
149       // At the moment, this defaults to aligning fused branches, unconditional
150       // jumps, and (unfused) conditional jumps with nops.  Both the
151       // instructions aligned and the alignment method (nop vs prefix) may
152       // change in the future.
153       AlignBoundary = assumeAligned(32);;
154       AlignBranchType.addKind(X86::AlignBranchFused);
155       AlignBranchType.addKind(X86::AlignBranchJcc);
156       AlignBranchType.addKind(X86::AlignBranchJmp);
157     }
158     // Allow overriding defaults set by master flag
159     if (X86AlignBranchBoundary.getNumOccurrences())
160       AlignBoundary = assumeAligned(X86AlignBranchBoundary);
161     if (X86AlignBranch.getNumOccurrences())
162       AlignBranchType = X86AlignBranchKindLoc;
163     if (X86PadMaxPrefixSize.getNumOccurrences())
164       TargetPrefixMax = X86PadMaxPrefixSize;
165   }
166 
167   bool allowAutoPadding() const override;
168   bool allowEnhancedRelaxation() const override;
169   void emitInstructionBegin(MCObjectStreamer &OS, const MCInst &Inst) override;
170   void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst) override;
171 
172   unsigned getNumFixupKinds() const override {
173     return X86::NumTargetFixupKinds;
174   }
175 
176   Optional<MCFixupKind> getFixupKind(StringRef Name) const override;
177 
178   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
179 
180   bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
181                              const MCValue &Target) override;
182 
183   void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
184                   const MCValue &Target, MutableArrayRef<char> Data,
185                   uint64_t Value, bool IsResolved,
186                   const MCSubtargetInfo *STI) const override;
187 
188   bool mayNeedRelaxation(const MCInst &Inst,
189                          const MCSubtargetInfo &STI) const override;
190 
191   bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
192                             const MCRelaxableFragment *DF,
193                             const MCAsmLayout &Layout) const override;
194 
195   void relaxInstruction(MCInst &Inst,
196                         const MCSubtargetInfo &STI) const override;
197 
198   bool padInstructionViaRelaxation(MCRelaxableFragment &RF,
199                                    MCCodeEmitter &Emitter,
200                                    unsigned &RemainingSize) const;
201 
202   bool padInstructionViaPrefix(MCRelaxableFragment &RF, MCCodeEmitter &Emitter,
203                                unsigned &RemainingSize) const;
204 
205   bool padInstructionEncoding(MCRelaxableFragment &RF, MCCodeEmitter &Emitter,
206                               unsigned &RemainingSize) const;
207 
208   void finishLayout(MCAssembler const &Asm, MCAsmLayout &Layout) const override;
209 
210   unsigned getMaximumNopSize() const override;
211 
212   bool writeNopData(raw_ostream &OS, uint64_t Count) const override;
213 };
214 } // end anonymous namespace
215 
216 static unsigned getRelaxedOpcodeBranch(const MCInst &Inst, bool Is16BitMode) {
217   unsigned Op = Inst.getOpcode();
218   switch (Op) {
219   default:
220     return Op;
221   case X86::JCC_1:
222     return (Is16BitMode) ? X86::JCC_2 : X86::JCC_4;
223   case X86::JMP_1:
224     return (Is16BitMode) ? X86::JMP_2 : X86::JMP_4;
225   }
226 }
227 
228 static unsigned getRelaxedOpcodeArith(const MCInst &Inst) {
229   unsigned Op = Inst.getOpcode();
230   switch (Op) {
231   default:
232     return Op;
233 
234     // IMUL
235   case X86::IMUL16rri8: return X86::IMUL16rri;
236   case X86::IMUL16rmi8: return X86::IMUL16rmi;
237   case X86::IMUL32rri8: return X86::IMUL32rri;
238   case X86::IMUL32rmi8: return X86::IMUL32rmi;
239   case X86::IMUL64rri8: return X86::IMUL64rri32;
240   case X86::IMUL64rmi8: return X86::IMUL64rmi32;
241 
242     // AND
243   case X86::AND16ri8: return X86::AND16ri;
244   case X86::AND16mi8: return X86::AND16mi;
245   case X86::AND32ri8: return X86::AND32ri;
246   case X86::AND32mi8: return X86::AND32mi;
247   case X86::AND64ri8: return X86::AND64ri32;
248   case X86::AND64mi8: return X86::AND64mi32;
249 
250     // OR
251   case X86::OR16ri8: return X86::OR16ri;
252   case X86::OR16mi8: return X86::OR16mi;
253   case X86::OR32ri8: return X86::OR32ri;
254   case X86::OR32mi8: return X86::OR32mi;
255   case X86::OR64ri8: return X86::OR64ri32;
256   case X86::OR64mi8: return X86::OR64mi32;
257 
258     // XOR
259   case X86::XOR16ri8: return X86::XOR16ri;
260   case X86::XOR16mi8: return X86::XOR16mi;
261   case X86::XOR32ri8: return X86::XOR32ri;
262   case X86::XOR32mi8: return X86::XOR32mi;
263   case X86::XOR64ri8: return X86::XOR64ri32;
264   case X86::XOR64mi8: return X86::XOR64mi32;
265 
266     // ADD
267   case X86::ADD16ri8: return X86::ADD16ri;
268   case X86::ADD16mi8: return X86::ADD16mi;
269   case X86::ADD32ri8: return X86::ADD32ri;
270   case X86::ADD32mi8: return X86::ADD32mi;
271   case X86::ADD64ri8: return X86::ADD64ri32;
272   case X86::ADD64mi8: return X86::ADD64mi32;
273 
274    // ADC
275   case X86::ADC16ri8: return X86::ADC16ri;
276   case X86::ADC16mi8: return X86::ADC16mi;
277   case X86::ADC32ri8: return X86::ADC32ri;
278   case X86::ADC32mi8: return X86::ADC32mi;
279   case X86::ADC64ri8: return X86::ADC64ri32;
280   case X86::ADC64mi8: return X86::ADC64mi32;
281 
282     // SUB
283   case X86::SUB16ri8: return X86::SUB16ri;
284   case X86::SUB16mi8: return X86::SUB16mi;
285   case X86::SUB32ri8: return X86::SUB32ri;
286   case X86::SUB32mi8: return X86::SUB32mi;
287   case X86::SUB64ri8: return X86::SUB64ri32;
288   case X86::SUB64mi8: return X86::SUB64mi32;
289 
290    // SBB
291   case X86::SBB16ri8: return X86::SBB16ri;
292   case X86::SBB16mi8: return X86::SBB16mi;
293   case X86::SBB32ri8: return X86::SBB32ri;
294   case X86::SBB32mi8: return X86::SBB32mi;
295   case X86::SBB64ri8: return X86::SBB64ri32;
296   case X86::SBB64mi8: return X86::SBB64mi32;
297 
298     // CMP
299   case X86::CMP16ri8: return X86::CMP16ri;
300   case X86::CMP16mi8: return X86::CMP16mi;
301   case X86::CMP32ri8: return X86::CMP32ri;
302   case X86::CMP32mi8: return X86::CMP32mi;
303   case X86::CMP64ri8: return X86::CMP64ri32;
304   case X86::CMP64mi8: return X86::CMP64mi32;
305 
306     // PUSH
307   case X86::PUSH32i8:  return X86::PUSHi32;
308   case X86::PUSH16i8:  return X86::PUSHi16;
309   case X86::PUSH64i8:  return X86::PUSH64i32;
310   }
311 }
312 
313 static unsigned getRelaxedOpcode(const MCInst &Inst, bool Is16BitMode) {
314   unsigned R = getRelaxedOpcodeArith(Inst);
315   if (R != Inst.getOpcode())
316     return R;
317   return getRelaxedOpcodeBranch(Inst, Is16BitMode);
318 }
319 
320 static X86::CondCode getCondFromBranch(const MCInst &MI,
321                                        const MCInstrInfo &MCII) {
322   unsigned Opcode = MI.getOpcode();
323   switch (Opcode) {
324   default:
325     return X86::COND_INVALID;
326   case X86::JCC_1: {
327     const MCInstrDesc &Desc = MCII.get(Opcode);
328     return static_cast<X86::CondCode>(
329         MI.getOperand(Desc.getNumOperands() - 1).getImm());
330   }
331   }
332 }
333 
334 static X86::SecondMacroFusionInstKind
335 classifySecondInstInMacroFusion(const MCInst &MI, const MCInstrInfo &MCII) {
336   X86::CondCode CC = getCondFromBranch(MI, MCII);
337   return classifySecondCondCodeInMacroFusion(CC);
338 }
339 
340 /// Check if the instruction uses RIP relative addressing.
341 static bool isRIPRelative(const MCInst &MI, const MCInstrInfo &MCII) {
342   unsigned Opcode = MI.getOpcode();
343   const MCInstrDesc &Desc = MCII.get(Opcode);
344   uint64_t TSFlags = Desc.TSFlags;
345   unsigned CurOp = X86II::getOperandBias(Desc);
346   int MemoryOperand = X86II::getMemoryOperandNo(TSFlags);
347   if (MemoryOperand < 0)
348     return false;
349   unsigned BaseRegNum = MemoryOperand + CurOp + X86::AddrBaseReg;
350   unsigned BaseReg = MI.getOperand(BaseRegNum).getReg();
351   return (BaseReg == X86::RIP);
352 }
353 
354 /// Check if the instruction is a prefix.
355 static bool isPrefix(const MCInst &MI, const MCInstrInfo &MCII) {
356   return X86II::isPrefix(MCII.get(MI.getOpcode()).TSFlags);
357 }
358 
359 /// Check if the instruction is valid as the first instruction in macro fusion.
360 static bool isFirstMacroFusibleInst(const MCInst &Inst,
361                                     const MCInstrInfo &MCII) {
362   // An Intel instruction with RIP relative addressing is not macro fusible.
363   if (isRIPRelative(Inst, MCII))
364     return false;
365   X86::FirstMacroFusionInstKind FIK =
366       X86::classifyFirstOpcodeInMacroFusion(Inst.getOpcode());
367   return FIK != X86::FirstMacroFusionInstKind::Invalid;
368 }
369 
370 /// X86 can reduce the bytes of NOP by padding instructions with prefixes to
371 /// get a better peformance in some cases. Here, we determine which prefix is
372 /// the most suitable.
373 ///
374 /// If the instruction has a segment override prefix, use the existing one.
375 /// If the target is 64-bit, use the CS.
376 /// If the target is 32-bit,
377 ///   - If the instruction has a ESP/EBP base register, use SS.
378 ///   - Otherwise use DS.
379 uint8_t X86AsmBackend::determinePaddingPrefix(const MCInst &Inst) const {
380   assert((STI.hasFeature(X86::Mode32Bit) || STI.hasFeature(X86::Mode64Bit)) &&
381          "Prefixes can be added only in 32-bit or 64-bit mode.");
382   const MCInstrDesc &Desc = MCII->get(Inst.getOpcode());
383   uint64_t TSFlags = Desc.TSFlags;
384 
385   // Determine where the memory operand starts, if present.
386   int MemoryOperand = X86II::getMemoryOperandNo(TSFlags);
387   if (MemoryOperand != -1)
388     MemoryOperand += X86II::getOperandBias(Desc);
389 
390   unsigned SegmentReg = 0;
391   if (MemoryOperand >= 0) {
392     // Check for explicit segment override on memory operand.
393     SegmentReg = Inst.getOperand(MemoryOperand + X86::AddrSegmentReg).getReg();
394   }
395 
396   switch (TSFlags & X86II::FormMask) {
397   default:
398     break;
399   case X86II::RawFrmDstSrc: {
400     // Check segment override opcode prefix as needed (not for %ds).
401     if (Inst.getOperand(2).getReg() != X86::DS)
402       SegmentReg = Inst.getOperand(2).getReg();
403     break;
404   }
405   case X86II::RawFrmSrc: {
406     // Check segment override opcode prefix as needed (not for %ds).
407     if (Inst.getOperand(1).getReg() != X86::DS)
408       SegmentReg = Inst.getOperand(1).getReg();
409     break;
410   }
411   case X86II::RawFrmMemOffs: {
412     // Check segment override opcode prefix as needed.
413     SegmentReg = Inst.getOperand(1).getReg();
414     break;
415   }
416   }
417 
418   if (SegmentReg != 0)
419     return X86::getSegmentOverridePrefixForReg(SegmentReg);
420 
421   if (STI.hasFeature(X86::Mode64Bit))
422     return X86::CS_Encoding;
423 
424   if (MemoryOperand >= 0) {
425     unsigned BaseRegNum = MemoryOperand + X86::AddrBaseReg;
426     unsigned BaseReg = Inst.getOperand(BaseRegNum).getReg();
427     if (BaseReg == X86::ESP || BaseReg == X86::EBP)
428       return X86::SS_Encoding;
429   }
430   return X86::DS_Encoding;
431 }
432 
433 /// Check if the two instructions will be macro-fused on the target cpu.
434 bool X86AsmBackend::isMacroFused(const MCInst &Cmp, const MCInst &Jcc) const {
435   const MCInstrDesc &InstDesc = MCII->get(Jcc.getOpcode());
436   if (!InstDesc.isConditionalBranch())
437     return false;
438   if (!isFirstMacroFusibleInst(Cmp, *MCII))
439     return false;
440   const X86::FirstMacroFusionInstKind CmpKind =
441       X86::classifyFirstOpcodeInMacroFusion(Cmp.getOpcode());
442   const X86::SecondMacroFusionInstKind BranchKind =
443       classifySecondInstInMacroFusion(Jcc, *MCII);
444   return X86::isMacroFused(CmpKind, BranchKind);
445 }
446 
447 /// Check if the instruction has a variant symbol operand.
448 static bool hasVariantSymbol(const MCInst &MI) {
449   for (auto &Operand : MI) {
450     if (!Operand.isExpr())
451       continue;
452     const MCExpr &Expr = *Operand.getExpr();
453     if (Expr.getKind() == MCExpr::SymbolRef &&
454         cast<MCSymbolRefExpr>(Expr).getKind() != MCSymbolRefExpr::VK_None)
455       return true;
456   }
457   return false;
458 }
459 
460 bool X86AsmBackend::allowAutoPadding() const {
461   return (AlignBoundary != Align(1) && AlignBranchType != X86::AlignBranchNone);
462 }
463 
464 bool X86AsmBackend::allowEnhancedRelaxation() const {
465   return allowAutoPadding() && TargetPrefixMax != 0 && X86PadForBranchAlign;
466 }
467 
468 /// X86 has certain instructions which enable interrupts exactly one
469 /// instruction *after* the instruction which stores to SS.  Return true if the
470 /// given instruction has such an interrupt delay slot.
471 static bool hasInterruptDelaySlot(const MCInst &Inst) {
472   switch (Inst.getOpcode()) {
473   case X86::POPSS16:
474   case X86::POPSS32:
475   case X86::STI:
476     return true;
477 
478   case X86::MOV16sr:
479   case X86::MOV32sr:
480   case X86::MOV64sr:
481   case X86::MOV16sm:
482     if (Inst.getOperand(0).getReg() == X86::SS)
483       return true;
484     break;
485   }
486   return false;
487 }
488 
489 /// Check if the instruction to be emitted is right after any data.
490 static bool
491 isRightAfterData(MCFragment *CurrentFragment,
492                  const std::pair<MCFragment *, size_t> &PrevInstPosition) {
493   MCFragment *F = CurrentFragment;
494   // Empty data fragments may be created to prevent further data being
495   // added into the previous fragment, we need to skip them since they
496   // have no contents.
497   for (; isa_and_nonnull<MCDataFragment>(F); F = F->getPrevNode())
498     if (cast<MCDataFragment>(F)->getContents().size() != 0)
499       break;
500 
501   // Since data is always emitted into a DataFragment, our check strategy is
502   // simple here.
503   //   - If the fragment is a DataFragment
504   //     - If it's not the fragment where the previous instruction is,
505   //       returns true.
506   //     - If it's the fragment holding the previous instruction but its
507   //       size changed since the the previous instruction was emitted into
508   //       it, returns true.
509   //     - Otherwise returns false.
510   //   - If the fragment is not a DataFragment, returns false.
511   if (auto *DF = dyn_cast_or_null<MCDataFragment>(F))
512     return DF != PrevInstPosition.first ||
513            DF->getContents().size() != PrevInstPosition.second;
514 
515   return false;
516 }
517 
518 /// \returns the fragment size if it has instructions, otherwise returns 0.
519 static size_t getSizeForInstFragment(const MCFragment *F) {
520   if (!F || !F->hasInstructions())
521     return 0;
522   // MCEncodedFragmentWithContents being templated makes this tricky.
523   switch (F->getKind()) {
524   default:
525     llvm_unreachable("Unknown fragment with instructions!");
526   case MCFragment::FT_Data:
527     return cast<MCDataFragment>(*F).getContents().size();
528   case MCFragment::FT_Relaxable:
529     return cast<MCRelaxableFragment>(*F).getContents().size();
530   case MCFragment::FT_CompactEncodedInst:
531     return cast<MCCompactEncodedInstFragment>(*F).getContents().size();
532   }
533 }
534 
535 /// Return true if we can insert NOP or prefixes automatically before the
536 /// the instruction to be emitted.
537 bool X86AsmBackend::canPadInst(const MCInst &Inst, MCObjectStreamer &OS) const {
538   if (hasVariantSymbol(Inst))
539     // Linker may rewrite the instruction with variant symbol operand(e.g.
540     // TLSCALL).
541     return false;
542 
543   if (hasInterruptDelaySlot(PrevInst))
544     // If this instruction follows an interrupt enabling instruction with a one
545     // instruction delay, inserting a nop would change behavior.
546     return false;
547 
548   if (isPrefix(PrevInst, *MCII))
549     // If this instruction follows a prefix, inserting a nop/prefix would change
550     // semantic.
551     return false;
552 
553   if (isPrefix(Inst, *MCII))
554     // If this instruction is a prefix, inserting a prefix would change
555     // semantic.
556     return false;
557 
558   if (isRightAfterData(OS.getCurrentFragment(), PrevInstPosition))
559     // If this instruction follows any data, there is no clear
560     // instruction boundary, inserting a nop/prefix would change semantic.
561     return false;
562 
563   return true;
564 }
565 
566 bool X86AsmBackend::canPadBranches(MCObjectStreamer &OS) const {
567   if (!OS.getAllowAutoPadding())
568     return false;
569   assert(allowAutoPadding() && "incorrect initialization!");
570 
571   // We only pad in text section.
572   if (!OS.getCurrentSectionOnly()->getKind().isText())
573     return false;
574 
575   // To be Done: Currently don't deal with Bundle cases.
576   if (OS.getAssembler().isBundlingEnabled())
577     return false;
578 
579   // Branches only need to be aligned in 32-bit or 64-bit mode.
580   if (!(STI.hasFeature(X86::Mode64Bit) || STI.hasFeature(X86::Mode32Bit)))
581     return false;
582 
583   return true;
584 }
585 
586 /// Check if the instruction operand needs to be aligned.
587 bool X86AsmBackend::needAlign(const MCInst &Inst) const {
588   const MCInstrDesc &Desc = MCII->get(Inst.getOpcode());
589   return (Desc.isConditionalBranch() &&
590           (AlignBranchType & X86::AlignBranchJcc)) ||
591          (Desc.isUnconditionalBranch() &&
592           (AlignBranchType & X86::AlignBranchJmp)) ||
593          (Desc.isCall() && (AlignBranchType & X86::AlignBranchCall)) ||
594          (Desc.isReturn() && (AlignBranchType & X86::AlignBranchRet)) ||
595          (Desc.isIndirectBranch() &&
596           (AlignBranchType & X86::AlignBranchIndirect));
597 }
598 
599 /// Insert BoundaryAlignFragment before instructions to align branches.
600 void X86AsmBackend::emitInstructionBegin(MCObjectStreamer &OS,
601                                          const MCInst &Inst) {
602   CanPadInst = canPadInst(Inst, OS);
603 
604   if (!canPadBranches(OS))
605     return;
606 
607   if (!isMacroFused(PrevInst, Inst))
608     // Macro fusion doesn't happen indeed, clear the pending.
609     PendingBA = nullptr;
610 
611   if (!CanPadInst)
612     return;
613 
614   if (PendingBA && OS.getCurrentFragment()->getPrevNode() == PendingBA) {
615     // Macro fusion actually happens and there is no other fragment inserted
616     // after the previous instruction.
617     //
618     // Do nothing here since we already inserted a BoudaryAlign fragment when
619     // we met the first instruction in the fused pair and we'll tie them
620     // together in emitInstructionEnd.
621     //
622     // Note: When there is at least one fragment, such as MCAlignFragment,
623     // inserted after the previous instruction, e.g.
624     //
625     // \code
626     //   cmp %rax %rcx
627     //   .align 16
628     //   je .Label0
629     // \ endcode
630     //
631     // We will treat the JCC as a unfused branch although it may be fused
632     // with the CMP.
633     return;
634   }
635 
636   if (needAlign(Inst) || ((AlignBranchType & X86::AlignBranchFused) &&
637                           isFirstMacroFusibleInst(Inst, *MCII))) {
638     // If we meet a unfused branch or the first instuction in a fusiable pair,
639     // insert a BoundaryAlign fragment.
640     OS.insert(PendingBA = new MCBoundaryAlignFragment(AlignBoundary));
641   }
642 }
643 
644 /// Set the last fragment to be aligned for the BoundaryAlignFragment.
645 void X86AsmBackend::emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst) {
646   PrevInst = Inst;
647   MCFragment *CF = OS.getCurrentFragment();
648   PrevInstPosition = std::make_pair(CF, getSizeForInstFragment(CF));
649   if (auto *F = dyn_cast_or_null<MCRelaxableFragment>(CF))
650     F->setAllowAutoPadding(CanPadInst);
651 
652   if (!canPadBranches(OS))
653     return;
654 
655   if (!needAlign(Inst) || !PendingBA)
656     return;
657 
658   // Tie the aligned instructions into a a pending BoundaryAlign.
659   PendingBA->setLastFragment(CF);
660   PendingBA = nullptr;
661 
662   // We need to ensure that further data isn't added to the current
663   // DataFragment, so that we can get the size of instructions later in
664   // MCAssembler::relaxBoundaryAlign. The easiest way is to insert a new empty
665   // DataFragment.
666   if (isa_and_nonnull<MCDataFragment>(CF))
667     OS.insert(new MCDataFragment());
668 
669   // Update the maximum alignment on the current section if necessary.
670   MCSection *Sec = OS.getCurrentSectionOnly();
671   if (AlignBoundary.value() > Sec->getAlignment())
672     Sec->setAlignment(AlignBoundary);
673 }
674 
675 Optional<MCFixupKind> X86AsmBackend::getFixupKind(StringRef Name) const {
676   if (STI.getTargetTriple().isOSBinFormatELF()) {
677     unsigned Type;
678     if (STI.getTargetTriple().getArch() == Triple::x86_64) {
679       Type = llvm::StringSwitch<unsigned>(Name)
680 #define ELF_RELOC(X, Y) .Case(#X, Y)
681 #include "llvm/BinaryFormat/ELFRelocs/x86_64.def"
682 #undef ELF_RELOC
683                  .Default(-1u);
684     } else {
685       Type = llvm::StringSwitch<unsigned>(Name)
686 #define ELF_RELOC(X, Y) .Case(#X, Y)
687 #include "llvm/BinaryFormat/ELFRelocs/i386.def"
688 #undef ELF_RELOC
689                  .Default(-1u);
690     }
691     if (Type == -1u)
692       return None;
693     return static_cast<MCFixupKind>(FirstLiteralRelocationKind + Type);
694   }
695   return MCAsmBackend::getFixupKind(Name);
696 }
697 
698 const MCFixupKindInfo &X86AsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
699   const static MCFixupKindInfo Infos[X86::NumTargetFixupKinds] = {
700       {"reloc_riprel_4byte", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
701       {"reloc_riprel_4byte_movq_load", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
702       {"reloc_riprel_4byte_relax", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
703       {"reloc_riprel_4byte_relax_rex", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
704       {"reloc_signed_4byte", 0, 32, 0},
705       {"reloc_signed_4byte_relax", 0, 32, 0},
706       {"reloc_global_offset_table", 0, 32, 0},
707       {"reloc_global_offset_table8", 0, 64, 0},
708       {"reloc_branch_4byte_pcrel", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
709   };
710 
711   // Fixup kinds from .reloc directive are like R_386_NONE/R_X86_64_NONE. They
712   // do not require any extra processing.
713   if (Kind >= FirstLiteralRelocationKind)
714     return MCAsmBackend::getFixupKindInfo(FK_NONE);
715 
716   if (Kind < FirstTargetFixupKind)
717     return MCAsmBackend::getFixupKindInfo(Kind);
718 
719   assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
720          "Invalid kind!");
721   assert(Infos[Kind - FirstTargetFixupKind].Name && "Empty fixup name!");
722   return Infos[Kind - FirstTargetFixupKind];
723 }
724 
725 bool X86AsmBackend::shouldForceRelocation(const MCAssembler &,
726                                           const MCFixup &Fixup,
727                                           const MCValue &) {
728   return Fixup.getKind() >= FirstLiteralRelocationKind;
729 }
730 
731 static unsigned getFixupKindSize(unsigned Kind) {
732   switch (Kind) {
733   default:
734     llvm_unreachable("invalid fixup kind!");
735   case FK_NONE:
736     return 0;
737   case FK_PCRel_1:
738   case FK_SecRel_1:
739   case FK_Data_1:
740     return 1;
741   case FK_PCRel_2:
742   case FK_SecRel_2:
743   case FK_Data_2:
744     return 2;
745   case FK_PCRel_4:
746   case X86::reloc_riprel_4byte:
747   case X86::reloc_riprel_4byte_relax:
748   case X86::reloc_riprel_4byte_relax_rex:
749   case X86::reloc_riprel_4byte_movq_load:
750   case X86::reloc_signed_4byte:
751   case X86::reloc_signed_4byte_relax:
752   case X86::reloc_global_offset_table:
753   case X86::reloc_branch_4byte_pcrel:
754   case FK_SecRel_4:
755   case FK_Data_4:
756     return 4;
757   case FK_PCRel_8:
758   case FK_SecRel_8:
759   case FK_Data_8:
760   case X86::reloc_global_offset_table8:
761     return 8;
762   }
763 }
764 
765 void X86AsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
766                                const MCValue &Target,
767                                MutableArrayRef<char> Data,
768                                uint64_t Value, bool IsResolved,
769                                const MCSubtargetInfo *STI) const {
770   unsigned Kind = Fixup.getKind();
771   if (Kind >= FirstLiteralRelocationKind)
772     return;
773   unsigned Size = getFixupKindSize(Kind);
774 
775   assert(Fixup.getOffset() + Size <= Data.size() && "Invalid fixup offset!");
776 
777   int64_t SignedValue = static_cast<int64_t>(Value);
778   if ((Target.isAbsolute() || IsResolved) &&
779       getFixupKindInfo(Fixup.getKind()).Flags &
780       MCFixupKindInfo::FKF_IsPCRel) {
781     // check that PC relative fixup fits into the fixup size.
782     if (Size > 0 && !isIntN(Size * 8, SignedValue))
783       Asm.getContext().reportError(
784                                    Fixup.getLoc(), "value of " + Twine(SignedValue) +
785                                    " is too large for field of " + Twine(Size) +
786                                    ((Size == 1) ? " byte." : " bytes."));
787   } else {
788     // Check that uppper bits are either all zeros or all ones.
789     // Specifically ignore overflow/underflow as long as the leakage is
790     // limited to the lower bits. This is to remain compatible with
791     // other assemblers.
792     assert((Size == 0 || isIntN(Size * 8 + 1, SignedValue)) &&
793            "Value does not fit in the Fixup field");
794   }
795 
796   for (unsigned i = 0; i != Size; ++i)
797     Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8));
798 }
799 
800 bool X86AsmBackend::mayNeedRelaxation(const MCInst &Inst,
801                                       const MCSubtargetInfo &STI) const {
802   // Branches can always be relaxed in either mode.
803   if (getRelaxedOpcodeBranch(Inst, false) != Inst.getOpcode())
804     return true;
805 
806   // Check if this instruction is ever relaxable.
807   if (getRelaxedOpcodeArith(Inst) == Inst.getOpcode())
808     return false;
809 
810 
811   // Check if the relaxable operand has an expression. For the current set of
812   // relaxable instructions, the relaxable operand is always the last operand.
813   unsigned RelaxableOp = Inst.getNumOperands() - 1;
814   if (Inst.getOperand(RelaxableOp).isExpr())
815     return true;
816 
817   return false;
818 }
819 
820 bool X86AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
821                                          uint64_t Value,
822                                          const MCRelaxableFragment *DF,
823                                          const MCAsmLayout &Layout) const {
824   // Relax if the value is too big for a (signed) i8.
825   return !isInt<8>(Value);
826 }
827 
828 // FIXME: Can tblgen help at all here to verify there aren't other instructions
829 // we can relax?
830 void X86AsmBackend::relaxInstruction(MCInst &Inst,
831                                      const MCSubtargetInfo &STI) const {
832   // The only relaxations X86 does is from a 1byte pcrel to a 4byte pcrel.
833   bool Is16BitMode = STI.getFeatureBits()[X86::Mode16Bit];
834   unsigned RelaxedOp = getRelaxedOpcode(Inst, Is16BitMode);
835 
836   if (RelaxedOp == Inst.getOpcode()) {
837     SmallString<256> Tmp;
838     raw_svector_ostream OS(Tmp);
839     Inst.dump_pretty(OS);
840     OS << "\n";
841     report_fatal_error("unexpected instruction to relax: " + OS.str());
842   }
843 
844   Inst.setOpcode(RelaxedOp);
845 }
846 
847 /// Return true if this instruction has been fully relaxed into it's most
848 /// general available form.
849 static bool isFullyRelaxed(const MCRelaxableFragment &RF) {
850   auto &Inst = RF.getInst();
851   auto &STI = *RF.getSubtargetInfo();
852   bool Is16BitMode = STI.getFeatureBits()[X86::Mode16Bit];
853   return getRelaxedOpcode(Inst, Is16BitMode) == Inst.getOpcode();
854 }
855 
856 bool X86AsmBackend::padInstructionViaPrefix(MCRelaxableFragment &RF,
857                                             MCCodeEmitter &Emitter,
858                                             unsigned &RemainingSize) const {
859   if (!RF.getAllowAutoPadding())
860     return false;
861   // If the instruction isn't fully relaxed, shifting it around might require a
862   // larger value for one of the fixups then can be encoded.  The outer loop
863   // will also catch this before moving to the next instruction, but we need to
864   // prevent padding this single instruction as well.
865   if (!isFullyRelaxed(RF))
866     return false;
867 
868   const unsigned OldSize = RF.getContents().size();
869   if (OldSize == 15)
870     return false;
871 
872   const unsigned MaxPossiblePad = std::min(15 - OldSize, RemainingSize);
873   const unsigned RemainingPrefixSize = [&]() -> unsigned {
874     SmallString<15> Code;
875     raw_svector_ostream VecOS(Code);
876     Emitter.emitPrefix(RF.getInst(), VecOS, STI);
877     assert(Code.size() < 15 && "The number of prefixes must be less than 15.");
878 
879     // TODO: It turns out we need a decent amount of plumbing for the target
880     // specific bits to determine number of prefixes its safe to add.  Various
881     // targets (older chips mostly, but also Atom family) encounter decoder
882     // stalls with too many prefixes.  For testing purposes, we set the value
883     // externally for the moment.
884     unsigned ExistingPrefixSize = Code.size();
885     if (TargetPrefixMax <= ExistingPrefixSize)
886       return 0;
887     return TargetPrefixMax - ExistingPrefixSize;
888   }();
889   const unsigned PrefixBytesToAdd =
890       std::min(MaxPossiblePad, RemainingPrefixSize);
891   if (PrefixBytesToAdd == 0)
892     return false;
893 
894   const uint8_t Prefix = determinePaddingPrefix(RF.getInst());
895 
896   SmallString<256> Code;
897   Code.append(PrefixBytesToAdd, Prefix);
898   Code.append(RF.getContents().begin(), RF.getContents().end());
899   RF.getContents() = Code;
900 
901   // Adjust the fixups for the change in offsets
902   for (auto &F : RF.getFixups()) {
903     F.setOffset(F.getOffset() + PrefixBytesToAdd);
904   }
905 
906   RemainingSize -= PrefixBytesToAdd;
907   return true;
908 }
909 
910 bool X86AsmBackend::padInstructionViaRelaxation(MCRelaxableFragment &RF,
911                                                 MCCodeEmitter &Emitter,
912                                                 unsigned &RemainingSize) const {
913   if (isFullyRelaxed(RF))
914     // TODO: There are lots of other tricks we could apply for increasing
915     // encoding size without impacting performance.
916     return false;
917 
918   MCInst Relaxed = RF.getInst();
919   relaxInstruction(Relaxed, *RF.getSubtargetInfo());
920 
921   SmallVector<MCFixup, 4> Fixups;
922   SmallString<15> Code;
923   raw_svector_ostream VecOS(Code);
924   Emitter.encodeInstruction(Relaxed, VecOS, Fixups, *RF.getSubtargetInfo());
925   const unsigned OldSize = RF.getContents().size();
926   const unsigned NewSize = Code.size();
927   assert(NewSize >= OldSize && "size decrease during relaxation?");
928   unsigned Delta = NewSize - OldSize;
929   if (Delta > RemainingSize)
930     return false;
931   RF.setInst(Relaxed);
932   RF.getContents() = Code;
933   RF.getFixups() = Fixups;
934   RemainingSize -= Delta;
935   return true;
936 }
937 
938 bool X86AsmBackend::padInstructionEncoding(MCRelaxableFragment &RF,
939                                            MCCodeEmitter &Emitter,
940                                            unsigned &RemainingSize) const {
941   bool Changed = false;
942   if (RemainingSize != 0)
943     Changed |= padInstructionViaRelaxation(RF, Emitter, RemainingSize);
944   if (RemainingSize != 0)
945     Changed |= padInstructionViaPrefix(RF, Emitter, RemainingSize);
946   return Changed;
947 }
948 
949 void X86AsmBackend::finishLayout(MCAssembler const &Asm,
950                                  MCAsmLayout &Layout) const {
951   // See if we can further relax some instructions to cut down on the number of
952   // nop bytes required for code alignment.  The actual win is in reducing
953   // instruction count, not number of bytes.  Modern X86-64 can easily end up
954   // decode limited.  It is often better to reduce the number of instructions
955   // (i.e. eliminate nops) even at the cost of increasing the size and
956   // complexity of others.
957   if (!X86PadForAlign && !X86PadForBranchAlign)
958     return;
959 
960   // The processed regions are delimitered by LabeledFragments. -g may have more
961   // MCSymbols and therefore different relaxation results. X86PadForAlign is
962   // disabled by default to eliminate the -g vs non -g difference.
963   DenseSet<MCFragment *> LabeledFragments;
964   for (const MCSymbol &S : Asm.symbols())
965     LabeledFragments.insert(S.getFragment(false));
966 
967   for (MCSection &Sec : Asm) {
968     if (!Sec.getKind().isText())
969       continue;
970 
971     SmallVector<MCRelaxableFragment *, 4> Relaxable;
972     for (MCSection::iterator I = Sec.begin(), IE = Sec.end(); I != IE; ++I) {
973       MCFragment &F = *I;
974 
975       if (LabeledFragments.count(&F))
976         Relaxable.clear();
977 
978       if (F.getKind() == MCFragment::FT_Data ||
979           F.getKind() == MCFragment::FT_CompactEncodedInst)
980         // Skip and ignore
981         continue;
982 
983       if (F.getKind() == MCFragment::FT_Relaxable) {
984         auto &RF = cast<MCRelaxableFragment>(*I);
985         Relaxable.push_back(&RF);
986         continue;
987       }
988 
989       auto canHandle = [](MCFragment &F) -> bool {
990         switch (F.getKind()) {
991         default:
992           return false;
993         case MCFragment::FT_Align:
994           return X86PadForAlign;
995         case MCFragment::FT_BoundaryAlign:
996           return X86PadForBranchAlign;
997         }
998       };
999       // For any unhandled kind, assume we can't change layout.
1000       if (!canHandle(F)) {
1001         Relaxable.clear();
1002         continue;
1003       }
1004 
1005 #ifndef NDEBUG
1006       const uint64_t OrigOffset = Layout.getFragmentOffset(&F);
1007 #endif
1008       const uint64_t OrigSize = Asm.computeFragmentSize(Layout, F);
1009 
1010       // To keep the effects local, prefer to relax instructions closest to
1011       // the align directive.  This is purely about human understandability
1012       // of the resulting code.  If we later find a reason to expand
1013       // particular instructions over others, we can adjust.
1014       MCFragment *FirstChangedFragment = nullptr;
1015       unsigned RemainingSize = OrigSize;
1016       while (!Relaxable.empty() && RemainingSize != 0) {
1017         auto &RF = *Relaxable.pop_back_val();
1018         // Give the backend a chance to play any tricks it wishes to increase
1019         // the encoding size of the given instruction.  Target independent code
1020         // will try further relaxation, but target's may play further tricks.
1021         if (padInstructionEncoding(RF, Asm.getEmitter(), RemainingSize))
1022           FirstChangedFragment = &RF;
1023 
1024         // If we have an instruction which hasn't been fully relaxed, we can't
1025         // skip past it and insert bytes before it.  Changing its starting
1026         // offset might require a larger negative offset than it can encode.
1027         // We don't need to worry about larger positive offsets as none of the
1028         // possible offsets between this and our align are visible, and the
1029         // ones afterwards aren't changing.
1030         if (!isFullyRelaxed(RF))
1031           break;
1032       }
1033       Relaxable.clear();
1034 
1035       if (FirstChangedFragment) {
1036         // Make sure the offsets for any fragments in the effected range get
1037         // updated.  Note that this (conservatively) invalidates the offsets of
1038         // those following, but this is not required.
1039         Layout.invalidateFragmentsFrom(FirstChangedFragment);
1040       }
1041 
1042       // BoundaryAlign explicitly tracks it's size (unlike align)
1043       if (F.getKind() == MCFragment::FT_BoundaryAlign)
1044         cast<MCBoundaryAlignFragment>(F).setSize(RemainingSize);
1045 
1046 #ifndef NDEBUG
1047       const uint64_t FinalOffset = Layout.getFragmentOffset(&F);
1048       const uint64_t FinalSize = Asm.computeFragmentSize(Layout, F);
1049       assert(OrigOffset + OrigSize == FinalOffset + FinalSize &&
1050              "can't move start of next fragment!");
1051       assert(FinalSize == RemainingSize && "inconsistent size computation?");
1052 #endif
1053 
1054       // If we're looking at a boundary align, make sure we don't try to pad
1055       // its target instructions for some following directive.  Doing so would
1056       // break the alignment of the current boundary align.
1057       if (auto *BF = dyn_cast<MCBoundaryAlignFragment>(&F)) {
1058         const MCFragment *LastFragment = BF->getLastFragment();
1059         if (!LastFragment)
1060           continue;
1061         while (&*I != LastFragment)
1062           ++I;
1063       }
1064     }
1065   }
1066 
1067   // The layout is done. Mark every fragment as valid.
1068   for (unsigned int i = 0, n = Layout.getSectionOrder().size(); i != n; ++i) {
1069     MCSection &Section = *Layout.getSectionOrder()[i];
1070     Layout.getFragmentOffset(&*Section.getFragmentList().rbegin());
1071     Asm.computeFragmentSize(Layout, *Section.getFragmentList().rbegin());
1072   }
1073 }
1074 
1075 unsigned X86AsmBackend::getMaximumNopSize() const {
1076   if (STI.hasFeature(X86::Mode16Bit))
1077     return 4;
1078   if (!STI.hasFeature(X86::FeatureNOPL) && !STI.hasFeature(X86::Mode64Bit))
1079     return 1;
1080   if (STI.getFeatureBits()[X86::FeatureFast7ByteNOP])
1081     return 7;
1082   if (STI.getFeatureBits()[X86::FeatureFast15ByteNOP])
1083     return 15;
1084   if (STI.getFeatureBits()[X86::FeatureFast11ByteNOP])
1085     return 11;
1086   // FIXME: handle 32-bit mode
1087   // 15-bytes is the longest single NOP instruction, but 10-bytes is
1088   // commonly the longest that can be efficiently decoded.
1089   return 10;
1090 }
1091 
1092 /// Write a sequence of optimal nops to the output, covering \p Count
1093 /// bytes.
1094 /// \return - true on success, false on failure
1095 bool X86AsmBackend::writeNopData(raw_ostream &OS, uint64_t Count) const {
1096   static const char Nops32Bit[10][11] = {
1097       // nop
1098       "\x90",
1099       // xchg %ax,%ax
1100       "\x66\x90",
1101       // nopl (%[re]ax)
1102       "\x0f\x1f\x00",
1103       // nopl 0(%[re]ax)
1104       "\x0f\x1f\x40\x00",
1105       // nopl 0(%[re]ax,%[re]ax,1)
1106       "\x0f\x1f\x44\x00\x00",
1107       // nopw 0(%[re]ax,%[re]ax,1)
1108       "\x66\x0f\x1f\x44\x00\x00",
1109       // nopl 0L(%[re]ax)
1110       "\x0f\x1f\x80\x00\x00\x00\x00",
1111       // nopl 0L(%[re]ax,%[re]ax,1)
1112       "\x0f\x1f\x84\x00\x00\x00\x00\x00",
1113       // nopw 0L(%[re]ax,%[re]ax,1)
1114       "\x66\x0f\x1f\x84\x00\x00\x00\x00\x00",
1115       // nopw %cs:0L(%[re]ax,%[re]ax,1)
1116       "\x66\x2e\x0f\x1f\x84\x00\x00\x00\x00\x00",
1117   };
1118 
1119   // 16-bit mode uses different nop patterns than 32-bit.
1120   static const char Nops16Bit[4][11] = {
1121       // nop
1122       "\x90",
1123       // xchg %eax,%eax
1124       "\x66\x90",
1125       // lea 0(%si),%si
1126       "\x8d\x74\x00",
1127       // lea 0w(%si),%si
1128       "\x8d\xb4\x00\x00",
1129   };
1130 
1131   const char(*Nops)[11] =
1132       STI.getFeatureBits()[X86::Mode16Bit] ? Nops16Bit : Nops32Bit;
1133 
1134   uint64_t MaxNopLength = (uint64_t)getMaximumNopSize();
1135 
1136   // Emit as many MaxNopLength NOPs as needed, then emit a NOP of the remaining
1137   // length.
1138   do {
1139     const uint8_t ThisNopLength = (uint8_t) std::min(Count, MaxNopLength);
1140     const uint8_t Prefixes = ThisNopLength <= 10 ? 0 : ThisNopLength - 10;
1141     for (uint8_t i = 0; i < Prefixes; i++)
1142       OS << '\x66';
1143     const uint8_t Rest = ThisNopLength - Prefixes;
1144     if (Rest != 0)
1145       OS.write(Nops[Rest - 1], Rest);
1146     Count -= ThisNopLength;
1147   } while (Count != 0);
1148 
1149   return true;
1150 }
1151 
1152 /* *** */
1153 
1154 namespace {
1155 
1156 class ELFX86AsmBackend : public X86AsmBackend {
1157 public:
1158   uint8_t OSABI;
1159   ELFX86AsmBackend(const Target &T, uint8_t OSABI, const MCSubtargetInfo &STI)
1160       : X86AsmBackend(T, STI), OSABI(OSABI) {}
1161 };
1162 
1163 class ELFX86_32AsmBackend : public ELFX86AsmBackend {
1164 public:
1165   ELFX86_32AsmBackend(const Target &T, uint8_t OSABI,
1166                       const MCSubtargetInfo &STI)
1167     : ELFX86AsmBackend(T, OSABI, STI) {}
1168 
1169   std::unique_ptr<MCObjectTargetWriter>
1170   createObjectTargetWriter() const override {
1171     return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI, ELF::EM_386);
1172   }
1173 };
1174 
1175 class ELFX86_X32AsmBackend : public ELFX86AsmBackend {
1176 public:
1177   ELFX86_X32AsmBackend(const Target &T, uint8_t OSABI,
1178                        const MCSubtargetInfo &STI)
1179       : ELFX86AsmBackend(T, OSABI, STI) {}
1180 
1181   std::unique_ptr<MCObjectTargetWriter>
1182   createObjectTargetWriter() const override {
1183     return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI,
1184                                     ELF::EM_X86_64);
1185   }
1186 };
1187 
1188 class ELFX86_IAMCUAsmBackend : public ELFX86AsmBackend {
1189 public:
1190   ELFX86_IAMCUAsmBackend(const Target &T, uint8_t OSABI,
1191                          const MCSubtargetInfo &STI)
1192       : ELFX86AsmBackend(T, OSABI, STI) {}
1193 
1194   std::unique_ptr<MCObjectTargetWriter>
1195   createObjectTargetWriter() const override {
1196     return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI,
1197                                     ELF::EM_IAMCU);
1198   }
1199 };
1200 
1201 class ELFX86_64AsmBackend : public ELFX86AsmBackend {
1202 public:
1203   ELFX86_64AsmBackend(const Target &T, uint8_t OSABI,
1204                       const MCSubtargetInfo &STI)
1205     : ELFX86AsmBackend(T, OSABI, STI) {}
1206 
1207   std::unique_ptr<MCObjectTargetWriter>
1208   createObjectTargetWriter() const override {
1209     return createX86ELFObjectWriter(/*IsELF64*/ true, OSABI, ELF::EM_X86_64);
1210   }
1211 };
1212 
1213 class WindowsX86AsmBackend : public X86AsmBackend {
1214   bool Is64Bit;
1215 
1216 public:
1217   WindowsX86AsmBackend(const Target &T, bool is64Bit,
1218                        const MCSubtargetInfo &STI)
1219     : X86AsmBackend(T, STI)
1220     , Is64Bit(is64Bit) {
1221   }
1222 
1223   Optional<MCFixupKind> getFixupKind(StringRef Name) const override {
1224     return StringSwitch<Optional<MCFixupKind>>(Name)
1225         .Case("dir32", FK_Data_4)
1226         .Case("secrel32", FK_SecRel_4)
1227         .Case("secidx", FK_SecRel_2)
1228         .Default(MCAsmBackend::getFixupKind(Name));
1229   }
1230 
1231   std::unique_ptr<MCObjectTargetWriter>
1232   createObjectTargetWriter() const override {
1233     return createX86WinCOFFObjectWriter(Is64Bit);
1234   }
1235 };
1236 
1237 namespace CU {
1238 
1239   /// Compact unwind encoding values.
1240   enum CompactUnwindEncodings {
1241     /// [RE]BP based frame where [RE]BP is pused on the stack immediately after
1242     /// the return address, then [RE]SP is moved to [RE]BP.
1243     UNWIND_MODE_BP_FRAME                   = 0x01000000,
1244 
1245     /// A frameless function with a small constant stack size.
1246     UNWIND_MODE_STACK_IMMD                 = 0x02000000,
1247 
1248     /// A frameless function with a large constant stack size.
1249     UNWIND_MODE_STACK_IND                  = 0x03000000,
1250 
1251     /// No compact unwind encoding is available.
1252     UNWIND_MODE_DWARF                      = 0x04000000,
1253 
1254     /// Mask for encoding the frame registers.
1255     UNWIND_BP_FRAME_REGISTERS              = 0x00007FFF,
1256 
1257     /// Mask for encoding the frameless registers.
1258     UNWIND_FRAMELESS_STACK_REG_PERMUTATION = 0x000003FF
1259   };
1260 
1261 } // namespace CU
1262 
1263 class DarwinX86AsmBackend : public X86AsmBackend {
1264   const MCRegisterInfo &MRI;
1265 
1266   /// Number of registers that can be saved in a compact unwind encoding.
1267   enum { CU_NUM_SAVED_REGS = 6 };
1268 
1269   mutable unsigned SavedRegs[CU_NUM_SAVED_REGS];
1270   Triple TT;
1271   bool Is64Bit;
1272 
1273   unsigned OffsetSize;                   ///< Offset of a "push" instruction.
1274   unsigned MoveInstrSize;                ///< Size of a "move" instruction.
1275   unsigned StackDivide;                  ///< Amount to adjust stack size by.
1276 protected:
1277   /// Size of a "push" instruction for the given register.
1278   unsigned PushInstrSize(unsigned Reg) const {
1279     switch (Reg) {
1280       case X86::EBX:
1281       case X86::ECX:
1282       case X86::EDX:
1283       case X86::EDI:
1284       case X86::ESI:
1285       case X86::EBP:
1286       case X86::RBX:
1287       case X86::RBP:
1288         return 1;
1289       case X86::R12:
1290       case X86::R13:
1291       case X86::R14:
1292       case X86::R15:
1293         return 2;
1294     }
1295     return 1;
1296   }
1297 
1298 private:
1299   /// Get the compact unwind number for a given register. The number
1300   /// corresponds to the enum lists in compact_unwind_encoding.h.
1301   int getCompactUnwindRegNum(unsigned Reg) const {
1302     static const MCPhysReg CU32BitRegs[7] = {
1303       X86::EBX, X86::ECX, X86::EDX, X86::EDI, X86::ESI, X86::EBP, 0
1304     };
1305     static const MCPhysReg CU64BitRegs[] = {
1306       X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0
1307     };
1308     const MCPhysReg *CURegs = Is64Bit ? CU64BitRegs : CU32BitRegs;
1309     for (int Idx = 1; *CURegs; ++CURegs, ++Idx)
1310       if (*CURegs == Reg)
1311         return Idx;
1312 
1313     return -1;
1314   }
1315 
1316   /// Return the registers encoded for a compact encoding with a frame
1317   /// pointer.
1318   uint32_t encodeCompactUnwindRegistersWithFrame() const {
1319     // Encode the registers in the order they were saved --- 3-bits per
1320     // register. The list of saved registers is assumed to be in reverse
1321     // order. The registers are numbered from 1 to CU_NUM_SAVED_REGS.
1322     uint32_t RegEnc = 0;
1323     for (int i = 0, Idx = 0; i != CU_NUM_SAVED_REGS; ++i) {
1324       unsigned Reg = SavedRegs[i];
1325       if (Reg == 0) break;
1326 
1327       int CURegNum = getCompactUnwindRegNum(Reg);
1328       if (CURegNum == -1) return ~0U;
1329 
1330       // Encode the 3-bit register number in order, skipping over 3-bits for
1331       // each register.
1332       RegEnc |= (CURegNum & 0x7) << (Idx++ * 3);
1333     }
1334 
1335     assert((RegEnc & 0x3FFFF) == RegEnc &&
1336            "Invalid compact register encoding!");
1337     return RegEnc;
1338   }
1339 
1340   /// Create the permutation encoding used with frameless stacks. It is
1341   /// passed the number of registers to be saved and an array of the registers
1342   /// saved.
1343   uint32_t encodeCompactUnwindRegistersWithoutFrame(unsigned RegCount) const {
1344     // The saved registers are numbered from 1 to 6. In order to encode the
1345     // order in which they were saved, we re-number them according to their
1346     // place in the register order. The re-numbering is relative to the last
1347     // re-numbered register. E.g., if we have registers {6, 2, 4, 5} saved in
1348     // that order:
1349     //
1350     //    Orig  Re-Num
1351     //    ----  ------
1352     //     6       6
1353     //     2       2
1354     //     4       3
1355     //     5       3
1356     //
1357     for (unsigned i = 0; i < RegCount; ++i) {
1358       int CUReg = getCompactUnwindRegNum(SavedRegs[i]);
1359       if (CUReg == -1) return ~0U;
1360       SavedRegs[i] = CUReg;
1361     }
1362 
1363     // Reverse the list.
1364     std::reverse(&SavedRegs[0], &SavedRegs[CU_NUM_SAVED_REGS]);
1365 
1366     uint32_t RenumRegs[CU_NUM_SAVED_REGS];
1367     for (unsigned i = CU_NUM_SAVED_REGS - RegCount; i < CU_NUM_SAVED_REGS; ++i){
1368       unsigned Countless = 0;
1369       for (unsigned j = CU_NUM_SAVED_REGS - RegCount; j < i; ++j)
1370         if (SavedRegs[j] < SavedRegs[i])
1371           ++Countless;
1372 
1373       RenumRegs[i] = SavedRegs[i] - Countless - 1;
1374     }
1375 
1376     // Take the renumbered values and encode them into a 10-bit number.
1377     uint32_t permutationEncoding = 0;
1378     switch (RegCount) {
1379     case 6:
1380       permutationEncoding |= 120 * RenumRegs[0] + 24 * RenumRegs[1]
1381                              + 6 * RenumRegs[2] +  2 * RenumRegs[3]
1382                              +     RenumRegs[4];
1383       break;
1384     case 5:
1385       permutationEncoding |= 120 * RenumRegs[1] + 24 * RenumRegs[2]
1386                              + 6 * RenumRegs[3] +  2 * RenumRegs[4]
1387                              +     RenumRegs[5];
1388       break;
1389     case 4:
1390       permutationEncoding |=  60 * RenumRegs[2] + 12 * RenumRegs[3]
1391                              + 3 * RenumRegs[4] +      RenumRegs[5];
1392       break;
1393     case 3:
1394       permutationEncoding |=  20 * RenumRegs[3] +  4 * RenumRegs[4]
1395                              +     RenumRegs[5];
1396       break;
1397     case 2:
1398       permutationEncoding |=   5 * RenumRegs[4] +      RenumRegs[5];
1399       break;
1400     case 1:
1401       permutationEncoding |=       RenumRegs[5];
1402       break;
1403     }
1404 
1405     assert((permutationEncoding & 0x3FF) == permutationEncoding &&
1406            "Invalid compact register encoding!");
1407     return permutationEncoding;
1408   }
1409 
1410 public:
1411   DarwinX86AsmBackend(const Target &T, const MCRegisterInfo &MRI,
1412                       const MCSubtargetInfo &STI)
1413       : X86AsmBackend(T, STI), MRI(MRI), TT(STI.getTargetTriple()),
1414         Is64Bit(TT.isArch64Bit()) {
1415     memset(SavedRegs, 0, sizeof(SavedRegs));
1416     OffsetSize = Is64Bit ? 8 : 4;
1417     MoveInstrSize = Is64Bit ? 3 : 2;
1418     StackDivide = Is64Bit ? 8 : 4;
1419   }
1420 
1421   std::unique_ptr<MCObjectTargetWriter>
1422   createObjectTargetWriter() const override {
1423     uint32_t CPUType = cantFail(MachO::getCPUType(TT));
1424     uint32_t CPUSubType = cantFail(MachO::getCPUSubType(TT));
1425     return createX86MachObjectWriter(Is64Bit, CPUType, CPUSubType);
1426   }
1427 
1428   /// Implementation of algorithm to generate the compact unwind encoding
1429   /// for the CFI instructions.
1430   uint32_t
1431   generateCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs) const override {
1432     if (Instrs.empty()) return 0;
1433 
1434     // Reset the saved registers.
1435     unsigned SavedRegIdx = 0;
1436     memset(SavedRegs, 0, sizeof(SavedRegs));
1437 
1438     bool HasFP = false;
1439 
1440     // Encode that we are using EBP/RBP as the frame pointer.
1441     uint32_t CompactUnwindEncoding = 0;
1442 
1443     unsigned SubtractInstrIdx = Is64Bit ? 3 : 2;
1444     unsigned InstrOffset = 0;
1445     unsigned StackAdjust = 0;
1446     unsigned StackSize = 0;
1447     unsigned NumDefCFAOffsets = 0;
1448 
1449     for (unsigned i = 0, e = Instrs.size(); i != e; ++i) {
1450       const MCCFIInstruction &Inst = Instrs[i];
1451 
1452       switch (Inst.getOperation()) {
1453       default:
1454         // Any other CFI directives indicate a frame that we aren't prepared
1455         // to represent via compact unwind, so just bail out.
1456         return 0;
1457       case MCCFIInstruction::OpDefCfaRegister: {
1458         // Defines a frame pointer. E.g.
1459         //
1460         //     movq %rsp, %rbp
1461         //  L0:
1462         //     .cfi_def_cfa_register %rbp
1463         //
1464         HasFP = true;
1465 
1466         // If the frame pointer is other than esp/rsp, we do not have a way to
1467         // generate a compact unwinding representation, so bail out.
1468         if (*MRI.getLLVMRegNum(Inst.getRegister(), true) !=
1469             (Is64Bit ? X86::RBP : X86::EBP))
1470           return 0;
1471 
1472         // Reset the counts.
1473         memset(SavedRegs, 0, sizeof(SavedRegs));
1474         StackAdjust = 0;
1475         SavedRegIdx = 0;
1476         InstrOffset += MoveInstrSize;
1477         break;
1478       }
1479       case MCCFIInstruction::OpDefCfaOffset: {
1480         // Defines a new offset for the CFA. E.g.
1481         //
1482         //  With frame:
1483         //
1484         //     pushq %rbp
1485         //  L0:
1486         //     .cfi_def_cfa_offset 16
1487         //
1488         //  Without frame:
1489         //
1490         //     subq $72, %rsp
1491         //  L0:
1492         //     .cfi_def_cfa_offset 80
1493         //
1494         StackSize = Inst.getOffset() / StackDivide;
1495         ++NumDefCFAOffsets;
1496         break;
1497       }
1498       case MCCFIInstruction::OpOffset: {
1499         // Defines a "push" of a callee-saved register. E.g.
1500         //
1501         //     pushq %r15
1502         //     pushq %r14
1503         //     pushq %rbx
1504         //  L0:
1505         //     subq $120, %rsp
1506         //  L1:
1507         //     .cfi_offset %rbx, -40
1508         //     .cfi_offset %r14, -32
1509         //     .cfi_offset %r15, -24
1510         //
1511         if (SavedRegIdx == CU_NUM_SAVED_REGS)
1512           // If there are too many saved registers, we cannot use a compact
1513           // unwind encoding.
1514           return CU::UNWIND_MODE_DWARF;
1515 
1516         unsigned Reg = *MRI.getLLVMRegNum(Inst.getRegister(), true);
1517         SavedRegs[SavedRegIdx++] = Reg;
1518         StackAdjust += OffsetSize;
1519         InstrOffset += PushInstrSize(Reg);
1520         break;
1521       }
1522       }
1523     }
1524 
1525     StackAdjust /= StackDivide;
1526 
1527     if (HasFP) {
1528       if ((StackAdjust & 0xFF) != StackAdjust)
1529         // Offset was too big for a compact unwind encoding.
1530         return CU::UNWIND_MODE_DWARF;
1531 
1532       // Get the encoding of the saved registers when we have a frame pointer.
1533       uint32_t RegEnc = encodeCompactUnwindRegistersWithFrame();
1534       if (RegEnc == ~0U) return CU::UNWIND_MODE_DWARF;
1535 
1536       CompactUnwindEncoding |= CU::UNWIND_MODE_BP_FRAME;
1537       CompactUnwindEncoding |= (StackAdjust & 0xFF) << 16;
1538       CompactUnwindEncoding |= RegEnc & CU::UNWIND_BP_FRAME_REGISTERS;
1539     } else {
1540       SubtractInstrIdx += InstrOffset;
1541       ++StackAdjust;
1542 
1543       if ((StackSize & 0xFF) == StackSize) {
1544         // Frameless stack with a small stack size.
1545         CompactUnwindEncoding |= CU::UNWIND_MODE_STACK_IMMD;
1546 
1547         // Encode the stack size.
1548         CompactUnwindEncoding |= (StackSize & 0xFF) << 16;
1549       } else {
1550         if ((StackAdjust & 0x7) != StackAdjust)
1551           // The extra stack adjustments are too big for us to handle.
1552           return CU::UNWIND_MODE_DWARF;
1553 
1554         // Frameless stack with an offset too large for us to encode compactly.
1555         CompactUnwindEncoding |= CU::UNWIND_MODE_STACK_IND;
1556 
1557         // Encode the offset to the nnnnnn value in the 'subl $nnnnnn, ESP'
1558         // instruction.
1559         CompactUnwindEncoding |= (SubtractInstrIdx & 0xFF) << 16;
1560 
1561         // Encode any extra stack adjustments (done via push instructions).
1562         CompactUnwindEncoding |= (StackAdjust & 0x7) << 13;
1563       }
1564 
1565       // Encode the number of registers saved. (Reverse the list first.)
1566       std::reverse(&SavedRegs[0], &SavedRegs[SavedRegIdx]);
1567       CompactUnwindEncoding |= (SavedRegIdx & 0x7) << 10;
1568 
1569       // Get the encoding of the saved registers when we don't have a frame
1570       // pointer.
1571       uint32_t RegEnc = encodeCompactUnwindRegistersWithoutFrame(SavedRegIdx);
1572       if (RegEnc == ~0U) return CU::UNWIND_MODE_DWARF;
1573 
1574       // Encode the register encoding.
1575       CompactUnwindEncoding |=
1576         RegEnc & CU::UNWIND_FRAMELESS_STACK_REG_PERMUTATION;
1577     }
1578 
1579     return CompactUnwindEncoding;
1580   }
1581 };
1582 
1583 } // end anonymous namespace
1584 
1585 MCAsmBackend *llvm::createX86_32AsmBackend(const Target &T,
1586                                            const MCSubtargetInfo &STI,
1587                                            const MCRegisterInfo &MRI,
1588                                            const MCTargetOptions &Options) {
1589   const Triple &TheTriple = STI.getTargetTriple();
1590   if (TheTriple.isOSBinFormatMachO())
1591     return new DarwinX86AsmBackend(T, MRI, STI);
1592 
1593   if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF())
1594     return new WindowsX86AsmBackend(T, false, STI);
1595 
1596   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
1597 
1598   if (TheTriple.isOSIAMCU())
1599     return new ELFX86_IAMCUAsmBackend(T, OSABI, STI);
1600 
1601   return new ELFX86_32AsmBackend(T, OSABI, STI);
1602 }
1603 
1604 MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
1605                                            const MCSubtargetInfo &STI,
1606                                            const MCRegisterInfo &MRI,
1607                                            const MCTargetOptions &Options) {
1608   const Triple &TheTriple = STI.getTargetTriple();
1609   if (TheTriple.isOSBinFormatMachO())
1610     return new DarwinX86AsmBackend(T, MRI, STI);
1611 
1612   if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF())
1613     return new WindowsX86AsmBackend(T, true, STI);
1614 
1615   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
1616 
1617   if (TheTriple.getEnvironment() == Triple::GNUX32)
1618     return new ELFX86_X32AsmBackend(T, OSABI, STI);
1619   return new ELFX86_64AsmBackend(T, OSABI, STI);
1620 }
1621