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
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 namespace
29
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(L: Fixup.getLoc(), Msg: "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