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