diff options
Diffstat (limited to 'include/llvm/CodeGen/BinaryObject.h')
| -rw-r--r-- | include/llvm/CodeGen/BinaryObject.h | 140 | 
1 files changed, 80 insertions, 60 deletions
diff --git a/include/llvm/CodeGen/BinaryObject.h b/include/llvm/CodeGen/BinaryObject.h index ce0c07af9515..2d4bd73a82eb 100644 --- a/include/llvm/CodeGen/BinaryObject.h +++ b/include/llvm/CodeGen/BinaryObject.h @@ -68,6 +68,13 @@ public:      return !Relocations.empty();    } +  /// emitZeros - This callback is invoked to emit a arbitrary number  +  /// of zero bytes to the data stream. +  inline void emitZeros(unsigned Size) { +    for (unsigned i=0; i < Size; ++i) +      emitByte(0); +  } +    /// emitByte - This callback is invoked when a byte needs to be    /// written to the data stream.    inline void emitByte(uint8_t B) { @@ -86,15 +93,15 @@ public:    /// emitWord16LE - This callback is invoked when a 16-bit word needs to be    /// written to the data stream in correct endian format and correct size.    inline void emitWord16LE(uint16_t W) { -    Data.push_back((W >> 0) & 255); -    Data.push_back((W >> 8) & 255); +    Data.push_back((uint8_t)(W >> 0)); +    Data.push_back((uint8_t)(W >> 8));    }    /// emitWord16BE - This callback is invoked when a 16-bit word needs to be    /// written to the data stream in correct endian format and correct size.    inline void emitWord16BE(uint16_t W) { -    Data.push_back((W >> 8) & 255); -    Data.push_back((W >> 0) & 255); +    Data.push_back((uint8_t)(W >> 8)); +    Data.push_back((uint8_t)(W >> 0));    }    /// emitWord - This callback is invoked when a word needs to be @@ -124,49 +131,62 @@ public:        emitDWordBE(W);    } +  /// emitWord64 - This callback is invoked when a x86_fp80 needs to be +  /// written to the data stream in correct endian format. +  inline void emitWordFP80(const uint64_t *W, unsigned PadSize) { +    if (IsLittleEndian) { +      emitWord64(W[0]); +      emitWord16(W[1]);   +    } else { +      emitWord16(W[1]);   +      emitWord64(W[0]); +    } +    emitZeros(PadSize); +  } +    /// emitWordLE - This callback is invoked when a 32-bit word needs to be    /// written to the data stream in little-endian format.    inline void emitWordLE(uint32_t W) { -    Data.push_back((W >>  0) & 255); -    Data.push_back((W >>  8) & 255); -    Data.push_back((W >> 16) & 255); -    Data.push_back((W >> 24) & 255); +    Data.push_back((uint8_t)(W >>  0)); +    Data.push_back((uint8_t)(W >>  8)); +    Data.push_back((uint8_t)(W >> 16)); +    Data.push_back((uint8_t)(W >> 24));    }    /// emitWordBE - This callback is invoked when a 32-bit word needs to be    /// written to the data stream in big-endian format.    ///    inline void emitWordBE(uint32_t W) { -    Data.push_back((W >> 24) & 255); -    Data.push_back((W >> 16) & 255); -    Data.push_back((W >>  8) & 255); -    Data.push_back((W >>  0) & 255); +    Data.push_back((uint8_t)(W >> 24)); +    Data.push_back((uint8_t)(W >> 16)); +    Data.push_back((uint8_t)(W >>  8)); +    Data.push_back((uint8_t)(W >>  0));    }    /// emitDWordLE - This callback is invoked when a 64-bit word needs to be    /// written to the data stream in little-endian format.    inline void emitDWordLE(uint64_t W) { -    Data.push_back(unsigned(W >>  0) & 255); -    Data.push_back(unsigned(W >>  8) & 255); -    Data.push_back(unsigned(W >> 16) & 255); -    Data.push_back(unsigned(W >> 24) & 255); -    Data.push_back(unsigned(W >> 32) & 255); -    Data.push_back(unsigned(W >> 40) & 255); -    Data.push_back(unsigned(W >> 48) & 255); -    Data.push_back(unsigned(W >> 56) & 255); +    Data.push_back((uint8_t)(W >>  0)); +    Data.push_back((uint8_t)(W >>  8)); +    Data.push_back((uint8_t)(W >> 16)); +    Data.push_back((uint8_t)(W >> 24)); +    Data.push_back((uint8_t)(W >> 32)); +    Data.push_back((uint8_t)(W >> 40)); +    Data.push_back((uint8_t)(W >> 48)); +    Data.push_back((uint8_t)(W >> 56));    }    /// emitDWordBE - This callback is invoked when a 64-bit word needs to be    /// written to the data stream in big-endian format.    inline void emitDWordBE(uint64_t W) { -    Data.push_back(unsigned(W >> 56) & 255); -    Data.push_back(unsigned(W >> 48) & 255); -    Data.push_back(unsigned(W >> 40) & 255); -    Data.push_back(unsigned(W >> 32) & 255); -    Data.push_back(unsigned(W >> 24) & 255); -    Data.push_back(unsigned(W >> 16) & 255); -    Data.push_back(unsigned(W >>  8) & 255); -    Data.push_back(unsigned(W >>  0) & 255); +    Data.push_back((uint8_t)(W >> 56)); +    Data.push_back((uint8_t)(W >> 48)); +    Data.push_back((uint8_t)(W >> 40)); +    Data.push_back((uint8_t)(W >> 32)); +    Data.push_back((uint8_t)(W >> 24)); +    Data.push_back((uint8_t)(W >> 16)); +    Data.push_back((uint8_t)(W >>  8)); +    Data.push_back((uint8_t)(W >>  0));    }    /// fixByte - This callback is invoked when a byte needs to be @@ -187,15 +207,15 @@ public:    /// emitWord16LE - This callback is invoked when a 16-bit word needs to    /// fixup the data stream in little endian format.    inline void fixWord16LE(uint16_t W, uint32_t offset) { -    Data[offset++] = W & 255; -    Data[offset] = (W >> 8) & 255; +    Data[offset]   = (uint8_t)(W >> 0); +    Data[++offset] = (uint8_t)(W >> 8);    }    /// fixWord16BE - This callback is invoked when a 16-bit word needs to    /// fixup data stream in big endian format.    inline void fixWord16BE(uint16_t W, uint32_t offset) { -    Data[offset++] = (W >> 8) & 255; -    Data[offset] = W & 255; +    Data[offset]   = (uint8_t)(W >> 8); +    Data[++offset] = (uint8_t)(W >> 0);    }    /// emitWord - This callback is invoked when a word needs to @@ -219,19 +239,19 @@ public:    /// fixWord32LE - This callback is invoked when a 32-bit word needs to    /// fixup the data in little endian format.    inline void fixWord32LE(uint32_t W, uint32_t offset) { -    Data[offset++] = W & 255; -    Data[offset++] = (W >> 8) & 255; -    Data[offset++] = (W >> 16) & 255; -    Data[offset] = (W >> 24) & 255; +    Data[offset]   = (uint8_t)(W >>  0); +    Data[++offset] = (uint8_t)(W >>  8); +    Data[++offset] = (uint8_t)(W >> 16); +    Data[++offset] = (uint8_t)(W >> 24);    }    /// fixWord32BE - This callback is invoked when a 32-bit word needs to    /// fixup the data in big endian format.    inline void fixWord32BE(uint32_t W, uint32_t offset) { -    Data[offset++] = (W >> 24) & 255; -    Data[offset++] = (W >> 16) & 255; -    Data[offset++] = (W >> 8) & 255; -    Data[offset] = W & 255; +    Data[offset]   = (uint8_t)(W >> 24); +    Data[++offset] = (uint8_t)(W >> 16); +    Data[++offset] = (uint8_t)(W >>  8); +    Data[++offset] = (uint8_t)(W >>  0);    }    /// fixWord64 - This callback is invoked when a 64-bit word needs to @@ -246,42 +266,42 @@ public:    /// fixWord64BE - This callback is invoked when a 64-bit word needs to    /// fixup the data in little endian format.    inline void fixWord64LE(uint64_t W, uint32_t offset) { -    Data[offset++] = W & 255; -    Data[offset++] = (W >> 8) & 255; -    Data[offset++] = (W >> 16) & 255; -    Data[offset++] = (W >> 24) & 255; -    Data[offset++] = (W >> 32) & 255; -    Data[offset++] = (W >> 40) & 255; -    Data[offset++] = (W >> 48) & 255; -    Data[offset] = (W >> 56) & 255; +    Data[offset]   = (uint8_t)(W >>  0); +    Data[++offset] = (uint8_t)(W >>  8); +    Data[++offset] = (uint8_t)(W >> 16); +    Data[++offset] = (uint8_t)(W >> 24); +    Data[++offset] = (uint8_t)(W >> 32); +    Data[++offset] = (uint8_t)(W >> 40); +    Data[++offset] = (uint8_t)(W >> 48); +    Data[++offset] = (uint8_t)(W >> 56);    }    /// fixWord64BE - This callback is invoked when a 64-bit word needs to    /// fixup the data in big endian format.    inline void fixWord64BE(uint64_t W, uint32_t offset) { -    Data[offset++] = (W >> 56) & 255; -    Data[offset++] = (W >> 48) & 255; -    Data[offset++] = (W >> 40) & 255; -    Data[offset++] = (W >> 32) & 255; -    Data[offset++] = (W >> 24) & 255; -    Data[offset++] = (W >> 16) & 255; -    Data[offset++] = (W >> 8) & 255; -    Data[offset] = W & 255; +    Data[offset]   = (uint8_t)(W >> 56); +    Data[++offset] = (uint8_t)(W >> 48); +    Data[++offset] = (uint8_t)(W >> 40); +    Data[++offset] = (uint8_t)(W >> 32); +    Data[++offset] = (uint8_t)(W >> 24); +    Data[++offset] = (uint8_t)(W >> 16); +    Data[++offset] = (uint8_t)(W >>  8); +    Data[++offset] = (uint8_t)(W >>  0);    }    /// emitAlignment - Pad the data to the specified alignment. -  void emitAlignment(unsigned Alignment) { +  void emitAlignment(unsigned Alignment, uint8_t fill = 0) {      if (Alignment <= 1) return;      unsigned PadSize = -Data.size() & (Alignment-1);      for (unsigned i = 0; i<PadSize; ++i) -      Data.push_back(0); +      Data.push_back(fill);    }    /// emitULEB128Bytes - This callback is invoked when a ULEB128 needs to be    /// written to the data stream.    void emitULEB128Bytes(uint64_t Value) {      do { -      unsigned char Byte = Value & 0x7f; +      uint8_t Byte = (uint8_t)(Value & 0x7f);        Value >>= 7;        if (Value) Byte |= 0x80;        emitByte(Byte); @@ -295,7 +315,7 @@ public:      bool IsMore;      do { -      unsigned char Byte = Value & 0x7f; +      uint8_t Byte = (uint8_t)(Value & 0x7f);        Value >>= 7;        IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;        if (IsMore) Byte |= 0x80;  | 
