62 lines · cpp
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-exception6//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 15using namespace llvm;16 17namespace {18 19class MipsWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {20public: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 namespace29 30MipsWinCOFFObjectWriter::MipsWinCOFFObjectWriter()31 : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_R4000) {}32 33unsigned 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 59std::unique_ptr<MCObjectTargetWriter> llvm::createMipsWinCOFFObjectWriter() {60 return std::make_unique<MipsWinCOFFObjectWriter>();61}62