Index: lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp =================================================================== --- lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp +++ lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp @@ -29,48 +29,14 @@ using namespace llvm; namespace { -class WebAssemblyAsmBackendELF final : public MCAsmBackend { - bool Is64Bit; - -public: - explicit WebAssemblyAsmBackendELF(bool Is64Bit) - : MCAsmBackend(), Is64Bit(Is64Bit) {} - ~WebAssemblyAsmBackendELF() override {} - - void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, - const MCValue &Target, MutableArrayRef Data, - uint64_t Value, bool IsPCRel) const override; - - std::unique_ptr - createObjectWriter(raw_pwrite_stream &OS) const override; - - // No instruction requires relaxation - bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, - const MCRelaxableFragment *DF, - const MCAsmLayout &Layout) const override { - return false; - } - - unsigned getNumFixupKinds() const override { - // We currently just use the generic fixups in MCFixup.h and don't have any - // target-specific fixups. - return 0; - } - - bool mayNeedRelaxation(const MCInst &Inst) const override { return false; } - - void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, - MCInst &Res) const override {} - - bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override; -}; class WebAssemblyAsmBackend final : public MCAsmBackend { bool Is64Bit; + bool IsELF; public: - explicit WebAssemblyAsmBackend(bool Is64Bit) - : MCAsmBackend(), Is64Bit(Is64Bit) {} + explicit WebAssemblyAsmBackend(bool Is64Bit, bool IsELF) + : MCAsmBackend(), Is64Bit(Is64Bit), IsELF(IsELF) {} ~WebAssemblyAsmBackend() override {} unsigned getNumFixupKinds() const override { @@ -101,43 +67,6 @@ bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override; }; -bool WebAssemblyAsmBackendELF::writeNopData(uint64_t Count, - MCObjectWriter *OW) const { - for (uint64_t i = 0; i < Count; ++i) - OW->write8(WebAssembly::Nop); - - return true; -} - -void WebAssemblyAsmBackendELF::applyFixup(const MCAssembler &Asm, - const MCFixup &Fixup, - const MCValue &Target, - MutableArrayRef Data, - uint64_t Value, bool IsPCRel) const { - const MCFixupKindInfo &Info = getFixupKindInfo(Fixup.getKind()); - assert(Info.Flags == 0 && "WebAssembly does not use MCFixupKindInfo flags"); - - unsigned NumBytes = alignTo(Info.TargetSize, 8) / 8; - if (Value == 0) - return; // Doesn't change encoding. - - // Shift the value into position. - Value <<= Info.TargetOffset; - - unsigned Offset = Fixup.getOffset(); - assert(Offset + NumBytes <= Data.size() && "Invalid fixup offset!"); - - // For each byte of the fragment that the fixup touches, mask in the - // bits from the fixup value. - for (unsigned i = 0; i != NumBytes; ++i) - Data[Offset + i] |= uint8_t((Value >> (i * 8)) & 0xff); -} - -std::unique_ptr -WebAssemblyAsmBackendELF::createObjectWriter(raw_pwrite_stream &OS) const { - return createWebAssemblyELFObjectWriter(OS, Is64Bit, 0); -} - const MCFixupKindInfo & WebAssemblyAsmBackend::getFixupKindInfo(MCFixupKind Kind) const { const static MCFixupKindInfo Infos[WebAssembly::NumTargetFixupKinds] = { @@ -160,9 +89,6 @@ bool WebAssemblyAsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const { - if (Count == 0) - return true; - for (uint64_t i = 0; i < Count; ++i) OW->write8(WebAssembly::Nop); @@ -195,12 +121,12 @@ std::unique_ptr WebAssemblyAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const { - return createWebAssemblyWasmObjectWriter(OS, Is64Bit); + return IsELF ? createWebAssemblyELFObjectWriter(OS, Is64Bit, 0) + : createWebAssemblyWasmObjectWriter(OS, Is64Bit); } + } // end anonymous namespace MCAsmBackend *llvm::createWebAssemblyAsmBackend(const Triple &TT) { - if (TT.isOSBinFormatELF()) - return new WebAssemblyAsmBackendELF(TT.isArch64Bit()); - return new WebAssemblyAsmBackend(TT.isArch64Bit()); + return new WebAssemblyAsmBackend(TT.isArch64Bit(), TT.isOSBinFormatELF()); }