LLVM 19.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"
20#include "llvm/MC/MCSection.h"
21#include "llvm/MC/MCSymbol.h"
22#include "llvm/MC/MCValue.h"
25using namespace llvm;
26
28 std::unique_ptr<MCAsmBackend> TAB,
29 std::unique_ptr<MCObjectWriter> OW,
30 std::unique_ptr<MCCodeEmitter> Emitter)
32 Assembler(std::make_unique<MCAssembler>(
33 Context, std::move(TAB), std::move(Emitter), std::move(OW))),
34 EmitEHFrame(true), EmitDebugFrame(false) {
35 if (Assembler->getBackendPtr())
36 setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
37 if (Context.getTargetOptions() && Context.getTargetOptions()->MCRelaxAll)
38 Assembler->setRelaxAll(true);
39}
40
42
43// AssemblerPtr is used for evaluation of expressions and causes
44// difference between asm and object outputs. Return nullptr to in
45// inline asm mode to limit divergence to assembly inputs.
48 return Assembler.get();
49 return nullptr;
50}
51
53 MCSection *CurSection = getCurrentSectionOnly();
54 if (CurSection) {
55 // Register labels that have not yet been assigned to a Section.
56 if (!PendingLabels.empty()) {
57 for (MCSymbol* Sym : PendingLabels)
58 CurSection->addPendingLabel(Sym);
59 PendingLabels.clear();
60 }
61
62 // Add this label to the current Section / Subsection.
63 CurSection->addPendingLabel(S, CurSubsectionIdx);
64
65 // Add this Section to the list of PendingLabelSections.
66 PendingLabelSections.insert(CurSection);
67 } else
68 // There is no Section / Subsection for this label yet.
69 PendingLabels.push_back(S);
70}
71
73 assert(F);
74 MCSection *CurSection = getCurrentSectionOnly();
75 if (!CurSection) {
76 assert(PendingLabels.empty());
77 return;
78 }
79 // Register labels that have not yet been assigned to a Section.
80 if (!PendingLabels.empty()) {
81 for (MCSymbol* Sym : PendingLabels)
82 CurSection->addPendingLabel(Sym, CurSubsectionIdx);
83 PendingLabels.clear();
84 }
85
86 // Associate the labels with F.
87 CurSection->flushPendingLabels(F, FOffset, CurSubsectionIdx);
88}
89
91 // Register labels that have not yet been assigned to a Section.
92 if (!PendingLabels.empty()) {
93 MCSection *CurSection = getCurrentSectionOnly();
94 assert(CurSection);
95 for (MCSymbol* Sym : PendingLabels)
96 CurSection->addPendingLabel(Sym, CurSubsectionIdx);
97 PendingLabels.clear();
98 }
99
100 // Assign an empty data fragment to all remaining pending labels.
101 for (MCSection* Section : PendingLabelSections)
102 Section->flushPendingLabels();
103}
104
105// When fixup's offset is a forward declared label, e.g.:
106//
107// .reloc 1f, R_MIPS_JALR, foo
108// 1: nop
109//
110// postpone adding it to Fixups vector until the label is defined and its offset
111// is known.
112void MCObjectStreamer::resolvePendingFixups() {
113 for (PendingMCFixup &PendingFixup : PendingFixups) {
114 if (!PendingFixup.Sym || PendingFixup.Sym->isUndefined ()) {
115 getContext().reportError(PendingFixup.Fixup.getLoc(),
116 "unresolved relocation offset");
117 continue;
118 }
119 flushPendingLabels(PendingFixup.DF, PendingFixup.DF->getContents().size());
120 PendingFixup.Fixup.setOffset(PendingFixup.Sym->getOffset() +
121 PendingFixup.Fixup.getOffset());
122
123 // If the location symbol to relocate is in MCEncodedFragmentWithFixups,
124 // put the Fixup into location symbol's fragment. Otherwise
125 // put into PendingFixup.DF
126 MCFragment *SymFragment = PendingFixup.Sym->getFragment();
127 switch (SymFragment->getKind()) {
131 cast<MCEncodedFragmentWithFixups<8, 1>>(SymFragment)
132 ->getFixups()
133 .push_back(PendingFixup.Fixup);
134 break;
137 cast<MCEncodedFragmentWithFixups<32, 4>>(SymFragment)
138 ->getFixups()
139 .push_back(PendingFixup.Fixup);
140 break;
141 default:
142 PendingFixup.DF->getFixups().push_back(PendingFixup.Fixup);
143 break;
144 }
145 }
146 PendingFixups.clear();
147}
148
149// As a compile-time optimization, avoid allocating and evaluating an MCExpr
150// tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment.
151static std::optional<uint64_t> absoluteSymbolDiff(const MCSymbol *Hi,
152 const MCSymbol *Lo) {
153 assert(Hi && Lo);
154 if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment() ||
155 Hi->isVariable() || Lo->isVariable())
156 return std::nullopt;
157
158 return Hi->getOffset() - Lo->getOffset();
159}
160
162 const MCSymbol *Lo,
163 unsigned Size) {
164 if (!getAssembler().getContext().getTargetTriple().isRISCV())
165 if (std::optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo))
166 return emitIntValue(*Diff, Size);
168}
169
171 const MCSymbol *Lo) {
172 if (!getAssembler().getContext().getTargetTriple().isRISCV())
173 if (std::optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo)) {
174 emitULEB128IntValue(*Diff);
175 return;
176 }
178}
179
181 if (Assembler)
182 Assembler->reset();
183 CurInsertionPoint = MCSection::iterator();
184 EmitEHFrame = true;
185 EmitDebugFrame = false;
186 PendingLabels.clear();
187 PendingLabelSections.clear();
189}
190
192 if (!getNumFrameInfos())
193 return;
194
195 if (EmitEHFrame)
196 MCDwarfFrameEmitter::Emit(*this, MAB, true);
197
198 if (EmitDebugFrame)
199 MCDwarfFrameEmitter::Emit(*this, MAB, false);
200}
201
203 assert(getCurrentSectionOnly() && "No current section!");
204
205 if (CurInsertionPoint != getCurrentSectionOnly()->getFragmentList().begin())
206 return &*std::prev(CurInsertionPoint);
207
208 return nullptr;
209}
210
212 const MCAssembler &Assembler,
213 const MCSubtargetInfo *STI) {
214 if (!F.hasInstructions())
215 return true;
216 // Do not add data after a linker-relaxable instruction. The difference
217 // between a new label and a label at or before the linker-relaxable
218 // instruction cannot be resolved at assemble-time.
219 if (F.isLinkerRelaxable())
220 return false;
221 // When bundling is enabled, we don't want to add data to a fragment that
222 // already has instructions (see MCELFStreamer::emitInstToData for details)
223 if (Assembler.isBundlingEnabled())
224 return Assembler.getRelaxAll();
225 // If the subtarget is changed mid fragment we start a new fragment to record
226 // the new STI.
227 return !STI || F.getSubtargetInfo() == STI;
228}
229
232 MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
233 if (!F || !canReuseDataFragment(*F, *Assembler, STI)) {
234 F = new MCDataFragment();
235 insert(F);
236 }
237 return F;
238}
239
241 Assembler->registerSymbol(Sym);
242}
243
246 EmitEHFrame = EH;
247 EmitDebugFrame = Debug;
248}
249
251 SMLoc Loc) {
254 flushPendingLabels(DF, DF->getContents().size());
255
257
258 // Avoid fixups when possible.
259 int64_t AbsValue;
260 if (Value->evaluateAsAbsolute(AbsValue, getAssemblerPtr())) {
261 if (!isUIntN(8 * Size, AbsValue) && !isIntN(8 * Size, AbsValue)) {
263 Loc, "value evaluated as " + Twine(AbsValue) + " is out of range.");
264 return;
265 }
266 emitIntValue(AbsValue, Size);
267 return;
268 }
269 DF->getFixups().push_back(
270 MCFixup::create(DF->getContents().size(), Value,
271 MCFixup::getKindForSize(Size, false), Loc));
272 DF->getContents().resize(DF->getContents().size() + Size, 0);
273}
274
275MCSymbol *MCObjectStreamer::emitCFILabel() {
276 MCSymbol *Label = getContext().createTempSymbol("cfi");
277 emitLabel(Label);
278 return Label;
279}
280
281void MCObjectStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
282 // We need to create a local symbol to avoid relocations.
284 emitLabel(Frame.Begin);
285}
286
287void MCObjectStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
288 Frame.End = getContext().createTempSymbol();
289 emitLabel(Frame.End);
290}
291
293 MCStreamer::emitLabel(Symbol, Loc);
294
295 getAssembler().registerSymbol(*Symbol);
296
297 // If there is a current fragment, mark the symbol as pointing into it.
298 // Otherwise queue the label and set its fragment pointer when we emit the
299 // next fragment.
300 auto *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
301 if (F && !(getAssembler().isBundlingEnabled() &&
302 getAssembler().getRelaxAll())) {
303 Symbol->setFragment(F);
304 Symbol->setOffset(F->getContents().size());
305 } else {
306 // Assign all pending labels to offset 0 within the dummy "pending"
307 // fragment. (They will all be reassigned to a real fragment in
308 // flushPendingLabels())
309 Symbol->setOffset(0);
310 addPendingLabel(Symbol);
311 }
312
314}
315
317 auto Assignments = pendingAssignments.find(Symbol);
318 if (Assignments != pendingAssignments.end()) {
319 for (const PendingAssignment &A : Assignments->second)
320 emitAssignment(A.Symbol, A.Value);
321
322 pendingAssignments.erase(Assignments);
323 }
324}
325
326// Emit a label at a previously emitted fragment/offset position. This must be
327// within the currently-active section.
330 assert(F->getParent() == getCurrentSectionOnly());
331
332 MCStreamer::emitLabel(Symbol, Loc);
333 getAssembler().registerSymbol(*Symbol);
334 auto *DF = dyn_cast_or_null<MCDataFragment>(F);
335 Symbol->setOffset(Offset);
336 if (DF) {
337 Symbol->setFragment(F);
338 } else {
339 assert(isa<MCDummyFragment>(F) &&
340 "F must either be an MCDataFragment or the pending MCDummyFragment");
341 assert(Offset == 0);
342 addPendingLabel(Symbol);
343 }
344}
345
347 int64_t IntValue;
348 if (Value->evaluateAsAbsolute(IntValue, getAssemblerPtr())) {
349 emitULEB128IntValue(IntValue);
350 return;
351 }
352 insert(new MCLEBFragment(*Value, false));
353}
354
356 int64_t IntValue;
357 if (Value->evaluateAsAbsolute(IntValue, getAssemblerPtr())) {
358 emitSLEB128IntValue(IntValue);
359 return;
360 }
361 insert(new MCLEBFragment(*Value, true));
362}
363
365 const MCSymbol *Symbol) {
366 report_fatal_error("This file format doesn't support weak aliases.");
367}
368
370 const MCExpr *Subsection) {
371 changeSectionImpl(Section, Subsection);
372}
373
375 const MCExpr *Subsection) {
376 assert(Section && "Cannot switch to a null section!");
378
379 bool Created = getAssembler().registerSection(*Section);
380
381 int64_t IntSubsection = 0;
382 if (Subsection &&
383 !Subsection->evaluateAsAbsolute(IntSubsection, getAssemblerPtr())) {
384 getContext().reportError(Subsection->getLoc(),
385 "cannot evaluate subsection number");
386 }
387 if (!isUInt<31>(IntSubsection)) {
388 getContext().reportError(Subsection->getLoc(),
389 "subsection number " + Twine(IntSubsection) +
390 " is not within [0,2147483647]");
391 }
392
393 CurSubsectionIdx = unsigned(IntSubsection);
394 CurInsertionPoint =
395 Section->getSubsectionInsertionPoint(CurSubsectionIdx);
396 return Created;
397}
398
400 getAssembler().registerSymbol(*Symbol);
403}
404
406 const MCExpr *Value) {
407 const MCSymbol *Target = &cast<MCSymbolRefExpr>(*Value).getSymbol();
408
409 // If the symbol already exists, emit the assignment. Otherwise, emit it
410 // later only if the symbol is also emitted.
411 if (Target->isRegistered())
412 emitAssignment(Symbol, Value);
413 else
414 pendingAssignments[Target].push_back({Symbol, Value});
415}
416
418 return Sec.hasInstructions();
419}
420
422 const MCSubtargetInfo &STI) {
423 const MCSection &Sec = *getCurrentSectionOnly();
424 if (Sec.isVirtualSection()) {
426 " section '" + Sec.getName() +
427 "' cannot have instructions");
428 return;
429 }
430 getAssembler().getBackend().emitInstructionBegin(*this, Inst, STI);
431 emitInstructionImpl(Inst, STI);
433}
434
435void MCObjectStreamer::emitInstructionImpl(const MCInst &Inst,
436 const MCSubtargetInfo &STI) {
438
440 Sec->setHasInstructions(true);
441
442 // Now that a machine instruction has been assembled into this section, make
443 // a line entry for any .loc directive that has been seen.
445
446 // If this instruction doesn't need relaxation, just emit it as data.
447 MCAssembler &Assembler = getAssembler();
448 MCAsmBackend &Backend = Assembler.getBackend();
449 if (!(Backend.mayNeedRelaxation(Inst, STI) ||
450 Backend.allowEnhancedRelaxation())) {
451 emitInstToData(Inst, STI);
452 return;
453 }
454
455 // Otherwise, relax and emit it as data if either:
456 // - The RelaxAll flag was passed
457 // - Bundling is enabled and this instruction is inside a bundle-locked
458 // group. We want to emit all such instructions into the same data
459 // fragment.
460 if (Assembler.getRelaxAll() ||
461 (Assembler.isBundlingEnabled() && Sec->isBundleLocked())) {
462 MCInst Relaxed = Inst;
463 while (Backend.mayNeedRelaxation(Relaxed, STI))
464 Backend.relaxInstruction(Relaxed, STI);
465 emitInstToData(Relaxed, STI);
466 return;
467 }
468
469 // Otherwise emit to a separate fragment.
470 emitInstToFragment(Inst, STI);
471}
472
474 const MCSubtargetInfo &STI) {
475 if (getAssembler().getRelaxAll() && getAssembler().isBundlingEnabled())
476 llvm_unreachable("All instructions should have already been relaxed");
477
478 // Always create a new, separate fragment here, because its size can change
479 // during relaxation.
480 MCRelaxableFragment *IF = new MCRelaxableFragment(Inst, STI);
481 insert(IF);
482
483 SmallString<128> Code;
484 getAssembler().getEmitter().encodeInstruction(Inst, Code, IF->getFixups(),
485 STI);
486 IF->getContents().append(Code.begin(), Code.end());
487}
488
489#ifndef NDEBUG
490static const char *const BundlingNotImplementedMsg =
491 "Aligned bundling is not implemented for this object format";
492#endif
493
496}
497
498void MCObjectStreamer::emitBundleLock(bool AlignToEnd) {
500}
501
504}
505
506void MCObjectStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
507 unsigned Column, unsigned Flags,
508 unsigned Isa,
509 unsigned Discriminator,
510 StringRef FileName) {
511 // In case we see two .loc directives in a row, make sure the
512 // first one gets a line entry.
514
515 this->MCStreamer::emitDwarfLocDirective(FileNo, Line, Column, Flags, Isa,
516 Discriminator, FileName);
517}
518
520 const MCSymbol *B, SMLoc Loc) {
521 MCContext &Context = OS.getContext();
523 const MCExpr *ARef = MCSymbolRefExpr::create(A, Variant, Context);
524 const MCExpr *BRef = MCSymbolRefExpr::create(B, Variant, Context);
525 const MCExpr *AddrDelta =
527 return AddrDelta;
528}
529
532 int64_t LineDelta, const MCSymbol *Label,
533 int PointerSize) {
534 // emit the sequence to set the address
535 OS.emitIntValue(dwarf::DW_LNS_extended_op, 1);
536 OS.emitULEB128IntValue(PointerSize + 1);
537 OS.emitIntValue(dwarf::DW_LNE_set_address, 1);
538 OS.emitSymbolValue(Label, PointerSize);
539
540 // emit the sequence for the LineDelta (from 1) and a zero address delta.
541 MCDwarfLineAddr::Emit(&OS, Params, LineDelta, 0);
542}
543
545 const MCSymbol *LastLabel,
546 const MCSymbol *Label,
547 unsigned PointerSize) {
548 if (!LastLabel) {
549 emitDwarfSetLineAddr(*this, Assembler->getDWARFLinetableParams(), LineDelta,
550 Label, PointerSize);
551 return;
552 }
553 const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel, SMLoc());
554 insert(new MCDwarfLineAddrFragment(LineDelta, *AddrDelta));
555}
556
558 MCSymbol *LastLabel) {
559 // Emit a DW_LNE_end_sequence for the end of the section.
560 // Use the section end label to compute the address delta and use INT64_MAX
561 // as the line delta which is the signal that this is actually a
562 // DW_LNE_end_sequence.
563 MCSymbol *SectionEnd = endSection(Section);
564
565 // Switch back the dwarf line section, in case endSection had to switch the
566 // section.
567 MCContext &Ctx = getContext();
569
570 const MCAsmInfo *AsmInfo = Ctx.getAsmInfo();
571 emitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
572 AsmInfo->getCodePointerSize());
573}
574
576 const MCSymbol *Label,
577 SMLoc Loc) {
578 const MCExpr *AddrDelta = buildSymbolDiff(*this, Label, LastLabel, Loc);
579 insert(new MCDwarfCallFrameFragment(*AddrDelta, nullptr));
580}
581
583 unsigned Line, unsigned Column,
584 bool PrologueEnd, bool IsStmt,
585 StringRef FileName, SMLoc Loc) {
586 // Validate the directive.
587 if (!checkCVLocSection(FunctionId, FileNo, Loc))
588 return;
589
590 // Emit a label at the current position and record it in the CodeViewContext.
591 MCSymbol *LineSym = getContext().createTempSymbol();
592 emitLabel(LineSym);
594 FileNo, Line, Column, PrologueEnd,
595 IsStmt);
596}
597
599 const MCSymbol *Begin,
600 const MCSymbol *End) {
602 End);
603 this->MCStreamer::emitCVLinetableDirective(FunctionId, Begin, End);
604}
605
607 unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum,
608 const MCSymbol *FnStartSym, const MCSymbol *FnEndSym) {
610 *this, PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym,
611 FnEndSym);
613 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
614}
615
617 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
618 StringRef FixedSizePortion) {
619 MCFragment *Frag =
620 getContext().getCVContext().emitDefRange(*this, Ranges, FixedSizePortion);
621 // Attach labels that were pending before we created the defrange fragment to
622 // the beginning of the new fragment.
623 flushPendingLabels(Frag, 0);
624 this->MCStreamer::emitCVDefRangeDirective(Ranges, FixedSizePortion);
625}
626
629}
632}
633
636}
637
641 flushPendingLabels(DF, DF->getContents().size());
642 DF->getContents().append(Data.begin(), Data.end());
643}
644
646 unsigned ValueSize,
647 unsigned MaxBytesToEmit) {
648 if (MaxBytesToEmit == 0)
649 MaxBytesToEmit = Alignment.value();
650 insert(new MCAlignFragment(Alignment, Value, ValueSize, MaxBytesToEmit));
651
652 // Update the maximum alignment on the current section if necessary.
654 CurSec->ensureMinAlignment(Alignment);
655}
656
658 const MCSubtargetInfo *STI,
659 unsigned MaxBytesToEmit) {
660 emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
661 cast<MCAlignFragment>(getCurrentFragment())->setEmitNops(true, STI);
662}
663
665 unsigned char Value,
666 SMLoc Loc) {
667 insert(new MCOrgFragment(*Offset, Value, Loc));
668}
669
670// Associate DTPRel32 fixup with data and resize data area
673 flushPendingLabels(DF, DF->getContents().size());
674
675 DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
677 DF->getContents().resize(DF->getContents().size() + 4, 0);
678}
679
680// Associate DTPRel64 fixup with data and resize data area
683 flushPendingLabels(DF, DF->getContents().size());
684
685 DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
687 DF->getContents().resize(DF->getContents().size() + 8, 0);
688}
689
690// Associate TPRel32 fixup with data and resize data area
693 flushPendingLabels(DF, DF->getContents().size());
694
695 DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
696 Value, FK_TPRel_4));
697 DF->getContents().resize(DF->getContents().size() + 4, 0);
698}
699
700// Associate TPRel64 fixup with data and resize data area
703 flushPendingLabels(DF, DF->getContents().size());
704
705 DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
706 Value, FK_TPRel_8));
707 DF->getContents().resize(DF->getContents().size() + 8, 0);
708}
709
710// Associate GPRel32 fixup with data and resize data area
713 flushPendingLabels(DF, DF->getContents().size());
714
715 DF->getFixups().push_back(
716 MCFixup::create(DF->getContents().size(), Value, FK_GPRel_4));
717 DF->getContents().resize(DF->getContents().size() + 4, 0);
718}
719
720// Associate GPRel64 fixup with data and resize data area
723 flushPendingLabels(DF, DF->getContents().size());
724
725 DF->getFixups().push_back(
726 MCFixup::create(DF->getContents().size(), Value, FK_GPRel_4));
727 DF->getContents().resize(DF->getContents().size() + 8, 0);
728}
729
730static std::optional<std::pair<bool, std::string>>
731getOffsetAndDataFragment(const MCSymbol &Symbol, uint32_t &RelocOffset,
732 MCDataFragment *&DF) {
733 if (Symbol.isVariable()) {
734 const MCExpr *SymbolExpr = Symbol.getVariableValue();
735 MCValue OffsetVal;
736 if(!SymbolExpr->evaluateAsRelocatable(OffsetVal, nullptr, nullptr))
737 return std::make_pair(false,
738 std::string("symbol in .reloc offset is not "
739 "relocatable"));
740 if (OffsetVal.isAbsolute()) {
741 RelocOffset = OffsetVal.getConstant();
742 MCFragment *Fragment = Symbol.getFragment();
743 // FIXME Support symbols with no DF. For example:
744 // .reloc .data, ENUM_VALUE, <some expr>
745 if (!Fragment || Fragment->getKind() != MCFragment::FT_Data)
746 return std::make_pair(false,
747 std::string("symbol in offset has no data "
748 "fragment"));
749 DF = cast<MCDataFragment>(Fragment);
750 return std::nullopt;
751 }
752
753 if (OffsetVal.getSymB())
754 return std::make_pair(false,
755 std::string(".reloc symbol offset is not "
756 "representable"));
757
758 const MCSymbolRefExpr &SRE = cast<MCSymbolRefExpr>(*OffsetVal.getSymA());
759 if (!SRE.getSymbol().isDefined())
760 return std::make_pair(false,
761 std::string("symbol used in the .reloc offset is "
762 "not defined"));
763
764 if (SRE.getSymbol().isVariable())
765 return std::make_pair(false,
766 std::string("symbol used in the .reloc offset is "
767 "variable"));
768
769 MCFragment *Fragment = SRE.getSymbol().getFragment();
770 // FIXME Support symbols with no DF. For example:
771 // .reloc .data, ENUM_VALUE, <some expr>
772 if (!Fragment || Fragment->getKind() != MCFragment::FT_Data)
773 return std::make_pair(false,
774 std::string("symbol in offset has no data "
775 "fragment"));
776 RelocOffset = SRE.getSymbol().getOffset() + OffsetVal.getConstant();
777 DF = cast<MCDataFragment>(Fragment);
778 } else {
779 RelocOffset = Symbol.getOffset();
780 MCFragment *Fragment = Symbol.getFragment();
781 // FIXME Support symbols with no DF. For example:
782 // .reloc .data, ENUM_VALUE, <some expr>
783 if (!Fragment || Fragment->getKind() != MCFragment::FT_Data)
784 return std::make_pair(false,
785 std::string("symbol in offset has no data "
786 "fragment"));
787 DF = cast<MCDataFragment>(Fragment);
788 }
789 return std::nullopt;
790}
791
792std::optional<std::pair<bool, std::string>>
794 const MCExpr *Expr, SMLoc Loc,
795 const MCSubtargetInfo &STI) {
796 std::optional<MCFixupKind> MaybeKind =
797 Assembler->getBackend().getFixupKind(Name);
798 if (!MaybeKind)
799 return std::make_pair(true, std::string("unknown relocation name"));
800
801 MCFixupKind Kind = *MaybeKind;
802 if (Expr)
803 visitUsedExpr(*Expr);
804 else
805 Expr =
806 MCSymbolRefExpr::create(getContext().createTempSymbol(), getContext());
807
809 flushPendingLabels(DF, DF->getContents().size());
810
811 MCValue OffsetVal;
812 if (!Offset.evaluateAsRelocatable(OffsetVal, nullptr, nullptr))
813 return std::make_pair(false,
814 std::string(".reloc offset is not relocatable"));
815 if (OffsetVal.isAbsolute()) {
816 if (OffsetVal.getConstant() < 0)
817 return std::make_pair(false, std::string(".reloc offset is negative"));
818 DF->getFixups().push_back(
819 MCFixup::create(OffsetVal.getConstant(), Expr, Kind, Loc));
820 return std::nullopt;
821 }
822 if (OffsetVal.getSymB())
823 return std::make_pair(false,
824 std::string(".reloc offset is not representable"));
825
826 const MCSymbolRefExpr &SRE = cast<MCSymbolRefExpr>(*OffsetVal.getSymA());
827 const MCSymbol &Symbol = SRE.getSymbol();
828 if (Symbol.isDefined()) {
829 uint32_t SymbolOffset = 0;
830 std::optional<std::pair<bool, std::string>> Error =
831 getOffsetAndDataFragment(Symbol, SymbolOffset, DF);
832
833 if (Error != std::nullopt)
834 return Error;
835
836 DF->getFixups().push_back(
837 MCFixup::create(SymbolOffset + OffsetVal.getConstant(),
838 Expr, Kind, Loc));
839 return std::nullopt;
840 }
841
842 PendingFixups.emplace_back(
843 &SRE.getSymbol(), DF,
844 MCFixup::create(OffsetVal.getConstant(), Expr, Kind, Loc));
845 return std::nullopt;
846}
847
848void MCObjectStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,
849 SMLoc Loc) {
851 flushPendingLabels(DF, DF->getContents().size());
852
853 assert(getCurrentSectionOnly() && "need a section");
854 insert(new MCFillFragment(FillValue, 1, NumBytes, Loc));
855}
856
857void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,
858 int64_t Expr, SMLoc Loc) {
859 int64_t IntNumValues;
860 // Do additional checking now if we can resolve the value.
861 if (NumValues.evaluateAsAbsolute(IntNumValues, getAssemblerPtr())) {
862 if (IntNumValues < 0) {
865 "'.fill' directive with negative repeat count has no effect");
866 return;
867 }
868 // Emit now if we can for better errors.
869 int64_t NonZeroSize = Size > 4 ? 4 : Size;
870 Expr &= ~0ULL >> (64 - NonZeroSize * 8);
871 for (uint64_t i = 0, e = IntNumValues; i != e; ++i) {
872 emitIntValue(Expr, NonZeroSize);
873 if (NonZeroSize < Size)
874 emitIntValue(0, Size - NonZeroSize);
875 }
876 return;
877 }
878
879 // Otherwise emit as fragment.
881 flushPendingLabels(DF, DF->getContents().size());
882
883 assert(getCurrentSectionOnly() && "need a section");
884 insert(new MCFillFragment(Expr, Size, NumValues, Loc));
885}
886
887void MCObjectStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLength,
888 SMLoc Loc, const MCSubtargetInfo &STI) {
889 // Emit an NOP fragment.
891 flushPendingLabels(DF, DF->getContents().size());
892
893 assert(getCurrentSectionOnly() && "need a section");
894
895 insert(new MCNopsFragment(NumBytes, ControlledNopLength, Loc, STI));
896}
897
899 getAssembler().addFileName(Filename);
900}
901
903 StringRef CompilerVersion,
904 StringRef TimeStamp,
905 StringRef Description) {
906 getAssembler().addFileName(Filename);
907 getAssembler().setCompilerVersion(CompilerVersion.str());
908 // TODO: add TimeStamp and Description to .file symbol table entry
909 // with the integrated assembler.
910}
911
914}
915
918}
919
922
923 // If we are generating dwarf for assembly source files dump out the sections.
924 if (getContext().getGenDwarfForAssembly())
926
927 // Dump out the dwarf file & directory tables and line tables.
928 MCDwarfLineTable::emit(this, getAssembler().getDWARFLinetableParams());
929
930 // Emit pseudo probes for the current module.
932
933 // Update any remaining pending labels with empty data fragments.
935
936 resolvePendingFixups();
938}
basic Basic Alias true
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
dxil DXContainer Global Emitter
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
std::string Name
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
Symbol * Sym
Definition: ELF_riscv.cpp:479
static const MCExpr * buildSymbolDiff(MCObjectStreamer &OS, const MCSymbol *A, const MCSymbol *B, SMLoc Loc)
static const char *const BundlingNotImplementedMsg
static std::optional< std::pair< bool, std::string > > getOffsetAndDataFragment(const MCSymbol &Symbol, uint32_t &RelocOffset, MCDataFragment *&DF)
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)
static bool canReuseDataFragment(const MCDataFragment &F, const MCAssembler &Assembler, const MCSubtargetInfo *STI)
#define F(x, y, z)
Definition: MD5.cpp:55
LLVMContext & Context
bool Debug
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
void emitLineTableForFunction(MCObjectStreamer &OS, unsigned FuncId, const MCSymbol *FuncBegin, const MCSymbol *FuncEnd)
Emits a line table substream.
Definition: MCCodeView.cpp:350
void emitFileChecksums(MCObjectStreamer &OS)
Emits the file checksum substream.
Definition: MCCodeView.cpp:193
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.
Definition: MCCodeView.cpp:131
void emitFileChecksumOffset(MCObjectStreamer &OS, unsigned FileNo)
Emits the offset into the checksum table of the given file number.
Definition: MCCodeView.cpp:248
void emitInlineLineTableForFunction(MCObjectStreamer &OS, unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
Definition: MCCodeView.cpp:445
void emitStringTable(MCObjectStreamer &OS)
Emits the string table substream.
Definition: MCCodeView.cpp:171
MCFragment * emitDefRange(MCObjectStreamer &OS, ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
Definition: MCCodeView.cpp:458
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:43
virtual bool allowEnhancedRelaxation() const
Return true if this target allows an unrelaxable instruction to be emitted into RelaxableFragment and...
Definition: MCAsmBackend.h:63
virtual void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const
Relax the instruction in the given fragment to the next wider instruction.
Definition: MCAsmBackend.h:186
virtual bool mayNeedRelaxation(const MCInst &Inst, const MCSubtargetInfo &STI) const
Check whether the given instruction may need relaxation.
Definition: MCAsmBackend.h:163
virtual void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst)
Definition: MCAsmBackend.h:70
virtual void emitInstructionBegin(MCObjectStreamer &OS, const MCInst &Inst, const MCSubtargetInfo &STI)
Give the target a chance to manipulate state related to instruction alignment (e.g.
Definition: MCAsmBackend.h:68
virtual std::optional< MCFixupKind > getFixupKind(StringRef Name) const
Map a relocation name used in .reloc to a fixup kind.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Definition: MCAsmInfo.h:546
void Finish()
Finish - Do final processing and write the object to the output stream.
bool isBundlingEnabled() const
Definition: MCAssembler.h:365
MCObjectWriter & getWriter() const
Definition: MCAssembler.h:338
bool getRelaxAll() const
Definition: MCAssembler.h:362
MCCodeEmitter & getEmitter() const
Definition: MCAssembler.h:336
void addFileName(StringRef FileName)
Definition: MCAssembler.h:487
MCAsmBackend & getBackend() const
Definition: MCAssembler.h:334
bool registerSection(MCSection &Section)
bool registerSymbol(const MCSymbol &Symbol)
MCDwarfLineTableParams getDWARFLinetableParams() const
Definition: MCAssembler.h:340
void setCompilerVersion(std::string CompilerVers)
Definition: MCAssembler.h:491
static const MCBinaryExpr * create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition: MCExpr.cpp:183
@ Sub
Subtraction.
Definition: MCExpr.h:517
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:81
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:457
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:322
void RemapDebugPaths()
Definition: MCContext.cpp:904
void clearDwarfLocSeen()
Definition: MCContext.h:797
CodeViewContext & getCVContext()
Definition: MCContext.cpp:1014
const SourceMgr * getSourceManager() const
Definition: MCContext.h:442
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:453
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1069
Fragment for data and encoded instructions.
Definition: MCFragment.h:242
static void Emit(MCObjectStreamer &streamer, MCAsmBackend *MAB, bool isEH)
Definition: MCDwarf.cpp:1859
static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
Definition: MCDwarf.cpp:673
static void make(MCStreamer *MCOS, MCSection *Section)
Definition: MCDwarf.cpp:94
static void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
Definition: MCDwarf.cpp:259
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
bool evaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
Definition: MCExpr.cpp:814
SMLoc getLoc() const
Definition: MCExpr.h:82
static MCFixupKind getKindForSize(unsigned Size, bool IsPCRel)
Return the generic fixup kind for a value with the given size.
Definition: MCFixup.h:109
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
Definition: MCFixup.h:87
FragmentType getKind() const
Definition: MCFragment.h:94
static void Emit(MCStreamer *MCOS)
Definition: MCDwarf.cpp:1142
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
SMLoc getLoc() const
Definition: MCInst.h:204
MCSection * getDwarfLineSection() const
Streaming object file generation interface.
void reset() override
state management
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel) override
Emit the debug line end entry.
void emitValueToAlignment(Align Alignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override
Emit an assignment of Value to Symbol.
void emitULEB128Value(const MCExpr *Value) override
void emitSLEB128Value(const MCExpr *Value) override
void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc, const MCSubtargetInfo &STI) override
MCDataFragment * getOrCreateDataFragment(const MCSubtargetInfo *STI=nullptr)
Get a data fragment to write into, creating a new one if the current fragment is not a data fragment.
void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym) override
This implements the CodeView '.cv_inline_linetable' assembler directive.
void emitCVStringTableDirective() override
This implements the CodeView '.cv_stringtable' assembler directive.
void emitBundleAlignMode(Align Alignment) override
Set the bundle alignment mode from now on in the section.
MCAssembler & getAssembler()
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override
Emit an weak reference from Alias to Symbol.
void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize) override
If targets does not support representing debug line section by .loc/.file directives in assembly outp...
void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc) override
This implements the CodeView '.cv_loc' assembler directive.
void emitDTPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a dtprel (32-bit DTP relative) value.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitBundleLock(bool AlignToEnd) override
The following instructions are a bundle-locked group.
void emitPendingAssignments(MCSymbol *Symbol)
Emits pending conditional assignments that depend on Symbol being emitted.
void emitFileDirective(StringRef Filename) override
Switch to a new logical file.
void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion) override
This implements the CodeView '.cv_def_range' assembler directive.
void emitGPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a gprel64 (64-bit GP relative) value.
MCAssembler * getAssemblerPtr() override
void flushPendingLabels()
Create a data fragment for any pending labels across all Sections and Subsections.
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment *F, uint64_t Offset)
std::optional< std::pair< bool, std::string > > emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc, const MCSubtargetInfo &STI) override
Record a relocation described by the .reloc directive.
void emitAddrsigSym(const MCSymbol *Sym) override
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
void visitUsedSymbol(const MCSymbol &Sym) override
void emitGPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a gprel32 (32-bit GP relative) value.
void insert(MCFragment *F)
virtual void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &)
Emit an instruction to a special fragment, because this instruction can change its size during relaxa...
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
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 emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo) override
Emit the absolute difference between two symbols encoded with ULEB128.
void emitBundleUnlock() override
Ends a bundle-locked group.
bool changeSectionImpl(MCSection *Section, const MCExpr *Subsection)
void emitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, const MCSymbol *Label, SMLoc Loc)
void emitCFISections(bool EH, bool Debug) override
void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName) override
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
void addPendingLabel(MCSymbol *label)
Assign a label to the current Section and Subsection even though a fragment is not yet present.
bool mayHaveInstructions(MCSection &Sec) const override
MCFragment * getCurrentFragment() const
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitFrames(MCAsmBackend *MAB)
void changeSection(MCSection *Section, const MCExpr *Subsection) override
Update streamer for a new active section.
void emitTPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a tprel (64-bit TP relative) value.
void emitCVFileChecksumOffsetDirective(unsigned FileNo) override
This implements the CodeView '.cv_filechecksumoffset' assembler directive.
void emitTPRel32Value(const MCExpr *Value) override
Emit the expression Value into the output as a tprel (32-bit TP relative) value.
void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value) override
Emit an assignment of Value to Symbol, but only if Value is also emitted.
void emitCVFileChecksumsDirective() override
This implements the CodeView '.cv_filechecksums' assembler directive.
void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *Begin, const MCSymbol *End) override
This implements the CodeView '.cv_linetable' assembler directive.
void emitDTPRel64Value(const MCExpr *Value) override
Emit the expression Value into the output as a dtprel (64-bit DTP relative) value.
void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc) override
Emit some number of copies of Value until the byte offset Offset is reached.
void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) override
Emit the absolute difference between two symbols if possible.
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 void emit(MCObjectStreamer *MCOS)
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:274
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
void addPendingLabel(MCSymbol *label, unsigned Subsection=0)
Add a pending label for the requested subsection.
Definition: MCSection.cpp:91
virtual StringRef getVirtualSectionKind() const
Definition: MCSection.cpp:89
void ensureMinAlignment(Align MinAlignment)
Makes sure that Alignment is at least MinAlignment.
Definition: MCSection.h:144
void flushPendingLabels(MCFragment *F, uint64_t FOffset=0, unsigned Subsection=0)
Associate all pending labels in a subsection with a fragment.
Definition: MCSection.cpp:95
bool hasInstructions() const
Definition: MCSection.h:166
void setHasInstructions(bool Value)
Definition: MCSection.h:167
virtual bool isVirtualSection() const =0
Check whether this section is "virtual", that is has no actual object file contents.
bool isBundleLocked() const
Definition: MCSection.h:157
StringRef getName() const
Definition: MCSection.h:124
FragmentListType::iterator iterator
Definition: MCSection.h:64
Streaming machine code generation interface.
Definition: MCStreamer.h:212
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
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:263
virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo)
Emit the absolute difference between two symbols encoded with ULEB128.
bool getUseAssemblerInfoForParsing()
Definition: MCStreamer.h:302
MCContext & getContext() const
Definition: MCStreamer.h:297
bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
Definition: MCStreamer.cpp:325
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.
Definition: MCStreamer.cpp:424
void setAllowAutoPadding(bool v)
Definition: MCStreamer.h:308
virtual void reset()
State management.
Definition: MCStreamer.cpp:102
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
Definition: MCStreamer.cpp:347
virtual void emitCFISections(bool EH, bool Debug)
Definition: MCStreamer.cpp:446
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:134
unsigned getNumFrameInfos()
Definition: MCStreamer.cpp:116
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:162
MCSymbol * endSection(MCSection *Section)
virtual void switchSection(MCSection *Section, const MCExpr *Subsection=nullptr)
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.
Definition: MCStreamer.cpp:369
MCSection * getCurrentSectionOnly() const
Definition: MCStreamer.h:393
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.
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:172
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:351
void visitUsedExpr(const MCExpr &Expr)
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
const MCSymbol & getSymbol() const
Definition: MCExpr.h:410
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:397
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:40
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:250
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition: MCSymbol.h:300
uint64_t getOffset() const
Definition: MCSymbol.h:327
MCFragment * getFragment(bool SetUsed=true) const
Definition: MCSymbol.h:397
This represents an "assembler immediate".
Definition: MCValue.h:36
int64_t getConstant() const
Definition: MCValue.h:43
const MCSymbolRefExpr * getSymB() const
Definition: MCValue.h:45
const MCSymbolRefExpr * getSymA() const
Definition: MCValue.h:44
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
Definition: MCValue.h:49
Represents a location in source code.
Definition: SMLoc.h:23
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
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.
Definition: SourceMgr.cpp:352
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:222
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
LLVM Value Representation.
Definition: Value.h:74
This class represents a function that is read from a sample profile.
Definition: FunctionId.h:36
#define INT64_MAX
Definition: DataTypes.h:71
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:456
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:239
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:156
MCFixupKind
Extensible enumeration to represent the type of a fixup.
Definition: MCFixup.h:21
@ FK_DTPRel_4
A four-byte dtp relative fixup.
Definition: MCFixup.h:36
@ FK_DTPRel_8
A eight-byte dtp relative fixup.
Definition: MCFixup.h:37
@ FK_TPRel_4
A four-byte tp relative fixup.
Definition: MCFixup.h:38
@ FK_GPRel_4
A four-byte gp relative fixup.
Definition: MCFixup.h:34
@ FK_TPRel_8
A eight-byte tp relative fixup.
Definition: MCFixup.h:39
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:244
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:1849
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
MCSymbol * Begin
Definition: MCDwarf.h:700