LLVM 22.0.0git
RISCVELFStreamer.cpp
Go to the documentation of this file.
1//===-- RISCVELFStreamer.cpp - RISC-V ELF Target Streamer Methods ---------===//
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// This file provides RISC-V specific target streamer methods.
10//
11//===----------------------------------------------------------------------===//
12
13#include "RISCVELFStreamer.h"
14#include "RISCVAsmBackend.h"
15#include "RISCVBaseInfo.h"
16#include "RISCVMCTargetDesc.h"
19#include "llvm/MC/MCAssembler.h"
21#include "llvm/MC/MCContext.h"
24
25using namespace llvm;
26
27// This part is for ELF object output.
29 const MCSubtargetInfo &STI)
30 : RISCVTargetStreamer(S), CurrentVendor("riscv") {
32 const FeatureBitset &Features = STI.getFeatureBits();
33 auto &MAB = static_cast<RISCVAsmBackend &>(MCA.getBackend());
35 MAB.getTargetOptions().getABIName()));
37}
38
40 std::unique_ptr<MCAsmBackend> MAB,
41 std::unique_ptr<MCObjectWriter> MOW,
42 std::unique_ptr<MCCodeEmitter> MCE)
43 : MCELFStreamer(C, std::move(MAB), std::move(MOW), std::move(MCE)) {}
44
48
59
60void RISCVTargetELFStreamer::emitAttribute(unsigned Attribute, unsigned Value) {
61 getStreamer().setAttributeItem(Attribute, Value, /*OverwriteExisting=*/true);
62}
63
64void RISCVTargetELFStreamer::emitTextAttribute(unsigned Attribute,
66 getStreamer().setAttributeItem(Attribute, String, /*OverwriteExisting=*/true);
67}
68
69void RISCVTargetELFStreamer::emitIntTextAttribute(unsigned Attribute,
70 unsigned IntValue,
71 StringRef StringValue) {
72 getStreamer().setAttributeItems(Attribute, IntValue, StringValue,
73 /*OverwriteExisting=*/true);
74}
75
77 RISCVELFStreamer &S = getStreamer();
78 if (S.Contents.empty())
79 return;
80
81 S.emitAttributesSection(CurrentVendor, ".riscv.attributes",
82 ELF::SHT_RISCV_ATTRIBUTES, AttributeSection);
83}
84
89
90 unsigned EFlags = W.getELFHeaderEFlags();
91
92 if (hasRVC())
93 EFlags |= ELF::EF_RISCV_RVC;
94 if (hasTSO())
95 EFlags |= ELF::EF_RISCV_TSO;
96
97 switch (ABI) {
100 break;
104 break;
108 break;
111 EFlags |= ELF::EF_RISCV_RVE;
112 break;
114 llvm_unreachable("Improperly initialised target ABI");
115 }
116
117 W.setELFHeaderEFlags(EFlags);
118}
119
121 AttributeSection = nullptr;
122}
123
128
130 static_cast<RISCVTargetStreamer *>(getTargetStreamer())->reset();
132 LastMappingSymbols.clear();
133 LastEMS = EMS_None;
134}
135
136void RISCVELFStreamer::emitDataMappingSymbol() {
137 if (LastEMS == EMS_Data)
138 return;
139 emitMappingSymbol("$d");
140 LastEMS = EMS_Data;
141}
142
143void RISCVELFStreamer::emitInstructionsMappingSymbol() {
144 if (LastEMS == EMS_Instructions)
145 return;
146 emitMappingSymbol("$x");
147 LastEMS = EMS_Instructions;
148}
149
150void RISCVELFStreamer::emitMappingSymbol(StringRef Name) {
151 auto *Symbol =
152 static_cast<MCSymbolELF *>(getContext().createLocalSymbol(Name));
153 emitLabel(Symbol);
154 Symbol->setType(ELF::STT_NOTYPE);
155 Symbol->setBinding(ELF::STB_LOCAL);
156}
157
159 // We have to keep track of the mapping symbol state of any sections we
160 // use. Each one should start off as EMS_None, which is provided as the
161 // default constructor by DenseMap::lookup.
162 LastMappingSymbols[getPreviousSection().first] = LastEMS;
163 LastEMS = LastMappingSymbols.lookup(Section);
164
165 MCELFStreamer::changeSection(Section, Subsection);
166}
167
169 const MCSubtargetInfo &STI) {
170 emitInstructionsMappingSymbol();
172}
173
175 emitDataMappingSymbol();
177}
178
179void RISCVELFStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,
180 SMLoc Loc) {
181 emitDataMappingSymbol();
182 MCELFStreamer::emitFill(NumBytes, FillValue, Loc);
183}
184
186 SMLoc Loc) {
187 emitDataMappingSymbol();
189}
190
192 std::unique_ptr<MCAsmBackend> &&MAB,
193 std::unique_ptr<MCObjectWriter> &&MOW,
194 std::unique_ptr<MCCodeEmitter> &&MCE) {
195 return new RISCVELFStreamer(C, std::move(MAB), std::move(MOW),
196 std::move(MCE));
197}
198
200 const uint32_t Feature1And) {
201 MCStreamer &OutStreamer = getStreamer();
202 MCContext &Ctx = OutStreamer.getContext();
203
204 const Triple &Triple = Ctx.getTargetTriple();
205 Align NoteAlign;
206 uint64_t DescSize;
207 if (Triple.isArch64Bit()) {
208 NoteAlign = Align(8);
209 DescSize = 16;
210 } else {
212 NoteAlign = Align(4);
213 DescSize = 12;
214 }
215
216 assert(Ctx.getObjectFileType() == MCContext::Environment::IsELF);
217 MCSection *const NoteSection =
218 Ctx.getELFSection(".note.gnu.property", ELF::SHT_NOTE, ELF::SHF_ALLOC);
219 OutStreamer.pushSection();
220 OutStreamer.switchSection(NoteSection);
221
222 // Emit the note header
223 OutStreamer.emitValueToAlignment(NoteAlign);
224 OutStreamer.emitIntValue(4, 4); // n_namsz
225 OutStreamer.emitIntValue(DescSize, 4); // n_descsz
226 OutStreamer.emitIntValue(ELF::NT_GNU_PROPERTY_TYPE_0, 4); // n_type
227 OutStreamer.emitBytes(StringRef("GNU", 4)); // n_name
228
229 // Emit n_desc field
230
231 // Emit the feature_1_and property
232 OutStreamer.emitIntValue(ELF::GNU_PROPERTY_RISCV_FEATURE_1_AND, 4); // pr_type
233 OutStreamer.emitIntValue(4, 4); // pr_datasz
234 OutStreamer.emitIntValue(Feature1And, 4); // pr_data
235 OutStreamer.emitValueToAlignment(NoteAlign); // pr_padding
236
237 OutStreamer.popSection();
238}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
Container class for subtarget features.
MCAsmBackend & getBackend() const
LLVM_ABI bool registerSymbol(const MCSymbol &Symbol)
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSymbol * createLocalSymbol(StringRef Name)
Create a local, non-temporary symbol like an ELF mapping symbol.
SmallVector< AttributeItem, 64 > Contents
void emitAttributesSection(StringRef Vendor, const Twine &Section, unsigned Type, MCSection *&AttributeSection)
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void setAttributeItems(unsigned Attribute, unsigned IntValue, StringRef StringValue, bool OverwriteExisting)
ELFObjectWriter & getWriter()
void setAttributeItem(unsigned Attribute, unsigned Value, bool OverwriteExisting)
void reset() override
state management
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
MCELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
MCAssembler & getAssembler()
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc()) override
Emit the expression Value into the output as a native integer of the given Size bytes.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:517
Streaming machine code generation interface.
Definition MCStreamer.h:220
MCSectionSubPair getPreviousSection() const
Return the previous section that the streamer is emitting code to.
Definition MCStreamer.h:426
virtual bool popSection()
Restore the current and previous section from the section stack.
MCContext & getContext() const
Definition MCStreamer.h:314
virtual void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
MCTargetStreamer * getTargetStreamer()
Definition MCStreamer.h:324
virtual void emitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers.
void pushSection()
Save the current and previous section on the section stack.
Definition MCStreamer.h:443
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
const FeatureBitset & getFeatureBits() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
MCStreamer & Streamer
Definition MCStreamer.h:95
void changeSection(MCSection *Section, uint32_t Subsection) override
This is called by popSection and switchSection, if the current section changes.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
RISCVELFStreamer(MCContext &C, std::unique_ptr< MCAsmBackend > MAB, std::unique_ptr< MCObjectWriter > MOW, std::unique_ptr< MCCodeEmitter > MCE)
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc) override
Emit Size bytes worth of the value specified by FillValue.
void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override
Emit the expression Value into the output as a native integer of the given Size bytes.
void emitNoteGnuPropertySection(const uint32_t Feature1And)
void emitDirectiveOptionNoExact() override
RISCVTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
void emitDirectiveVariantCC(MCSymbol &Symbol) override
RISCVELFStreamer & getStreamer()
void emitDirectiveOptionNoRelax() override
RISCVABI::ABI getTargetABI() const
void setFlagsFromFeatures(const MCSubtargetInfo &STI)
void setTargetABI(RISCVABI::ABI ABI)
Represents a location in source code.
Definition SMLoc.h:22
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
LLVM_ABI bool isArch64Bit() const
Test whether the architecture is 64-bit.
Definition Triple.cpp:1797
LLVM_ABI bool isArch32Bit() const
Test whether the architecture is 32-bit.
Definition Triple.cpp:1801
LLVM Value Representation.
Definition Value.h:75
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ NT_GNU_PROPERTY_TYPE_0
Definition ELF.h:1809
@ SHF_ALLOC
Definition ELF.h:1248
@ SHT_RISCV_ATTRIBUTES
Definition ELF.h:1231
@ SHT_NOTE
Definition ELF.h:1153
@ STB_LOCAL
Definition ELF.h:1404
@ STT_NOTYPE
Definition ELF.h:1416
@ STO_RISCV_VARIANT_CC
Definition ELF.h:731
@ GNU_PROPERTY_RISCV_FEATURE_1_AND
Definition ELF.h:1845
@ EF_RISCV_RVE
Definition ELF.h:716
@ EF_RISCV_RVC
Definition ELF.h:710
@ EF_RISCV_TSO
Definition ELF.h:717
@ EF_RISCV_FLOAT_ABI_SINGLE
Definition ELF.h:713
@ EF_RISCV_FLOAT_ABI_DOUBLE
Definition ELF.h:714
ABI computeTargetABI(const Triple &TT, const FeatureBitset &FeatureBits, StringRef ABIName)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
MCStreamer * createRISCVELFStreamer(const Triple &, MCContext &C, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&MOW, std::unique_ptr< MCCodeEmitter > &&MCE)
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1915
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39