Path: blob/main/contrib/llvm-project/llvm/lib/Target/M68k/MCTargetDesc/M68kELFObjectWriter.cpp
35294 views
//===-- M68kELFObjectWriter.cpp - M68k ELF Writer ---------------*- C++ -*-===//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//===----------------------------------------------------------------------===//7///8/// \file9/// This file contains definitions for M68k ELF Writers10///11//===----------------------------------------------------------------------===//1213#include "MCTargetDesc/M68kFixupKinds.h"14#include "MCTargetDesc/M68kMCTargetDesc.h"1516#include "llvm/BinaryFormat/ELF.h"17#include "llvm/MC/MCAsmInfo.h"18#include "llvm/MC/MCContext.h"19#include "llvm/MC/MCELFObjectWriter.h"20#include "llvm/MC/MCExpr.h"21#include "llvm/MC/MCValue.h"22#include "llvm/Support/ErrorHandling.h"2324using namespace llvm;2526namespace {27class M68kELFObjectWriter : public MCELFObjectTargetWriter {28public:29M68kELFObjectWriter(uint8_t OSABI);3031~M68kELFObjectWriter() override;3233protected:34unsigned getRelocType(MCContext &Ctx, const MCValue &Target,35const MCFixup &Fixup, bool IsPCRel) const override;36};37} // namespace3839M68kELFObjectWriter::M68kELFObjectWriter(uint8_t OSABI)40: MCELFObjectTargetWriter(false, OSABI, ELF::EM_68K, /* RELA */ true) {}4142M68kELFObjectWriter::~M68kELFObjectWriter() {}4344enum M68kRelType { RT_32, RT_16, RT_8 };4546static M68kRelType47getType(unsigned Kind, MCSymbolRefExpr::VariantKind &Modifier, bool &IsPCRel) {48switch (Kind) {49case FK_Data_4:50case FK_PCRel_4:51return RT_32;52case FK_PCRel_2:53case FK_Data_2:54return RT_16;55case FK_PCRel_1:56case FK_Data_1:57return RT_8;58}59llvm_unreachable("Unimplemented");60}6162unsigned M68kELFObjectWriter::getRelocType(MCContext &Ctx,63const MCValue &Target,64const MCFixup &Fixup,65bool IsPCRel) const {66MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();67unsigned Kind = Fixup.getKind();68M68kRelType Type = getType(Kind, Modifier, IsPCRel);69switch (Modifier) {70default:71llvm_unreachable("Unimplemented");7273case MCSymbolRefExpr::VK_TLSGD:74switch (Type) {75case RT_32:76return ELF::R_68K_TLS_GD32;77case RT_16:78return ELF::R_68K_TLS_GD16;79case RT_8:80return ELF::R_68K_TLS_GD8;81}82llvm_unreachable("Unrecognized size");83case MCSymbolRefExpr::VK_TLSLDM:84switch (Type) {85case RT_32:86return ELF::R_68K_TLS_LDM32;87case RT_16:88return ELF::R_68K_TLS_LDM16;89case RT_8:90return ELF::R_68K_TLS_LDM8;91}92llvm_unreachable("Unrecognized size");93case MCSymbolRefExpr::VK_TLSLD:94switch (Type) {95case RT_32:96return ELF::R_68K_TLS_LDO32;97case RT_16:98return ELF::R_68K_TLS_LDO16;99case RT_8:100return ELF::R_68K_TLS_LDO8;101}102llvm_unreachable("Unrecognized size");103case MCSymbolRefExpr::VK_GOTTPOFF:104switch (Type) {105case RT_32:106return ELF::R_68K_TLS_IE32;107case RT_16:108return ELF::R_68K_TLS_IE16;109case RT_8:110return ELF::R_68K_TLS_IE8;111}112llvm_unreachable("Unrecognized size");113case MCSymbolRefExpr::VK_TPOFF:114switch (Type) {115case RT_32:116return ELF::R_68K_TLS_LE32;117case RT_16:118return ELF::R_68K_TLS_LE16;119case RT_8:120return ELF::R_68K_TLS_LE8;121}122llvm_unreachable("Unrecognized size");123case MCSymbolRefExpr::VK_None:124switch (Type) {125case RT_32:126return IsPCRel ? ELF::R_68K_PC32 : ELF::R_68K_32;127case RT_16:128return IsPCRel ? ELF::R_68K_PC16 : ELF::R_68K_16;129case RT_8:130return IsPCRel ? ELF::R_68K_PC8 : ELF::R_68K_8;131}132llvm_unreachable("Unrecognized size");133case MCSymbolRefExpr::VK_GOTPCREL:134switch (Type) {135case RT_32:136return ELF::R_68K_GOTPCREL32;137case RT_16:138return ELF::R_68K_GOTPCREL16;139case RT_8:140return ELF::R_68K_GOTPCREL8;141}142llvm_unreachable("Unrecognized size");143case MCSymbolRefExpr::VK_GOTOFF:144assert(!IsPCRel);145switch (Type) {146case RT_32:147return ELF::R_68K_GOTOFF32;148case RT_16:149return ELF::R_68K_GOTOFF16;150case RT_8:151return ELF::R_68K_GOTOFF8;152}153llvm_unreachable("Unrecognized size");154case MCSymbolRefExpr::VK_PLT:155switch (Type) {156case RT_32:157return ELF::R_68K_PLT32;158case RT_16:159return ELF::R_68K_PLT16;160case RT_8:161return ELF::R_68K_PLT8;162}163llvm_unreachable("Unrecognized size");164}165}166167std::unique_ptr<MCObjectTargetWriter>168llvm::createM68kELFObjectWriter(uint8_t OSABI) {169return std::make_unique<M68kELFObjectWriter>(OSABI);170}171172173