brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · cbe74f8 Raw
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