[ms-inline asm] Remove the MatchInstruction() function. Previously, this was
[oota-llvm.git] / include / llvm / MC / MCObjectWriter.h
index da55a0c0a0c92759063b46dbb3bfe0ee02682a7a..14fe75fd4c3104ad835d0dccc5f2f1a490488a71 100644 (file)
 #ifndef LLVM_MC_MCOBJECTWRITER_H
 #define LLVM_MC_MCOBJECTWRITER_H
 
-#include "llvm/Support/MathExtras.h"
 #include "llvm/Support/raw_ostream.h"
-#include "llvm/System/DataTypes.h"
-#include "llvm/System/Host.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/DataTypes.h"
 #include <cassert>
 
 namespace llvm {
@@ -21,8 +20,9 @@ class MCAsmLayout;
 class MCAssembler;
 class MCFixup;
 class MCFragment;
+class MCSymbolData;
+class MCSymbolRefExpr;
 class MCValue;
-class raw_ostream;
 
 /// MCObjectWriter - Defines the object file and target independent interfaces
 /// used by the assembler backend to write native file format object files.
@@ -36,8 +36,8 @@ class raw_ostream;
 /// The object writer also contains a number of helper methods for writing
 /// binary data to the output stream.
 class MCObjectWriter {
-  MCObjectWriter(const MCObjectWriter &); // DO NOT IMPLEMENT
-  void operator=(const MCObjectWriter &); // DO NOT IMPLEMENT
+  MCObjectWriter(const MCObjectWriter &) LLVM_DELETED_FUNCTION;
+  void operator=(const MCObjectWriter &) LLVM_DELETED_FUNCTION;
 
 protected:
   raw_ostream &OS;
@@ -63,7 +63,8 @@ public:
   ///
   /// This routine is called by the assembler after layout and relaxation is
   /// complete.
-  virtual void ExecutePostLayoutBinding(MCAssembler &Asm) = 0;
+  virtual void ExecutePostLayoutBinding(MCAssembler &Asm,
+                                        const MCAsmLayout &Layout) = 0;
 
   /// Record a relocation entry.
   ///
@@ -77,12 +78,31 @@ public:
                                 const MCFixup &Fixup, MCValue Target,
                                 uint64_t &FixedValue) = 0;
 
+  /// \brief Check whether the difference (A - B) between two symbol
+  /// references is fully resolved.
+  ///
+  /// Clients are not required to answer precisely and may conservatively return
+  /// false, even when a difference is fully resolved.
+  bool
+  IsSymbolRefDifferenceFullyResolved(const MCAssembler &Asm,
+                                     const MCSymbolRefExpr *A,
+                                     const MCSymbolRefExpr *B,
+                                     bool InSet) const;
+
+  virtual bool
+  IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
+                                         const MCSymbolData &DataA,
+                                         const MCFragment &FB,
+                                         bool InSet,
+                                         bool IsPCRel) const;
+
+
   /// Write the object file.
   ///
   /// This routine is called by the assembler after layout and relaxation is
   /// complete, fixups have been evaluated and applied, and relocations
   /// generated.
-  virtual void WriteObject(const MCAssembler &Asm,
+  virtual void WriteObject(MCAssembler &Asm,
                            const MCAsmLayout &Layout) = 0;
 
   /// @}
@@ -94,57 +114,54 @@ public:
   }
 
   void WriteLE16(uint16_t Value) {
-    if (sys::isBigEndianHost())
-      Value = ByteSwap_16(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    Write8(uint8_t(Value >> 0));
+    Write8(uint8_t(Value >> 8));
   }
 
   void WriteLE32(uint32_t Value) {
-    if (sys::isBigEndianHost())
-      Value = ByteSwap_32(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    WriteLE16(uint16_t(Value >> 0));
+    WriteLE16(uint16_t(Value >> 16));
   }
 
   void WriteLE64(uint64_t Value) {
-    if (sys::isBigEndianHost())
-      Value = ByteSwap_64(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    WriteLE32(uint32_t(Value >> 0));
+    WriteLE32(uint32_t(Value >> 32));
   }
 
   void WriteBE16(uint16_t Value) {
-    if (sys::isLittleEndianHost())
-      Value = ByteSwap_16(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    Write8(uint8_t(Value >> 8));
+    Write8(uint8_t(Value >> 0));
   }
 
   void WriteBE32(uint32_t Value) {
-    if (sys::isLittleEndianHost())
-      Value = ByteSwap_32(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    WriteBE16(uint16_t(Value >> 16));
+    WriteBE16(uint16_t(Value >> 0));
   }
 
   void WriteBE64(uint64_t Value) {
-    if (sys::isLittleEndianHost())
-      Value = ByteSwap_64(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    WriteBE32(uint32_t(Value >> 32));
+    WriteBE32(uint32_t(Value >> 0));
   }
 
   void Write16(uint16_t Value) {
-    if (IsLittleEndian != sys::isLittleEndianHost())
-      Value = ByteSwap_16(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    if (IsLittleEndian)
+      WriteLE16(Value);
+    else
+      WriteBE16(Value);
   }
 
   void Write32(uint32_t Value) {
-    if (IsLittleEndian != sys::isLittleEndianHost())
-      Value = ByteSwap_32(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    if (IsLittleEndian)
+      WriteLE32(Value);
+    else
+      WriteBE32(Value);
   }
 
   void Write64(uint64_t Value) {
-    if (IsLittleEndian != sys::isLittleEndianHost())
-      Value = ByteSwap_64(Value);
-    OS << StringRef((const char*)&Value, sizeof(Value));
+    if (IsLittleEndian)
+      WriteLE64(Value);
+    else
+      WriteBE64(Value);
   }
 
   void WriteZeros(unsigned N) {
@@ -165,9 +182,8 @@ public:
   }
 
   /// @}
-};
 
-MCObjectWriter *createWinCOFFObjectWriter(raw_ostream &OS);
+};
 
 } // End llvm namespace