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