LLVM 20.0.0git
MCObjectStreamer.h
Go to the documentation of this file.
1//===- MCObjectStreamer.h - MCStreamer Object File Interface ----*- C++ -*-===//
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#ifndef LLVM_MC_MCOBJECTSTREAMER_H
10#define LLVM_MC_MCOBJECTSTREAMER_H
11
12#include "llvm/ADT/SetVector.h"
14#include "llvm/MC/MCFixup.h"
15#include "llvm/MC/MCFragment.h"
16#include "llvm/MC/MCSection.h"
17#include "llvm/MC/MCStreamer.h"
18
19namespace llvm {
20class MCContext;
21class MCInst;
22class MCObjectWriter;
23class MCSymbol;
24struct MCDwarfFrameInfo;
25class MCAssembler;
26class MCCodeEmitter;
27class MCSubtargetInfo;
28class MCExpr;
29class MCAsmBackend;
30class raw_ostream;
31class raw_pwrite_stream;
32
33/// Streaming object file generation interface.
34///
35/// This class provides an implementation of the MCStreamer interface which is
36/// suitable for use with the assembler backend. Specific object file formats
37/// are expected to subclass this interface to implement directives specific
38/// to that file format or custom semantics expected by the object writer
39/// implementation.
41 std::unique_ptr<MCAssembler> Assembler;
42 bool EmitEHFrame;
43 bool EmitDebugFrame;
44 struct PendingMCFixup {
45 const MCSymbol *Sym;
48 PendingMCFixup(const MCSymbol *McSym, MCDataFragment *F, MCFixup McFixup)
49 : Sym(McSym), Fixup(McFixup), DF(F) {}
50 };
52
53 struct PendingAssignment {
54 MCSymbol *Symbol;
55 const MCExpr *Value;
56 };
57
58 /// A list of conditional assignments we may need to emit if the target
59 /// symbol is later emitted.
61 pendingAssignments;
62
63 virtual void emitInstToData(const MCInst &Inst, const MCSubtargetInfo&) = 0;
64 void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override;
65 void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override;
66 MCSymbol *emitCFILabel() override;
67 void emitInstructionImpl(const MCInst &Inst, const MCSubtargetInfo &STI);
68 void resolvePendingFixups();
69
70protected:
71 MCObjectStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> TAB,
72 std::unique_ptr<MCObjectWriter> OW,
73 std::unique_ptr<MCCodeEmitter> Emitter);
75
76public:
77 /// state management
78 void reset() override;
79
80 /// Object streamers require the integrated assembler.
81 bool isIntegratedAssemblerRequired() const override { return true; }
82
83 void emitFrames(MCAsmBackend *MAB);
84 void emitCFISections(bool EH, bool Debug) override;
85
87 auto *Sec = CurFrag->getParent();
88 F->setParent(Sec);
89 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
90 CurFrag->Next = F;
91 CurFrag = F;
92 Sec->curFragList()->Tail = F;
93 }
94
95 /// Get a data fragment to write into, creating a new one if the current
96 /// fragment is not a data fragment.
97 /// Optionally a \p STI can be passed in so that a new fragment is created
98 /// if the Subtarget differs from the current fragment.
100
101protected:
102 bool changeSectionImpl(MCSection *Section, uint32_t Subsection);
103
104public:
105 void visitUsedSymbol(const MCSymbol &Sym) override;
106
107 MCAssembler &getAssembler() { return *Assembler; }
108 MCAssembler *getAssemblerPtr() override;
109 /// \name MCStreamer Interface
110 /// @{
111
112 void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
113 virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F,
115 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
117 const MCExpr *Value) override;
118 void emitValueImpl(const MCExpr *Value, unsigned Size,
119 SMLoc Loc = SMLoc()) override;
120 void emitULEB128Value(const MCExpr *Value) override;
121 void emitSLEB128Value(const MCExpr *Value) override;
122 void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
123 void changeSection(MCSection *Section, uint32_t Subsection = 0) override;
124 void switchSectionNoPrint(MCSection *Section) override;
125 void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
126
127 /// Emit an instruction to a special fragment, because this instruction
128 /// can change its size during relaxation.
129 virtual void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &);
130
131 void emitBundleAlignMode(Align Alignment) override;
132 void emitBundleLock(bool AlignToEnd) override;
133 void emitBundleUnlock() override;
134 void emitBytes(StringRef Data) override;
135 void emitValueToAlignment(Align Alignment, int64_t Value = 0,
136 unsigned ValueSize = 1,
137 unsigned MaxBytesToEmit = 0) override;
138 void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo *STI,
139 unsigned MaxBytesToEmit = 0) override;
140 void emitValueToOffset(const MCExpr *Offset, unsigned char Value,
141 SMLoc Loc) override;
142 void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column,
143 unsigned Flags, unsigned Isa,
144 unsigned Discriminator,
145 StringRef FileName) override;
146 void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel,
147 const MCSymbol *Label,
148 unsigned PointerSize) override;
149 void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
150 MCSymbol *EndLabel = nullptr) override;
151 void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
152 const MCSymbol *Label, SMLoc Loc);
153 void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line,
154 unsigned Column, bool PrologueEnd, bool IsStmt,
155 StringRef FileName, SMLoc Loc) override;
156 void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *Begin,
157 const MCSymbol *End) override;
158 void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
159 unsigned SourceFileId,
160 unsigned SourceLineNum,
161 const MCSymbol *FnStartSym,
162 const MCSymbol *FnEndSym) override;
164 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
165 StringRef FixedSizePortion) override;
166 void emitCVStringTableDirective() override;
167 void emitCVFileChecksumsDirective() override;
168 void emitCVFileChecksumOffsetDirective(unsigned FileNo) override;
169 void emitDTPRel32Value(const MCExpr *Value) override;
170 void emitDTPRel64Value(const MCExpr *Value) override;
171 void emitTPRel32Value(const MCExpr *Value) override;
172 void emitTPRel64Value(const MCExpr *Value) override;
173 void emitGPRel32Value(const MCExpr *Value) override;
174 void emitGPRel64Value(const MCExpr *Value) override;
175 std::optional<std::pair<bool, std::string>>
177 SMLoc Loc, const MCSubtargetInfo &STI) override;
179 void emitFill(const MCExpr &NumBytes, uint64_t FillValue,
180 SMLoc Loc = SMLoc()) override;
181 void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
182 SMLoc Loc = SMLoc()) override;
183 void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc,
184 const MCSubtargetInfo &STI) override;
185 void emitFileDirective(StringRef Filename) override;
186 void emitFileDirective(StringRef Filename, StringRef CompilerVersion,
187 StringRef TimeStamp, StringRef Description) override;
188
189 void emitAddrsig() override;
190 void emitAddrsigSym(const MCSymbol *Sym) override;
191
192 void finishImpl() override;
193
194 /// Emit the absolute difference between two symbols if possible.
195 ///
196 /// Emit the absolute difference between \c Hi and \c Lo, as long as we can
197 /// compute it. Currently, that requires that both symbols are in the same
198 /// data fragment and that the target has not specified that diff expressions
199 /// require relocations to be emitted. Otherwise, do nothing and return
200 /// \c false.
201 ///
202 /// \pre Offset of \c Hi is greater than the offset \c Lo.
203 void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
204 unsigned Size) override;
205
207 const MCSymbol *Lo) override;
208
209 bool mayHaveInstructions(MCSection &Sec) const override;
210
211 /// Emits pending conditional assignments that depend on \p Symbol
212 /// being emitted.
213 void emitPendingAssignments(MCSymbol *Symbol);
214};
215
216} // end namespace llvm
217
218#endif
dxil DXContainer Global Emitter
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
Definition: Debug.cpp:108
std::string Name
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
Symbol * Sym
Definition: ELF_riscv.cpp:479
#define F(x, y, z)
Definition: MD5.cpp:55
PowerPC TLS Dynamic Call Fixup
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:42
Context object for machine code objects.
Definition: MCContext.h:83
Fragment for data and encoded instructions.
Definition: MCFragment.h:219
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:34
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:71
unsigned getLayoutOrder() const
Definition: MCFragment.h:104
MCSection * getParent() const
Definition: MCFragment.h:99
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:185
Streaming object file generation interface.
void reset() override
state management
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
void emitValueToAlignment(Align Alignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override
Emit an assignment of Value to Symbol.
void emitULEB128Value(const MCExpr *Value) override
void emitSLEB128Value(const MCExpr *Value) override
void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc, const MCSubtargetInfo &STI) override
MCDataFragment * getOrCreateDataFragment(const MCSubtargetInfo *STI=nullptr)
Get a data fragment to write into, creating a new one if the current fragment is not a data fragment.
void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym) override
This implements the CodeView '.cv_inline_linetable' assembler directive.
void emitCVStringTableDirective() override
This implements the CodeView '.cv_stringtable' assembler directive.
void emitBundleAlignMode(Align Alignment) override
Set the bundle alignment mode from now on in the section.
MCAssembler & getAssembler()
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override
Emit an weak reference from Alias to Symbol.
void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize) override
If targets does not support representing debug line section by .loc/.file directives in assembly outp...
void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc) override
This implements the CodeView '.cv_loc' assembler directive.
void emitDTPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a dtprel (32-bit DTP relative) value.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitBundleLock(bool AlignToEnd) override
The following instructions are a bundle-locked group.
void emitPendingAssignments(MCSymbol *Symbol)
Emits pending conditional assignments that depend on Symbol being emitted.
bool changeSectionImpl(MCSection *Section, uint32_t Subsection)
void emitFileDirective(StringRef Filename) override
Switch to a new logical file.
void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion) override
This implements the CodeView '.cv_def_range' assembler directive.
void emitGPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a gprel64 (64-bit GP relative) value.
MCAssembler * getAssemblerPtr() override
std::optional< std::pair< bool, std::string > > emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc, const MCSubtargetInfo &STI) override
Record a relocation described by the .reloc directive.
void emitAddrsigSym(const MCSymbol *Sym) override
bool isIntegratedAssemblerRequired() const override
Object streamers require the integrated assembler.
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel, MCSymbol *EndLabel=nullptr) override
Emit the debug line end entry.
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
void visitUsedSymbol(const MCSymbol &Sym) override
void emitGPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a gprel32 (32-bit GP relative) value.
void insert(MCFragment *F)
virtual void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &)
Emit an instruction to a special fragment, because this instruction can change its size during relaxa...
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol 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.
void finishImpl() override
Streamer specific finalization.
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo) override
Emit the absolute difference between two symbols encoded with ULEB128.
void emitBundleUnlock() override
Ends a bundle-locked group.
void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, const MCSymbol *Label, SMLoc Loc)
void switchSectionNoPrint(MCSection *Section) override
Similar to switchSection, but does not print the section directive.
void emitCFISections(bool EH, bool Debug) override
void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName) override
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
bool mayHaveInstructions(MCSection &Sec) const override
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitFrames(MCAsmBackend *MAB)
void emitTPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a tprel (64-bit TP relative) value.
void emitCVFileChecksumOffsetDirective(unsigned FileNo) override
This implements the CodeView '.cv_filechecksumoffset' assembler directive.
void emitTPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a tprel (32-bit TP relative) value.
void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value) override
Emit an assignment of Value to Symbol, but only if Value is also emitted.
void emitCVFileChecksumsDirective() override
This implements the CodeView '.cv_filechecksums' assembler directive.
void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *Begin, const MCSymbol *End) override
This implements the CodeView '.cv_linetable' assembler directive.
void emitDTPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a dtprel (64-bit DTP relative) value.
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F, uint64_t Offset)
void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc) override
Emit some number of copies of Value until the byte offset Offset is reached.
void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) override
Emit the absolute difference between two symbols if possible.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:36
Streaming machine code generation interface.
Definition: MCStreamer.h:213
MCFragment * CurFrag
Definition: MCStreamer.h:255
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
Definition: MCStreamer.cpp:220
Generic base class for all target subtargets.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
Represents a location in source code.
Definition: SMLoc.h:23
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
LLVM Value Representation.
Definition: Value.h:74
This class represents a function that is read from a sample profile.
Definition: FunctionId.h:36
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39