Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
RISCVELFObjectWriter.cpp
Go to the documentation of this file.
1//===-- RISCVELFObjectWriter.cpp - RISC-V ELF Writer ----------------------===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "MCTargetDesc/RISCVFixupKinds.h"
10#include "MCTargetDesc/RISCVMCExpr.h"
11#include "MCTargetDesc/RISCVMCTargetDesc.h"
12#include "llvm/MC/MCContext.h"
13#include "llvm/MC/MCELFObjectWriter.h"
14#include "llvm/MC/MCFixup.h"
15#include "llvm/MC/MCObjectWriter.h"
16#include "llvm/MC/MCValue.h"
17#include "llvm/Support/ErrorHandling.h"
18
19using namespacellvm;
20
21namespace{
22classRISCVELFObjectWriter :publicMCELFObjectTargetWriter {
23public:
24 RISCVELFObjectWriter(uint8_t OSABI,bool Is64Bit);
25
26 ~RISCVELFObjectWriter()override;
27
28// Return true if the given relocation must be with a symbol rather than
29// section plus offset.
30boolneedsRelocateWithSymbol(constMCValue &Val,constMCSymbol &Sym,
31unsignedType) const override{
32// TODO: this is very conservative, update once RISC-V psABI requirements
33// are clarified.
34returntrue;
35 }
36
37protected:
38unsignedgetRelocType(MCContext &Ctx,constMCValue &Target,
39constMCFixup &Fixup,bool IsPCRel)const override;
40};
41}
42
43RISCVELFObjectWriter::RISCVELFObjectWriter(uint8_t OSABI,bool Is64Bit)
44 :MCELFObjectTargetWriter(Is64Bit, OSABI,ELF::EM_RISCV,
45/*HasRelocationAddend*/true) {}
46
47RISCVELFObjectWriter::~RISCVELFObjectWriter() =default;
48
49unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
50constMCValue &Target,
51constMCFixup &Fixup,
52bool IsPCRel) const{
53constMCExpr *Expr =Fixup.getValue();
54// Determine the type of the relocation
55unsignedKind =Fixup.getTargetKind();
56if (Kind >=FirstLiteralRelocationKind)
57returnKind -FirstLiteralRelocationKind;
58if (IsPCRel) {
59switch (Kind) {
60default:
61 Ctx.reportError(Fixup.getLoc(),"unsupported relocation type");
62return ELF::R_RISCV_NONE;
63caseFK_Data_4:
64caseFK_PCRel_4:
65returnTarget.getAccessVariant() ==MCSymbolRefExpr::VK_PLT
66 ? ELF::R_RISCV_PLT32
67 : ELF::R_RISCV_32_PCREL;
68caseRISCV::fixup_riscv_pcrel_hi20:
69return ELF::R_RISCV_PCREL_HI20;
70caseRISCV::fixup_riscv_pcrel_lo12_i:
71return ELF::R_RISCV_PCREL_LO12_I;
72caseRISCV::fixup_riscv_pcrel_lo12_s:
73return ELF::R_RISCV_PCREL_LO12_S;
74caseRISCV::fixup_riscv_got_hi20:
75return ELF::R_RISCV_GOT_HI20;
76caseRISCV::fixup_riscv_tls_got_hi20:
77return ELF::R_RISCV_TLS_GOT_HI20;
78caseRISCV::fixup_riscv_tls_gd_hi20:
79return ELF::R_RISCV_TLS_GD_HI20;
80caseRISCV::fixup_riscv_tlsdesc_hi20:
81return ELF::R_RISCV_TLSDESC_HI20;
82caseRISCV::fixup_riscv_tlsdesc_load_lo12:
83return ELF::R_RISCV_TLSDESC_LOAD_LO12;
84caseRISCV::fixup_riscv_tlsdesc_add_lo12:
85return ELF::R_RISCV_TLSDESC_ADD_LO12;
86caseRISCV::fixup_riscv_tlsdesc_call:
87return ELF::R_RISCV_TLSDESC_CALL;
88caseRISCV::fixup_riscv_jal:
89return ELF::R_RISCV_JAL;
90caseRISCV::fixup_riscv_branch:
91return ELF::R_RISCV_BRANCH;
92caseRISCV::fixup_riscv_rvc_jump:
93return ELF::R_RISCV_RVC_JUMP;
94caseRISCV::fixup_riscv_rvc_branch:
95return ELF::R_RISCV_RVC_BRANCH;
96caseRISCV::fixup_riscv_call:
97return ELF::R_RISCV_CALL_PLT;
98caseRISCV::fixup_riscv_call_plt:
99return ELF::R_RISCV_CALL_PLT;
100 }
101 }
102
103switch (Kind) {
104default:
105 Ctx.reportError(Fixup.getLoc(),"unsupported relocation type");
106return ELF::R_RISCV_NONE;
107caseRISCV::fixup_riscv_tlsdesc_load_lo12:
108return ELF::R_RISCV_TLSDESC_LOAD_LO12;
109caseRISCV::fixup_riscv_tlsdesc_add_lo12:
110return ELF::R_RISCV_TLSDESC_ADD_LO12;
111caseRISCV::fixup_riscv_tlsdesc_call:
112return ELF::R_RISCV_TLSDESC_CALL;
113
114caseFK_Data_1:
115 Ctx.reportError(Fixup.getLoc(),"1-byte data relocations not supported");
116return ELF::R_RISCV_NONE;
117caseFK_Data_2:
118 Ctx.reportError(Fixup.getLoc(),"2-byte data relocations not supported");
119return ELF::R_RISCV_NONE;
120caseFK_Data_4:
121if (Expr->getKind() ==MCExpr::Target &&
122 cast<RISCVMCExpr>(Expr)->getKind() ==RISCVMCExpr::VK_RISCV_32_PCREL)
123return ELF::R_RISCV_32_PCREL;
124if (Target.getSymA()->getKind() ==MCSymbolRefExpr::VK_GOTPCREL)
125return ELF::R_RISCV_GOT32_PCREL;
126return ELF::R_RISCV_32;
127caseFK_Data_8:
128return ELF::R_RISCV_64;
129caseRISCV::fixup_riscv_hi20:
130return ELF::R_RISCV_HI20;
131caseRISCV::fixup_riscv_lo12_i:
132return ELF::R_RISCV_LO12_I;
133caseRISCV::fixup_riscv_lo12_s:
134return ELF::R_RISCV_LO12_S;
135caseRISCV::fixup_riscv_tprel_hi20:
136return ELF::R_RISCV_TPREL_HI20;
137caseRISCV::fixup_riscv_tprel_lo12_i:
138return ELF::R_RISCV_TPREL_LO12_I;
139caseRISCV::fixup_riscv_tprel_lo12_s:
140return ELF::R_RISCV_TPREL_LO12_S;
141caseRISCV::fixup_riscv_tprel_add:
142return ELF::R_RISCV_TPREL_ADD;
143caseRISCV::fixup_riscv_relax:
144return ELF::R_RISCV_RELAX;
145caseRISCV::fixup_riscv_align:
146return ELF::R_RISCV_ALIGN;
147 }
148}
149
150std::unique_ptr<MCObjectTargetWriter>
151llvm::createRISCVELFObjectWriter(uint8_t OSABI,bool Is64Bit) {
152return std::make_unique<RISCVELFObjectWriter>(OSABI, Is64Bit);
153}
true
basic Basic Alias true
Definition:BasicAliasAnalysis.cpp:1981
Sym
Symbol * Sym
Definition:ELF_riscv.cpp:479
MCContext.h
MCELFObjectWriter.h
MCFixup.h
MCObjectWriter.h
MCValue.h
Fixup
PowerPC TLS Dynamic Call Fixup
Definition:PPCTLSDynamicCall.cpp:339
RISCVFixupKinds.h
RISCVMCExpr.h
RISCVMCTargetDesc.h
llvm::MCContext
Context object for machine code objects.
Definition:MCContext.h:83
llvm::MCContext::reportError
void reportError(SMLoc L, const Twine &Msg)
Definition:MCContext.cpp:1072
llvm::MCELFObjectTargetWriter
Definition:MCELFObjectWriter.h:53
llvm::MCELFObjectTargetWriter::needsRelocateWithSymbol
virtual bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym, unsigned Type) const
Definition:MCELFObjectTargetWriter.cpp:20
llvm::MCELFObjectTargetWriter::getRelocType
virtual unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const =0
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition:MCExpr.h:34
llvm::MCExpr::Target
@ Target
Target specific expression.
Definition:MCExpr.h:41
llvm::MCExpr::getKind
ExprKind getKind() const
Definition:MCExpr.h:78
llvm::MCFixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition:MCFixup.h:71
llvm::MCSymbolRefExpr::VK_GOTPCREL
@ VK_GOTPCREL
Definition:MCExpr.h:203
llvm::MCSymbolRefExpr::VK_PLT
@ VK_PLT
Definition:MCExpr.h:209
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition:MCSymbol.h:41
llvm::MCValue
This represents an "assembler immediate".
Definition:MCValue.h:36
llvm::RISCVMCExpr::VK_RISCV_32_PCREL
@ VK_RISCV_32_PCREL
Definition:RISCVMCExpr.h:39
llvm::Target
Target - Wrapper for Target specific information.
Definition:TargetRegistry.h:144
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition:Type.h:45
uint8_t
ErrorHandling.h
llvm::ELF::EM_RISCV
@ EM_RISCV
Definition:ELF.h:320
llvm::RISCV::fixup_riscv_tprel_lo12_s
@ fixup_riscv_tprel_lo12_s
Definition:RISCVFixupKinds.h:44
llvm::RISCV::fixup_riscv_tls_got_hi20
@ fixup_riscv_tls_got_hi20
Definition:RISCVFixupKinds.h:50
llvm::RISCV::fixup_riscv_call_plt
@ fixup_riscv_call_plt
Definition:RISCVFixupKinds.h:67
llvm::RISCV::fixup_riscv_tls_gd_hi20
@ fixup_riscv_tls_gd_hi20
Definition:RISCVFixupKinds.h:53
llvm::RISCV::fixup_riscv_hi20
@ fixup_riscv_hi20
Definition:RISCVFixupKinds.h:21
llvm::RISCV::fixup_riscv_pcrel_lo12_i
@ fixup_riscv_pcrel_lo12_i
Definition:RISCVFixupKinds.h:31
llvm::RISCV::fixup_riscv_tlsdesc_call
@ fixup_riscv_tlsdesc_call
Definition:RISCVFixupKinds.h:79
llvm::RISCV::fixup_riscv_tprel_hi20
@ fixup_riscv_tprel_hi20
Definition:RISCVFixupKinds.h:39
llvm::RISCV::fixup_riscv_pcrel_lo12_s
@ fixup_riscv_pcrel_lo12_s
Definition:RISCVFixupKinds.h:34
llvm::RISCV::fixup_riscv_relax
@ fixup_riscv_relax
Definition:RISCVFixupKinds.h:70
llvm::RISCV::fixup_riscv_got_hi20
@ fixup_riscv_got_hi20
Definition:RISCVFixupKinds.h:37
llvm::RISCV::fixup_riscv_align
@ fixup_riscv_align
Definition:RISCVFixupKinds.h:73
llvm::RISCV::fixup_riscv_tprel_lo12_i
@ fixup_riscv_tprel_lo12_i
Definition:RISCVFixupKinds.h:41
llvm::RISCV::fixup_riscv_tlsdesc_load_lo12
@ fixup_riscv_tlsdesc_load_lo12
Definition:RISCVFixupKinds.h:77
llvm::RISCV::fixup_riscv_call
@ fixup_riscv_call
Definition:RISCVFixupKinds.h:64
llvm::RISCV::fixup_riscv_lo12_i
@ fixup_riscv_lo12_i
Definition:RISCVFixupKinds.h:23
llvm::RISCV::fixup_riscv_tprel_add
@ fixup_riscv_tprel_add
Definition:RISCVFixupKinds.h:47
llvm::RISCV::fixup_riscv_rvc_jump
@ fixup_riscv_rvc_jump
Definition:RISCVFixupKinds.h:59
llvm::RISCV::fixup_riscv_lo12_s
@ fixup_riscv_lo12_s
Definition:RISCVFixupKinds.h:27
llvm::RISCV::fixup_riscv_tlsdesc_hi20
@ fixup_riscv_tlsdesc_hi20
Definition:RISCVFixupKinds.h:76
llvm::RISCV::fixup_riscv_rvc_branch
@ fixup_riscv_rvc_branch
Definition:RISCVFixupKinds.h:61
llvm::RISCV::fixup_riscv_branch
@ fixup_riscv_branch
Definition:RISCVFixupKinds.h:57
llvm::RISCV::fixup_riscv_pcrel_hi20
@ fixup_riscv_pcrel_hi20
Definition:RISCVFixupKinds.h:29
llvm::RISCV::fixup_riscv_tlsdesc_add_lo12
@ fixup_riscv_tlsdesc_add_lo12
Definition:RISCVFixupKinds.h:78
llvm::RISCV::fixup_riscv_jal
@ fixup_riscv_jal
Definition:RISCVFixupKinds.h:55
llvm::lltok::Kind
Kind
Definition:LLToken.h:18
llvm::logicalview::LVBinaryType::ELF
@ ELF
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::createRISCVELFObjectWriter
std::unique_ptr< MCObjectTargetWriter > createRISCVELFObjectWriter(uint8_t OSABI, bool Is64Bit)
Definition:RISCVELFObjectWriter.cpp:151
llvm::FK_PCRel_4
@ FK_PCRel_4
A four-byte pc relative fixup.
Definition:MCFixup.h:30
llvm::FirstLiteralRelocationKind
@ FirstLiteralRelocationKind
The range [FirstLiteralRelocationKind, MaxTargetFixupKind) is used for relocations coming from ....
Definition:MCFixup.h:50
llvm::FK_Data_8
@ FK_Data_8
A eight-byte fixup.
Definition:MCFixup.h:26
llvm::FK_Data_1
@ FK_Data_1
A one-byte fixup.
Definition:MCFixup.h:23
llvm::FK_Data_4
@ FK_Data_4
A four-byte fixup.
Definition:MCFixup.h:25
llvm::FK_Data_2
@ FK_Data_2
A two-byte fixup.
Definition:MCFixup.h:24

Generated on Fri Jul 18 2025 14:25:14 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp