#include <cassert>
namespace llvm {
-class MCAsmFixup;
+class MCAsmLayout;
class MCAssembler;
-class MCDataFragment;
+class MCFixup;
+class MCFragment;
class MCValue;
class raw_ostream;
public:
virtual ~MCObjectWriter();
- bool isLittleEndian() { return IsLittleEndian; }
+ bool isLittleEndian() const { return IsLittleEndian; }
raw_ostream &getStream() { return OS; }
/// information about the relocation so that it can be emitted during
/// WriteObject().
virtual void RecordRelocation(const MCAssembler &Asm,
- const MCDataFragment &Fragment,
- const MCAsmFixup &Fixup, MCValue Target,
+ const MCAsmLayout &Layout,
+ const MCFragment *Fragment,
+ const MCFixup &Fixup, MCValue Target,
uint64_t &FixedValue) = 0;
+ /// Check if a fixup is fully resolved.
+ ///
+ /// This routine is used by the assembler to let the file format decide
+ /// if a fixup is not fully resolved. For example, one that crosses
+ /// two sections on ELF.
+ virtual bool IsFixupFullyResolved(const MCAssembler &Asm,
+ const MCValue Target,
+ bool IsPCRel,
+ const MCFragment *DF) const = 0;
+
/// Write the object file.
///
/// This routine is called by the assembler after layout and relaxation is
- /// complete, fixups have been evaluate and applied, and relocations
+ /// complete, fixups have been evaluated and applied, and relocations
/// generated.
- virtual void WriteObject(const MCAssembler &Asm) = 0;
+ virtual void WriteObject(const MCAssembler &Asm,
+ const MCAsmLayout &Layout) = 0;
/// @}
/// @name Binary Output
}
void WriteBytes(StringRef Str, unsigned ZeroFillSize = 0) {
+ assert((ZeroFillSize == 0 || Str.size () <= ZeroFillSize) &&
+ "data size greater than fill size, unexpected large write will occur");
OS << Str;
if (ZeroFillSize)
WriteZeros(ZeroFillSize - Str.size());
/// @}
};
+MCObjectWriter *createWinCOFFObjectWriter(raw_ostream &OS, bool is64Bit);
+
} // End llvm namespace
#endif