119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- X86AsmBackend.cpp - X86 Assembler Backend -------------------------===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCAsmBackend.h" 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MCTargetDesc/X86BaseInfo.h" 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MCTargetDesc/X86FixupKinds.h" 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/Twine.h" 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCAssembler.h" 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCELFObjectWriter.h" 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCExpr.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCFixupKindInfo.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCMachObjectWriter.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCObjectWriter.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionCOFF.h" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionELF.h" 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionMachO.h" 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Object/MachOFormat.h" 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/CommandLine.h" 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ELF.h" 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h" 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/TargetRegistry.h" 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h" 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm; 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Option to allow disabling arithmetic relaxation to workaround PR9807, which 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// is useful when running bitwise comparison experiments on Darwin. We should be 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// able to remove this once PR9807 is resolved. 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic cl::opt<bool> 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCDisableArithRelaxation("mc-x86-disable-arith-relaxation", 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman cl::desc("Disable relaxation of arithmetic instruction for X86")); 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getFixupKindLog2Size(unsigned Kind) { 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (Kind) { 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: assert(0 && "invalid fixup kind!"); 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_PCRel_1: 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_Data_1: return 0; 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_PCRel_2: 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_Data_2: return 1; 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_PCRel_4: 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::reloc_riprel_4byte: 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::reloc_riprel_4byte_movq_load: 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::reloc_signed_4byte: 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::reloc_global_offset_table: 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_Data_4: return 2; 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_PCRel_8: 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case FK_Data_8: return 3; 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace { 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass X86ELFObjectWriter : public MCELFObjectTargetWriter { 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman X86ELFObjectWriter(bool is64Bit, Triple::OSType OSType, uint16_t EMachine, 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool HasRelocationAddend) 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : MCELFObjectTargetWriter(is64Bit, OSType, EMachine, HasRelocationAddend) {} 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass X86AsmBackend : public MCAsmBackend { 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman X86AsmBackend(const Target &T) 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : MCAsmBackend() {} 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned getNumFixupKinds() const { 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return X86::NumTargetFixupKinds; 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const { 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const static MCFixupKindInfo Infos[X86::NumTargetFixupKinds] = { 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel }, 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel}, 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman { "reloc_signed_4byte", 0, 4 * 8, 0}, 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman { "reloc_global_offset_table", 0, 4 * 8, 0} 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind < FirstTargetFixupKind) 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MCAsmBackend::getFixupKindInfo(Kind); 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Invalid kind!"); 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Infos[Kind - FirstTargetFixupKind]; 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman uint64_t Value) const { 9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Size = 1 << getFixupKindLog2Size(Fixup.getKind()); 9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Fixup.getOffset() + Size <= DataSize && 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Invalid fixup offset!"); 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Check that uppper bits are either all zeros or all ones. 9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Specifically ignore overflow/underflow as long as the leakage is 9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // limited to the lower bits. This is to remain compatible with 10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // other assemblers. 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(isIntN(Size * 8 + 1, Value) && 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "Value does not fit in the Fixup field"); 10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0; i != Size; ++i) 10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8)); 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool MayNeedRelaxation(const MCInst &Inst) const; 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void RelaxInstruction(const MCInst &Inst, MCInst &Res) const; 11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const; 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getRelaxedOpcodeBranch(unsigned Op) { 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (Op) { 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Op; 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JAE_1: return X86::JAE_4; 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JA_1: return X86::JA_4; 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JBE_1: return X86::JBE_4; 12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JB_1: return X86::JB_4; 12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JE_1: return X86::JE_4; 12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JGE_1: return X86::JGE_4; 12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JG_1: return X86::JG_4; 12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JLE_1: return X86::JLE_4; 12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JL_1: return X86::JL_4; 13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JMP_1: return X86::JMP_4; 13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JNE_1: return X86::JNE_4; 13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JNO_1: return X86::JNO_4; 13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JNP_1: return X86::JNP_4; 13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JNS_1: return X86::JNS_4; 13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JO_1: return X86::JO_4; 13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JP_1: return X86::JP_4; 13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::JS_1: return X86::JS_4; 13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getRelaxedOpcodeArith(unsigned Op) { 14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (Op) { 14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: 14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Op; 14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // IMUL 14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL16rri8: return X86::IMUL16rri; 14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL16rmi8: return X86::IMUL16rmi; 14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL32rri8: return X86::IMUL32rri; 15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL32rmi8: return X86::IMUL32rmi; 15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL64rri8: return X86::IMUL64rri32; 15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::IMUL64rmi8: return X86::IMUL64rmi32; 15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // AND 15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND16ri8: return X86::AND16ri; 15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND16mi8: return X86::AND16mi; 15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND32ri8: return X86::AND32ri; 15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND32mi8: return X86::AND32mi; 15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND64ri8: return X86::AND64ri32; 16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::AND64mi8: return X86::AND64mi32; 16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // OR 16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR16ri8: return X86::OR16ri; 16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR16mi8: return X86::OR16mi; 16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR32ri8: return X86::OR32ri; 16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR32mi8: return X86::OR32mi; 16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR64ri8: return X86::OR64ri32; 16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::OR64mi8: return X86::OR64mi32; 16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // XOR 17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR16ri8: return X86::XOR16ri; 17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR16mi8: return X86::XOR16mi; 17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR32ri8: return X86::XOR32ri; 17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR32mi8: return X86::XOR32mi; 17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR64ri8: return X86::XOR64ri32; 17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::XOR64mi8: return X86::XOR64mi32; 17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // ADD 17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD16ri8: return X86::ADD16ri; 18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD16mi8: return X86::ADD16mi; 18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD32ri8: return X86::ADD32ri; 18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD32mi8: return X86::ADD32mi; 18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD64ri8: return X86::ADD64ri32; 18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::ADD64mi8: return X86::ADD64mi32; 18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // SUB 18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB16ri8: return X86::SUB16ri; 18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB16mi8: return X86::SUB16mi; 18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB32ri8: return X86::SUB32ri; 19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB32mi8: return X86::SUB32mi; 19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB64ri8: return X86::SUB64ri32; 19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::SUB64mi8: return X86::SUB64mi32; 19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // CMP 19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP16ri8: return X86::CMP16ri; 19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP16mi8: return X86::CMP16mi; 19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP32ri8: return X86::CMP32ri; 19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP32mi8: return X86::CMP32mi; 19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP64ri8: return X86::CMP64ri32; 20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::CMP64mi8: return X86::CMP64mi32; 20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // PUSH 20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::PUSHi8: return X86::PUSHi32; 20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::PUSHi16: return X86::PUSHi32; 20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::PUSH64i8: return X86::PUSH64i32; 20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case X86::PUSH64i16: return X86::PUSH64i32; 20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getRelaxedOpcode(unsigned Op) { 21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned R = getRelaxedOpcodeArith(Op); 21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (R != Op) 21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return R; 21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getRelaxedOpcodeBranch(Op); 21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86AsmBackend::MayNeedRelaxation(const MCInst &Inst) const { 21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Branches can always be relaxed. 21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (getRelaxedOpcodeBranch(Inst.getOpcode()) != Inst.getOpcode()) 22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (MCDisableArithRelaxation) 22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Check if this instruction is ever relaxable. 22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (getRelaxedOpcodeArith(Inst.getOpcode()) == Inst.getOpcode()) 22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Check if it has an expression and is not RIP relative. 23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool hasExp = false; 23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool hasRIP = false; 23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0; i < Inst.getNumOperands(); ++i) { 23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCOperand &Op = Inst.getOperand(i); 23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Op.isExpr()) 23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman hasExp = true; 23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Op.isReg() && Op.getReg() == X86::RIP) 23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman hasRIP = true; 24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: Why exactly do we need the !hasRIP? Is it just a limitation on 24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // how we do relaxations? 24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return hasExp && !hasRIP; 24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// FIXME: Can tblgen help at all here to verify there aren't other instructions 24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// we can relax? 24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid X86AsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const { 25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The only relaxations X86 does is from a 1byte pcrel to a 4byte pcrel. 25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode()); 25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (RelaxedOp == Inst.getOpcode()) { 25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<256> Tmp; 25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman raw_svector_ostream OS(Tmp); 25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Inst.dump_pretty(OS); 25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OS << "\n"; 25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman report_fatal_error("unexpected instruction to relax: " + OS.str()); 25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Res = Inst; 26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Res.setOpcode(RelaxedOp); 26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// WriteNopData - Write optimal nops to the output file for the \arg Count 26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// bytes. This returns the number of bytes written. It may return 0 if 26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// the \arg Count is more than the maximum optimal nops. 26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86AsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const { 26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman static const uint8_t Nops[10][10] = { 27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nop 27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x90}, 27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // xchg %ax,%ax 27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x66, 0x90}, 27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopl (%[re]ax) 27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x0f, 0x1f, 0x00}, 27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopl 0(%[re]ax) 27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x0f, 0x1f, 0x40, 0x00}, 27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopl 0(%[re]ax,%[re]ax,1) 27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x0f, 0x1f, 0x44, 0x00, 0x00}, 28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopw 0(%[re]ax,%[re]ax,1) 28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00}, 28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopl 0L(%[re]ax) 28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00}, 28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopl 0L(%[re]ax,%[re]ax,1) 28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, 28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopw 0L(%[re]ax,%[re]ax,1) 28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, 28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // nopw %cs:0L(%[re]ax,%[re]ax,1) 28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman {0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, 29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; 29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Write an optimal sequence for the first 15 bytes. 29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const uint64_t OptimalCount = (Count < 16) ? Count : 15; 29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const uint64_t Prefixes = OptimalCount <= 10 ? 0 : OptimalCount - 10; 29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (uint64_t i = 0, e = Prefixes; i != e; i++) 29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OW->Write8(0x66); 29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const uint64_t Rest = OptimalCount - Prefixes; 29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (uint64_t i = 0, e = Rest; i != e; i++) 29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OW->Write8(Nops[Rest - 1][i]); 30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Finish with single byte nops. 30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (uint64_t i = OptimalCount, e = Count; i != e; ++i) 30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OW->Write8(0x90); 30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/* *** */ 30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace { 31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass ELFX86AsmBackend : public X86AsmBackend { 31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Triple::OSType OSType; 31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELFX86AsmBackend(const Target &T, Triple::OSType _OSType) 31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : X86AsmBackend(T), OSType(_OSType) { 31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman HasReliableSymbolDifference = true; 31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman virtual bool doesSectionRequireSymbols(const MCSection &Section) const { 32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSectionELF &ES = static_cast<const MCSectionELF&>(Section); 32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ES.getFlags() & ELF::SHF_MERGE; 32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass ELFX86_32AsmBackend : public ELFX86AsmBackend { 32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELFX86_32AsmBackend(const Target &T, Triple::OSType OSType) 32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ELFX86AsmBackend(T, OSType) {} 32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return createELFObjectWriter(createELFObjectTargetWriter(), 33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OS, /*IsLittleEndian*/ true); 33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCELFObjectTargetWriter *createELFObjectTargetWriter() const { 33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new X86ELFObjectWriter(false, OSType, ELF::EM_386, false); 33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass ELFX86_64AsmBackend : public ELFX86AsmBackend { 34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELFX86_64AsmBackend(const Target &T, Triple::OSType OSType) 34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : ELFX86AsmBackend(T, OSType) {} 34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return createELFObjectWriter(createELFObjectTargetWriter(), 34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman OS, /*IsLittleEndian*/ true); 34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCELFObjectTargetWriter *createELFObjectTargetWriter() const { 35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new X86ELFObjectWriter(true, OSType, ELF::EM_X86_64, true); 35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass WindowsX86AsmBackend : public X86AsmBackend { 35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool Is64Bit; 35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman WindowsX86AsmBackend(const Target &T, bool is64Bit) 36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : X86AsmBackend(T) 36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman , Is64Bit(is64Bit) { 36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return createWinCOFFObjectWriter(OS, Is64Bit); 36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass DarwinX86AsmBackend : public X86AsmBackend { 37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman DarwinX86AsmBackend(const Target &T) 37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : X86AsmBackend(T) { } 37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass DarwinX86_32AsmBackend : public DarwinX86AsmBackend { 37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman DarwinX86_32AsmBackend(const Target &T) 37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : DarwinX86AsmBackend(T) {} 37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return createX86MachObjectWriter(OS, /*Is64Bit=*/false, 38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman object::mach::CTM_i386, 38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman object::mach::CSX86_ALL); 38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass DarwinX86_64AsmBackend : public DarwinX86AsmBackend { 38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman DarwinX86_64AsmBackend(const Target &T) 39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : DarwinX86AsmBackend(T) { 39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman HasReliableSymbolDifference = true; 39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCObjectWriter *createObjectWriter(raw_ostream &OS) const { 39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return createX86MachObjectWriter(OS, /*Is64Bit=*/true, 39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman object::mach::CTM_x86_64, 39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman object::mach::CSX86_ALL); 39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman virtual bool doesSectionRequireSymbols(const MCSection &Section) const { 40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Temporary labels in the string literals sections require symbols. The 40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // issue is that the x86_64 relocation format does not allow symbol + 40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // offset, and so the linker does not have enough information to resolve the 40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // access to the appropriate atom unless an external relocation is used. For 40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // non-cstring sections, we expect the compiler to use a non-temporary label 40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // for anything that could have an addend pointing outside the symbol. 40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // 40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // See <rdar://problem/4765733>. 40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section); 41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SMO.getType() == MCSectionMachO::S_CSTRING_LITERALS; 41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman virtual bool isSectionAtomizable(const MCSection &Section) const { 41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section); 41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Fixed sized data sections are uniqued, they cannot be diced into atoms. 41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (SMO.getType()) { 41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: 41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_4BYTE_LITERALS: 42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_8BYTE_LITERALS: 42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_16BYTE_LITERALS: 42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_LITERAL_POINTERS: 42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS: 42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_LAZY_SYMBOL_POINTERS: 42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_MOD_INIT_FUNC_POINTERS: 42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_MOD_TERM_FUNC_POINTERS: 42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case MCSectionMachO::S_INTERPOSING: 42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace 43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCAsmBackend *llvm::createX86_32AsmBackend(const Target &T, StringRef TT) { 43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Triple TheTriple(TT); 43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO) 44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new DarwinX86_32AsmBackend(T); 44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (TheTriple.isOSWindows()) 44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new WindowsX86AsmBackend(T, false); 44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new ELFX86_32AsmBackend(T, TheTriple.getOS()); 44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, StringRef TT) { 44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Triple TheTriple(TT); 45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO) 45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new DarwinX86_64AsmBackend(T); 45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (TheTriple.isOSWindows()) 45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new WindowsX86AsmBackend(T, true); 45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new ELFX86_64AsmBackend(T, TheTriple.getOS()); 45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 459