1d8a5fae6SHervé Poussineau //===- MipsWinCOFFObjectWriter.cpp------------------------------*- C++ -*-===// 2d8a5fae6SHervé Poussineau // 3d8a5fae6SHervé Poussineau // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d8a5fae6SHervé Poussineau // See https://llvm.org/LICENSE.txt for license information. 5d8a5fae6SHervé Poussineau // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d8a5fae6SHervé Poussineau // 7d8a5fae6SHervé Poussineau //===---------------------------------------------------------------------===// 8d8a5fae6SHervé Poussineau 9d8a5fae6SHervé Poussineau #include "MCTargetDesc/MipsFixupKinds.h" 10d8a5fae6SHervé Poussineau #include "MCTargetDesc/MipsMCTargetDesc.h" 11d8a5fae6SHervé Poussineau #include "llvm/BinaryFormat/COFF.h" 12d8a5fae6SHervé Poussineau #include "llvm/MC/MCContext.h" 13d8a5fae6SHervé Poussineau #include "llvm/MC/MCWinCOFFObjectWriter.h" 14d8a5fae6SHervé Poussineau 15d8a5fae6SHervé Poussineau using namespace llvm; 16d8a5fae6SHervé Poussineau 17d8a5fae6SHervé Poussineau namespace { 18d8a5fae6SHervé Poussineau 19d8a5fae6SHervé Poussineau class MipsWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter { 20d8a5fae6SHervé Poussineau public: 21d8a5fae6SHervé Poussineau MipsWinCOFFObjectWriter(); 22d8a5fae6SHervé Poussineau 23d8a5fae6SHervé Poussineau unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 24d8a5fae6SHervé Poussineau const MCFixup &Fixup, bool IsCrossSection, 25d8a5fae6SHervé Poussineau const MCAsmBackend &MAB) const override; 26d8a5fae6SHervé Poussineau }; 27d8a5fae6SHervé Poussineau 28d8a5fae6SHervé Poussineau } // end anonymous namespace 29d8a5fae6SHervé Poussineau 30d8a5fae6SHervé Poussineau MipsWinCOFFObjectWriter::MipsWinCOFFObjectWriter() 31d8a5fae6SHervé Poussineau : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_R4000) {} 32d8a5fae6SHervé Poussineau 33d8a5fae6SHervé Poussineau unsigned MipsWinCOFFObjectWriter::getRelocType(MCContext &Ctx, 34d8a5fae6SHervé Poussineau const MCValue &Target, 35d8a5fae6SHervé Poussineau const MCFixup &Fixup, 36d8a5fae6SHervé Poussineau bool IsCrossSection, 37d8a5fae6SHervé Poussineau const MCAsmBackend &MAB) const { 38d8a5fae6SHervé Poussineau unsigned FixupKind = Fixup.getKind(); 39d8a5fae6SHervé Poussineau 40d8a5fae6SHervé Poussineau switch (FixupKind) { 41d8a5fae6SHervé Poussineau case FK_Data_4: 42d8a5fae6SHervé Poussineau return COFF::IMAGE_REL_MIPS_REFWORD; 43*be68f35bSHervé Poussineau case FK_SecRel_2: 44*be68f35bSHervé Poussineau return COFF::IMAGE_REL_MIPS_SECTION; 45*be68f35bSHervé Poussineau case FK_SecRel_4: 46*be68f35bSHervé Poussineau return COFF::IMAGE_REL_MIPS_SECREL; 47d8a5fae6SHervé Poussineau case Mips::fixup_Mips_26: 48d8a5fae6SHervé Poussineau return COFF::IMAGE_REL_MIPS_JMPADDR; 49d8a5fae6SHervé Poussineau case Mips::fixup_Mips_HI16: 50d8a5fae6SHervé Poussineau return COFF::IMAGE_REL_MIPS_REFHI; 51d8a5fae6SHervé Poussineau case Mips::fixup_Mips_LO16: 52d8a5fae6SHervé Poussineau return COFF::IMAGE_REL_MIPS_REFLO; 53d8a5fae6SHervé Poussineau default: 54d8a5fae6SHervé Poussineau Ctx.reportError(Fixup.getLoc(), "unsupported relocation type"); 55d8a5fae6SHervé Poussineau return COFF::IMAGE_REL_MIPS_REFWORD; 56d8a5fae6SHervé Poussineau } 57d8a5fae6SHervé Poussineau } 58d8a5fae6SHervé Poussineau 59d8a5fae6SHervé Poussineau std::unique_ptr<MCObjectTargetWriter> llvm::createMipsWinCOFFObjectWriter() { 60d8a5fae6SHervé Poussineau return std::make_unique<MipsWinCOFFObjectWriter>(); 61d8a5fae6SHervé Poussineau } 62