Path: blob/main/contrib/llvm-project/llvm/lib/Target/CSKY/MCTargetDesc/CSKYELFObjectWriter.cpp
35293 views
//===-- CSKYELFObjectWriter.cpp - CSKY ELF Writer -------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "CSKYFixupKinds.h"9#include "CSKYMCExpr.h"10#include "CSKYMCTargetDesc.h"11#include "llvm/MC/MCContext.h"12#include "llvm/MC/MCELFObjectWriter.h"13#include "llvm/MC/MCObjectWriter.h"1415#define DEBUG_TYPE "csky-elf-object-writer"1617using namespace llvm;1819namespace {2021class CSKYELFObjectWriter : public MCELFObjectTargetWriter {22public:23CSKYELFObjectWriter(uint8_t OSABI = 0)24: MCELFObjectTargetWriter(false, OSABI, ELF::EM_CSKY, true){};25~CSKYELFObjectWriter() {}2627unsigned getRelocType(MCContext &Ctx, const MCValue &Target,28const MCFixup &Fixup, bool IsPCRel) const override;29};3031} // namespace3233unsigned CSKYELFObjectWriter::getRelocType(MCContext &Ctx,34const MCValue &Target,35const MCFixup &Fixup,36bool IsPCRel) const {37const MCExpr *Expr = Fixup.getValue();38// Determine the type of the relocation39unsigned Kind = Fixup.getTargetKind();40MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();4142if (IsPCRel) {43switch (Kind) {44default:45LLVM_DEBUG(dbgs() << "Unknown Kind1 = " << Kind);46Ctx.reportError(Fixup.getLoc(), "Unsupported relocation type");47return ELF::R_CKCORE_NONE;48case FK_Data_4:49case FK_PCRel_4:50return ELF::R_CKCORE_PCREL32;51case CSKY::fixup_csky_pcrel_uimm16_scale4:52return ELF::R_CKCORE_PCREL_IMM16_4;53case CSKY::fixup_csky_pcrel_uimm8_scale4:54return ELF::R_CKCORE_PCREL_IMM8_4;55case CSKY::fixup_csky_pcrel_imm26_scale2:56return ELF::R_CKCORE_PCREL_IMM26_2;57case CSKY::fixup_csky_pcrel_imm18_scale2:58return ELF::R_CKCORE_PCREL_IMM18_2;59case CSKY::fixup_csky_pcrel_imm16_scale2:60return ELF::R_CKCORE_PCREL_IMM16_2;61case CSKY::fixup_csky_pcrel_imm10_scale2:62return ELF::R_CKCORE_PCREL_IMM10_2;63case CSKY::fixup_csky_pcrel_uimm7_scale4:64return ELF::R_CKCORE_PCREL_IMM7_4;65}66}6768switch (Kind) {69default:70LLVM_DEBUG(dbgs() << "Unknown Kind2 = " << Kind);71Ctx.reportError(Fixup.getLoc(), "Unsupported relocation type");72return ELF::R_CKCORE_NONE;73case FK_Data_1:74Ctx.reportError(Fixup.getLoc(), "1-byte data relocations not supported");75return ELF::R_CKCORE_NONE;76case FK_Data_2:77Ctx.reportError(Fixup.getLoc(), "2-byte data relocations not supported");78return ELF::R_CKCORE_NONE;79case FK_Data_4:80if (Expr->getKind() == MCExpr::Target) {81auto TK = cast<CSKYMCExpr>(Expr)->getKind();82if (TK == CSKYMCExpr::VK_CSKY_ADDR)83return ELF::R_CKCORE_ADDR32;84if (TK == CSKYMCExpr::VK_CSKY_GOT)85return ELF::R_CKCORE_GOT32;86if (TK == CSKYMCExpr::VK_CSKY_GOTOFF)87return ELF::R_CKCORE_GOTOFF;88if (TK == CSKYMCExpr::VK_CSKY_PLT)89return ELF::R_CKCORE_PLT32;90if (TK == CSKYMCExpr::VK_CSKY_TLSIE)91return ELF::R_CKCORE_TLS_IE32;92if (TK == CSKYMCExpr::VK_CSKY_TLSLE)93return ELF::R_CKCORE_TLS_LE32;94if (TK == CSKYMCExpr::VK_CSKY_TLSGD)95return ELF::R_CKCORE_TLS_GD32;96if (TK == CSKYMCExpr::VK_CSKY_TLSLDM)97return ELF::R_CKCORE_TLS_LDM32;98if (TK == CSKYMCExpr::VK_CSKY_TLSLDO)99return ELF::R_CKCORE_TLS_LDO32;100if (TK == CSKYMCExpr::VK_CSKY_GOTPC)101return ELF::R_CKCORE_GOTPC;102if (TK == CSKYMCExpr::VK_CSKY_None)103return ELF::R_CKCORE_ADDR32;104105LLVM_DEBUG(dbgs() << "Unknown FK_Data_4 TK = " << TK);106Ctx.reportError(Fixup.getLoc(), "unknown target FK_Data_4");107} else {108switch (Modifier) {109default:110Ctx.reportError(Fixup.getLoc(),111"invalid fixup for 4-byte data relocation");112return ELF::R_CKCORE_NONE;113case MCSymbolRefExpr::VK_GOT:114return ELF::R_CKCORE_GOT32;115case MCSymbolRefExpr::VK_GOTOFF:116return ELF::R_CKCORE_GOTOFF;117case MCSymbolRefExpr::VK_PLT:118return ELF::R_CKCORE_PLT32;119case MCSymbolRefExpr::VK_TLSGD:120return ELF::R_CKCORE_TLS_GD32;121case MCSymbolRefExpr::VK_TLSLDM:122return ELF::R_CKCORE_TLS_LDM32;123case MCSymbolRefExpr::VK_TPOFF:124return ELF::R_CKCORE_TLS_LE32;125case MCSymbolRefExpr::VK_None:126return ELF::R_CKCORE_ADDR32;127}128}129return ELF::R_CKCORE_NONE;130case FK_Data_8:131Ctx.reportError(Fixup.getLoc(), "8-byte data relocations not supported");132return ELF::R_CKCORE_NONE;133case CSKY::fixup_csky_addr32:134return ELF::R_CKCORE_ADDR32;135case CSKY::fixup_csky_addr_hi16:136return ELF::R_CKCORE_ADDR_HI16;137case CSKY::fixup_csky_addr_lo16:138return ELF::R_CKCORE_ADDR_LO16;139case CSKY::fixup_csky_doffset_imm18:140return ELF::R_CKCORE_DOFFSET_IMM18;141case CSKY::fixup_csky_doffset_imm18_scale2:142return ELF::R_CKCORE_DOFFSET_IMM18_2;143case CSKY::fixup_csky_doffset_imm18_scale4:144return ELF::R_CKCORE_DOFFSET_IMM18_4;145case CSKY::fixup_csky_got_imm18_scale4:146return ELF::R_CKCORE_GOT_IMM18_4;147case CSKY::fixup_csky_plt_imm18_scale4:148return ELF::R_CKCORE_PLT_IMM18_4;149}150}151152std::unique_ptr<MCObjectTargetWriter> llvm::createCSKYELFObjectWriter() {153return std::make_unique<CSKYELFObjectWriter>();154}155156157