LLVM 20.0.0git
MCStreamer.h
Go to the documentation of this file.
1//===- MCStreamer.h - High-level Streaming Machine Code Output --*- 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// This file declares the MCStreamer class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_MC_MCSTREAMER_H
14#define LLVM_MC_MCSTREAMER_H
15
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/StringRef.h"
21#include "llvm/MC/MCDwarf.h"
22#include "llvm/MC/MCFragment.h"
25#include "llvm/MC/MCWinEH.h"
26#include "llvm/Support/Error.h"
27#include "llvm/Support/MD5.h"
28#include "llvm/Support/SMLoc.h"
31#include <cassert>
32#include <cstdint>
33#include <memory>
34#include <optional>
35#include <string>
36#include <utility>
37#include <vector>
38
39namespace llvm {
40
41class APInt;
42class AssemblerConstantPools;
43class MCAsmBackend;
44class MCAssembler;
45class MCContext;
46class MCExpr;
47class MCFragment;
48class MCInst;
49class MCInstPrinter;
50class MCRegister;
51class MCSection;
52class MCStreamer;
53class MCSubtargetInfo;
54class MCSymbol;
55class MCSymbolRefExpr;
56class Triple;
57class Twine;
58class raw_ostream;
59
60namespace codeview {
61struct DefRangeRegisterRelHeader;
62struct DefRangeSubfieldRegisterHeader;
63struct DefRangeRegisterHeader;
64struct DefRangeFramePointerRelHeader;
65}
66
67using MCSectionSubPair = std::pair<MCSection *, uint32_t>;
68
69/// Target specific streamer interface. This is used so that targets can
70/// implement support for target specific assembly directives.
71///
72/// If target foo wants to use this, it should implement 3 classes:
73/// * FooTargetStreamer : public MCTargetStreamer
74/// * FooTargetAsmStreamer : public FooTargetStreamer
75/// * FooTargetELFStreamer : public FooTargetStreamer
76///
77/// FooTargetStreamer should have a pure virtual method for each directive. For
78/// example, for a ".bar symbol_name" directive, it should have
79/// virtual emitBar(const MCSymbol &Symbol) = 0;
80///
81/// The FooTargetAsmStreamer and FooTargetELFStreamer classes implement the
82/// method. The assembly streamer just prints ".bar symbol_name". The object
83/// streamer does whatever is needed to implement .bar in the object file.
84///
85/// In the assembly printer and parser the target streamer can be used by
86/// calling getTargetStreamer and casting it to FooTargetStreamer:
87///
88/// MCTargetStreamer &TS = OutStreamer.getTargetStreamer();
89/// FooTargetStreamer &ATS = static_cast<FooTargetStreamer &>(TS);
90///
91/// The base classes FooTargetAsmStreamer and FooTargetELFStreamer should
92/// *never* be treated differently. Callers should always talk to a
93/// FooTargetStreamer.
95protected:
97
98public:
101
103
104 // Allow a target to add behavior to the EmitLabel of MCStreamer.
105 virtual void emitLabel(MCSymbol *Symbol);
106 // Allow a target to add behavior to the emitAssignment of MCStreamer.
107 virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value);
108
109 virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, uint64_t Address,
110 const MCInst &Inst, const MCSubtargetInfo &STI,
111 raw_ostream &OS);
112
114
115 /// Update streamer for a new active section.
116 ///
117 /// This is called by popSection and switchSection, if the current
118 /// section changes.
119 virtual void changeSection(const MCSection *CurSection, MCSection *Section,
120 uint32_t SubSection, raw_ostream &OS);
121
122 virtual void emitValue(const MCExpr *Value);
123
124 /// Emit the bytes in \p Data into the output.
125 ///
126 /// This is used to emit bytes in \p Data as sequence of .byte directives.
127 virtual void emitRawBytes(StringRef Data);
128
129 virtual void emitConstantPools();
130
131 virtual void finish();
132};
133
134// FIXME: declared here because it is used from
135// lib/CodeGen/AsmPrinter/ARMException.cpp.
137public:
140
141 virtual void emitFnStart();
142 virtual void emitFnEnd();
143 virtual void emitCantUnwind();
144 virtual void emitPersonality(const MCSymbol *Personality);
145 virtual void emitPersonalityIndex(unsigned Index);
146 virtual void emitHandlerData();
147 virtual void emitSetFP(MCRegister FpReg, MCRegister SpReg,
148 int64_t Offset = 0);
149 virtual void emitMovSP(MCRegister Reg, int64_t Offset = 0);
150 virtual void emitPad(int64_t Offset);
151 virtual void emitRegSave(const SmallVectorImpl<MCRegister> &RegList,
152 bool isVector);
153 virtual void emitUnwindRaw(int64_t StackOffset,
154 const SmallVectorImpl<uint8_t> &Opcodes);
155
156 virtual void switchVendor(StringRef Vendor);
157 virtual void emitAttribute(unsigned Attribute, unsigned Value);
158 virtual void emitTextAttribute(unsigned Attribute, StringRef String);
159 virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue,
160 StringRef StringValue = "");
161 virtual void emitFPU(ARM::FPUKind FPU);
162 virtual void emitArch(ARM::ArchKind Arch);
163 virtual void emitArchExtension(uint64_t ArchExt);
164 virtual void emitObjectArch(ARM::ArchKind Arch);
165 void emitTargetAttributes(const MCSubtargetInfo &STI);
166 virtual void finishAttributeSection();
167 virtual void emitInst(uint32_t Inst, char Suffix = '\0');
168
169 virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
170
171 virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
172
173 void emitConstantPools() override;
174
175 virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide);
176 virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide);
177 virtual void emitARMWinCFISaveSP(unsigned Reg);
178 virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last);
179 virtual void emitARMWinCFISaveLR(unsigned Offset);
180 virtual void emitARMWinCFIPrologEnd(bool Fragment);
181 virtual void emitARMWinCFINop(bool Wide);
182 virtual void emitARMWinCFIEpilogStart(unsigned Condition);
183 virtual void emitARMWinCFIEpilogEnd();
184 virtual void emitARMWinCFICustom(unsigned Opcode);
185
186 /// Reset any state between object emissions, i.e. the equivalent of
187 /// MCStreamer's reset method.
188 virtual void reset();
189
190 /// Callback used to implement the ldr= pseudo.
191 /// Add a new entry to the constant pool for the current section and return an
192 /// MCExpr that can be used to refer to the constant pool location.
193 const MCExpr *addConstantPoolEntry(const MCExpr *, SMLoc Loc);
194
195 /// Callback used to implement the .ltorg directive.
196 /// Emit contents of constant pool for the current section.
198
199private:
200 std::unique_ptr<AssemblerConstantPools> ConstantPools;
201};
202
203/// Streaming machine code generation interface.
204///
205/// This interface is intended to provide a programmatic interface that is very
206/// similar to the level that an assembler .s file provides. It has callbacks
207/// to emit bytes, handle directives, etc. The implementation of this interface
208/// retains state to know what the current section is etc.
209///
210/// There are multiple implementations of this interface: one for writing out
211/// a .s file, and implementations that write out .o files of various formats.
212///
214 MCContext &Context;
215 std::unique_ptr<MCTargetStreamer> TargetStreamer;
216
217 std::vector<MCDwarfFrameInfo> DwarfFrameInfos;
218 // This is a pair of index into DwarfFrameInfos and the MCSection associated
219 // with the frame. Note, we use an index instead of an iterator because they
220 // can be invalidated in std::vector.
222 MCDwarfFrameInfo *getCurrentDwarfFrameInfo();
223
224 /// Similar to DwarfFrameInfos, but for SEH unwind info. Chained frames may
225 /// refer to each other, so use std::unique_ptr to provide pointer stability.
226 std::vector<std::unique_ptr<WinEH::FrameInfo>> WinFrameInfos;
227
228 WinEH::FrameInfo *CurrentWinFrameInfo;
229 size_t CurrentProcWinFrameInfoStartIndex;
230
231 /// This is stack of current and previous section values saved by
232 /// pushSection.
234
235 /// Pointer to the parser's SMLoc if available. This is used to provide
236 /// locations for diagnostics.
237 const SMLoc *StartTokLocPtr = nullptr;
238
239 /// The next unique ID to use when creating a WinCFI-related section (.pdata
240 /// or .xdata). This ID ensures that we have a one-to-one mapping from
241 /// code section to unwind info section, which MSVC's incremental linker
242 /// requires.
243 unsigned NextWinCFIID = 0;
244
245 bool UseAssemblerInfoForParsing = true;
246
247 /// Is the assembler allowed to insert padding automatically? For
248 /// correctness reasons, we sometimes need to ensure instructions aren't
249 /// separated in unexpected ways. At the moment, this feature is only
250 /// useable from an integrated assembler, but assembly syntax is under
251 /// discussion for future inclusion.
252 bool AllowAutoPadding = false;
253
254protected:
255 MCFragment *CurFrag = nullptr;
256
257 MCStreamer(MCContext &Ctx);
258
259 /// This is called by popSection and switchSection, if the current
260 /// section changes.
261 virtual void changeSection(MCSection *, uint32_t);
262
263 virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame);
264 virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame);
265
267 return CurrentWinFrameInfo;
268 }
269
270 virtual void emitWindowsUnwindTables(WinEH::FrameInfo *Frame);
271
272 virtual void emitWindowsUnwindTables();
273
274 virtual void emitRawTextImpl(StringRef String);
275
276 /// Returns true if the .cv_loc directive is in the right section.
277 bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc);
278
279public:
280 MCStreamer(const MCStreamer &) = delete;
281 MCStreamer &operator=(const MCStreamer &) = delete;
282 virtual ~MCStreamer();
283
284 void visitUsedExpr(const MCExpr &Expr);
285 virtual void visitUsedSymbol(const MCSymbol &Sym);
286
288 TargetStreamer.reset(TS);
289 }
290
291 void setStartTokLocPtr(const SMLoc *Loc) { StartTokLocPtr = Loc; }
293 return StartTokLocPtr ? *StartTokLocPtr : SMLoc();
294 }
295
296 /// State management
297 ///
298 virtual void reset();
299
300 MCContext &getContext() const { return Context; }
301
302 // MCObjectStreamer has an MCAssembler and allows more expression folding at
303 // parse time.
304 virtual MCAssembler *getAssemblerPtr() { return nullptr; }
305
306 void setUseAssemblerInfoForParsing(bool v) { UseAssemblerInfoForParsing = v; }
307 bool getUseAssemblerInfoForParsing() { return UseAssemblerInfoForParsing; }
308
310 return TargetStreamer.get();
311 }
312
313 void setAllowAutoPadding(bool v) { AllowAutoPadding = v; }
314 bool getAllowAutoPadding() const { return AllowAutoPadding; }
315
317
318 /// When emitting an object file, create and emit a real label. When emitting
319 /// textual assembly, this should do nothing to avoid polluting our output.
320 virtual MCSymbol *emitCFILabel();
321
322 /// Retrieve the current frame info if one is available and it is not yet
323 /// closed. Otherwise, issue an error and return null.
325
326 unsigned getNumFrameInfos();
328
330
331 unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); }
333 return WinFrameInfos;
334 }
335
337
338 /// \name Assembly File Formatting.
339 /// @{
340
341 /// Return true if this streamer supports verbose assembly and if it is
342 /// enabled.
343 virtual bool isVerboseAsm() const { return false; }
344
345 /// Return true if this asm streamer supports emitting unformatted text
346 /// to the .s file with EmitRawText.
347 virtual bool hasRawTextSupport() const { return false; }
348
349 /// Is the integrated assembler required for this streamer to function
350 /// correctly?
351 virtual bool isIntegratedAssemblerRequired() const { return false; }
352
353 /// Add a textual comment.
354 ///
355 /// Typically for comments that can be emitted to the generated .s
356 /// file if applicable as a QoI issue to make the output of the compiler
357 /// more readable. This only affects the MCAsmStreamer, and only when
358 /// verbose assembly output is enabled.
359 ///
360 /// If the comment includes embedded \n's, they will each get the comment
361 /// prefix as appropriate. The added comment should not end with a \n.
362 /// By default, each comment is terminated with an end of line, i.e. the
363 /// EOL param is set to true by default. If one prefers not to end the
364 /// comment with a new line then the EOL param should be passed
365 /// with a false value.
366 virtual void AddComment(const Twine &T, bool EOL = true) {}
367
368 /// Return a raw_ostream that comments can be written to. Unlike
369 /// AddComment, you are required to terminate comments with \n if you use this
370 /// method.
371 virtual raw_ostream &getCommentOS();
372
373 /// Print T and prefix it with the comment string (normally #) and
374 /// optionally a tab. This prints the comment immediately, not at the end of
375 /// the current line. It is basically a safe version of EmitRawText: since it
376 /// only prints comments, the object streamer ignores it instead of asserting.
377 virtual void emitRawComment(const Twine &T, bool TabPrefix = true);
378
379 /// Add explicit comment T. T is required to be a valid
380 /// comment in the output and does not need to be escaped.
381 virtual void addExplicitComment(const Twine &T);
382
383 /// Emit added explicit comments.
384 virtual void emitExplicitComments();
385
386 /// Emit a blank line to a .s file to pretty it up.
387 virtual void addBlankLine() {}
388
389 /// @}
390
391 /// \name Symbol & Section Management
392 /// @{
393
394 /// Return the current section that the streamer is emitting code to.
396 if (!SectionStack.empty())
397 return SectionStack.back().first;
398 return MCSectionSubPair();
399 }
401 return CurFrag->getParent();
402 }
403
404 /// Return the previous section that the streamer is emitting code to.
406 if (!SectionStack.empty())
407 return SectionStack.back().second;
408 return MCSectionSubPair();
409 }
410
412 assert(!getCurrentSection().first ||
413 CurFrag->getParent() == getCurrentSection().first);
414 return CurFrag;
415 }
416
417 /// Save the current and previous section on the section stack.
418 void pushSection() {
419 SectionStack.push_back(
420 std::make_pair(getCurrentSection(), getPreviousSection()));
421 }
422
423 /// Restore the current and previous section from the section stack.
424 /// Calls changeSection as needed.
425 ///
426 /// Returns false if the stack was empty.
427 bool popSection();
428
429 /// Set the current section where code is being emitted to \p Section. This
430 /// is required to update CurSection.
431 ///
432 /// This corresponds to assembler directives like .section, .text, etc.
433 virtual void switchSection(MCSection *Section, uint32_t Subsec = 0);
434 bool switchSection(MCSection *Section, const MCExpr *);
435
436 /// Similar to switchSection, but does not print the section directive.
437 virtual void switchSectionNoPrint(MCSection *Section);
438
439 /// Create the default sections and set the initial one.
440 virtual void initSections(bool NoExecStack, const MCSubtargetInfo &STI);
441
442 MCSymbol *endSection(MCSection *Section);
443
444 /// Returns the mnemonic for \p MI, if the streamer has access to a
445 /// instruction printer and returns an empty string otherwise.
446 virtual StringRef getMnemonic(const MCInst &MI) const { return ""; }
447
448 /// Emit a label for \p Symbol into the current section.
449 ///
450 /// This corresponds to an assembler statement such as:
451 /// foo:
452 ///
453 /// \param Symbol - The symbol to emit. A given symbol should only be
454 /// emitted as a label once, and symbols emitted as a label should never be
455 /// used in an assignment.
456 // FIXME: These emission are non-const because we mutate the symbol to
457 // add the section we're emitting it to later.
458 virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc());
459
460 virtual void emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol);
461
462 /// Note in the output the specified \p Flag.
463 virtual void emitAssemblerFlag(MCAssemblerFlag Flag);
464
465 /// Emit the given list \p Options of strings as linker
466 /// options into the output.
468
469 /// Note in the output the specified region \p Kind.
470 virtual void emitDataRegion(MCDataRegionType Kind) {}
471
472 /// Specify the Mach-O minimum deployment target version.
473 virtual void emitVersionMin(MCVersionMinType Type, unsigned Major,
474 unsigned Minor, unsigned Update,
475 VersionTuple SDKVersion) {}
476
477 /// Emit/Specify Mach-O build version command.
478 /// \p Platform should be one of MachO::PlatformType.
479 virtual void emitBuildVersion(unsigned Platform, unsigned Major,
480 unsigned Minor, unsigned Update,
481 VersionTuple SDKVersion) {}
482
483 virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform,
484 unsigned Major,
485 unsigned Minor,
486 unsigned Update,
487 VersionTuple SDKVersion) {}
488
490 const VersionTuple &SDKVersion,
491 const Triple *DarwinTargetVariantTriple,
492 const VersionTuple &DarwinTargetVariantSDKVersion);
493
494 /// Note in the output that the specified \p Func is a Thumb mode
495 /// function (ARM target only).
496 virtual void emitThumbFunc(MCSymbol *Func);
497
498 /// Emit an assignment of \p Value to \p Symbol.
499 ///
500 /// This corresponds to an assembler statement such as:
501 /// symbol = value
502 ///
503 /// The assignment generates no code, but has the side effect of binding the
504 /// value in the current context. For the assembly streamer, this prints the
505 /// binding into the .s file.
506 ///
507 /// \param Symbol - The symbol being assigned to.
508 /// \param Value - The value for the symbol.
509 virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value);
510
511 /// Emit an assignment of \p Value to \p Symbol, but only if \p Value is also
512 /// emitted.
513 virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value);
514
515 /// Emit an weak reference from \p Alias to \p Symbol.
516 ///
517 /// This corresponds to an assembler statement such as:
518 /// .weakref alias, symbol
519 ///
520 /// \param Alias - The alias that is being created.
521 /// \param Symbol - The symbol being aliased.
522 virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
523
524 /// Add the given \p Attribute to \p Symbol.
525 virtual bool emitSymbolAttribute(MCSymbol *Symbol,
527
528 /// Set the \p DescValue for the \p Symbol.
529 ///
530 /// \param Symbol - The symbol to have its n_desc field set.
531 /// \param DescValue - The value to set into the n_desc field.
532 virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
533
534 /// Start emitting COFF symbol definition
535 ///
536 /// \param Symbol - The symbol to have its External & Type fields set.
537 virtual void beginCOFFSymbolDef(const MCSymbol *Symbol);
538
539 /// Emit the storage class of the symbol.
540 ///
541 /// \param StorageClass - The storage class the symbol should have.
543
544 /// Emit the type of the symbol.
545 ///
546 /// \param Type - A COFF type identifier (see COFF::SymbolType in X86COFF.h)
547 virtual void emitCOFFSymbolType(int Type);
548
549 /// Marks the end of the symbol definition.
550 virtual void endCOFFSymbolDef();
551
552 virtual void emitCOFFSafeSEH(MCSymbol const *Symbol);
553
554 /// Emits the symbol table index of a Symbol into the current section.
555 virtual void emitCOFFSymbolIndex(MCSymbol const *Symbol);
556
557 /// Emits a COFF section index.
558 ///
559 /// \param Symbol - Symbol the section number relocation should point to.
560 virtual void emitCOFFSectionIndex(MCSymbol const *Symbol);
561
562 /// Emits a COFF section relative relocation.
563 ///
564 /// \param Symbol - Symbol the section relative relocation should point to.
565 virtual void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset);
566
567 /// Emits a COFF image relative relocation.
568 ///
569 /// \param Symbol - Symbol the image relative relocation should point to.
570 virtual void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset);
571
572 /// Emits an lcomm directive with XCOFF csect information.
573 ///
574 /// \param LabelSym - Label on the block of storage.
575 /// \param Size - The size of the block of storage.
576 /// \param CsectSym - Csect name for the block of storage.
577 /// \param Alignment - The alignment of the symbol in bytes.
578 virtual void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size,
579 MCSymbol *CsectSym, Align Alignment);
580
581 /// Emit a symbol's linkage and visibility with a linkage directive for XCOFF.
582 ///
583 /// \param Symbol - The symbol to emit.
584 /// \param Linkage - The linkage of the symbol to emit.
585 /// \param Visibility - The visibility of the symbol to emit or MCSA_Invalid
586 /// if the symbol does not have an explicit visibility.
589 MCSymbolAttr Visibility);
590
591 /// Emit a XCOFF .rename directive which creates a synonym for an illegal or
592 /// undesirable name.
593 ///
594 /// \param Name - The name used internally in the assembly for references to
595 /// the symbol.
596 /// \param Rename - The value to which the Name parameter is
597 /// changed at the end of assembly.
598 virtual void emitXCOFFRenameDirective(const MCSymbol *Name, StringRef Rename);
599
600 /// Emit an XCOFF .except directive which adds information about
601 /// a trap instruction to the object file exception section
602 ///
603 /// \param Symbol - The function containing the trap.
604 /// \param Lang - The language code for the exception entry.
605 /// \param Reason - The reason code for the exception entry.
606 virtual void emitXCOFFExceptDirective(const MCSymbol *Symbol,
607 const MCSymbol *Trap,
608 unsigned Lang, unsigned Reason,
609 unsigned FunctionSize, bool hasDebug);
610
611 /// Emit a XCOFF .ref directive which creates R_REF type entry in the
612 /// relocation table for one or more symbols.
613 ///
614 /// \param Sym - The symbol on the .ref directive.
615 virtual void emitXCOFFRefDirective(const MCSymbol *Symbol);
616
617 /// Emit a C_INFO symbol with XCOFF embedded metadata to the .info section.
618 ///
619 /// \param Name - The embedded metadata name
620 /// \param Metadata - The embedded metadata
622
623 /// Emit an ELF .size directive.
624 ///
625 /// This corresponds to an assembler statement such as:
626 /// .size symbol, expression
627 virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value);
628
629 /// Emit an ELF .symver directive.
630 ///
631 /// This corresponds to an assembler statement such as:
632 /// .symver _start, foo@@SOME_VERSION
633 virtual void emitELFSymverDirective(const MCSymbol *OriginalSym,
634 StringRef Name, bool KeepOriginalSym);
635
636 /// Emit a Linker Optimization Hint (LOH) directive.
637 /// \param Args - Arguments of the LOH.
638 virtual void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) {}
639
640 /// Emit a .gnu_attribute directive.
641 virtual void emitGNUAttribute(unsigned Tag, unsigned Value) {}
642
643 /// Emit a common symbol.
644 ///
645 /// \param Symbol - The common symbol to emit.
646 /// \param Size - The size of the common symbol.
647 /// \param ByteAlignment - The alignment of the symbol.
648 virtual void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
649 Align ByteAlignment) = 0;
650
651 /// Emit a local common (.lcomm) symbol.
652 ///
653 /// \param Symbol - The common symbol to emit.
654 /// \param Size - The size of the common symbol.
655 /// \param ByteAlignment - The alignment of the common symbol in bytes.
656 virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
657 Align ByteAlignment);
658
659 /// Emit the zerofill section and an optional symbol.
660 ///
661 /// \param Section - The zerofill section to create and or to put the symbol
662 /// \param Symbol - The zerofill symbol to emit, if non-NULL.
663 /// \param Size - The size of the zerofill symbol.
664 /// \param ByteAlignment - The alignment of the zerofill symbol.
665 virtual void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
666 uint64_t Size = 0, Align ByteAlignment = Align(1),
667 SMLoc Loc = SMLoc()) = 0;
668
669 /// Emit a thread local bss (.tbss) symbol.
670 ///
671 /// \param Section - The thread local common section.
672 /// \param Symbol - The thread local common symbol to emit.
673 /// \param Size - The size of the symbol.
674 /// \param ByteAlignment - The alignment of the thread local common symbol.
675 virtual void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
676 uint64_t Size, Align ByteAlignment = Align(1));
677
678 /// @}
679 /// \name Generating Data
680 /// @{
681
682 /// Emit the bytes in \p Data into the output.
683 ///
684 /// This is used to implement assembler directives such as .byte, .ascii,
685 /// etc.
686 virtual void emitBytes(StringRef Data);
687
688 /// Functionally identical to EmitBytes. When emitting textual assembly, this
689 /// method uses .byte directives instead of .ascii or .asciz for readability.
690 virtual void emitBinaryData(StringRef Data);
691
692 /// Emit the expression \p Value into the output as a native
693 /// integer of the given \p Size bytes.
694 ///
695 /// This is used to implement assembler directives such as .word, .quad,
696 /// etc.
697 ///
698 /// \param Value - The value to emit.
699 /// \param Size - The size of the integer (in bytes) to emit. This must
700 /// match a native machine width.
701 /// \param Loc - The location of the expression for error reporting.
702 virtual void emitValueImpl(const MCExpr *Value, unsigned Size,
703 SMLoc Loc = SMLoc());
704
705 void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc = SMLoc());
706
707 /// Special case of EmitValue that avoids the client having
708 /// to pass in a MCExpr for constant integers.
709 virtual void emitIntValue(uint64_t Value, unsigned Size);
710 virtual void emitIntValue(const APInt &Value);
711
712 /// Special case of EmitValue that avoids the client having to pass
713 /// in a MCExpr for constant integers & prints in Hex format for certain
714 /// modes.
715 virtual void emitIntValueInHex(uint64_t Value, unsigned Size) {
717 }
718
723
724 /// Special case of EmitValue that avoids the client having to pass
725 /// in a MCExpr for constant integers & prints in Hex format for certain
726 /// modes, pads the field with leading zeros to Size width
729 }
730
731 virtual void emitULEB128Value(const MCExpr *Value);
732
733 virtual void emitSLEB128Value(const MCExpr *Value);
734
735 /// Special case of EmitULEB128Value that avoids the client having to
736 /// pass in a MCExpr for constant integers.
737 unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo = 0);
738
739 /// Special case of EmitSLEB128Value that avoids the client having to
740 /// pass in a MCExpr for constant integers.
741 unsigned emitSLEB128IntValue(int64_t Value);
742
743 /// Special case of EmitValue that avoids the client having to pass in
744 /// a MCExpr for MCSymbols.
745 void emitSymbolValue(const MCSymbol *Sym, unsigned Size,
746 bool IsSectionRelative = false);
747
748 /// Emit the expression \p Value into the output as a dtprel
749 /// (64-bit DTP relative) value.
750 ///
751 /// This is used to implement assembler directives such as .dtpreldword on
752 /// targets that support them.
753 virtual void emitDTPRel64Value(const MCExpr *Value);
754
755 /// Emit the expression \p Value into the output as a dtprel
756 /// (32-bit DTP relative) value.
757 ///
758 /// This is used to implement assembler directives such as .dtprelword on
759 /// targets that support them.
760 virtual void emitDTPRel32Value(const MCExpr *Value);
761
762 /// Emit the expression \p Value into the output as a tprel
763 /// (64-bit TP relative) value.
764 ///
765 /// This is used to implement assembler directives such as .tpreldword on
766 /// targets that support them.
767 virtual void emitTPRel64Value(const MCExpr *Value);
768
769 /// Emit the expression \p Value into the output as a tprel
770 /// (32-bit TP relative) value.
771 ///
772 /// This is used to implement assembler directives such as .tprelword on
773 /// targets that support them.
774 virtual void emitTPRel32Value(const MCExpr *Value);
775
776 /// Emit the expression \p Value into the output as a gprel64 (64-bit
777 /// GP relative) value.
778 ///
779 /// This is used to implement assembler directives such as .gpdword on
780 /// targets that support them.
781 virtual void emitGPRel64Value(const MCExpr *Value);
782
783 /// Emit the expression \p Value into the output as a gprel32 (32-bit
784 /// GP relative) value.
785 ///
786 /// This is used to implement assembler directives such as .gprel32 on
787 /// targets that support them.
788 virtual void emitGPRel32Value(const MCExpr *Value);
789
790 /// Emit NumBytes bytes worth of the value specified by FillValue.
791 /// This implements directives such as '.space'.
792 void emitFill(uint64_t NumBytes, uint8_t FillValue);
793
794 /// Emit \p Size bytes worth of the value specified by \p FillValue.
795 ///
796 /// This is used to implement assembler directives such as .space or .skip.
797 ///
798 /// \param NumBytes - The number of bytes to emit.
799 /// \param FillValue - The value to use when filling bytes.
800 /// \param Loc - The location of the expression for error reporting.
801 virtual void emitFill(const MCExpr &NumBytes, uint64_t FillValue,
802 SMLoc Loc = SMLoc());
803
804 /// Emit \p NumValues copies of \p Size bytes. Each \p Size bytes is
805 /// taken from the lowest order 4 bytes of \p Expr expression.
806 ///
807 /// This is used to implement assembler directives such as .fill.
808 ///
809 /// \param NumValues - The number of copies of \p Size bytes to emit.
810 /// \param Size - The size (in bytes) of each repeated value.
811 /// \param Expr - The expression from which \p Size bytes are used.
812 virtual void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
813 SMLoc Loc = SMLoc());
814
815 virtual void emitNops(int64_t NumBytes, int64_t ControlledNopLength,
816 SMLoc Loc, const MCSubtargetInfo& STI);
817
818 /// Emit NumBytes worth of zeros.
819 /// This function properly handles data in virtual sections.
820 void emitZeros(uint64_t NumBytes);
821
822 /// Emit some number of copies of \p Value until the byte alignment \p
823 /// ByteAlignment is reached.
824 ///
825 /// If the number of bytes need to emit for the alignment is not a multiple
826 /// of \p ValueSize, then the contents of the emitted fill bytes is
827 /// undefined.
828 ///
829 /// This used to implement the .align assembler directive.
830 ///
831 /// \param Alignment - The alignment to reach.
832 /// \param Value - The value to use when filling bytes.
833 /// \param ValueSize - The size of the integer (in bytes) to emit for
834 /// \p Value. This must match a native machine width.
835 /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If
836 /// the alignment cannot be reached in this many bytes, no bytes are
837 /// emitted.
838 virtual void emitValueToAlignment(Align Alignment, int64_t Value = 0,
839 unsigned ValueSize = 1,
840 unsigned MaxBytesToEmit = 0);
841
842 /// Emit nops until the byte alignment \p ByteAlignment is reached.
843 ///
844 /// This used to align code where the alignment bytes may be executed. This
845 /// can emit different bytes for different sizes to optimize execution.
846 ///
847 /// \param Alignment - The alignment to reach.
848 /// \param STI - The MCSubtargetInfo in operation when padding is emitted.
849 /// \param MaxBytesToEmit - The maximum numbers of bytes to emit, or 0. If
850 /// the alignment cannot be reached in this many bytes, no bytes are
851 /// emitted.
852 virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI,
853 unsigned MaxBytesToEmit = 0);
854
855 /// Emit some number of copies of \p Value until the byte offset \p
856 /// Offset is reached.
857 ///
858 /// This is used to implement assembler directives such as .org.
859 ///
860 /// \param Offset - The offset to reach. This may be an expression, but the
861 /// expression must be associated with the current section.
862 /// \param Value - The value to use when filling bytes.
863 virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value,
864 SMLoc Loc);
865
866 /// @}
867
868 /// Switch to a new logical file. This is used to implement the '.file
869 /// "foo.c"' assembler directive.
870 virtual void emitFileDirective(StringRef Filename);
871
872 /// Emit ".file assembler diretive with additioal info.
873 virtual void emitFileDirective(StringRef Filename, StringRef CompilerVersion,
874 StringRef TimeStamp, StringRef Description);
875
876 /// Emit the "identifiers" directive. This implements the
877 /// '.ident "version foo"' assembler directive.
878 virtual void emitIdent(StringRef IdentString) {}
879
880 /// Associate a filename with a specified logical file number. This
881 /// implements the DWARF2 '.file 4 "foo.c"' assembler directive.
883 unsigned FileNo, StringRef Directory, StringRef Filename,
884 std::optional<MD5::MD5Result> Checksum = std::nullopt,
885 std::optional<StringRef> Source = std::nullopt, unsigned CUID = 0) {
886 return cantFail(
887 tryEmitDwarfFileDirective(FileNo, Directory, Filename, Checksum,
888 Source, CUID));
889 }
890
891 /// Associate a filename with a specified logical file number.
892 /// Also associate a directory, optional checksum, and optional source
893 /// text with the logical file. This implements the DWARF2
894 /// '.file 4 "dir/foo.c"' assembler directive, and the DWARF5
895 /// '.file 4 "dir/foo.c" md5 "..." source "..."' assembler directive.
897 unsigned FileNo, StringRef Directory, StringRef Filename,
898 std::optional<MD5::MD5Result> Checksum = std::nullopt,
899 std::optional<StringRef> Source = std::nullopt, unsigned CUID = 0);
900
901 /// Specify the "root" file of the compilation, using the ".file 0" extension.
902 virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename,
903 std::optional<MD5::MD5Result> Checksum,
904 std::optional<StringRef> Source,
905 unsigned CUID = 0);
906
907 virtual void emitCFIBKeyFrame();
908 virtual void emitCFIMTETaggedFrame();
909
910 /// This implements the DWARF2 '.loc fileno lineno ...' assembler
911 /// directive.
912 virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line,
913 unsigned Column, unsigned Flags,
914 unsigned Isa, unsigned Discriminator,
915 StringRef FileName);
916
917 /// This implements the '.loc_label Name' directive.
919
920 /// Associate a filename with a specified logical file number, and also
921 /// specify that file's checksum information. This implements the '.cv_file 4
922 /// "foo.c"' assembler directive. Returns true on success.
923 virtual bool emitCVFileDirective(unsigned FileNo, StringRef Filename,
924 ArrayRef<uint8_t> Checksum,
925 unsigned ChecksumKind);
926
927 /// Introduces a function id for use with .cv_loc.
928 virtual bool emitCVFuncIdDirective(unsigned FunctionId);
929
930 /// Introduces an inline call site id for use with .cv_loc. Includes
931 /// extra information for inline line table generation.
932 virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc,
933 unsigned IAFile, unsigned IALine,
934 unsigned IACol, SMLoc Loc);
935
936 /// This implements the CodeView '.cv_loc' assembler directive.
937 virtual void emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
938 unsigned Line, unsigned Column,
939 bool PrologueEnd, bool IsStmt,
940 StringRef FileName, SMLoc Loc);
941
942 /// This implements the CodeView '.cv_linetable' assembler directive.
943 virtual void emitCVLinetableDirective(unsigned FunctionId,
944 const MCSymbol *FnStart,
945 const MCSymbol *FnEnd);
946
947 /// This implements the CodeView '.cv_inline_linetable' assembler
948 /// directive.
949 virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
950 unsigned SourceFileId,
951 unsigned SourceLineNum,
952 const MCSymbol *FnStartSym,
953 const MCSymbol *FnEndSym);
954
955 /// This implements the CodeView '.cv_def_range' assembler
956 /// directive.
957 virtual void emitCVDefRangeDirective(
958 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
959 StringRef FixedSizePortion);
960
961 virtual void emitCVDefRangeDirective(
962 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
964
965 virtual void emitCVDefRangeDirective(
966 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
968
969 virtual void emitCVDefRangeDirective(
970 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
972
973 virtual void emitCVDefRangeDirective(
974 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
976
977 /// This implements the CodeView '.cv_stringtable' assembler directive.
979
980 /// This implements the CodeView '.cv_filechecksums' assembler directive.
982
983 /// This implements the CodeView '.cv_filechecksumoffset' assembler
984 /// directive.
985 virtual void emitCVFileChecksumOffsetDirective(unsigned FileNo) {}
986
987 /// This implements the CodeView '.cv_fpo_data' assembler directive.
988 virtual void emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc = {}) {}
989
990 /// Emit the absolute difference between two symbols.
991 ///
992 /// \pre Offset of \c Hi is greater than the offset \c Lo.
993 virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
994 unsigned Size);
995
996 /// Emit the absolute difference between two symbols encoded with ULEB128.
997 virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
998 const MCSymbol *Lo);
999
1000 virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);
1001 virtual void emitCFISections(bool EH, bool Debug);
1002 void emitCFIStartProc(bool IsSimple, SMLoc Loc = SMLoc());
1003 void emitCFIEndProc();
1004 virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc = {});
1005 virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc = {});
1006 virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc = {});
1007 virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset,
1008 int64_t AddressSpace, SMLoc Loc = {});
1009 virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc = {});
1010 virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding);
1011 virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding);
1012 virtual void emitCFIRememberState(SMLoc Loc);
1013 virtual void emitCFIRestoreState(SMLoc Loc);
1014 virtual void emitCFISameValue(int64_t Register, SMLoc Loc = {});
1015 virtual void emitCFIRestore(int64_t Register, SMLoc Loc = {});
1016 virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc);
1017 virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc = {});
1018 virtual void emitCFIEscape(StringRef Values, SMLoc Loc = {});
1019 virtual void emitCFIReturnColumn(int64_t Register);
1020 virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc = {});
1021 virtual void emitCFISignalFrame();
1022 virtual void emitCFIUndefined(int64_t Register, SMLoc Loc = {});
1023 virtual void emitCFIRegister(int64_t Register1, int64_t Register2,
1024 SMLoc Loc = {});
1025 virtual void emitCFIWindowSave(SMLoc Loc = {});
1026 virtual void emitCFINegateRAState(SMLoc Loc = {});
1027 virtual void emitCFINegateRAStateWithPC(SMLoc Loc = {});
1028 virtual void emitCFILabelDirective(SMLoc Loc, StringRef Name);
1029 virtual void emitCFIValOffset(int64_t Register, int64_t Offset,
1030 SMLoc Loc = {});
1031
1032 virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc = SMLoc());
1033 virtual void emitWinCFIEndProc(SMLoc Loc = SMLoc());
1034 /// This is used on platforms, such as Windows on ARM64, that require function
1035 /// or funclet sizes to be emitted in .xdata before the End marker is emitted
1036 /// for the frame. We cannot use the End marker, as it is not set at the
1037 /// point of emitting .xdata, in order to indicate that the frame is active.
1038 virtual void emitWinCFIFuncletOrFuncEnd(SMLoc Loc = SMLoc());
1039 virtual void emitWinCFIStartChained(SMLoc Loc = SMLoc());
1040 virtual void emitWinCFIEndChained(SMLoc Loc = SMLoc());
1041 virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc = SMLoc());
1042 virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset,
1043 SMLoc Loc = SMLoc());
1044 virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc = SMLoc());
1045 virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset,
1046 SMLoc Loc = SMLoc());
1047 virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset,
1048 SMLoc Loc = SMLoc());
1049 virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc = SMLoc());
1050 virtual void emitWinCFIEndProlog(SMLoc Loc = SMLoc());
1051 virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
1052 SMLoc Loc = SMLoc());
1053 virtual void emitWinEHHandlerData(SMLoc Loc = SMLoc());
1054
1055 virtual void emitCGProfileEntry(const MCSymbolRefExpr *From,
1056 const MCSymbolRefExpr *To, uint64_t Count);
1057
1058 /// Get the .pdata section used for the given section. Typically the given
1059 /// section is either the main .text section or some other COMDAT .text
1060 /// section, but it may be any section containing code.
1061 MCSection *getAssociatedPDataSection(const MCSection *TextSec);
1062
1063 /// Get the .xdata section used for the given section.
1064 MCSection *getAssociatedXDataSection(const MCSection *TextSec);
1065
1066 virtual void emitSyntaxDirective();
1067
1068 /// Record a relocation described by the .reloc directive. Return std::nullopt
1069 /// if succeeded. Otherwise, return a pair (Name is invalid, error message).
1070 virtual std::optional<std::pair<bool, std::string>>
1072 SMLoc Loc, const MCSubtargetInfo &STI) {
1073 return std::nullopt;
1074 }
1075
1076 virtual void emitAddrsig() {}
1077 virtual void emitAddrsigSym(const MCSymbol *Sym) {}
1078
1079 /// Emit the given \p Instruction into the current section.
1080 virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI);
1081
1082 /// Emit the a pseudo probe into the current section.
1084 uint64_t Attr, uint64_t Discriminator,
1085 const MCPseudoProbeInlineStack &InlineStack,
1086 MCSymbol *FnSym);
1087
1088 /// Set the bundle alignment mode from now on in the section.
1089 /// The value 1 means turn the bundle alignment off.
1090 virtual void emitBundleAlignMode(Align Alignment);
1091
1092 /// The following instructions are a bundle-locked group.
1093 ///
1094 /// \param AlignToEnd - If true, the bundle-locked group will be aligned to
1095 /// the end of a bundle.
1096 virtual void emitBundleLock(bool AlignToEnd);
1097
1098 /// Ends a bundle-locked group.
1099 virtual void emitBundleUnlock();
1100
1101 /// If this file is backed by a assembly streamer, this dumps the
1102 /// specified string in the output .s file. This capability is indicated by
1103 /// the hasRawTextSupport() predicate. By default this aborts.
1104 void emitRawText(const Twine &String);
1105
1106 /// Streamer specific finalization.
1107 virtual void finishImpl();
1108 /// Finish emission of machine code.
1109 void finish(SMLoc EndLoc = SMLoc());
1110
1111 virtual bool mayHaveInstructions(MCSection &Sec) const { return true; }
1112
1113 /// Emit a special value of 0xffffffff if producing 64-bit debugging info.
1114 void maybeEmitDwarf64Mark();
1115
1116 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
1117 /// according to the settings.
1118 virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment);
1119
1120 /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
1121 /// according to the settings.
1122 /// Return the end symbol generated inside, the caller needs to emit it.
1123 virtual MCSymbol *emitDwarfUnitLength(const Twine &Prefix,
1124 const Twine &Comment);
1125
1126 /// Emit the debug line start label.
1127 virtual void emitDwarfLineStartLabel(MCSymbol *StartSym);
1128
1129 /// Emit the debug line end entry.
1130 virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
1131 MCSymbol *EndLabel = nullptr) {}
1132
1133 /// If targets does not support representing debug line section by .loc/.file
1134 /// directives in assembly output, we need to populate debug line section with
1135 /// raw debug line contents.
1136 virtual void emitDwarfAdvanceLineAddr(int64_t LineDelta,
1137 const MCSymbol *LastLabel,
1138 const MCSymbol *Label,
1139 unsigned PointerSize) {}
1140
1141 /// Do finalization for the streamer at the end of a section.
1142 virtual void doFinalizationAtSectionEnd(MCSection *Section) {}
1143};
1144
1145/// Create a dummy machine code streamer, which does nothing. This is useful for
1146/// timing the assembler front end.
1147MCStreamer *createNullStreamer(MCContext &Ctx);
1148
1149} // end namespace llvm
1150
1151#endif // LLVM_MC_MCSTREAMER_H
BlockVerifier::State From
DXIL Finalize Linkage
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
Definition: Debug.cpp:108
This file defines the DenseMap class.
std::string Name
uint32_t Index
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:479
IRTranslator LLVM IR MI
unsigned Reg
Profile::FuncID FuncId
Definition: Profile.cpp:321
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This file defines the SmallVector class.
Defines the llvm::VersionTuple class, which represents a version in the form major[....
Class for arbitrary precision integers.
Definition: APInt.h:78
virtual void emitUnwindRaw(int64_t StackOffset, const SmallVectorImpl< uint8_t > &Opcodes)
~ARMTargetStreamer() override
void emitTargetAttributes(const MCSubtargetInfo &STI)
Emit the build attributes that only depend on the hardware that we expect.
virtual void reset()
Reset any state between object emissions, i.e.
virtual void emitSetFP(MCRegister FpReg, MCRegister SpReg, int64_t Offset=0)
virtual void annotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE)
virtual void finishAttributeSection()
virtual void emitMovSP(MCRegister Reg, int64_t Offset=0)
virtual void emitARMWinCFISaveSP(unsigned Reg)
virtual void emitPersonalityIndex(unsigned Index)
virtual void emitInst(uint32_t Inst, char Suffix='\0')
virtual void emitARMWinCFISaveLR(unsigned Offset)
virtual void emitArchExtension(uint64_t ArchExt)
virtual void emitTextAttribute(unsigned Attribute, StringRef String)
virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide)
virtual void emitARMWinCFICustom(unsigned Opcode)
virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide)
virtual void emitRegSave(const SmallVectorImpl< MCRegister > &RegList, bool isVector)
virtual void emitARMWinCFIEpilogEnd()
virtual void emitARMWinCFIPrologEnd(bool Fragment)
virtual void switchVendor(StringRef Vendor)
virtual void emitPersonality(const MCSymbol *Personality)
virtual void emitObjectArch(ARM::ArchKind Arch)
const MCExpr * addConstantPoolEntry(const MCExpr *, SMLoc Loc)
Callback used to implement the ldr= pseudo.
virtual void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, StringRef StringValue="")
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value)
virtual void emitFPU(ARM::FPUKind FPU)
virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last)
virtual void emitARMWinCFIEpilogStart(unsigned Condition)
virtual void emitPad(int64_t Offset)
void emitCurrentConstantPool()
Callback used to implement the .ltorg directive.
virtual void emitAttribute(unsigned Attribute, unsigned Value)
virtual void emitARMWinCFINop(bool Wide)
void emitConstantPools() override
virtual void emitArch(ARM::ArchKind Arch)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Tagged union holding either a T or a Error.
Definition: Error.h:481
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:42
Context object for machine code objects.
Definition: MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:34
MCSection * getParent() const
Definition: MCFragment.h:99
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Definition: MCInstPrinter.h:46
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:185
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
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
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
Definition: MCStreamer.cpp:648
virtual void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc, const MCSubtargetInfo &STI)
Definition: MCStreamer.cpp:225
virtual void emitAddrsig()
Definition: MCStreamer.h:1076
MCSymbol * emitLineTableLabel()
Definition: MCStreamer.cpp:486
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
virtual void switchSectionNoPrint(MCSection *Section)
Similar to switchSection, but does not print the section directive.
virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:506
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
Definition: MCStreamer.h:387
virtual void visitUsedSymbol(const MCSymbol &Sym)
void emitCFIStartProc(bool IsSimple, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:444
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
Definition: MCStreamer.cpp:307
virtual void finishImpl()
Streamer specific finalization.
virtual void emitDTPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (64-bit DTP relative) value.
Definition: MCStreamer.cpp:194
virtual void emitCFIBKeyFrame()
Definition: MCStreamer.cpp:248
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
Definition: MCStreamer.cpp:125
MCSectionSubPair getPreviousSection() const
Return the previous section that the streamer is emitting code to.
Definition: MCStreamer.h:405
virtual void beginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
virtual void emitSyntaxDirective()
Definition: MCStreamer.cpp:903
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:909
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual void initSections(bool NoExecStack, const MCSubtargetInfo &STI)
Create the default sections and set the initial one.
Definition: MCStreamer.cpp:416
bool popSection()
Restore the current and previous section from the section stack.
virtual MCSymbol * emitCFILabel()
When emitting an object file, create and emit a real label.
Definition: MCStreamer.cpp:500
virtual void emitWindowsUnwindTables()
MCStreamer(const MCStreamer &)=delete
virtual void emitGNUAttribute(unsigned Tag, unsigned Value)
Emit a .gnu_attribute directive.
Definition: MCStreamer.h:641
virtual raw_ostream & getCommentOS()
Return a raw_ostream that comments can be written to.
Definition: MCStreamer.cpp:110
virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:828
virtual void emitBundleLock(bool AlignToEnd)
The following instructions are a bundle-locked group.
MCSection * getAssociatedPDataSection(const MCSection *TextSec)
Get the .pdata section used for the given section.
Definition: MCStreamer.cpp:891
unsigned getNumWinFrameInfos()
Definition: MCStreamer.h:331
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
Definition: MCStreamer.cpp:270
bool hasUnfinishedDwarfFrameInfo()
Definition: MCStreamer.cpp:286
virtual ~MCStreamer()
void setStartTokLocPtr(const SMLoc *Loc)
Definition: MCStreamer.h:291
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
MCFragment * getCurrentFragment() const
Definition: MCStreamer.h:411
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
Definition: MCStreamer.cpp:705
virtual void emitGPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a gprel64 (64-bit GP relative) value.
Definition: MCStreamer.cpp:210
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:618
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
virtual bool emitCVFileDirective(unsigned FileNo, StringRef Filename, ArrayRef< uint8_t > Checksum, unsigned ChecksumKind)
Associate a filename with a specified logical file number, and also specify that file's checksum info...
Definition: MCStreamer.cpp:300
virtual void emitCFIReturnColumn(int64_t Register)
Definition: MCStreamer.cpp:715
virtual void emitCOFFSymbolType(int Type)
Emit the type of the symbol.
virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:580
virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment)
Emit a unit length field.
virtual void emitCFIWindowSave(SMLoc Loc={})
Definition: MCStreamer.cpp:686
virtual void emitCOFFSymbolIndex(MCSymbol const *Symbol)
Emits the symbol table index of a Symbol into the current section.
virtual void emitCVStringTableDirective()
This implements the CodeView '.cv_stringtable' assembler directive.
Definition: MCStreamer.h:978
virtual bool hasRawTextSupport() const
Return true if this asm streamer supports emitting unformatted text to the .s file with EmitRawText.
Definition: MCStreamer.h:347
virtual void emitIntValueInHex(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers & p...
Definition: MCStreamer.h:715
virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName)
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
Definition: MCStreamer.cpp:262
virtual bool isVerboseAsm() const
Return true if this streamer supports verbose assembly and if it is enabled.
Definition: MCStreamer.h:343
virtual void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset)
Emits a COFF image relative relocation.
virtual void endCOFFSymbolDef()
Marks the end of the symbol definition.
unsigned emitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum=std::nullopt, std::optional< StringRef > Source=std::nullopt, unsigned CUID=0)
Associate a filename with a specified logical file number.
Definition: MCStreamer.h:882
virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:992
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:845
virtual void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)=0
Emit a common symbol.
virtual MCAssembler * getAssemblerPtr()
Definition: MCStreamer.h:304
virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo)
Emit the absolute difference between two symbols encoded with ULEB128.
virtual void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol, MCSymbolAttr Linkage, MCSymbolAttr Visibility)
Emit a symbol's linkage and visibility with a linkage directive for XCOFF.
virtual void emitCFIUndefined(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:665
void setTargetStreamer(MCTargetStreamer *TS)
Definition: MCStreamer.h:287
virtual bool isIntegratedAssemblerRequired() const
Is the integrated assembler required for this streamer to function correctly?
Definition: MCStreamer.h:351
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:977
virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
Definition: MCStreamer.cpp:469
virtual void emitCVFileChecksumOffsetDirective(unsigned FileNo)
This implements the CodeView '.cv_filechecksumoffset' assembler directive.
Definition: MCStreamer.h:985
bool getUseAssemblerInfoForParsing()
Definition: MCStreamer.h:307
virtual void emitCFINegateRAState(SMLoc Loc={})
Definition: MCStreamer.cpp:695
virtual void emitGPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a gprel32 (32-bit GP relative) value.
Definition: MCStreamer.cpp:214
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:589
MCContext & getContext() const
Definition: MCStreamer.h:300
SMLoc getStartTokLoc() const
Definition: MCStreamer.h:292
virtual void emitBundleUnlock()
Ends a bundle-locked group.
virtual Expected< unsigned > tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum=std::nullopt, std::optional< StringRef > Source=std::nullopt, unsigned CUID=0)
Associate a filename with a specified logical file number.
Definition: MCStreamer.cpp:231
virtual void addExplicitComment(const Twine &T)
Add explicit comment T.
Definition: MCStreamer.cpp:122
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
Definition: MCStreamer.h:366
virtual void emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc={})
This implements the CodeView '.cv_fpo_data' assembler directive.
Definition: MCStreamer.h:988
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
virtual void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, MCSymbol *CsectSym, Align Alignment)
Emits an lcomm directive with XCOFF csect information.
virtual void emitCFIMTETaggedFrame()
Definition: MCStreamer.cpp:255
virtual void emitTPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a tprel (32-bit TP relative) value.
Definition: MCStreamer.cpp:206
virtual void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset)
Emits a COFF section relative relocation.
MCSection * getAssociatedXDataSection(const MCSection *TextSec)
Get the .xdata section used for the given section.
Definition: MCStreamer.cpp:897
virtual void doFinalizationAtSectionEnd(MCSection *Section)
Do finalization for the streamer at the end of a section.
Definition: MCStreamer.h:1142
virtual void emitRawComment(const Twine &T, bool TabPrefix=true)
Print T and prefix it with the comment string (normally #) and optionally a tab.
Definition: MCStreamer.cpp:120
virtual std::optional< std::pair< bool, std::string > > emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc, const MCSubtargetInfo &STI)
Record a relocation described by the .reloc directive.
Definition: MCStreamer.h:1071
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:754
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:179
void emitSymbolValue(const MCSymbol *Sym, unsigned Size, bool IsSectionRelative=false)
Special case of EmitValue that avoids the client having to pass in a MCExpr for MCSymbols.
Definition: MCStreamer.cpp:183
bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
Definition: MCStreamer.cpp:330
virtual void emitIdent(StringRef IdentString)
Emit the "identifiers" directive.
Definition: MCStreamer.h:878
virtual StringRef getMnemonic(const MCInst &MI) const
Returns the mnemonic for MI, if the streamer has access to a instruction printer and returns an empty...
Definition: MCStreamer.h:446
virtual void emitCVFileChecksumsDirective()
This implements the CodeView '.cv_filechecksums' assembler directive.
Definition: MCStreamer.h:981
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
Definition: MCStreamer.cpp:638
virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size)
Emit the absolute difference between two symbols.
virtual void emitXCOFFExceptDirective(const MCSymbol *Symbol, const MCSymbol *Trap, unsigned Lang, unsigned Reason, unsigned FunctionSize, bool hasDebug)
Emit an XCOFF .except directive which adds information about a trap instruction to the object file ex...
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
Definition: MCStreamer.cpp:420
virtual void emitCOFFSectionIndex(MCSymbol const *Symbol)
Emits a COFF section index.
void setAllowAutoPadding(bool v)
Definition: MCStreamer.h:313
virtual void emitCFIRememberState(SMLoc Loc)
Definition: MCStreamer.cpp:597
virtual void reset()
State management.
Definition: MCStreamer.cpp:101
virtual void emitCFILabelDirective(SMLoc Loc, StringRef Name)
Definition: MCStreamer.cpp:722
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
Definition: MCStreamer.cpp:352
virtual void emitTPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a tprel (64-bit TP relative) value.
Definition: MCStreamer.cpp:202
virtual void emitCFISections(bool EH, bool Debug)
Definition: MCStreamer.cpp:442
MCTargetStreamer * getTargetStreamer()
Definition: MCStreamer.h:309
virtual void emitIntValueInHexWithPadding(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers & p...
Definition: MCStreamer.h:727
MCFragment * CurFrag
Definition: MCStreamer.h:255
virtual void emitAssemblerFlag(MCAssemblerFlag Flag)
Note in the output the specified Flag.
virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Definition: MCStreamer.h:483
virtual bool mayHaveInstructions(MCSection &Sec) const
Definition: MCStreamer.h:1111
virtual void emitValueToAlignment(Align Alignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
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.
Definition: MCStreamer.cpp:133
unsigned getNumFrameInfos()
Definition: MCStreamer.cpp:115
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:960
virtual void emitWinCFIEndChained(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:814
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
virtual void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize)
If targets does not support representing debug line section by .loc/.file directives in assembly outp...
Definition: MCStreamer.h:1136
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:772
void emitInt16(uint64_t Value)
Definition: MCStreamer.h:720
void emitVersionForTarget(const Triple &Target, const VersionTuple &SDKVersion, const Triple *DarwinTargetVariantTriple, const VersionTuple &DarwinTargetVariantSDKVersion)
virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0)
Emit nops until the byte alignment ByteAlignment is reached.
virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
Definition: MCStreamer.cpp:480
virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue)
Set the DescValue for the Symbol.
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:537
virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)
Emit a local common (.lcomm) symbol.
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
Definition: MCStreamer.cpp:276
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
Definition: MCStreamer.cpp:675
virtual void emitCOFFSafeSEH(MCSymbol const *Symbol)
virtual void emitWinCFIFuncletOrFuncEnd(SMLoc Loc=SMLoc())
This is used on platforms, such as Windows on ARM64, that require function or funclet sizes to be emi...
Definition: MCStreamer.cpp:790
virtual void emitXCOFFRenameDirective(const MCSymbol *Name, StringRef Rename)
Emit a XCOFF .rename directive which creates a synonym for an illegal or undesirable name.
void pushSection()
Save the current and previous section on the section stack.
Definition: MCStreamer.h:418
virtual void emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type, uint64_t Attr, uint64_t Discriminator, const MCPseudoProbeInlineStack &InlineStack, MCSymbol *FnSym)
Emit the a pseudo probe into the current section.
void setUseAssemblerInfoForParsing(bool v)
Definition: MCStreamer.h:306
virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count)
Definition: MCStreamer.cpp:853
virtual void emitDataRegion(MCDataRegionType Kind)
Note in the output the specified region Kind.
Definition: MCStreamer.h:470
virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
Definition: MCStreamer.cpp:527
unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo=0)
Special case of EmitULEB128Value that avoids the client having to pass in a MCExpr for constant integ...
Definition: MCStreamer.cpp:161
virtual void emitULEB128Value(const MCExpr *Value)
ArrayRef< MCDwarfFrameInfo > getDwarfFrameInfos() const
Definition: MCStreamer.cpp:116
bool getAllowAutoPadding() const
Definition: MCStreamer.h:314
virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc)
Definition: MCStreamer.cpp:570
virtual void emitLinkerOptions(ArrayRef< std::string > Kind)
Emit the given list Options of strings as linker options into the output.
Definition: MCStreamer.h:467
virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc)
Emit some number of copies of Value until the byte offset Offset is reached.
void emitInt64(uint64_t Value)
Definition: MCStreamer.h:722
MCSymbol * endSection(MCSection *Section)
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitExplicitComments()
Emit added explicit comments.
Definition: MCStreamer.cpp:123
WinEH::FrameInfo * EnsureValidWinFrameInfo(SMLoc Loc)
Retrieve the current frame info if one is available and it is not yet closed.
Definition: MCStreamer.cpp:739
virtual void emitThumbFunc(MCSymbol *Func)
Note in the output that the specified Func is a Thumb mode function (ARM target only).
virtual void emitCFIRestoreState(SMLoc Loc)
Definition: MCStreamer.cpp:607
virtual void emitXCOFFRefDirective(const MCSymbol *Symbol)
Emit a XCOFF .ref directive which creates R_REF type entry in the relocation table for one or more sy...
virtual void emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol)
Definition: MCStreamer.cpp:412
virtual void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
This implements the CodeView '.cv_def_range' assembler directive.
Definition: MCStreamer.cpp:374
void emitInt32(uint64_t Value)
Definition: MCStreamer.h:721
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:560
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:921
ArrayRef< std::unique_ptr< WinEH::FrameInfo > > getWinFrameInfos() const
Definition: MCStreamer.h:332
void maybeEmitDwarf64Mark()
Emit a special value of 0xffffffff if producing 64-bit debugging info.
virtual void emitDTPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (32-bit DTP relative) value.
Definition: MCStreamer.cpp:198
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:517
virtual void emitZerofill(MCSection *Section, MCSymbol *Symbol=nullptr, uint64_t Size=0, Align ByteAlignment=Align(1), SMLoc Loc=SMLoc())=0
Emit the zerofill section and an optional symbol.
virtual void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc)
This implements the CodeView '.cv_loc' assembler directive.
Definition: MCStreamer.cpp:325
MCSectionSubPair getCurrentSection() const
Return the current section that the streamer is emitting code to.
Definition: MCStreamer.h:395
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:943
virtual void emitFileDirective(StringRef Filename)
Switch to a new logical file.
virtual void emitSLEB128Value(const MCExpr *Value)
virtual void emitCFIValOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:729
virtual void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym)
Emit an ELF .symver directive.
virtual void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata)
Emit a C_INFO symbol with XCOFF embedded metadata to the .info section.
MCSection * getCurrentSectionOnly() const
Definition: MCStreamer.h:400
virtual void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Emit the expression Value into the output as a native integer of the given Size bytes.
void emitRawText(const Twine &String)
If this file is backed by a assembly streamer, this dumps the specified string in the output ....
MCStreamer & operator=(const MCStreamer &)=delete
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Definition: MCStreamer.cpp:229
virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel, MCSymbol *EndLabel=nullptr)
Emit the debug line end entry.
Definition: MCStreamer.h:1130
virtual void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args)
Emit a Linker Optimization Hint (LOH) directive.
Definition: MCStreamer.h:638
unsigned emitSLEB128IntValue(int64_t Value)
Special case of EmitSLEB128Value that avoids the client having to pass in a MCExpr for constant integ...
Definition: MCStreamer.cpp:171
virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol, SMLoc Loc)
Introduces an inline call site id for use with .cv_loc.
Definition: MCStreamer.cpp:311
virtual void emitCFISignalFrame()
Definition: MCStreamer.cpp:658
virtual void emitVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Specify the Mach-O minimum deployment target version.
Definition: MCStreamer.h:473
virtual void emitCOFFSymbolStorageClass(int StorageClass)
Emit the storage class of the symbol.
WinEH::FrameInfo * getCurrentWinFrameInfo()
Definition: MCStreamer.h:266
virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol, but only if Value is also emitted.
Definition: MCStreamer.cpp:439
void emitInt8(uint64_t Value)
Definition: MCStreamer.h:719
virtual void emitWinCFIStartChained(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:801
virtual void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, Align ByteAlignment=Align(1))
Emit a thread local bss (.tbss) symbol.
virtual void emitCFIRestore(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:628
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
Definition: MCStreamer.cpp:356
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
Definition: MCStreamer.cpp:220
virtual void emitBundleAlignMode(Align Alignment)
Set the bundle alignment mode from now on in the section.
virtual void emitRawTextImpl(StringRef String)
EmitRawText - If this file is backed by an assembly streamer, this dumps the specified string in the ...
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
virtual void emitAddrsigSym(const MCSymbol *Sym)
Definition: MCStreamer.h:1077
void finish(SMLoc EndLoc=SMLoc())
Finish emission of machine code.
virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol)
Emit an weak reference from Alias to Symbol.
void visitUsedExpr(const MCExpr &Expr)
virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, unsigned CUID=0)
Specify the "root" file of the compilation, using the ".file 0" extension.
Definition: MCStreamer.cpp:239
virtual void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Emit/Specify Mach-O build version command.
Definition: MCStreamer.h:479
virtual void changeSection(MCSection *, uint32_t)
This is called by popSection and switchSection, if the current section changes.
virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset, int64_t AddressSpace, SMLoc Loc={})
Definition: MCStreamer.cpp:548
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
Target specific streamer interface.
Definition: MCStreamer.h:94
virtual void emitDwarfFileDirective(StringRef Directive)
Definition: MCStreamer.cpp:67
virtual void emitValue(const MCExpr *Value)
Definition: MCStreamer.cpp:71
virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, uint64_t Address, const MCInst &Inst, const MCSubtargetInfo &STI, raw_ostream &OS)
virtual void finish()
Definition: MCStreamer.cpp:55
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Definition: MCStreamer.cpp:91
MCStreamer & getStreamer()
Definition: MCStreamer.h:102
virtual void emitRawBytes(StringRef Data)
Emit the bytes in Data into the output.
Definition: MCStreamer.cpp:79
MCStreamer & Streamer
Definition: MCStreamer.h:96
virtual void changeSection(const MCSection *CurSection, MCSection *Section, uint32_t SubSection, raw_ostream &OS)
Update streamer for a new active section.
Definition: MCStreamer.cpp:59
virtual void emitLabel(MCSymbol *Symbol)
Definition: MCStreamer.cpp:53
virtual void emitConstantPools()
Definition: MCStreamer.cpp:57
Root of the metadata hierarchy.
Definition: Metadata.h:62
Represents a location in source code.
Definition: SMLoc.h:23
bool empty() const
Definition: SmallVector.h:81
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StackOffset holds a fixed and a scalable offset in bytes.
Definition: TypeSize.h:33
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM Value Representation.
Definition: Value.h:74
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:29
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
This class represents a function that is read from a sample profile.
Definition: FunctionId.h:36
StorageClass
Definition: XCOFF.h:170
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
@ Length
Definition: DWP.cpp:480
MCStreamer * createNullStreamer(MCContext &Ctx)
Create a dummy machine code streamer, which does nothing.
MCDataRegionType
Definition: MCDirectives.h:61
std::pair< MCSection *, uint32_t > MCSectionSubPair
Definition: MCStreamer.h:67
MCVersionMinType
Definition: MCDirectives.h:69
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
MCAssemblerFlag
Definition: MCDirectives.h:53
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Definition: Error.h:756
MCLOHType
Linker Optimization Hint Type.
MCSymbolAttr
Definition: MCDirectives.h:18
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39