Path: blob/main/contrib/llvm-project/llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp
35293 views
//===-- AVRELFObjectWriter.cpp - AVR 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 "MCTargetDesc/AVRFixupKinds.h"9#include "MCTargetDesc/AVRMCExpr.h"10#include "MCTargetDesc/AVRMCTargetDesc.h"1112#include "llvm/MC/MCAssembler.h"13#include "llvm/MC/MCELFObjectWriter.h"14#include "llvm/MC/MCExpr.h"15#include "llvm/MC/MCObjectWriter.h"16#include "llvm/MC/MCSection.h"17#include "llvm/MC/MCValue.h"18#include "llvm/Support/ErrorHandling.h"1920namespace llvm {2122/// Writes AVR machine code into an ELF32 object file.23class AVRELFObjectWriter : public MCELFObjectTargetWriter {24public:25AVRELFObjectWriter(uint8_t OSABI);2627virtual ~AVRELFObjectWriter() = default;2829unsigned getRelocType(MCContext &Ctx, const MCValue &Target,30const MCFixup &Fixup, bool IsPCRel) const override;31};3233AVRELFObjectWriter::AVRELFObjectWriter(uint8_t OSABI)34: MCELFObjectTargetWriter(false, OSABI, ELF::EM_AVR, true) {}3536unsigned AVRELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,37const MCFixup &Fixup,38bool IsPCRel) const {39const unsigned Kind = Fixup.getTargetKind();40if (Kind >= FirstLiteralRelocationKind)41return Kind - FirstLiteralRelocationKind;42MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();43switch ((unsigned)Fixup.getKind()) {44case FK_Data_1:45switch (Modifier) {46default:47llvm_unreachable("Unsupported Modifier");48case MCSymbolRefExpr::VK_None:49return ELF::R_AVR_8;50case MCSymbolRefExpr::VK_AVR_DIFF8:51return ELF::R_AVR_DIFF8;52case MCSymbolRefExpr::VK_AVR_LO8:53return ELF::R_AVR_8_LO8;54case MCSymbolRefExpr::VK_AVR_HI8:55return ELF::R_AVR_8_HI8;56case MCSymbolRefExpr::VK_AVR_HLO8:57return ELF::R_AVR_8_HLO8;58}59case FK_Data_4:60switch (Modifier) {61default:62llvm_unreachable("Unsupported Modifier");63case MCSymbolRefExpr::VK_None:64return ELF::R_AVR_32;65case MCSymbolRefExpr::VK_AVR_DIFF32:66return ELF::R_AVR_DIFF32;67}68case FK_Data_2:69switch (Modifier) {70default:71llvm_unreachable("Unsupported Modifier");72case MCSymbolRefExpr::VK_None:73return ELF::R_AVR_16;74case MCSymbolRefExpr::VK_AVR_NONE:75case MCSymbolRefExpr::VK_AVR_PM:76return ELF::R_AVR_16_PM;77case MCSymbolRefExpr::VK_AVR_DIFF16:78return ELF::R_AVR_DIFF16;79}80case AVR::fixup_32:81return ELF::R_AVR_32;82case AVR::fixup_7_pcrel:83return ELF::R_AVR_7_PCREL;84case AVR::fixup_13_pcrel:85return ELF::R_AVR_13_PCREL;86case AVR::fixup_16:87return ELF::R_AVR_16;88case AVR::fixup_16_pm:89return ELF::R_AVR_16_PM;90case AVR::fixup_lo8_ldi:91return ELF::R_AVR_LO8_LDI;92case AVR::fixup_hi8_ldi:93return ELF::R_AVR_HI8_LDI;94case AVR::fixup_hh8_ldi:95return ELF::R_AVR_HH8_LDI;96case AVR::fixup_lo8_ldi_neg:97return ELF::R_AVR_LO8_LDI_NEG;98case AVR::fixup_hi8_ldi_neg:99return ELF::R_AVR_HI8_LDI_NEG;100case AVR::fixup_hh8_ldi_neg:101return ELF::R_AVR_HH8_LDI_NEG;102case AVR::fixup_lo8_ldi_pm:103return ELF::R_AVR_LO8_LDI_PM;104case AVR::fixup_hi8_ldi_pm:105return ELF::R_AVR_HI8_LDI_PM;106case AVR::fixup_hh8_ldi_pm:107return ELF::R_AVR_HH8_LDI_PM;108case AVR::fixup_lo8_ldi_pm_neg:109return ELF::R_AVR_LO8_LDI_PM_NEG;110case AVR::fixup_hi8_ldi_pm_neg:111return ELF::R_AVR_HI8_LDI_PM_NEG;112case AVR::fixup_hh8_ldi_pm_neg:113return ELF::R_AVR_HH8_LDI_PM_NEG;114case AVR::fixup_call:115return ELF::R_AVR_CALL;116case AVR::fixup_ldi:117return ELF::R_AVR_LDI;118case AVR::fixup_6:119return ELF::R_AVR_6;120case AVR::fixup_6_adiw:121return ELF::R_AVR_6_ADIW;122case AVR::fixup_ms8_ldi:123return ELF::R_AVR_MS8_LDI;124case AVR::fixup_ms8_ldi_neg:125return ELF::R_AVR_MS8_LDI_NEG;126case AVR::fixup_lo8_ldi_gs:127return ELF::R_AVR_LO8_LDI_GS;128case AVR::fixup_hi8_ldi_gs:129return ELF::R_AVR_HI8_LDI_GS;130case AVR::fixup_8:131return ELF::R_AVR_8;132case AVR::fixup_8_lo8:133return ELF::R_AVR_8_LO8;134case AVR::fixup_8_hi8:135return ELF::R_AVR_8_HI8;136case AVR::fixup_8_hlo8:137return ELF::R_AVR_8_HLO8;138case AVR::fixup_diff8:139return ELF::R_AVR_DIFF8;140case AVR::fixup_diff16:141return ELF::R_AVR_DIFF16;142case AVR::fixup_diff32:143return ELF::R_AVR_DIFF32;144case AVR::fixup_lds_sts_16:145return ELF::R_AVR_LDS_STS_16;146case AVR::fixup_port6:147return ELF::R_AVR_PORT6;148case AVR::fixup_port5:149return ELF::R_AVR_PORT5;150default:151llvm_unreachable("invalid fixup kind!");152}153}154155std::unique_ptr<MCObjectTargetWriter> createAVRELFObjectWriter(uint8_t OSABI) {156return std::make_unique<AVRELFObjectWriter>(OSABI);157}158159} // end of namespace llvm160161162