xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MCTargetDesc/MipsWinCOFFObjectWriter.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
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 
MipsWinCOFFObjectWriter()30 MipsWinCOFFObjectWriter::MipsWinCOFFObjectWriter()
31     : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_R4000) {}
32 
getRelocType(MCContext & Ctx,const MCValue & Target,const MCFixup & Fixup,bool IsCrossSection,const MCAsmBackend & MAB) const33 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 
createMipsWinCOFFObjectWriter()59 std::unique_ptr<MCObjectTargetWriter> llvm::createMipsWinCOFFObjectWriter() {
60   return std::make_unique<MipsWinCOFFObjectWriter>();
61 }
62