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/MCAssembler.h" 16 #include "llvm/MC/MCContext.h" 17 #include "llvm/MC/MCDwarf.h" 18 #include "llvm/MC/MCELFObjectWriter.h" 19 #include "llvm/MC/MCExpr.h" 20 #include "llvm/MC/MCFixupKindInfo.h" 21 #include "llvm/MC/MCInst.h" 22 #include "llvm/MC/MCInstrInfo.h" 23 #include "llvm/MC/MCMachObjectWriter.h" 24 #include "llvm/MC/MCObjectStreamer.h" 25 #include "llvm/MC/MCObjectWriter.h" 26 #include "llvm/MC/MCRegisterInfo.h" 27 #include "llvm/MC/MCSectionMachO.h" 28 #include "llvm/MC/MCSubtargetInfo.h" 29 #include "llvm/MC/MCValue.h" 30 #include "llvm/Support/CommandLine.h" 31 #include "llvm/Support/ErrorHandling.h" 32 #include "llvm/Support/TargetRegistry.h" 33 #include "llvm/Support/raw_ostream.h" 34 35 using namespace llvm; 36 37 namespace { 38 /// A wrapper for holding a mask of the values from X86::AlignBranchBoundaryKind 39 class X86AlignBranchKind { 40 private: 41 uint8_t AlignBranchKind = 0; 42 43 public: 44 void operator=(const std::string &Val) { 45 if (Val.empty()) 46 return; 47 SmallVector<StringRef, 6> BranchTypes; 48 StringRef(Val).split(BranchTypes, '+', -1, false); 49 for (auto BranchType : BranchTypes) { 50 if (BranchType == "fused") 51 addKind(X86::AlignBranchFused); 52 else if (BranchType == "jcc") 53 addKind(X86::AlignBranchJcc); 54 else if (BranchType == "jmp") 55 addKind(X86::AlignBranchJmp); 56 else if (BranchType == "call") 57 addKind(X86::AlignBranchCall); 58 else if (BranchType == "ret") 59 addKind(X86::AlignBranchRet); 60 else if (BranchType == "indirect") 61 addKind(X86::AlignBranchIndirect); 62 else { 63 report_fatal_error( 64 "'-x86-align-branch 'The branches's type is combination of jcc, " 65 "fused, jmp, call, ret, indirect.(plus separated)", 66 false); 67 } 68 } 69 } 70 71 operator uint8_t() const { return AlignBranchKind; } 72 void addKind(X86::AlignBranchBoundaryKind Value) { AlignBranchKind |= Value; } 73 }; 74 75 X86AlignBranchKind X86AlignBranchKindLoc; 76 77 cl::opt<unsigned> X86AlignBranchBoundary( 78 "x86-align-branch-boundary", cl::init(0), 79 cl::desc( 80 "Control how the assembler should align branches with NOP. If the " 81 "boundary's size is not 0, it should be a power of 2 and no less " 82 "than 32. Branches will be aligned to prevent from being across or " 83 "against the boundary of specified size. The default value 0 does not " 84 "align branches.")); 85 86 cl::opt<X86AlignBranchKind, true, cl::parser<std::string>> X86AlignBranch( 87 "x86-align-branch", 88 cl::desc( 89 "Specify types of branches to align (plus separated list of types):" 90 "\njcc indicates conditional jumps" 91 "\nfused indicates fused conditional jumps" 92 "\njmp indicates direct unconditional jumps" 93 "\ncall indicates direct and indirect calls" 94 "\nret indicates rets" 95 "\nindirect indicates indirect unconditional jumps"), 96 cl::location(X86AlignBranchKindLoc)); 97 98 cl::opt<bool> X86AlignBranchWithin32BBoundaries( 99 "x86-branches-within-32B-boundaries", cl::init(false), 100 cl::desc( 101 "Align selected instructions to mitigate negative performance impact " 102 "of Intel's micro code update for errata skx102. May break " 103 "assumptions about labels corresponding to particular instructions, " 104 "and should be used with caution.")); 105 106 class X86ELFObjectWriter : public MCELFObjectTargetWriter { 107 public: 108 X86ELFObjectWriter(bool is64Bit, uint8_t OSABI, uint16_t EMachine, 109 bool HasRelocationAddend, bool foobar) 110 : MCELFObjectTargetWriter(is64Bit, OSABI, EMachine, HasRelocationAddend) {} 111 }; 112 113 class X86AsmBackend : public MCAsmBackend { 114 const MCSubtargetInfo &STI; 115 std::unique_ptr<const MCInstrInfo> MCII; 116 X86AlignBranchKind AlignBranchType; 117 Align AlignBoundary; 118 119 bool isMacroFused(const MCInst &Cmp, const MCInst &Jcc) const; 120 121 bool needAlign(MCObjectStreamer &OS) const; 122 bool needAlignInst(const MCInst &Inst) const; 123 MCBoundaryAlignFragment * 124 getOrCreateBoundaryAlignFragment(MCObjectStreamer &OS) const; 125 MCInst PrevInst; 126 127 public: 128 X86AsmBackend(const Target &T, const MCSubtargetInfo &STI) 129 : MCAsmBackend(support::little), STI(STI), 130 MCII(T.createMCInstrInfo()) { 131 if (X86AlignBranchWithin32BBoundaries) { 132 // At the moment, this defaults to aligning fused branches, unconditional 133 // jumps, and (unfused) conditional jumps with nops. Both the 134 // instructions aligned and the alignment method (nop vs prefix) may 135 // change in the future. 136 AlignBoundary = assumeAligned(32);; 137 AlignBranchType.addKind(X86::AlignBranchFused); 138 AlignBranchType.addKind(X86::AlignBranchJcc); 139 AlignBranchType.addKind(X86::AlignBranchJmp); 140 } 141 // Allow overriding defaults set by master flag 142 if (X86AlignBranchBoundary.getNumOccurrences()) 143 AlignBoundary = assumeAligned(X86AlignBranchBoundary); 144 if (X86AlignBranch.getNumOccurrences()) 145 AlignBranchType = X86AlignBranchKindLoc; 146 } 147 148 bool allowAutoPadding() const override; 149 void alignBranchesBegin(MCObjectStreamer &OS, const MCInst &Inst) override; 150 void alignBranchesEnd(MCObjectStreamer &OS, const MCInst &Inst) override; 151 152 unsigned getNumFixupKinds() const override { 153 return X86::NumTargetFixupKinds; 154 } 155 156 Optional<MCFixupKind> getFixupKind(StringRef Name) const override; 157 158 const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override; 159 160 bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup, 161 const MCValue &Target) override; 162 163 void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 164 const MCValue &Target, MutableArrayRef<char> Data, 165 uint64_t Value, bool IsResolved, 166 const MCSubtargetInfo *STI) const override; 167 168 bool mayNeedRelaxation(const MCInst &Inst, 169 const MCSubtargetInfo &STI) const override; 170 171 bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 172 const MCRelaxableFragment *DF, 173 const MCAsmLayout &Layout) const override; 174 175 void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, 176 MCInst &Res) const override; 177 178 bool writeNopData(raw_ostream &OS, uint64_t Count) const override; 179 }; 180 } // end anonymous namespace 181 182 static unsigned getRelaxedOpcodeBranch(const MCInst &Inst, bool is16BitMode) { 183 unsigned Op = Inst.getOpcode(); 184 switch (Op) { 185 default: 186 return Op; 187 case X86::JCC_1: 188 return (is16BitMode) ? X86::JCC_2 : X86::JCC_4; 189 case X86::JMP_1: 190 return (is16BitMode) ? X86::JMP_2 : X86::JMP_4; 191 } 192 } 193 194 static unsigned getRelaxedOpcodeArith(const MCInst &Inst) { 195 unsigned Op = Inst.getOpcode(); 196 switch (Op) { 197 default: 198 return Op; 199 200 // IMUL 201 case X86::IMUL16rri8: return X86::IMUL16rri; 202 case X86::IMUL16rmi8: return X86::IMUL16rmi; 203 case X86::IMUL32rri8: return X86::IMUL32rri; 204 case X86::IMUL32rmi8: return X86::IMUL32rmi; 205 case X86::IMUL64rri8: return X86::IMUL64rri32; 206 case X86::IMUL64rmi8: return X86::IMUL64rmi32; 207 208 // AND 209 case X86::AND16ri8: return X86::AND16ri; 210 case X86::AND16mi8: return X86::AND16mi; 211 case X86::AND32ri8: return X86::AND32ri; 212 case X86::AND32mi8: return X86::AND32mi; 213 case X86::AND64ri8: return X86::AND64ri32; 214 case X86::AND64mi8: return X86::AND64mi32; 215 216 // OR 217 case X86::OR16ri8: return X86::OR16ri; 218 case X86::OR16mi8: return X86::OR16mi; 219 case X86::OR32ri8: return X86::OR32ri; 220 case X86::OR32mi8: return X86::OR32mi; 221 case X86::OR64ri8: return X86::OR64ri32; 222 case X86::OR64mi8: return X86::OR64mi32; 223 224 // XOR 225 case X86::XOR16ri8: return X86::XOR16ri; 226 case X86::XOR16mi8: return X86::XOR16mi; 227 case X86::XOR32ri8: return X86::XOR32ri; 228 case X86::XOR32mi8: return X86::XOR32mi; 229 case X86::XOR64ri8: return X86::XOR64ri32; 230 case X86::XOR64mi8: return X86::XOR64mi32; 231 232 // ADD 233 case X86::ADD16ri8: return X86::ADD16ri; 234 case X86::ADD16mi8: return X86::ADD16mi; 235 case X86::ADD32ri8: return X86::ADD32ri; 236 case X86::ADD32mi8: return X86::ADD32mi; 237 case X86::ADD64ri8: return X86::ADD64ri32; 238 case X86::ADD64mi8: return X86::ADD64mi32; 239 240 // ADC 241 case X86::ADC16ri8: return X86::ADC16ri; 242 case X86::ADC16mi8: return X86::ADC16mi; 243 case X86::ADC32ri8: return X86::ADC32ri; 244 case X86::ADC32mi8: return X86::ADC32mi; 245 case X86::ADC64ri8: return X86::ADC64ri32; 246 case X86::ADC64mi8: return X86::ADC64mi32; 247 248 // SUB 249 case X86::SUB16ri8: return X86::SUB16ri; 250 case X86::SUB16mi8: return X86::SUB16mi; 251 case X86::SUB32ri8: return X86::SUB32ri; 252 case X86::SUB32mi8: return X86::SUB32mi; 253 case X86::SUB64ri8: return X86::SUB64ri32; 254 case X86::SUB64mi8: return X86::SUB64mi32; 255 256 // SBB 257 case X86::SBB16ri8: return X86::SBB16ri; 258 case X86::SBB16mi8: return X86::SBB16mi; 259 case X86::SBB32ri8: return X86::SBB32ri; 260 case X86::SBB32mi8: return X86::SBB32mi; 261 case X86::SBB64ri8: return X86::SBB64ri32; 262 case X86::SBB64mi8: return X86::SBB64mi32; 263 264 // CMP 265 case X86::CMP16ri8: return X86::CMP16ri; 266 case X86::CMP16mi8: return X86::CMP16mi; 267 case X86::CMP32ri8: return X86::CMP32ri; 268 case X86::CMP32mi8: return X86::CMP32mi; 269 case X86::CMP64ri8: return X86::CMP64ri32; 270 case X86::CMP64mi8: return X86::CMP64mi32; 271 272 // PUSH 273 case X86::PUSH32i8: return X86::PUSHi32; 274 case X86::PUSH16i8: return X86::PUSHi16; 275 case X86::PUSH64i8: return X86::PUSH64i32; 276 } 277 } 278 279 static unsigned getRelaxedOpcode(const MCInst &Inst, bool is16BitMode) { 280 unsigned R = getRelaxedOpcodeArith(Inst); 281 if (R != Inst.getOpcode()) 282 return R; 283 return getRelaxedOpcodeBranch(Inst, is16BitMode); 284 } 285 286 static X86::CondCode getCondFromBranch(const MCInst &MI, 287 const MCInstrInfo &MCII) { 288 unsigned Opcode = MI.getOpcode(); 289 switch (Opcode) { 290 default: 291 return X86::COND_INVALID; 292 case X86::JCC_1: { 293 const MCInstrDesc &Desc = MCII.get(Opcode); 294 return static_cast<X86::CondCode>( 295 MI.getOperand(Desc.getNumOperands() - 1).getImm()); 296 } 297 } 298 } 299 300 static X86::SecondMacroFusionInstKind 301 classifySecondInstInMacroFusion(const MCInst &MI, const MCInstrInfo &MCII) { 302 X86::CondCode CC = getCondFromBranch(MI, MCII); 303 return classifySecondCondCodeInMacroFusion(CC); 304 } 305 306 /// Check if the instruction uses RIP relative addressing. 307 static bool isRIPRelative(const MCInst &MI, const MCInstrInfo &MCII) { 308 unsigned Opcode = MI.getOpcode(); 309 const MCInstrDesc &Desc = MCII.get(Opcode); 310 uint64_t TSFlags = Desc.TSFlags; 311 unsigned CurOp = X86II::getOperandBias(Desc); 312 int MemoryOperand = X86II::getMemoryOperandNo(TSFlags); 313 if (MemoryOperand < 0) 314 return false; 315 unsigned BaseRegNum = MemoryOperand + CurOp + X86::AddrBaseReg; 316 unsigned BaseReg = MI.getOperand(BaseRegNum).getReg(); 317 return (BaseReg == X86::RIP); 318 } 319 320 /// Check if the instruction is valid as the first instruction in macro fusion. 321 static bool isFirstMacroFusibleInst(const MCInst &Inst, 322 const MCInstrInfo &MCII) { 323 // An Intel instruction with RIP relative addressing is not macro fusible. 324 if (isRIPRelative(Inst, MCII)) 325 return false; 326 X86::FirstMacroFusionInstKind FIK = 327 X86::classifyFirstOpcodeInMacroFusion(Inst.getOpcode()); 328 return FIK != X86::FirstMacroFusionInstKind::Invalid; 329 } 330 331 /// Check if the two instructions will be macro-fused on the target cpu. 332 bool X86AsmBackend::isMacroFused(const MCInst &Cmp, const MCInst &Jcc) const { 333 const MCInstrDesc &InstDesc = MCII->get(Jcc.getOpcode()); 334 if (!InstDesc.isConditionalBranch()) 335 return false; 336 if (!isFirstMacroFusibleInst(Cmp, *MCII)) 337 return false; 338 const X86::FirstMacroFusionInstKind CmpKind = 339 X86::classifyFirstOpcodeInMacroFusion(Cmp.getOpcode()); 340 const X86::SecondMacroFusionInstKind BranchKind = 341 classifySecondInstInMacroFusion(Jcc, *MCII); 342 return X86::isMacroFused(CmpKind, BranchKind); 343 } 344 345 /// Check if the instruction has a variant symbol operand. 346 static bool hasVariantSymbol(const MCInst &MI) { 347 for (auto &Operand : MI) { 348 if (!Operand.isExpr()) 349 continue; 350 const MCExpr &Expr = *Operand.getExpr(); 351 if (Expr.getKind() == MCExpr::SymbolRef && 352 cast<MCSymbolRefExpr>(Expr).getKind() != MCSymbolRefExpr::VK_None) 353 return true; 354 } 355 return false; 356 } 357 358 bool X86AsmBackend::allowAutoPadding() const { 359 return (AlignBoundary != Align(1) && AlignBranchType != X86::AlignBranchNone); 360 } 361 362 bool X86AsmBackend::needAlign(MCObjectStreamer &OS) const { 363 if (!OS.getAllowAutoPadding()) 364 return false; 365 assert(allowAutoPadding() && "incorrect initialization!"); 366 367 MCAssembler &Assembler = OS.getAssembler(); 368 MCSection *Sec = OS.getCurrentSectionOnly(); 369 // To be Done: Currently don't deal with Bundle cases. 370 if (Assembler.isBundlingEnabled() && Sec->isBundleLocked()) 371 return false; 372 373 // Branches only need to be aligned in 32-bit or 64-bit mode. 374 if (!(STI.hasFeature(X86::Mode64Bit) || STI.hasFeature(X86::Mode32Bit))) 375 return false; 376 377 return true; 378 } 379 380 /// Check if the instruction operand needs to be aligned. Padding is disabled 381 /// before intruction which may be rewritten by linker(e.g. TLSCALL). 382 bool X86AsmBackend::needAlignInst(const MCInst &Inst) const { 383 // Linker may rewrite the instruction with variant symbol operand. 384 if (hasVariantSymbol(Inst)) 385 return false; 386 387 const MCInstrDesc &InstDesc = MCII->get(Inst.getOpcode()); 388 return (InstDesc.isConditionalBranch() && 389 (AlignBranchType & X86::AlignBranchJcc)) || 390 (InstDesc.isUnconditionalBranch() && 391 (AlignBranchType & X86::AlignBranchJmp)) || 392 (InstDesc.isCall() && 393 (AlignBranchType & X86::AlignBranchCall)) || 394 (InstDesc.isReturn() && 395 (AlignBranchType & X86::AlignBranchRet)) || 396 (InstDesc.isIndirectBranch() && 397 (AlignBranchType & X86::AlignBranchIndirect)); 398 } 399 400 static bool canReuseBoundaryAlignFragment(const MCBoundaryAlignFragment &F) { 401 // If a MCBoundaryAlignFragment has not been used to emit NOP,we can reuse it. 402 return !F.canEmitNops(); 403 } 404 405 MCBoundaryAlignFragment * 406 X86AsmBackend::getOrCreateBoundaryAlignFragment(MCObjectStreamer &OS) const { 407 auto *F = dyn_cast_or_null<MCBoundaryAlignFragment>(OS.getCurrentFragment()); 408 if (!F || !canReuseBoundaryAlignFragment(*F)) { 409 F = new MCBoundaryAlignFragment(AlignBoundary); 410 OS.insert(F); 411 } 412 return F; 413 } 414 415 /// Insert MCBoundaryAlignFragment before instructions to align branches. 416 void X86AsmBackend::alignBranchesBegin(MCObjectStreamer &OS, 417 const MCInst &Inst) { 418 if (!needAlign(OS)) 419 return; 420 421 MCFragment *CF = OS.getCurrentFragment(); 422 bool NeedAlignFused = AlignBranchType & X86::AlignBranchFused; 423 if (NeedAlignFused && isMacroFused(PrevInst, Inst) && CF) { 424 // Macro fusion actually happens and there is no other fragment inserted 425 // after the previous instruction. NOP can be emitted in PF to align fused 426 // jcc. 427 if (auto *PF = 428 dyn_cast_or_null<MCBoundaryAlignFragment>(CF->getPrevNode())) { 429 const_cast<MCBoundaryAlignFragment *>(PF)->setEmitNops(true); 430 const_cast<MCBoundaryAlignFragment *>(PF)->setFused(true); 431 } 432 } else if (needAlignInst(Inst)) { 433 // Note: When there is at least one fragment, such as MCAlignFragment, 434 // inserted after the previous instruction, e.g. 435 // 436 // \code 437 // cmp %rax %rcx 438 // .align 16 439 // je .Label0 440 // \ endcode 441 // 442 // We will treat the JCC as a unfused branch although it may be fused 443 // with the CMP. 444 auto *F = getOrCreateBoundaryAlignFragment(OS); 445 F->setEmitNops(true); 446 F->setFused(false); 447 } else if (NeedAlignFused && isFirstMacroFusibleInst(Inst, *MCII)) { 448 // We don't know if macro fusion happens until the reaching the next 449 // instruction, so a place holder is put here if necessary. 450 getOrCreateBoundaryAlignFragment(OS); 451 } 452 453 PrevInst = Inst; 454 } 455 456 /// Insert a MCBoundaryAlignFragment to mark the end of the branch to be aligned 457 /// if necessary. 458 void X86AsmBackend::alignBranchesEnd(MCObjectStreamer &OS, const MCInst &Inst) { 459 if (!needAlign(OS)) 460 return; 461 // If the branch is emitted into a MCRelaxableFragment, we can determine the 462 // size of the branch easily in MCAssembler::relaxBoundaryAlign. When the 463 // branch is fused, the fused branch(macro fusion pair) must be emitted into 464 // two fragments. Or when the branch is unfused, the branch must be emitted 465 // into one fragment. The MCRelaxableFragment naturally marks the end of the 466 // fused or unfused branch. 467 // Otherwise, we need to insert a MCBoundaryAlignFragment to mark the end of 468 // the branch. This MCBoundaryAlignFragment may be reused to emit NOP to align 469 // other branch. 470 if (needAlignInst(Inst) && !isa<MCRelaxableFragment>(OS.getCurrentFragment())) 471 OS.insert(new MCBoundaryAlignFragment(AlignBoundary)); 472 473 // Update the maximum alignment on the current section if necessary. 474 MCSection *Sec = OS.getCurrentSectionOnly(); 475 if (AlignBoundary.value() > Sec->getAlignment()) 476 Sec->setAlignment(AlignBoundary); 477 } 478 479 Optional<MCFixupKind> X86AsmBackend::getFixupKind(StringRef Name) const { 480 if (STI.getTargetTriple().isOSBinFormatELF()) { 481 if (STI.getTargetTriple().getArch() == Triple::x86_64) { 482 if (Name == "R_X86_64_NONE") 483 return FK_NONE; 484 } else { 485 if (Name == "R_386_NONE") 486 return FK_NONE; 487 } 488 } 489 return MCAsmBackend::getFixupKind(Name); 490 } 491 492 const MCFixupKindInfo &X86AsmBackend::getFixupKindInfo(MCFixupKind Kind) const { 493 const static MCFixupKindInfo Infos[X86::NumTargetFixupKinds] = { 494 {"reloc_riprel_4byte", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 495 {"reloc_riprel_4byte_movq_load", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 496 {"reloc_riprel_4byte_relax", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 497 {"reloc_riprel_4byte_relax_rex", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 498 {"reloc_signed_4byte", 0, 32, 0}, 499 {"reloc_signed_4byte_relax", 0, 32, 0}, 500 {"reloc_global_offset_table", 0, 32, 0}, 501 {"reloc_global_offset_table8", 0, 64, 0}, 502 {"reloc_branch_4byte_pcrel", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 503 }; 504 505 if (Kind < FirstTargetFixupKind) 506 return MCAsmBackend::getFixupKindInfo(Kind); 507 508 assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && 509 "Invalid kind!"); 510 assert(Infos[Kind - FirstTargetFixupKind].Name && "Empty fixup name!"); 511 return Infos[Kind - FirstTargetFixupKind]; 512 } 513 514 bool X86AsmBackend::shouldForceRelocation(const MCAssembler &, 515 const MCFixup &Fixup, 516 const MCValue &) { 517 return Fixup.getKind() == FK_NONE; 518 } 519 520 static unsigned getFixupKindSize(unsigned Kind) { 521 switch (Kind) { 522 default: 523 llvm_unreachable("invalid fixup kind!"); 524 case FK_NONE: 525 return 0; 526 case FK_PCRel_1: 527 case FK_SecRel_1: 528 case FK_Data_1: 529 return 1; 530 case FK_PCRel_2: 531 case FK_SecRel_2: 532 case FK_Data_2: 533 return 2; 534 case FK_PCRel_4: 535 case X86::reloc_riprel_4byte: 536 case X86::reloc_riprel_4byte_relax: 537 case X86::reloc_riprel_4byte_relax_rex: 538 case X86::reloc_riprel_4byte_movq_load: 539 case X86::reloc_signed_4byte: 540 case X86::reloc_signed_4byte_relax: 541 case X86::reloc_global_offset_table: 542 case X86::reloc_branch_4byte_pcrel: 543 case FK_SecRel_4: 544 case FK_Data_4: 545 return 4; 546 case FK_PCRel_8: 547 case FK_SecRel_8: 548 case FK_Data_8: 549 case X86::reloc_global_offset_table8: 550 return 8; 551 } 552 } 553 554 void X86AsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 555 const MCValue &Target, 556 MutableArrayRef<char> Data, 557 uint64_t Value, bool IsResolved, 558 const MCSubtargetInfo *STI) const { 559 unsigned Size = getFixupKindSize(Fixup.getKind()); 560 561 assert(Fixup.getOffset() + Size <= Data.size() && "Invalid fixup offset!"); 562 563 int64_t SignedValue = static_cast<int64_t>(Value); 564 if ((Target.isAbsolute() || IsResolved) && 565 getFixupKindInfo(Fixup.getKind()).Flags & 566 MCFixupKindInfo::FKF_IsPCRel) { 567 // check that PC relative fixup fits into the fixup size. 568 if (Size > 0 && !isIntN(Size * 8, SignedValue)) 569 Asm.getContext().reportError( 570 Fixup.getLoc(), "value of " + Twine(SignedValue) + 571 " is too large for field of " + Twine(Size) + 572 ((Size == 1) ? " byte." : " bytes.")); 573 } else { 574 // Check that uppper bits are either all zeros or all ones. 575 // Specifically ignore overflow/underflow as long as the leakage is 576 // limited to the lower bits. This is to remain compatible with 577 // other assemblers. 578 assert((Size == 0 || isIntN(Size * 8 + 1, SignedValue)) && 579 "Value does not fit in the Fixup field"); 580 } 581 582 for (unsigned i = 0; i != Size; ++i) 583 Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8)); 584 } 585 586 bool X86AsmBackend::mayNeedRelaxation(const MCInst &Inst, 587 const MCSubtargetInfo &STI) const { 588 // Branches can always be relaxed in either mode. 589 if (getRelaxedOpcodeBranch(Inst, false) != Inst.getOpcode()) 590 return true; 591 592 // Check if this instruction is ever relaxable. 593 if (getRelaxedOpcodeArith(Inst) == Inst.getOpcode()) 594 return false; 595 596 597 // Check if the relaxable operand has an expression. For the current set of 598 // relaxable instructions, the relaxable operand is always the last operand. 599 unsigned RelaxableOp = Inst.getNumOperands() - 1; 600 if (Inst.getOperand(RelaxableOp).isExpr()) 601 return true; 602 603 return false; 604 } 605 606 bool X86AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup, 607 uint64_t Value, 608 const MCRelaxableFragment *DF, 609 const MCAsmLayout &Layout) const { 610 // Relax if the value is too big for a (signed) i8. 611 return !isInt<8>(Value); 612 } 613 614 // FIXME: Can tblgen help at all here to verify there aren't other instructions 615 // we can relax? 616 void X86AsmBackend::relaxInstruction(const MCInst &Inst, 617 const MCSubtargetInfo &STI, 618 MCInst &Res) const { 619 // The only relaxations X86 does is from a 1byte pcrel to a 4byte pcrel. 620 bool is16BitMode = STI.getFeatureBits()[X86::Mode16Bit]; 621 unsigned RelaxedOp = getRelaxedOpcode(Inst, is16BitMode); 622 623 if (RelaxedOp == Inst.getOpcode()) { 624 SmallString<256> Tmp; 625 raw_svector_ostream OS(Tmp); 626 Inst.dump_pretty(OS); 627 OS << "\n"; 628 report_fatal_error("unexpected instruction to relax: " + OS.str()); 629 } 630 631 Res = Inst; 632 Res.setOpcode(RelaxedOp); 633 } 634 635 /// Write a sequence of optimal nops to the output, covering \p Count 636 /// bytes. 637 /// \return - true on success, false on failure 638 bool X86AsmBackend::writeNopData(raw_ostream &OS, uint64_t Count) const { 639 static const char Nops[10][11] = { 640 // nop 641 "\x90", 642 // xchg %ax,%ax 643 "\x66\x90", 644 // nopl (%[re]ax) 645 "\x0f\x1f\x00", 646 // nopl 0(%[re]ax) 647 "\x0f\x1f\x40\x00", 648 // nopl 0(%[re]ax,%[re]ax,1) 649 "\x0f\x1f\x44\x00\x00", 650 // nopw 0(%[re]ax,%[re]ax,1) 651 "\x66\x0f\x1f\x44\x00\x00", 652 // nopl 0L(%[re]ax) 653 "\x0f\x1f\x80\x00\x00\x00\x00", 654 // nopl 0L(%[re]ax,%[re]ax,1) 655 "\x0f\x1f\x84\x00\x00\x00\x00\x00", 656 // nopw 0L(%[re]ax,%[re]ax,1) 657 "\x66\x0f\x1f\x84\x00\x00\x00\x00\x00", 658 // nopw %cs:0L(%[re]ax,%[re]ax,1) 659 "\x66\x2e\x0f\x1f\x84\x00\x00\x00\x00\x00", 660 }; 661 662 // This CPU doesn't support long nops. If needed add more. 663 // FIXME: We could generated something better than plain 0x90. 664 if (!STI.getFeatureBits()[X86::FeatureNOPL]) { 665 for (uint64_t i = 0; i < Count; ++i) 666 OS << '\x90'; 667 return true; 668 } 669 670 // 15-bytes is the longest single NOP instruction, but 10-bytes is 671 // commonly the longest that can be efficiently decoded. 672 uint64_t MaxNopLength = 10; 673 if (STI.getFeatureBits()[X86::ProcIntelSLM]) 674 MaxNopLength = 7; 675 else if (STI.getFeatureBits()[X86::FeatureFast15ByteNOP]) 676 MaxNopLength = 15; 677 else if (STI.getFeatureBits()[X86::FeatureFast11ByteNOP]) 678 MaxNopLength = 11; 679 680 // Emit as many MaxNopLength NOPs as needed, then emit a NOP of the remaining 681 // length. 682 do { 683 const uint8_t ThisNopLength = (uint8_t) std::min(Count, MaxNopLength); 684 const uint8_t Prefixes = ThisNopLength <= 10 ? 0 : ThisNopLength - 10; 685 for (uint8_t i = 0; i < Prefixes; i++) 686 OS << '\x66'; 687 const uint8_t Rest = ThisNopLength - Prefixes; 688 if (Rest != 0) 689 OS.write(Nops[Rest - 1], Rest); 690 Count -= ThisNopLength; 691 } while (Count != 0); 692 693 return true; 694 } 695 696 /* *** */ 697 698 namespace { 699 700 class ELFX86AsmBackend : public X86AsmBackend { 701 public: 702 uint8_t OSABI; 703 ELFX86AsmBackend(const Target &T, uint8_t OSABI, const MCSubtargetInfo &STI) 704 : X86AsmBackend(T, STI), OSABI(OSABI) {} 705 }; 706 707 class ELFX86_32AsmBackend : public ELFX86AsmBackend { 708 public: 709 ELFX86_32AsmBackend(const Target &T, uint8_t OSABI, 710 const MCSubtargetInfo &STI) 711 : ELFX86AsmBackend(T, OSABI, STI) {} 712 713 std::unique_ptr<MCObjectTargetWriter> 714 createObjectTargetWriter() const override { 715 return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI, ELF::EM_386); 716 } 717 }; 718 719 class ELFX86_X32AsmBackend : public ELFX86AsmBackend { 720 public: 721 ELFX86_X32AsmBackend(const Target &T, uint8_t OSABI, 722 const MCSubtargetInfo &STI) 723 : ELFX86AsmBackend(T, OSABI, STI) {} 724 725 std::unique_ptr<MCObjectTargetWriter> 726 createObjectTargetWriter() const override { 727 return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI, 728 ELF::EM_X86_64); 729 } 730 }; 731 732 class ELFX86_IAMCUAsmBackend : public ELFX86AsmBackend { 733 public: 734 ELFX86_IAMCUAsmBackend(const Target &T, uint8_t OSABI, 735 const MCSubtargetInfo &STI) 736 : ELFX86AsmBackend(T, OSABI, STI) {} 737 738 std::unique_ptr<MCObjectTargetWriter> 739 createObjectTargetWriter() const override { 740 return createX86ELFObjectWriter(/*IsELF64*/ false, OSABI, 741 ELF::EM_IAMCU); 742 } 743 }; 744 745 class ELFX86_64AsmBackend : public ELFX86AsmBackend { 746 public: 747 ELFX86_64AsmBackend(const Target &T, uint8_t OSABI, 748 const MCSubtargetInfo &STI) 749 : ELFX86AsmBackend(T, OSABI, STI) {} 750 751 std::unique_ptr<MCObjectTargetWriter> 752 createObjectTargetWriter() const override { 753 return createX86ELFObjectWriter(/*IsELF64*/ true, OSABI, ELF::EM_X86_64); 754 } 755 }; 756 757 class WindowsX86AsmBackend : public X86AsmBackend { 758 bool Is64Bit; 759 760 public: 761 WindowsX86AsmBackend(const Target &T, bool is64Bit, 762 const MCSubtargetInfo &STI) 763 : X86AsmBackend(T, STI) 764 , Is64Bit(is64Bit) { 765 } 766 767 Optional<MCFixupKind> getFixupKind(StringRef Name) const override { 768 return StringSwitch<Optional<MCFixupKind>>(Name) 769 .Case("dir32", FK_Data_4) 770 .Case("secrel32", FK_SecRel_4) 771 .Case("secidx", FK_SecRel_2) 772 .Default(MCAsmBackend::getFixupKind(Name)); 773 } 774 775 std::unique_ptr<MCObjectTargetWriter> 776 createObjectTargetWriter() const override { 777 return createX86WinCOFFObjectWriter(Is64Bit); 778 } 779 }; 780 781 namespace CU { 782 783 /// Compact unwind encoding values. 784 enum CompactUnwindEncodings { 785 /// [RE]BP based frame where [RE]BP is pused on the stack immediately after 786 /// the return address, then [RE]SP is moved to [RE]BP. 787 UNWIND_MODE_BP_FRAME = 0x01000000, 788 789 /// A frameless function with a small constant stack size. 790 UNWIND_MODE_STACK_IMMD = 0x02000000, 791 792 /// A frameless function with a large constant stack size. 793 UNWIND_MODE_STACK_IND = 0x03000000, 794 795 /// No compact unwind encoding is available. 796 UNWIND_MODE_DWARF = 0x04000000, 797 798 /// Mask for encoding the frame registers. 799 UNWIND_BP_FRAME_REGISTERS = 0x00007FFF, 800 801 /// Mask for encoding the frameless registers. 802 UNWIND_FRAMELESS_STACK_REG_PERMUTATION = 0x000003FF 803 }; 804 805 } // end CU namespace 806 807 class DarwinX86AsmBackend : public X86AsmBackend { 808 const MCRegisterInfo &MRI; 809 810 /// Number of registers that can be saved in a compact unwind encoding. 811 enum { CU_NUM_SAVED_REGS = 6 }; 812 813 mutable unsigned SavedRegs[CU_NUM_SAVED_REGS]; 814 bool Is64Bit; 815 816 unsigned OffsetSize; ///< Offset of a "push" instruction. 817 unsigned MoveInstrSize; ///< Size of a "move" instruction. 818 unsigned StackDivide; ///< Amount to adjust stack size by. 819 protected: 820 /// Size of a "push" instruction for the given register. 821 unsigned PushInstrSize(unsigned Reg) const { 822 switch (Reg) { 823 case X86::EBX: 824 case X86::ECX: 825 case X86::EDX: 826 case X86::EDI: 827 case X86::ESI: 828 case X86::EBP: 829 case X86::RBX: 830 case X86::RBP: 831 return 1; 832 case X86::R12: 833 case X86::R13: 834 case X86::R14: 835 case X86::R15: 836 return 2; 837 } 838 return 1; 839 } 840 841 /// Implementation of algorithm to generate the compact unwind encoding 842 /// for the CFI instructions. 843 uint32_t 844 generateCompactUnwindEncodingImpl(ArrayRef<MCCFIInstruction> Instrs) const { 845 if (Instrs.empty()) return 0; 846 847 // Reset the saved registers. 848 unsigned SavedRegIdx = 0; 849 memset(SavedRegs, 0, sizeof(SavedRegs)); 850 851 bool HasFP = false; 852 853 // Encode that we are using EBP/RBP as the frame pointer. 854 uint32_t CompactUnwindEncoding = 0; 855 856 unsigned SubtractInstrIdx = Is64Bit ? 3 : 2; 857 unsigned InstrOffset = 0; 858 unsigned StackAdjust = 0; 859 unsigned StackSize = 0; 860 unsigned NumDefCFAOffsets = 0; 861 862 for (unsigned i = 0, e = Instrs.size(); i != e; ++i) { 863 const MCCFIInstruction &Inst = Instrs[i]; 864 865 switch (Inst.getOperation()) { 866 default: 867 // Any other CFI directives indicate a frame that we aren't prepared 868 // to represent via compact unwind, so just bail out. 869 return 0; 870 case MCCFIInstruction::OpDefCfaRegister: { 871 // Defines a frame pointer. E.g. 872 // 873 // movq %rsp, %rbp 874 // L0: 875 // .cfi_def_cfa_register %rbp 876 // 877 HasFP = true; 878 879 // If the frame pointer is other than esp/rsp, we do not have a way to 880 // generate a compact unwinding representation, so bail out. 881 if (*MRI.getLLVMRegNum(Inst.getRegister(), true) != 882 (Is64Bit ? X86::RBP : X86::EBP)) 883 return 0; 884 885 // Reset the counts. 886 memset(SavedRegs, 0, sizeof(SavedRegs)); 887 StackAdjust = 0; 888 SavedRegIdx = 0; 889 InstrOffset += MoveInstrSize; 890 break; 891 } 892 case MCCFIInstruction::OpDefCfaOffset: { 893 // Defines a new offset for the CFA. E.g. 894 // 895 // With frame: 896 // 897 // pushq %rbp 898 // L0: 899 // .cfi_def_cfa_offset 16 900 // 901 // Without frame: 902 // 903 // subq $72, %rsp 904 // L0: 905 // .cfi_def_cfa_offset 80 906 // 907 StackSize = std::abs(Inst.getOffset()) / StackDivide; 908 ++NumDefCFAOffsets; 909 break; 910 } 911 case MCCFIInstruction::OpOffset: { 912 // Defines a "push" of a callee-saved register. E.g. 913 // 914 // pushq %r15 915 // pushq %r14 916 // pushq %rbx 917 // L0: 918 // subq $120, %rsp 919 // L1: 920 // .cfi_offset %rbx, -40 921 // .cfi_offset %r14, -32 922 // .cfi_offset %r15, -24 923 // 924 if (SavedRegIdx == CU_NUM_SAVED_REGS) 925 // If there are too many saved registers, we cannot use a compact 926 // unwind encoding. 927 return CU::UNWIND_MODE_DWARF; 928 929 unsigned Reg = *MRI.getLLVMRegNum(Inst.getRegister(), true); 930 SavedRegs[SavedRegIdx++] = Reg; 931 StackAdjust += OffsetSize; 932 InstrOffset += PushInstrSize(Reg); 933 break; 934 } 935 } 936 } 937 938 StackAdjust /= StackDivide; 939 940 if (HasFP) { 941 if ((StackAdjust & 0xFF) != StackAdjust) 942 // Offset was too big for a compact unwind encoding. 943 return CU::UNWIND_MODE_DWARF; 944 945 // Get the encoding of the saved registers when we have a frame pointer. 946 uint32_t RegEnc = encodeCompactUnwindRegistersWithFrame(); 947 if (RegEnc == ~0U) return CU::UNWIND_MODE_DWARF; 948 949 CompactUnwindEncoding |= CU::UNWIND_MODE_BP_FRAME; 950 CompactUnwindEncoding |= (StackAdjust & 0xFF) << 16; 951 CompactUnwindEncoding |= RegEnc & CU::UNWIND_BP_FRAME_REGISTERS; 952 } else { 953 SubtractInstrIdx += InstrOffset; 954 ++StackAdjust; 955 956 if ((StackSize & 0xFF) == StackSize) { 957 // Frameless stack with a small stack size. 958 CompactUnwindEncoding |= CU::UNWIND_MODE_STACK_IMMD; 959 960 // Encode the stack size. 961 CompactUnwindEncoding |= (StackSize & 0xFF) << 16; 962 } else { 963 if ((StackAdjust & 0x7) != StackAdjust) 964 // The extra stack adjustments are too big for us to handle. 965 return CU::UNWIND_MODE_DWARF; 966 967 // Frameless stack with an offset too large for us to encode compactly. 968 CompactUnwindEncoding |= CU::UNWIND_MODE_STACK_IND; 969 970 // Encode the offset to the nnnnnn value in the 'subl $nnnnnn, ESP' 971 // instruction. 972 CompactUnwindEncoding |= (SubtractInstrIdx & 0xFF) << 16; 973 974 // Encode any extra stack adjustments (done via push instructions). 975 CompactUnwindEncoding |= (StackAdjust & 0x7) << 13; 976 } 977 978 // Encode the number of registers saved. (Reverse the list first.) 979 std::reverse(&SavedRegs[0], &SavedRegs[SavedRegIdx]); 980 CompactUnwindEncoding |= (SavedRegIdx & 0x7) << 10; 981 982 // Get the encoding of the saved registers when we don't have a frame 983 // pointer. 984 uint32_t RegEnc = encodeCompactUnwindRegistersWithoutFrame(SavedRegIdx); 985 if (RegEnc == ~0U) return CU::UNWIND_MODE_DWARF; 986 987 // Encode the register encoding. 988 CompactUnwindEncoding |= 989 RegEnc & CU::UNWIND_FRAMELESS_STACK_REG_PERMUTATION; 990 } 991 992 return CompactUnwindEncoding; 993 } 994 995 private: 996 /// Get the compact unwind number for a given register. The number 997 /// corresponds to the enum lists in compact_unwind_encoding.h. 998 int getCompactUnwindRegNum(unsigned Reg) const { 999 static const MCPhysReg CU32BitRegs[7] = { 1000 X86::EBX, X86::ECX, X86::EDX, X86::EDI, X86::ESI, X86::EBP, 0 1001 }; 1002 static const MCPhysReg CU64BitRegs[] = { 1003 X86::RBX, X86::R12, X86::R13, X86::R14, X86::R15, X86::RBP, 0 1004 }; 1005 const MCPhysReg *CURegs = Is64Bit ? CU64BitRegs : CU32BitRegs; 1006 for (int Idx = 1; *CURegs; ++CURegs, ++Idx) 1007 if (*CURegs == Reg) 1008 return Idx; 1009 1010 return -1; 1011 } 1012 1013 /// Return the registers encoded for a compact encoding with a frame 1014 /// pointer. 1015 uint32_t encodeCompactUnwindRegistersWithFrame() const { 1016 // Encode the registers in the order they were saved --- 3-bits per 1017 // register. The list of saved registers is assumed to be in reverse 1018 // order. The registers are numbered from 1 to CU_NUM_SAVED_REGS. 1019 uint32_t RegEnc = 0; 1020 for (int i = 0, Idx = 0; i != CU_NUM_SAVED_REGS; ++i) { 1021 unsigned Reg = SavedRegs[i]; 1022 if (Reg == 0) break; 1023 1024 int CURegNum = getCompactUnwindRegNum(Reg); 1025 if (CURegNum == -1) return ~0U; 1026 1027 // Encode the 3-bit register number in order, skipping over 3-bits for 1028 // each register. 1029 RegEnc |= (CURegNum & 0x7) << (Idx++ * 3); 1030 } 1031 1032 assert((RegEnc & 0x3FFFF) == RegEnc && 1033 "Invalid compact register encoding!"); 1034 return RegEnc; 1035 } 1036 1037 /// Create the permutation encoding used with frameless stacks. It is 1038 /// passed the number of registers to be saved and an array of the registers 1039 /// saved. 1040 uint32_t encodeCompactUnwindRegistersWithoutFrame(unsigned RegCount) const { 1041 // The saved registers are numbered from 1 to 6. In order to encode the 1042 // order in which they were saved, we re-number them according to their 1043 // place in the register order. The re-numbering is relative to the last 1044 // re-numbered register. E.g., if we have registers {6, 2, 4, 5} saved in 1045 // that order: 1046 // 1047 // Orig Re-Num 1048 // ---- ------ 1049 // 6 6 1050 // 2 2 1051 // 4 3 1052 // 5 3 1053 // 1054 for (unsigned i = 0; i < RegCount; ++i) { 1055 int CUReg = getCompactUnwindRegNum(SavedRegs[i]); 1056 if (CUReg == -1) return ~0U; 1057 SavedRegs[i] = CUReg; 1058 } 1059 1060 // Reverse the list. 1061 std::reverse(&SavedRegs[0], &SavedRegs[CU_NUM_SAVED_REGS]); 1062 1063 uint32_t RenumRegs[CU_NUM_SAVED_REGS]; 1064 for (unsigned i = CU_NUM_SAVED_REGS - RegCount; i < CU_NUM_SAVED_REGS; ++i){ 1065 unsigned Countless = 0; 1066 for (unsigned j = CU_NUM_SAVED_REGS - RegCount; j < i; ++j) 1067 if (SavedRegs[j] < SavedRegs[i]) 1068 ++Countless; 1069 1070 RenumRegs[i] = SavedRegs[i] - Countless - 1; 1071 } 1072 1073 // Take the renumbered values and encode them into a 10-bit number. 1074 uint32_t permutationEncoding = 0; 1075 switch (RegCount) { 1076 case 6: 1077 permutationEncoding |= 120 * RenumRegs[0] + 24 * RenumRegs[1] 1078 + 6 * RenumRegs[2] + 2 * RenumRegs[3] 1079 + RenumRegs[4]; 1080 break; 1081 case 5: 1082 permutationEncoding |= 120 * RenumRegs[1] + 24 * RenumRegs[2] 1083 + 6 * RenumRegs[3] + 2 * RenumRegs[4] 1084 + RenumRegs[5]; 1085 break; 1086 case 4: 1087 permutationEncoding |= 60 * RenumRegs[2] + 12 * RenumRegs[3] 1088 + 3 * RenumRegs[4] + RenumRegs[5]; 1089 break; 1090 case 3: 1091 permutationEncoding |= 20 * RenumRegs[3] + 4 * RenumRegs[4] 1092 + RenumRegs[5]; 1093 break; 1094 case 2: 1095 permutationEncoding |= 5 * RenumRegs[4] + RenumRegs[5]; 1096 break; 1097 case 1: 1098 permutationEncoding |= RenumRegs[5]; 1099 break; 1100 } 1101 1102 assert((permutationEncoding & 0x3FF) == permutationEncoding && 1103 "Invalid compact register encoding!"); 1104 return permutationEncoding; 1105 } 1106 1107 public: 1108 DarwinX86AsmBackend(const Target &T, const MCRegisterInfo &MRI, 1109 const MCSubtargetInfo &STI, bool Is64Bit) 1110 : X86AsmBackend(T, STI), MRI(MRI), Is64Bit(Is64Bit) { 1111 memset(SavedRegs, 0, sizeof(SavedRegs)); 1112 OffsetSize = Is64Bit ? 8 : 4; 1113 MoveInstrSize = Is64Bit ? 3 : 2; 1114 StackDivide = Is64Bit ? 8 : 4; 1115 } 1116 }; 1117 1118 class DarwinX86_32AsmBackend : public DarwinX86AsmBackend { 1119 public: 1120 DarwinX86_32AsmBackend(const Target &T, const MCRegisterInfo &MRI, 1121 const MCSubtargetInfo &STI) 1122 : DarwinX86AsmBackend(T, MRI, STI, false) {} 1123 1124 std::unique_ptr<MCObjectTargetWriter> 1125 createObjectTargetWriter() const override { 1126 return createX86MachObjectWriter(/*Is64Bit=*/false, 1127 MachO::CPU_TYPE_I386, 1128 MachO::CPU_SUBTYPE_I386_ALL); 1129 } 1130 1131 /// Generate the compact unwind encoding for the CFI instructions. 1132 uint32_t generateCompactUnwindEncoding( 1133 ArrayRef<MCCFIInstruction> Instrs) const override { 1134 return generateCompactUnwindEncodingImpl(Instrs); 1135 } 1136 }; 1137 1138 class DarwinX86_64AsmBackend : public DarwinX86AsmBackend { 1139 const MachO::CPUSubTypeX86 Subtype; 1140 public: 1141 DarwinX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI, 1142 const MCSubtargetInfo &STI, MachO::CPUSubTypeX86 st) 1143 : DarwinX86AsmBackend(T, MRI, STI, true), Subtype(st) {} 1144 1145 std::unique_ptr<MCObjectTargetWriter> 1146 createObjectTargetWriter() const override { 1147 return createX86MachObjectWriter(/*Is64Bit=*/true, MachO::CPU_TYPE_X86_64, 1148 Subtype); 1149 } 1150 1151 /// Generate the compact unwind encoding for the CFI instructions. 1152 uint32_t generateCompactUnwindEncoding( 1153 ArrayRef<MCCFIInstruction> Instrs) const override { 1154 return generateCompactUnwindEncodingImpl(Instrs); 1155 } 1156 }; 1157 1158 } // end anonymous namespace 1159 1160 MCAsmBackend *llvm::createX86_32AsmBackend(const Target &T, 1161 const MCSubtargetInfo &STI, 1162 const MCRegisterInfo &MRI, 1163 const MCTargetOptions &Options) { 1164 const Triple &TheTriple = STI.getTargetTriple(); 1165 if (TheTriple.isOSBinFormatMachO()) 1166 return new DarwinX86_32AsmBackend(T, MRI, STI); 1167 1168 if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF()) 1169 return new WindowsX86AsmBackend(T, false, STI); 1170 1171 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS()); 1172 1173 if (TheTriple.isOSIAMCU()) 1174 return new ELFX86_IAMCUAsmBackend(T, OSABI, STI); 1175 1176 return new ELFX86_32AsmBackend(T, OSABI, STI); 1177 } 1178 1179 MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, 1180 const MCSubtargetInfo &STI, 1181 const MCRegisterInfo &MRI, 1182 const MCTargetOptions &Options) { 1183 const Triple &TheTriple = STI.getTargetTriple(); 1184 if (TheTriple.isOSBinFormatMachO()) { 1185 MachO::CPUSubTypeX86 CS = 1186 StringSwitch<MachO::CPUSubTypeX86>(TheTriple.getArchName()) 1187 .Case("x86_64h", MachO::CPU_SUBTYPE_X86_64_H) 1188 .Default(MachO::CPU_SUBTYPE_X86_64_ALL); 1189 return new DarwinX86_64AsmBackend(T, MRI, STI, CS); 1190 } 1191 1192 if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF()) 1193 return new WindowsX86AsmBackend(T, true, STI); 1194 1195 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS()); 1196 1197 if (TheTriple.getEnvironment() == Triple::GNUX32) 1198 return new ELFX86_X32AsmBackend(T, OSABI, STI); 1199 return new ELFX86_64AsmBackend(T, OSABI, STI); 1200 } 1201