Home | History | Annotate | Download | only in MCTargetDesc
      1 //===-- X86AsmBackend.cpp - X86 Assembler Backend -------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "MCTargetDesc/X86BaseInfo.h"
     11 #include "MCTargetDesc/X86FixupKinds.h"
     12 #include "llvm/MC/MCAsmBackend.h"
     13 #include "llvm/MC/MCAssembler.h"
     14 #include "llvm/MC/MCELFObjectWriter.h"
     15 #include "llvm/MC/MCExpr.h"
     16 #include "llvm/MC/MCFixupKindInfo.h"
     17 #include "llvm/MC/MCMachObjectWriter.h"
     18 #include "llvm/MC/MCObjectWriter.h"
     19 #include "llvm/MC/MCSectionCOFF.h"
     20 #include "llvm/MC/MCSectionELF.h"
     21 #include "llvm/MC/MCSectionMachO.h"
     22 #include "llvm/Object/MachOFormat.h"
     23 #include "llvm/Support/CommandLine.h"
     24 #include "llvm/Support/ELF.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 #include "llvm/Support/TargetRegistry.h"
     27 #include "llvm/Support/raw_ostream.h"
     28 using namespace llvm;
     29 
     30 // Option to allow disabling arithmetic relaxation to workaround PR9807, which
     31 // is useful when running bitwise comparison experiments on Darwin. We should be
     32 // able to remove this once PR9807 is resolved.
     33 static cl::opt<bool>
     34 MCDisableArithRelaxation("mc-x86-disable-arith-relaxation",
     35          cl::desc("Disable relaxation of arithmetic instruction for X86"));
     36 
     37 static unsigned getFixupKindLog2Size(unsigned Kind) {
     38   switch (Kind) {
     39   default: llvm_unreachable("invalid fixup kind!");
     40   case FK_PCRel_1:
     41   case FK_SecRel_1:
     42   case FK_Data_1: return 0;
     43   case FK_PCRel_2:
     44   case FK_SecRel_2:
     45   case FK_Data_2: return 1;
     46   case FK_PCRel_4:
     47   case X86::reloc_riprel_4byte:
     48   case X86::reloc_riprel_4byte_movq_load:
     49   case X86::reloc_signed_4byte:
     50   case X86::reloc_global_offset_table:
     51   case FK_SecRel_4:
     52   case FK_Data_4: return 2;
     53   case FK_PCRel_8:
     54   case FK_SecRel_8:
     55   case FK_Data_8: return 3;
     56   }
     57 }
     58 
     59 namespace {
     60 
     61 class X86ELFObjectWriter : public MCELFObjectTargetWriter {
     62 public:
     63   X86ELFObjectWriter(bool is64Bit, uint8_t OSABI, uint16_t EMachine,
     64                      bool HasRelocationAddend, bool foobar)
     65     : MCELFObjectTargetWriter(is64Bit, OSABI, EMachine, HasRelocationAddend) {}
     66 };
     67 
     68 class X86AsmBackend : public MCAsmBackend {
     69   StringRef CPU;
     70 public:
     71   X86AsmBackend(const Target &T, StringRef _CPU)
     72     : MCAsmBackend(), CPU(_CPU) {}
     73 
     74   unsigned getNumFixupKinds() const {
     75     return X86::NumTargetFixupKinds;
     76   }
     77 
     78   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
     79     const static MCFixupKindInfo Infos[X86::NumTargetFixupKinds] = {
     80       { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel },
     81       { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel},
     82       { "reloc_signed_4byte", 0, 4 * 8, 0},
     83       { "reloc_global_offset_table", 0, 4 * 8, 0}
     84     };
     85 
     86     if (Kind < FirstTargetFixupKind)
     87       return MCAsmBackend::getFixupKindInfo(Kind);
     88 
     89     assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() &&
     90            "Invalid kind!");
     91     return Infos[Kind - FirstTargetFixupKind];
     92   }
     93 
     94   void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
     95                   uint64_t Value) const {
     96     unsigned Size = 1 << getFixupKindLog2Size(Fixup.getKind());
     97 
     98     assert(Fixup.getOffset() + Size <= DataSize &&
     99            "Invalid fixup offset!");
    100 
    101     // Check that uppper bits are either all zeros or all ones.
    102     // Specifically ignore overflow/underflow as long as the leakage is
    103     // limited to the lower bits. This is to remain compatible with
    104     // other assemblers.
    105     assert(isIntN(Size * 8 + 1, Value) &&
    106            "Value does not fit in the Fixup field");
    107 
    108     for (unsigned i = 0; i != Size; ++i)
    109       Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8));
    110   }
    111 
    112   bool mayNeedRelaxation(const MCInst &Inst) const;
    113 
    114   bool fixupNeedsRelaxation(const MCFixup &Fixup,
    115                             uint64_t Value,
    116                             const MCRelaxableFragment *DF,
    117                             const MCAsmLayout &Layout) const;
    118 
    119   void relaxInstruction(const MCInst &Inst, MCInst &Res) const;
    120 
    121   bool writeNopData(uint64_t Count, MCObjectWriter *OW) const;
    122 };
    123 } // end anonymous namespace
    124 
    125 static unsigned getRelaxedOpcodeBranch(unsigned Op) {
    126   switch (Op) {
    127   default:
    128     return Op;
    129 
    130   case X86::JAE_1: return X86::JAE_4;
    131   case X86::JA_1:  return X86::JA_4;
    132   case X86::JBE_1: return X86::JBE_4;
    133   case X86::JB_1:  return X86::JB_4;
    134   case X86::JE_1:  return X86::JE_4;
    135   case X86::JGE_1: return X86::JGE_4;
    136   case X86::JG_1:  return X86::JG_4;
    137   case X86::JLE_1: return X86::JLE_4;
    138   case X86::JL_1:  return X86::JL_4;
    139   case X86::JMP_1: return X86::JMP_4;
    140   case X86::JNE_1: return X86::JNE_4;
    141   case X86::JNO_1: return X86::JNO_4;
    142   case X86::JNP_1: return X86::JNP_4;
    143   case X86::JNS_1: return X86::JNS_4;
    144   case X86::JO_1:  return X86::JO_4;
    145   case X86::JP_1:  return X86::JP_4;
    146   case X86::JS_1:  return X86::JS_4;
    147   }
    148 }
    149 
    150 static unsigned getRelaxedOpcodeArith(unsigned Op) {
    151   switch (Op) {
    152   default:
    153     return Op;
    154 
    155     // IMUL
    156   case X86::IMUL16rri8: return X86::IMUL16rri;
    157   case X86::IMUL16rmi8: return X86::IMUL16rmi;
    158   case X86::IMUL32rri8: return X86::IMUL32rri;
    159   case X86::IMUL32rmi8: return X86::IMUL32rmi;
    160   case X86::IMUL64rri8: return X86::IMUL64rri32;
    161   case X86::IMUL64rmi8: return X86::IMUL64rmi32;
    162 
    163     // AND
    164   case X86::AND16ri8: return X86::AND16ri;
    165   case X86::AND16mi8: return X86::AND16mi;
    166   case X86::AND32ri8: return X86::AND32ri;
    167   case X86::AND32mi8: return X86::AND32mi;
    168   case X86::AND64ri8: return X86::AND64ri32;
    169   case X86::AND64mi8: return X86::AND64mi32;
    170 
    171     // OR
    172   case X86::OR16ri8: return X86::OR16ri;
    173   case X86::OR16mi8: return X86::OR16mi;
    174   case X86::OR32ri8: return X86::OR32ri;
    175   case X86::OR32mi8: return X86::OR32mi;
    176   case X86::OR64ri8: return X86::OR64ri32;
    177   case X86::OR64mi8: return X86::OR64mi32;
    178 
    179     // XOR
    180   case X86::XOR16ri8: return X86::XOR16ri;
    181   case X86::XOR16mi8: return X86::XOR16mi;
    182   case X86::XOR32ri8: return X86::XOR32ri;
    183   case X86::XOR32mi8: return X86::XOR32mi;
    184   case X86::XOR64ri8: return X86::XOR64ri32;
    185   case X86::XOR64mi8: return X86::XOR64mi32;
    186 
    187     // ADD
    188   case X86::ADD16ri8: return X86::ADD16ri;
    189   case X86::ADD16mi8: return X86::ADD16mi;
    190   case X86::ADD32ri8: return X86::ADD32ri;
    191   case X86::ADD32mi8: return X86::ADD32mi;
    192   case X86::ADD64ri8: return X86::ADD64ri32;
    193   case X86::ADD64mi8: return X86::ADD64mi32;
    194 
    195     // SUB
    196   case X86::SUB16ri8: return X86::SUB16ri;
    197   case X86::SUB16mi8: return X86::SUB16mi;
    198   case X86::SUB32ri8: return X86::SUB32ri;
    199   case X86::SUB32mi8: return X86::SUB32mi;
    200   case X86::SUB64ri8: return X86::SUB64ri32;
    201   case X86::SUB64mi8: return X86::SUB64mi32;
    202 
    203     // CMP
    204   case X86::CMP16ri8: return X86::CMP16ri;
    205   case X86::CMP16mi8: return X86::CMP16mi;
    206   case X86::CMP32ri8: return X86::CMP32ri;
    207   case X86::CMP32mi8: return X86::CMP32mi;
    208   case X86::CMP64ri8: return X86::CMP64ri32;
    209   case X86::CMP64mi8: return X86::CMP64mi32;
    210 
    211     // PUSH
    212   case X86::PUSHi8: return X86::PUSHi32;
    213   case X86::PUSHi16: return X86::PUSHi32;
    214   case X86::PUSH64i8: return X86::PUSH64i32;
    215   case X86::PUSH64i16: return X86::PUSH64i32;
    216   }
    217 }
    218 
    219 static unsigned getRelaxedOpcode(unsigned Op) {
    220   unsigned R = getRelaxedOpcodeArith(Op);
    221   if (R != Op)
    222     return R;
    223   return getRelaxedOpcodeBranch(Op);
    224 }
    225 
    226 bool X86AsmBackend::mayNeedRelaxation(const MCInst &Inst) const {
    227   // Branches can always be relaxed.
    228   if (getRelaxedOpcodeBranch(Inst.getOpcode()) != Inst.getOpcode())
    229     return true;
    230 
    231   if (MCDisableArithRelaxation)
    232     return false;
    233 
    234   // Check if this instruction is ever relaxable.
    235   if (getRelaxedOpcodeArith(Inst.getOpcode()) == Inst.getOpcode())
    236     return false;
    237 
    238 
    239   // Check if it has an expression and is not RIP relative.
    240   bool hasExp = false;
    241   bool hasRIP = false;
    242   for (unsigned i = 0; i < Inst.getNumOperands(); ++i) {
    243     const MCOperand &Op = Inst.getOperand(i);
    244     if (Op.isExpr())
    245       hasExp = true;
    246 
    247     if (Op.isReg() && Op.getReg() == X86::RIP)
    248       hasRIP = true;
    249   }
    250 
    251   // FIXME: Why exactly do we need the !hasRIP? Is it just a limitation on
    252   // how we do relaxations?
    253   return hasExp && !hasRIP;
    254 }
    255 
    256 bool X86AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
    257                                          uint64_t Value,
    258                                          const MCRelaxableFragment *DF,
    259                                          const MCAsmLayout &Layout) const {
    260   // Relax if the value is too big for a (signed) i8.
    261   return int64_t(Value) != int64_t(int8_t(Value));
    262 }
    263 
    264 // FIXME: Can tblgen help at all here to verify there aren't other instructions
    265 // we can relax?
    266 void X86AsmBackend::relaxInstruction(const MCInst &Inst, MCInst &Res) const {
    267   // The only relaxations X86 does is from a 1byte pcrel to a 4byte pcrel.
    268   unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode());
    269 
    270   if (RelaxedOp == Inst.getOpcode()) {
    271     SmallString<256> Tmp;
    272     raw_svector_ostream OS(Tmp);
    273     Inst.dump_pretty(OS);
    274     OS << "\n";
    275     report_fatal_error("unexpected instruction to relax: " + OS.str());
    276   }
    277 
    278   Res = Inst;
    279   Res.setOpcode(RelaxedOp);
    280 }
    281 
    282 /// \brief Write a sequence of optimal nops to the output, covering \p Count
    283 /// bytes.
    284 /// \return - true on success, false on failure
    285 bool X86AsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
    286   static const uint8_t Nops[10][10] = {
    287     // nop
    288     {0x90},
    289     // xchg %ax,%ax
    290     {0x66, 0x90},
    291     // nopl (%[re]ax)
    292     {0x0f, 0x1f, 0x00},
    293     // nopl 0(%[re]ax)
    294     {0x0f, 0x1f, 0x40, 0x00},
    295     // nopl 0(%[re]ax,%[re]ax,1)
    296     {0x0f, 0x1f, 0x44, 0x00, 0x00},
    297     // nopw 0(%[re]ax,%[re]ax,1)
    298     {0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00},
    299     // nopl 0L(%[re]ax)
    300     {0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00},
    301     // nopl 0L(%[re]ax,%[re]ax,1)
    302     {0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
    303     // nopw 0L(%[re]ax,%[re]ax,1)
    304     {0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
    305     // nopw %cs:0L(%[re]ax,%[re]ax,1)
    306     {0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
    307   };
    308 
    309   // This CPU doesnt support long nops. If needed add more.
    310   // FIXME: Can we get this from the subtarget somehow?
    311   if (CPU == "generic" || CPU == "i386" || CPU == "i486" || CPU == "i586" ||
    312       CPU == "pentium" || CPU == "pentium-mmx" || CPU == "geode") {
    313     for (uint64_t i = 0; i < Count; ++i)
    314       OW->Write8(0x90);
    315     return true;
    316   }
    317 
    318   // 15 is the longest single nop instruction.  Emit as many 15-byte nops as
    319   // needed, then emit a nop of the remaining length.
    320   do {
    321     const uint8_t ThisNopLength = (uint8_t) std::min(Count, (uint64_t) 15);
    322     const uint8_t Prefixes = ThisNopLength <= 10 ? 0 : ThisNopLength - 10;
    323     for (uint8_t i = 0; i < Prefixes; i++)
    324       OW->Write8(0x66);
    325     const uint8_t Rest = ThisNopLength - Prefixes;
    326     for (uint8_t i = 0; i < Rest; i++)
    327       OW->Write8(Nops[Rest - 1][i]);
    328     Count -= ThisNopLength;
    329   } while (Count != 0);
    330 
    331   return true;
    332 }
    333 
    334 /* *** */
    335 
    336 namespace {
    337 class ELFX86AsmBackend : public X86AsmBackend {
    338 public:
    339   uint8_t OSABI;
    340   ELFX86AsmBackend(const Target &T, uint8_t _OSABI, StringRef CPU)
    341     : X86AsmBackend(T, CPU), OSABI(_OSABI) {
    342     HasReliableSymbolDifference = true;
    343   }
    344 
    345   virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
    346     const MCSectionELF &ES = static_cast<const MCSectionELF&>(Section);
    347     return ES.getFlags() & ELF::SHF_MERGE;
    348   }
    349 };
    350 
    351 class ELFX86_32AsmBackend : public ELFX86AsmBackend {
    352 public:
    353   ELFX86_32AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU)
    354     : ELFX86AsmBackend(T, OSABI, CPU) {}
    355 
    356   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
    357     return createX86ELFObjectWriter(OS, /*IsELF64*/ false, OSABI, ELF::EM_386);
    358   }
    359 };
    360 
    361 class ELFX86_64AsmBackend : public ELFX86AsmBackend {
    362 public:
    363   ELFX86_64AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU)
    364     : ELFX86AsmBackend(T, OSABI, CPU) {}
    365 
    366   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
    367     return createX86ELFObjectWriter(OS, /*IsELF64*/ true, OSABI, ELF::EM_X86_64);
    368   }
    369 };
    370 
    371 class WindowsX86AsmBackend : public X86AsmBackend {
    372   bool Is64Bit;
    373 
    374 public:
    375   WindowsX86AsmBackend(const Target &T, bool is64Bit, StringRef CPU)
    376     : X86AsmBackend(T, CPU)
    377     , Is64Bit(is64Bit) {
    378   }
    379 
    380   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
    381     return createX86WinCOFFObjectWriter(OS, Is64Bit);
    382   }
    383 };
    384 
    385 class DarwinX86AsmBackend : public X86AsmBackend {
    386 public:
    387   DarwinX86AsmBackend(const Target &T, StringRef CPU)
    388     : X86AsmBackend(T, CPU) { }
    389 };
    390 
    391 class DarwinX86_32AsmBackend : public DarwinX86AsmBackend {
    392 public:
    393   DarwinX86_32AsmBackend(const Target &T, StringRef CPU)
    394     : DarwinX86AsmBackend(T, CPU) {}
    395 
    396   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
    397     return createX86MachObjectWriter(OS, /*Is64Bit=*/false,
    398                                      object::mach::CTM_i386,
    399                                      object::mach::CSX86_ALL);
    400   }
    401 };
    402 
    403 class DarwinX86_64AsmBackend : public DarwinX86AsmBackend {
    404 public:
    405   DarwinX86_64AsmBackend(const Target &T, StringRef CPU)
    406     : DarwinX86AsmBackend(T, CPU) {
    407     HasReliableSymbolDifference = true;
    408   }
    409 
    410   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
    411     return createX86MachObjectWriter(OS, /*Is64Bit=*/true,
    412                                      object::mach::CTM_x86_64,
    413                                      object::mach::CSX86_ALL);
    414   }
    415 
    416   virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
    417     // Temporary labels in the string literals sections require symbols. The
    418     // issue is that the x86_64 relocation format does not allow symbol +
    419     // offset, and so the linker does not have enough information to resolve the
    420     // access to the appropriate atom unless an external relocation is used. For
    421     // non-cstring sections, we expect the compiler to use a non-temporary label
    422     // for anything that could have an addend pointing outside the symbol.
    423     //
    424     // See <rdar://problem/4765733>.
    425     const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
    426     return SMO.getType() == MCSectionMachO::S_CSTRING_LITERALS;
    427   }
    428 
    429   virtual bool isSectionAtomizable(const MCSection &Section) const {
    430     const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
    431     // Fixed sized data sections are uniqued, they cannot be diced into atoms.
    432     switch (SMO.getType()) {
    433     default:
    434       return true;
    435 
    436     case MCSectionMachO::S_4BYTE_LITERALS:
    437     case MCSectionMachO::S_8BYTE_LITERALS:
    438     case MCSectionMachO::S_16BYTE_LITERALS:
    439     case MCSectionMachO::S_LITERAL_POINTERS:
    440     case MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS:
    441     case MCSectionMachO::S_LAZY_SYMBOL_POINTERS:
    442     case MCSectionMachO::S_MOD_INIT_FUNC_POINTERS:
    443     case MCSectionMachO::S_MOD_TERM_FUNC_POINTERS:
    444     case MCSectionMachO::S_INTERPOSING:
    445       return false;
    446     }
    447   }
    448 };
    449 
    450 } // end anonymous namespace
    451 
    452 MCAsmBackend *llvm::createX86_32AsmBackend(const Target &T, StringRef TT, StringRef CPU) {
    453   Triple TheTriple(TT);
    454 
    455   if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
    456     return new DarwinX86_32AsmBackend(T, CPU);
    457 
    458   if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
    459     return new WindowsX86AsmBackend(T, false, CPU);
    460 
    461   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
    462   return new ELFX86_32AsmBackend(T, OSABI, CPU);
    463 }
    464 
    465 MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, StringRef TT, StringRef CPU) {
    466   Triple TheTriple(TT);
    467 
    468   if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
    469     return new DarwinX86_64AsmBackend(T, CPU);
    470 
    471   if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
    472     return new WindowsX86AsmBackend(T, true, CPU);
    473 
    474   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
    475   return new ELFX86_64AsmBackend(T, OSABI, CPU);
    476 }
    477