diff options
| -rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 49 | 
1 files changed, 47 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 2c698e76f92..96227dbee50 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -1066,9 +1066,54 @@ void MCAssembler::LayoutSection(MCSectionData &SD) {  ///  /// FIXME this is X86 32-bit specific and should move to a better place.  static uint64_t WriteNopData(uint64_t Count, MachObjectWriter &MOW) { -  // FIXME for now just use the 0x90 nop opcode byte. +  static const uint8_t Nops[16][16] = { +    // nop +    {0x90}, +    // xchg %ax,%ax +    {0x66, 0x90}, +    // nopl (%[re]ax) +    {0x0f, 0x1f, 0x00}, +    // nopl 0(%[re]ax) +    {0x0f, 0x1f, 0x40, 0x00}, +    // nopl 0(%[re]ax,%[re]ax,1) +    {0x0f, 0x1f, 0x44, 0x00, 0x00}, +    // nopw 0(%[re]ax,%[re]ax,1) +    {0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00}, +    // nopl 0L(%[re]ax) +    {0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00}, +    // nopl 0L(%[re]ax,%[re]ax,1) +    {0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, +    // nopw 0L(%[re]ax,%[re]ax,1) +    {0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, +    // nopw %cs:0L(%[re]ax,%[re]ax,1) +    {0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00}, +    // nopl 0(%[re]ax,%[re]ax,1) +    // nopw 0(%[re]ax,%[re]ax,1) +    {0x0f, 0x1f, 0x44, 0x00, 0x00, +     0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00}, +    // nopw 0(%[re]ax,%[re]ax,1) +    // nopw 0(%[re]ax,%[re]ax,1) +    {0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, +     0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00}, +    // nopw 0(%[re]ax,%[re]ax,1) +    // nopl 0L(%[re]ax) */ +    {0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00, +     0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00}, +    // nopl 0L(%[re]ax) +    // nopl 0L(%[re]ax) +    {0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, +     0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00}, +    // nopl 0L(%[re]ax) +    // nopl 0L(%[re]ax,%[re]ax,1) +    {0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, +     0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00} +  }; + +  if (Count > 15) +    return 0; +    for (uint64_t i = 0; i < Count; i++) -    MOW.Write8 (uint8_t(0x90)); +    MOW.Write8 (uint8_t(Nops[Count - 1][i]));    return Count;  }  | 

