X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FMC%2FMCObjectWriter.h;h=14fe75fd4c3104ad835d0dccc5f2f1a490488a71;hb=6312cb099734263f348f36a31b8892b1373a7076;hp=da55a0c0a0c92759063b46dbb3bfe0ee02682a7a;hpb=8466efc36f57ec24fc42f91d70d5a70f38690a48;p=oota-llvm.git diff --git a/include/llvm/MC/MCObjectWriter.h b/include/llvm/MC/MCObjectWriter.h index da55a0c0a0c..14fe75fd4c3 100644 --- a/include/llvm/MC/MCObjectWriter.h +++ b/include/llvm/MC/MCObjectWriter.h @@ -10,10 +10,9 @@ #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 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