LLVM 24.0.0git
MCObjectStreamer.cpp
Go to the documentation of this file.
1//===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===//
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
11#include "llvm/MC/MCAsmInfo.h"
12#include "llvm/MC/MCAssembler.h"
14#include "llvm/MC/MCCodeView.h"
15#include "llvm/MC/MCContext.h"
16#include "llvm/MC/MCDwarf.h"
17#include "llvm/MC/MCExpr.h"
21#include "llvm/MC/MCSFrame.h"
22#include "llvm/MC/MCSection.h"
23#include "llvm/MC/MCSymbol.h"
26using namespace llvm;
27
29 std::unique_ptr<MCAsmBackend> TAB,
30 std::unique_ptr<MCObjectWriter> OW,
31 std::unique_ptr<MCCodeEmitter> Emitter)
32 : MCStreamer(Context),
33 Assembler(std::make_unique<MCAssembler>(
34 Context, std::move(TAB), std::move(Emitter), std::move(OW))),
35 EmitEHFrame(true), EmitDebugFrame(false), EmitSFrame(false) {
36 assert(Assembler->getBackendPtr() && Assembler->getEmitterPtr());
37 IsObj = true;
38 setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
39 if (Context.getTargetOptions().MCRelaxAll)
40 Assembler->setRelaxAll(true);
41}
42
44
47 return Assembler.get();
48 return nullptr;
49}
50
51constexpr size_t FragBlockSize = 16384;
52// Ensure the new fragment can at least store a few bytes.
53constexpr size_t NewFragHeadroom = 8;
54
55static_assert(NewFragHeadroom >= alignof(MCFragment));
56static_assert(FragBlockSize >= sizeof(MCFragment) + NewFragHeadroom);
57
59 auto Size = std::max(FragBlockSize, sizeof(MCFragment) + Headroom);
60 FragSpace = Size - sizeof(MCFragment);
61 auto Block = std::unique_ptr<uint8_t[]>(new uint8_t[Size]);
62 auto *F = reinterpret_cast<MCFragment *>(Block.get());
63 FragStorage.push_back(std::move(Block));
64 return F;
65}
66
69 if (LLVM_LIKELY(sizeof(MCFragment) + NewFragHeadroom <= FragSpace)) {
70 auto End = reinterpret_cast<size_t>(getCurFragEnd());
71 F = reinterpret_cast<MCFragment *>(
72 alignToPowerOf2(End, alignof(MCFragment)));
73 FragSpace -= size_t(F) - End + sizeof(MCFragment);
74 } else {
75 F = allocFragSpace(0);
76 }
77 new (F) MCFragment();
79}
80
81void MCObjectStreamer::ensureHeadroom(size_t Headroom) {
82 if (Headroom <= FragSpace)
83 return;
84 auto *F = allocFragSpace(Headroom);
85 new (F) MCFragment();
87}
88
89void MCObjectStreamer::addSpecialFragment(MCFragment *Frag) {
91 "Frag should have a variable-size tail");
92 // Frag is not connected to FragSpace. Before modifying CurFrag with
93 // addFragment(Frag), allocate an empty fragment to maintain FragSpace
94 // connectivity, potentially reusing CurFrag's associated space.
96 if (LLVM_LIKELY(sizeof(MCFragment) + NewFragHeadroom <= FragSpace)) {
97 auto End = reinterpret_cast<size_t>(getCurFragEnd());
98 F = reinterpret_cast<MCFragment *>(
99 alignToPowerOf2(End, alignof(MCFragment)));
100 FragSpace -= size_t(F) - End + sizeof(MCFragment);
101 } else {
102 F = allocFragSpace(0);
103 }
104 new (F) MCFragment();
105
106 addFragment(Frag);
107 addFragment(F);
108}
109
111 ensureHeadroom(Contents.size());
112 assert(FragSpace >= Contents.size());
113 // As this is performance-sensitive code, explicitly use std::memcpy.
114 // Optimization of std::copy to memmove is unreliable.
115 if (!Contents.empty())
116 std::memcpy(getCurFragEnd(), Contents.begin(), Contents.size());
117 CurFrag->FixedSize += Contents.size();
118 FragSpace -= Contents.size();
119}
120
122 ensureHeadroom(Num);
124 llvm::fill(Data, Elt);
125 CurFrag->FixedSize += Num;
126 FragSpace -= Num;
127}
128
132
133// As a compile-time optimization, avoid allocating and evaluating an MCExpr
134// tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment's fixed
135// part.
136static std::optional<uint64_t> absoluteSymbolDiff(const MCSymbol *Hi,
137 const MCSymbol *Lo) {
138 assert(Hi && Lo);
139 if (Lo == Hi)
140 return 0;
141 if (Hi->isVariable() || Lo->isVariable())
142 return std::nullopt;
143 auto *LoF = Lo->getFragment();
144 if (!LoF || Hi->getFragment() != LoF || LoF->isLinkerRelaxable())
145 return std::nullopt;
146 // If either symbol resides in the variable part, bail out.
147 auto Fixed = LoF->getFixedSize();
148 if (Lo->getOffset() > Fixed || Hi->getOffset() > Fixed)
149 return std::nullopt;
150
151 return Hi->getOffset() - Lo->getOffset();
152}
153
155 const MCSymbol *Lo,
156 unsigned Size) {
157 if (std::optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo))
158 emitIntValue(*Diff, Size);
159 else
161}
162
164 const MCSymbol *Lo) {
165 if (std::optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo))
166 emitULEB128IntValue(*Diff);
167 else
169}
170
172 if (Assembler) {
173 Assembler->reset();
174 Assembler->setRelaxAll(getContext().getTargetOptions().MCRelaxAll);
175 }
176 EmitEHFrame = true;
177 EmitDebugFrame = false;
178 BundleLocked = false;
179 FragStorage.clear();
180 FragSpace = 0;
181 SpecialFragAllocator.Reset();
183}
184
186 auto &Backend = getAssembler().getBackend();
187 for (auto &FI : DwarfFrameInfos)
188 FI.CompactUnwindEncoding =
190}
191
193 if (!getNumFrameInfos())
194 return;
195
196 if (EmitEHFrame)
197 MCDwarfFrameEmitter::emit(*this, true);
198 if (EmitDebugFrame)
199 MCDwarfFrameEmitter::emit(*this, false);
200
201 if (EmitSFrame || getContext().getTargetOptions().EmitSFrameUnwind)
203}
204
206 Assembler->registerSymbol(Sym);
207}
208
209void MCObjectStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {
211 EmitEHFrame = EH;
212 EmitDebugFrame = Debug;
213 EmitSFrame = SFrame;
214}
215
217 SMLoc Loc) {
219
221
222 // Avoid fixups when possible.
223 int64_t AbsValue;
224 if (Value->evaluateAsAbsolute(AbsValue, getAssemblerPtr())) {
225 if (!isUIntN(8 * Size, AbsValue) && !isIntN(8 * Size, AbsValue)) {
227 Loc, "value evaluated as " + Twine(AbsValue) + " is out of range.");
228 return;
229 }
230 emitIntValue(AbsValue, Size);
231 return;
232 }
236}
237
239 MCSymbol *Label = getContext().createTempSymbol("cfi");
240 emitLabel(Label);
241 return Label;
242}
243
244void MCObjectStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
245 // We need to create a local symbol to avoid relocations.
247 emitLabel(Frame.Begin);
248}
249
250void MCObjectStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
251 Frame.End = getContext().createTempSymbol();
252 emitLabel(Frame.End);
253}
254
256 MCStreamer::emitLabel(Symbol, Loc);
257 // If Symbol is a non-redefiniable variable, emitLabel has reported an error.
258 // Bail out.
259 if (Symbol->isVariable())
260 return;
261
262 getAssembler().registerSymbol(*Symbol);
263
264 // Set the fragment and offset. This function might be called by
265 // changeSection, when the section stack top hasn't been changed to the new
266 // section.
268 Symbol->setFragment(F);
269 Symbol->setOffset(F->getFixedSize());
270
272}
273
275 auto Assignments = pendingAssignments.find(Symbol);
276 if (Assignments == pendingAssignments.end())
277 return;
278
279 // emitAssignment can recursively re-enter emitPendingAssignments for
280 // other symbols, so move the list out and erase before iterating.
281 SmallVector<PendingAssignment, 1> Pending = std::move(Assignments->second);
282 pendingAssignments.erase(Assignments);
283 for (const PendingAssignment &A : Pending)
284 emitAssignment(A.Symbol, A.Value);
285}
286
287// Emit a label at a previously emitted fragment/offset position. This must be
288// within the currently-active section.
291 assert(F.getParent() == getCurrentSectionOnly());
292 MCStreamer::emitLabel(Symbol, Loc);
293 getAssembler().registerSymbol(*Symbol);
294 Symbol->setFragment(&F);
295 Symbol->setOffset(Offset);
296}
297
299 int64_t IntValue;
300 if (Value->evaluateAsAbsolute(IntValue, getAssembler())) {
301 emitULEB128IntValue(IntValue);
302 return;
303 }
304 auto *F = getCurrentFragment();
305 F->makeLEB(false, Value);
306 newFragment();
307}
308
310 int64_t IntValue;
311 if (Value->evaluateAsAbsolute(IntValue, getAssembler())) {
312 emitSLEB128IntValue(IntValue);
313 return;
314 }
315 auto *F = getCurrentFragment();
316 F->makeLEB(true, Value);
317 newFragment();
318}
319
321 const MCSymbol *Target) {
322 reportFatalUsageError("this file format doesn't support weak aliases");
323}
324
326 assert(Section && "Cannot switch to a null section!");
328
329 // Register the section and create an initial fragment for subsection 0
330 // if `Subsection` is non-zero.
331 bool NewSec = getAssembler().registerSection(*Section);
332 MCFragment *F0 = nullptr;
333 if (NewSec && Subsection) {
334 changeSection(Section, 0);
335 F0 = CurFrag;
336 }
337
338 // To maintain connectivity between CurFrag and FragSpace when CurFrag is
339 // modified, allocate an empty fragment and append it to the fragment list.
340 // (Subsections[I].second.Tail is not connected to FragSpace.)
341 MCFragment *F;
342 if (LLVM_LIKELY(sizeof(MCFragment) + NewFragHeadroom <= FragSpace)) {
343 auto End = reinterpret_cast<size_t>(getCurFragEnd());
344 F = reinterpret_cast<MCFragment *>(
345 alignToPowerOf2(End, alignof(MCFragment)));
346 FragSpace -= size_t(F) - End + sizeof(MCFragment);
347 } else {
348 F = allocFragSpace(0);
349 }
350 new (F) MCFragment();
351 F->setParent(Section);
352
353 auto &Subsections = Section->Subsections;
354 size_t I = 0, E = Subsections.size();
355 while (I != E && Subsections[I].first < Subsection)
356 ++I;
357 // If the subsection number is not in the sorted Subsections list, create a
358 // new fragment list.
359 if (I == E || Subsections[I].first != Subsection) {
360 Subsections.insert(Subsections.begin() + I,
361 {Subsection, MCSection::FragList{F, F}});
362 Section->CurFragList = &Subsections[I].second;
363 CurFrag = F;
364 } else {
365 Section->CurFragList = &Subsections[I].second;
366 CurFrag = Subsections[I].second.Tail;
367 // Ensure CurFrag is associated with FragSpace.
368 addFragment(F);
369 }
370
371 // Define the section symbol at subsection 0's initial fragment if required.
372 if (!NewSec)
373 return;
374 if (auto *Sym = Section->getBeginSymbol()) {
375 Sym->setFragment(Subsection ? F0 : CurFrag);
376 getAssembler().registerSymbol(*Sym);
377 }
378}
379
385
387 const MCExpr *Value) {
388 const MCSymbol *Target = &cast<MCSymbolRefExpr>(*Value).getSymbol();
389
390 // If the symbol already exists, emit the assignment. Otherwise, emit it
391 // later only if the symbol is also emitted.
392 if (Target->isRegistered())
393 emitAssignment(Symbol, Value);
394 else
395 pendingAssignments[Target].push_back({Symbol, Value});
396}
397
399 return Sec.hasInstructions();
400}
401
403 const MCSubtargetInfo &STI) {
404 if (LFIRewriter && LFIRewriter->rewriteInst(Inst, *this, STI))
405 return;
406
408
410 Sec->setHasInstructions(true);
411
412 // Now that a machine instruction has been assembled into this section, make
413 // a line entry for any .loc directive that has been seen.
415
416 // If this instruction doesn't need relaxation, just emit it as data.
417 MCAssembler &Assembler = getAssembler();
418 MCAsmBackend &Backend = Assembler.getBackend();
419
420 auto relaxToFixpoint = [&](MCInst I) {
421 while (Backend.mayNeedRelaxation(I.getOpcode(), I.getOperands(), STI))
422 Backend.relaxInstruction(I, STI);
423 return I;
424 };
425
426 // Bundling emits one relaxable fragment per instruction so that finishLayout
427 // can fold padding into instruction encodings.
428 if (Assembler.isBundlingEnabled()) {
429 if (BundleLocked || Assembler.getRelaxAll())
430 emitInstToFragment(relaxToFixpoint(Inst), STI);
431 else
432 emitInstToFragment(Inst, STI);
433 return;
434 }
435
436 if (!(Backend.mayNeedRelaxation(Inst.getOpcode(), Inst.getOperands(), STI) ||
437 Backend.allowEnhancedRelaxation())) {
438 emitInstToData(Inst, STI);
439 return;
440 }
441
442 // Otherwise, relax and emit it as data if RelaxAll is specified.
443 if (Assembler.getRelaxAll()) {
444 emitInstToData(relaxToFixpoint(Inst), STI);
445 return;
446 }
447
448 emitInstToFragment(Inst, STI);
449}
450
451void MCObjectStreamer::emitInstToData(const MCInst &Inst,
452 const MCSubtargetInfo &STI) {
454
455 // Append the instruction to the data fragment.
456 size_t CodeOffset = getCurFragSize();
457 SmallString<16> Content;
459 getAssembler().getEmitter().encodeInstruction(Inst, Content, Fixups, STI);
460 appendContents(Content);
461 if (CurFrag != F) {
462 F = CurFrag;
463 CodeOffset = 0;
464 }
465 F->setHasInstructions(STI);
466
467 if (Fixups.empty())
468 return;
469 bool MarkedLinkerRelaxable = false;
470 for (auto &Fixup : Fixups) {
471 Fixup.setOffset(Fixup.getOffset() + CodeOffset);
472 if (!Fixup.isLinkerRelaxable() || MarkedLinkerRelaxable)
473 continue;
474 MarkedLinkerRelaxable = true;
475 // Set the fragment's order within the subsection for use by
476 // MCAssembler::relaxAlign.
477 auto *Sec = F->getParent();
478 if (!Sec->isLinkerRelaxable())
479 Sec->setFirstLinkerRelaxable(F->getLayoutOrder());
480 // Do not add data after a linker-relaxable instruction. The difference
481 // between a new label and a label at or before the linker-relaxable
482 // instruction cannot be resolved at assemble-time.
483 F->setLinkerRelaxable();
484 newFragment();
485 }
486 F->appendFixups(Fixups);
487}
488
490 const MCSubtargetInfo &STI) {
491 auto *F = getCurrentFragment();
494 getAssembler().getEmitter().encodeInstruction(Inst, Data, Fixups, STI);
495
497 F->setHasInstructions(STI);
498
499 F->setVarContents(Data);
500 F->setInst(Inst);
501
502 bool MarkedLinkerRelaxable = false;
503 for (auto &Fixup : Fixups) {
504 if (!Fixup.isLinkerRelaxable() || MarkedLinkerRelaxable)
505 continue;
506 MarkedLinkerRelaxable = true;
507 auto *Sec = F->getParent();
508 if (!Sec->isLinkerRelaxable())
509 Sec->setFirstLinkerRelaxable(F->getLayoutOrder());
510 F->setLinkerRelaxable();
511 }
512 F->setVarFixups(Fixups);
513
514 newFragment();
515}
516
517void MCObjectStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
518 unsigned Column, unsigned Flags,
519 unsigned Isa,
520 unsigned Discriminator,
521 StringRef FileName,
522 StringRef Comment) {
523 // In case we see two .loc directives in a row, make sure the
524 // first one gets a line entry.
526
527 this->MCStreamer::emitDwarfLocDirective(FileNo, Line, Column, Flags, Isa,
528 Discriminator, FileName, Comment);
529}
530
532 const MCSymbol *B, SMLoc Loc) {
533 MCContext &Context = OS.getContext();
534 const MCExpr *ARef = MCSymbolRefExpr::create(A, Context);
535 const MCExpr *BRef = MCSymbolRefExpr::create(B, Context);
536 const MCExpr *AddrDelta =
537 MCBinaryExpr::create(MCBinaryExpr::Sub, ARef, BRef, Context, Loc);
538 return AddrDelta;
539}
540
543 int64_t LineDelta, const MCSymbol *Label,
544 int PointerSize) {
545 // emit the sequence to set the address
546 OS.emitIntValue(dwarf::DW_LNS_extended_op, 1);
547 OS.emitULEB128IntValue(PointerSize + 1);
548 OS.emitIntValue(dwarf::DW_LNE_set_address, 1);
549 OS.emitSymbolValue(Label, PointerSize);
550
551 // emit the sequence for the LineDelta (from 1) and a zero address delta.
552 MCDwarfLineAddr::Emit(&OS, Params, LineDelta, 0);
553}
554
556 const MCSymbol *LastLabel,
557 const MCSymbol *Label,
558 unsigned PointerSize) {
559 if (!LastLabel) {
560 emitDwarfSetLineAddr(*this, Assembler->getDWARFLinetableParams(), LineDelta,
561 Label, PointerSize);
562 return;
563 }
564
565 // If the two labels are within the same fragment, then the address-offset is
566 // already a fixed constant and is not relaxable. Emit the advance-line-addr
567 // data immediately to save time and memory.
568 if (auto OptAddrDelta = absoluteSymbolDiff(Label, LastLabel)) {
569 SmallString<16> Tmp;
570 MCDwarfLineAddr::encode(getContext(), Assembler->getDWARFLinetableParams(),
571 LineDelta, *OptAddrDelta, Tmp);
572 emitBytes(Tmp);
573 return;
574 }
575
576 auto *F = getCurrentFragment();
577 F->Kind = MCFragment::FT_Dwarf;
578 F->setDwarfAddrDelta(buildSymbolDiff(*this, Label, LastLabel, SMLoc()));
579 F->setDwarfLineDelta(LineDelta);
580 newFragment();
581}
582
584 MCSymbol *LastLabel,
585 MCSymbol *EndLabel) {
586 // Emit a DW_LNE_end_sequence into the line table. When EndLabel is null, it
587 // means we should emit the entry for the end of the section and therefore we
588 // use the section end label for the reference label. After having the
589 // appropriate reference label, we emit the address delta and use INT64_MAX as
590 // the line delta which is the signal that this is actually a
591 // DW_LNE_end_sequence.
592 if (!EndLabel)
593 EndLabel = endSection(Section);
594
595 // Switch back the dwarf line section, in case endSection had to switch the
596 // section.
597 MCContext &Ctx = getContext();
598 switchSection(Ctx.getObjectFileInfo()->getDwarfLineSection());
599
600 const MCAsmInfo &AsmInfo = Ctx.getAsmInfo();
601 emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, EndLabel,
602 AsmInfo.getCodePointerSize());
603}
604
606 const MCSymbol *Label,
607 SMLoc Loc) {
608 auto *F = getCurrentFragment();
610 F->setDwarfAddrDelta(buildSymbolDiff(*this, Label, LastLabel, Loc));
611 newFragment();
612}
613
615 const MCSymbol *FREBegin,
616 MCFragment *FDEFrag,
617 SMLoc Loc) {
618 assert(FuncBase && "No function base address");
619 assert(FREBegin && "FRE doesn't describe a location");
620 auto *F = getCurrentFragment();
621 F->Kind = MCFragment::FT_SFrame;
622 F->setSFrameAddrDelta(buildSymbolDiff(*this, FREBegin, FuncBase, Loc));
623 F->setSFrameFDE(FDEFrag);
624 newFragment();
625}
626
628 unsigned Line, unsigned Column,
629 bool PrologueEnd, bool IsStmt,
630 StringRef FileName, SMLoc Loc) {
631 // Validate the directive.
633 return;
634
635 // Emit a label at the current position and record it in the CodeViewContext.
636 MCSymbol *LineSym = getContext().createTempSymbol();
637 emitLabel(LineSym);
639 FileNo, Line, Column, PrologueEnd,
640 IsStmt);
641}
642
644 const MCSymbol *Begin,
645 const MCSymbol *End) {
647 End);
648 this->MCStreamer::emitCVLinetableDirective(FunctionId, Begin, End);
649}
650
652 unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum,
653 const MCSymbol *FnStartSym, const MCSymbol *FnEndSym) {
655 *this, PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym,
656 FnEndSym);
658 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
659}
660
662 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
663 StringRef FixedSizePortion) {
664 getContext().getCVContext().emitDefRange(*this, Ranges, FixedSizePortion);
665 // Attach labels that were pending before we created the defrange fragment to
666 // the beginning of the new fragment.
667 this->MCStreamer::emitCVDefRangeDirective(Ranges, FixedSizePortion);
668}
669
676
680
685
687 uint8_t FillLen,
688 unsigned MaxBytesToEmit) {
689 if (MaxBytesToEmit == 0)
690 MaxBytesToEmit = Alignment.value();
692 F->makeAlign(Alignment, Fill, FillLen, MaxBytesToEmit);
693 newFragment();
694
695 // Update the maximum alignment on the current section if necessary.
696 F->getParent()->ensureMinAlignment(Alignment);
697}
698
700 const MCSubtargetInfo &STI,
701 unsigned MaxBytesToEmit) {
702 auto *F = getCurrentFragment();
703 emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
704 F->u.align.EmitNops = true;
705 F->STI = &STI;
706}
707
709 bool EmitNops, uint8_t Fill,
710 const MCSubtargetInfo &STI) {
711 auto *F = getCurrentFragment();
712 F->makePrefAlign(Alignment, End, EmitNops, Fill);
713 if (EmitNops)
714 F->STI = &STI;
715 newFragment();
716}
717
723
725 const MCExpr *Expr, SMLoc Loc) {
726 std::optional<MCFixupKind> MaybeKind =
727 Assembler->getBackend().getFixupKind(Name);
728 if (!MaybeKind) {
729 getContext().reportError(Loc, "unknown relocation name");
730 return;
731 }
732
733 MCFixupKind Kind = *MaybeKind;
734 if (Expr)
735 visitUsedExpr(*Expr);
736 else
737 Expr =
738 MCSymbolRefExpr::create(getContext().createTempSymbol(), getContext());
739
740 auto *O = &Offset;
741 int64_t Val;
742 if (Offset.evaluateAsAbsolute(Val, nullptr)) {
743 auto *SecSym = getCurrentSectionOnly()->getBeginSymbol();
745 O, getContext(), Loc);
746 }
747 getAssembler().addRelocDirective({*O, Expr, Kind});
748}
749
750void MCObjectStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,
751 SMLoc Loc) {
752 assert(getCurrentSectionOnly() && "need a section");
753 newSpecialFragment<MCFillFragment>(FillValue, 1, NumBytes, Loc);
754}
755
756void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,
757 int64_t Expr, SMLoc Loc) {
758 int64_t IntNumValues;
759 // Do additional checking now if we can resolve the value.
760 if (NumValues.evaluateAsAbsolute(IntNumValues, getAssembler()) &&
761 IntNumValues < 0) {
764 "'.fill' directive with negative repeat count has no effect");
765 return;
766 }
767
768 assert(getCurrentSectionOnly() && "need a section");
770}
771
772void MCObjectStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLength,
773 SMLoc Loc, const MCSubtargetInfo &STI) {
774 assert(getCurrentSectionOnly() && "need a section");
775 newSpecialFragment<MCNopsFragment>(NumBytes, ControlledNopLength, Loc, STI);
776}
777
779 MCAssembler &Asm = getAssembler();
780 Asm.getWriter().addFileName(Filename);
781}
782
784 StringRef CompilerVersion,
785 StringRef TimeStamp,
786 StringRef Description) {
788 W.addFileName(Filename);
789 if (CompilerVersion.size())
790 W.setCompilerVersion(CompilerVersion);
791 // TODO: add TimeStamp and Description to .file symbol table entry
792 // with the integrated assembler.
793}
794
798
802
805
806 // If we are generating dwarf for assembly source files dump out the sections.
807 if (getContext().getGenDwarfForAssembly())
809
810 // Dump out the dwarf file & directory tables and line tables.
811 MCDwarfLineTable::emit(this, getAssembler().getDWARFLinetableParams());
812
813 // Emit pseudo probes for the current module.
815
817}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:343
dxil DXContainer Global Emitter
This file declares the MCLFIRewriter class, an abstract class that encapsulates the rewriting logic f...
static const MCExpr * buildSymbolDiff(MCObjectStreamer &OS, const MCSymbol *A, const MCSymbol *B, SMLoc Loc)
constexpr size_t FragBlockSize
static void emitDwarfSetLineAddr(MCObjectStreamer &OS, MCDwarfLineTableParams Params, int64_t LineDelta, const MCSymbol *Label, int PointerSize)
static std::optional< uint64_t > absoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo)
constexpr size_t NewFragHeadroom
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static constexpr StringLiteral Filename
PowerPC TLS Dynamic Call Fixup
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
LLVM_ABI void emitLineTableForFunction(MCObjectStreamer &OS, unsigned FuncId, const MCSymbol *FuncBegin, const MCSymbol *FuncEnd)
Emits a line table substream.
LLVM_ABI void emitFileChecksums(MCObjectStreamer &OS)
Emits the file checksum substream.
LLVM_ABI void recordCVLoc(MCContext &Ctx, const MCSymbol *Label, unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt)
Saves the information from the currently parsed .cv_loc directive and sets CVLocSeen.
LLVM_ABI void emitDefRange(MCObjectStreamer &OS, ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
LLVM_ABI void emitFileChecksumOffset(MCObjectStreamer &OS, unsigned FileNo)
Emits the offset into the checksum table of the given file number.
LLVM_ABI void emitInlineLineTableForFunction(MCObjectStreamer &OS, unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
LLVM_ABI void emitStringTable(MCObjectStreamer &OS)
Emits the string table substream.
Generic interface to target specific assembler backends.
bool allowEnhancedRelaxation() const
Return true if this target allows an unrelaxable instruction to be emitted into RelaxableFragment and...
virtual void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const
Relax the instruction in the given fragment to the next wider instruction.
virtual bool mayNeedRelaxation(unsigned Opcode, ArrayRef< MCOperand > Operands, const MCSubtargetInfo &STI) const
Check whether the given instruction (encoded as Opcode+Operands) may need relaxation.
virtual uint64_t generateCompactUnwindEncoding(const MCDwarfFrameInfo *FI, const MCContext *Ctxt) const
Generate the compact unwind encoding for the CFI instructions.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:67
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Definition MCAsmInfo.h:454
LLVM_ABI void Finish()
Finish - Do final processing and write the object to the output stream.
MCObjectWriter & getWriter() const
LLVM_ABI void addRelocDirective(RelocDirective RD)
MCCodeEmitter & getEmitter() const
MCAsmBackend & getBackend() const
LLVM_ABI bool registerSection(MCSection &Section)
LLVM_ABI bool registerSymbol(const MCSymbol &Symbol)
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:342
static LLVM_ABI const MCBinaryExpr * create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.cpp:201
@ Sub
Subtraction.
Definition MCExpr.h:323
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI void RemapDebugPaths()
void clearDwarfLocSeen()
Definition MCContext.h:767
LLVM_ABI CodeViewContext & getCVContext()
const SourceMgr * getSourceManager() const
Definition MCContext.h:398
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
static LLVM_ABI void emit(MCObjectStreamer &streamer, bool isEH)
Definition MCDwarf.cpp:2163
static LLVM_ABI void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
Definition MCDwarf.cpp:729
static LLVM_ABI void encode(MCContext &Context, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta, SmallVectorImpl< char > &OS)
Utility function to encode a Dwarf pair of LineDelta and AddrDeltas.
Definition MCDwarf.cpp:744
static LLVM_ABI void make(MCStreamer *MCOS, MCSection *Section)
Definition MCDwarf.cpp:91
static LLVM_ABI void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
Definition MCDwarf.cpp:307
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
static MCFixupKind getDataKindForSize(unsigned Size)
Return the generic fixup kind for a value with the given size.
Definition MCFixup.h:110
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, bool PCRel=false)
Consider bit fields if we need more flags.
Definition MCFixup.h:86
FragmentType getKind() const
Definition MCSection.h:179
static LLVM_ABI void Emit(MCStreamer *MCOS)
Definition MCDwarf.cpp:1204
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
unsigned getOpcode() const
Definition MCInst.h:202
ArrayRef< MCOperand > getOperands() const
Definition MCInst.h:214
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.
FT * newSpecialFragment(Args &&...args)
void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=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 emitCFISections(bool EH, bool Debug, bool SFrame) override
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
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.
MCAssembler & getAssembler()
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 emitWeakReference(MCSymbol *Alias, const MCSymbol *Target) override
Emit an weak reference from Alias to Symbol.
void appendContents(ArrayRef< char > Contents)
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 emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc={}) override
Record a relocation described by the .reloc directive.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitPendingAssignments(MCSymbol *Symbol)
Emits pending conditional assignments that depend on Symbol being emitted.
void addFixup(const MCExpr *Value, MCFixupKind Kind)
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo &STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitFileDirective(StringRef Filename) override
Switch to a new logical file.
void emitSFrameCalculateFuncOffset(const MCSymbol *FunCabsel, const MCSymbol *FREBegin, MCFragment *FDEFrag, SMLoc Loc)
void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName, StringRef Comment={}) override
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
MCSymbol * emitCFILabel() override
When emitting an object file, create and emit a real label.
void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion) override
This implements the CodeView '.cv_def_range' assembler directive.
MCAssembler * getAssemblerPtr() override
void emitAddrsigSym(const MCSymbol *Sym) override
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 emitPrefAlign(Align Alignment, const MCSymbol &End, bool EmitNops, uint8_t Fill, const MCSubtargetInfo &STI) override
void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &)
Emit an instruction to a special fragment, because this instruction can change its size during relaxa...
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment &F, uint64_t Offset)
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
MCObjectStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
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.
MCFragment * allocFragSpace(size_t Headroom)
void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, const MCSymbol *Label, SMLoc Loc)
bool mayHaveInstructions(MCSection &Sec) const override
~MCObjectStreamer() override
void ensureHeadroom(size_t Headroom)
void emitCVFileChecksumOffsetDirective(unsigned FileNo) override
This implements the CodeView '.cv_filechecksumoffset' assembler directive.
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 emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc) override
Emit some number of copies of Value until the byte offset Offset is reached.
uint8_t * getCurFragEnd() const
void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) override
Emit the absolute difference between two symbols if possible.
Defines the object file and target independent interfaces used by the assembler backend to write nati...
void emitAddrsigSection()
Tell the object writer to emit an address-significance table during writeObject().
void addAddrsigSymbol(const MCSymbol *Sym)
Record the given symbol in the address-significance table to be written diring writeObject().
static LLVM_ABI void emit(MCObjectStreamer *MCOS)
static LLVM_ABI void emit(MCObjectStreamer &Streamer)
Definition MCSFrame.cpp:588
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
bool hasInstructions() const
Definition MCSection.h:676
void setHasInstructions(bool Value)
Definition MCSection.h:677
MCSymbol * getBeginSymbol()
Definition MCSection.h:653
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
bool checkCVLocSection(unsigned FuncId, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
std::unique_ptr< MCLFIRewriter > LFIRewriter
Definition MCStreamer.h:299
virtual void emitCFISections(bool EH, bool Debug, bool SFrame)
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
MCFragment * getCurrentFragment() const
Definition MCStreamer.h:449
SmallVector< MCDwarfFrameInfo, 0 > DwarfFrameInfos
Definition MCStreamer.h:273
virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo)
Emit the absolute difference between two symbols encoded with ULEB128.
bool getUseAssemblerInfoForParsing()
Definition MCStreamer.h:334
MCContext & getContext() const
Definition MCStreamer.h:326
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.
virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size)
Emit the absolute difference between two symbols.
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
void setAllowAutoPadding(bool v)
Definition MCStreamer.h:340
virtual void reset()
State management.
virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName, StringRef Comment={})
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
MCStreamer(MCContext &Ctx)
MCFragment * CurFrag
Definition MCStreamer.h:271
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.
unsigned getNumFrameInfos()
size_t getCurFragSize() const
Definition MCStreamer.h:458
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...
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 emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
This implements the CodeView '.cv_def_range' assembler directive.
MCSection * getCurrentSectionOnly() const
Definition MCStreamer.h:438
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 addFragment(MCFragment *F)
unsigned emitSLEB128IntValue(int64_t Value)
Special case of EmitSLEB128Value that avoids the client having to pass in a MCExpr for constant integ...
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
void visitUsedExpr(const MCExpr &Expr)
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Represents a location in source code.
Definition SMLoc.h:22
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM_ABI void PrintMessage(raw_ostream &OS, SMLoc Loc, DiagKind Kind, const Twine &Msg, ArrayRef< SMRange > Ranges={}, ArrayRef< SMFixIt > FixIts={}, bool ShowColors=true) const
Emit a message about the specified location with the specified string.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
LLVM Value Representation.
Definition Value.h:75
This class represents a function that is read from a sample profile.
Definition FunctionId.h:36
#define INT64_MAX
Definition DataTypes.h:71
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
@ Debug
Register 'use' is for debugging purpose.
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:244
uint16_t MCFixupKind
Extensible enumeration to represent the type of a fixup.
Definition MCFixup.h:22
constexpr T alignToPowerOf2(U Value, V Align)
Will overflow only if result is not representable in T.
Definition MathExtras.h:494
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition MathExtras.h:249
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77