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