Reference RegionPass to stop it being eliminated.
[oota-llvm.git] / include / llvm / CodeGen / BinaryObject.h
index 4b66fe85678cb85395cb84a76903d544075cfd70..3ade7c9e47cd113e45c3a76d6e6c6bdf810c7ce9 100644 (file)
 #ifndef LLVM_CODEGEN_BINARYOBJECT_H
 #define LLVM_CODEGEN_BINARYOBJECT_H
 
+#include "llvm/CodeGen/MachineRelocation.h"
+#include "llvm/System/DataTypes.h"
+
 #include <string>
 #include <vector>
 
 namespace llvm {
 
-class MachineRelocation;
 typedef std::vector<uint8_t> BinaryData;
 
 class BinaryObject {
@@ -66,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) {
@@ -84,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
@@ -122,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
@@ -185,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
@@ -217,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
@@ -244,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);
@@ -293,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;