28 std::unique_ptr<MCAsmBackend> TAB,
29 std::unique_ptr<MCObjectWriter> OW,
30 std::unique_ptr<MCCodeEmitter>
Emitter)
34 EmitEHFrame(
true), EmitDebugFrame(
false) {
35 if (Assembler->getBackendPtr())
46 return Assembler.get();
54 if (!PendingLabels.empty()) {
57 PendingLabels.clear();
64 PendingLabelSections.insert(CurSection);
67 PendingLabels.push_back(S);
74 assert(PendingLabels.empty());
78 if (!PendingLabels.empty()) {
81 PendingLabels.clear();
90 if (!PendingLabels.empty()) {
95 PendingLabels.clear();
99 for (
MCSection* Section : PendingLabelSections)
100 Section->flushPendingLabels();
110void MCObjectStreamer::resolvePendingFixups() {
111 for (PendingMCFixup &PendingFixup : PendingFixups) {
112 if (!PendingFixup.Sym || PendingFixup.Sym->isUndefined ()) {
114 "unresolved relocation offset");
118 PendingFixup.Fixup.setOffset(PendingFixup.Sym->getOffset() +
119 PendingFixup.Fixup.getOffset());
124 MCFragment *SymFragment = PendingFixup.Sym->getFragment();
125 switch (SymFragment->
getKind()) {
129 cast<MCEncodedFragmentWithFixups<8, 1>>(SymFragment)
131 .push_back(PendingFixup.Fixup);
135 cast<MCEncodedFragmentWithFixups<32, 4>>(SymFragment)
137 .push_back(PendingFixup.Fixup);
140 PendingFixup.DF->getFixups().push_back(PendingFixup.Fixup);
144 PendingFixups.clear();
152 if (!
Hi->getFragment() ||
Hi->getFragment() !=
Lo->getFragment() ||
153 Hi->isVariable() ||
Lo->isVariable())
156 return Hi->getOffset() -
Lo->getOffset();
183 EmitDebugFrame =
false;
184 PendingLabels.clear();
185 PendingLabelSections.clear();
204 return &*std::prev(CurInsertionPoint);
212 if (!
F.hasInstructions())
217 if (
F.isLinkerRelaxable())
225 return !STI ||
F.getSubtargetInfo() == STI;
239 Assembler->registerSymbol(
Sym);
245 EmitDebugFrame =
Debug;
261 Loc,
"value evaluated as " +
Twine(AbsValue) +
" is out of range.");
267 DF->getFixups().push_back(
270 DF->getContents().resize(
DF->getContents().size() +
Size, 0);
273MCSymbol *MCObjectStreamer::emitCFILabel() {
301 Symbol->setFragment(
F);
302 Symbol->setOffset(
F->getContents().size());
307 Symbol->setOffset(0);
315 auto Assignments = pendingAssignments.find(Symbol);
316 if (Assignments != pendingAssignments.end()) {
317 for (
const PendingAssignment &
A : Assignments->second)
320 pendingAssignments.erase(Assignments);
332 auto *
DF = dyn_cast_or_null<MCDataFragment>(
F);
333 Symbol->setOffset(
Offset);
335 Symbol->setFragment(
F);
337 assert(isa<MCDummyFragment>(
F) &&
338 "F must either be an MCDataFragment or the pending MCDummyFragment");
368 const MCExpr *Subsection) {
373 const MCExpr *Subsection) {
374 assert(Section &&
"Cannot switch to a null section!");
379 int64_t IntSubsection = 0;
383 "cannot evaluate subsection number");
385 if (!isUInt<31>(IntSubsection)) {
387 "subsection number " +
Twine(IntSubsection) +
388 " is not within [0,2147483647]");
391 CurSubsectionIdx =
unsigned(IntSubsection);
393 Section->getSubsectionInsertionPoint(CurSubsectionIdx);
405 const MCSymbol *
Target = &cast<MCSymbolRefExpr>(*Value).getSymbol();
409 if (
Target->isRegistered())
412 pendingAssignments[
Target].push_back({Symbol,
Value});
425 "' cannot have instructions");
429 emitInstructionImpl(Inst, STI);
433void MCObjectStreamer::emitInstructionImpl(
const MCInst &Inst,
449 emitInstToData(Inst, STI);
463 emitInstToData(Relaxed, STI);
484 IF->getContents().append(Code.begin(), Code.end());
489 "Aligned bundling is not implemented for this object format";
505 unsigned Column,
unsigned Flags,
507 unsigned Discriminator,
514 Discriminator, FileName);
530 int64_t LineDelta,
const MCSymbol *Label,
533 OS.emitIntValue(dwarf::DW_LNS_extended_op, 1);
534 OS.emitULEB128IntValue(PointerSize + 1);
535 OS.emitIntValue(dwarf::DW_LNE_set_address, 1);
536 OS.emitSymbolValue(Label, PointerSize);
545 unsigned PointerSize) {
581 unsigned Line,
unsigned Column,
582 bool PrologueEnd,
bool IsStmt,
592 FileNo, Line, Column, PrologueEnd,
605 unsigned PrimaryFunctionId,
unsigned SourceFileId,
unsigned SourceLineNum,
608 *
this, PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym,
611 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
615 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
640 DF->getContents().append(
Data.begin(),
Data.end());
645 unsigned MaxBytesToEmit) {
646 if (MaxBytesToEmit == 0)
647 MaxBytesToEmit = Alignment.
value();
657 unsigned MaxBytesToEmit) {
675 DF->getContents().resize(
DF->getContents().size() + 4, 0);
685 DF->getContents().resize(
DF->getContents().size() + 8, 0);
695 DF->getContents().resize(
DF->getContents().size() + 4, 0);
705 DF->getContents().resize(
DF->getContents().size() + 8, 0);
713 DF->getFixups().push_back(
715 DF->getContents().resize(
DF->getContents().size() + 4, 0);
723 DF->getFixups().push_back(
725 DF->getContents().resize(
DF->getContents().size() + 8, 0);
728static std::optional<std::pair<bool, std::string>>
731 if (Symbol.isVariable()) {
732 const MCExpr *SymbolExpr = Symbol.getVariableValue();
735 return std::make_pair(
false,
736 std::string(
"symbol in .reloc offset is not "
744 return std::make_pair(
false,
745 std::string(
"symbol in offset has no data "
747 DF = cast<MCDataFragment>(Fragment);
752 return std::make_pair(
false,
753 std::string(
".reloc symbol offset is not "
758 return std::make_pair(
false,
759 std::string(
"symbol used in the .reloc offset is "
763 return std::make_pair(
false,
764 std::string(
"symbol used in the .reloc offset is "
771 return std::make_pair(
false,
772 std::string(
"symbol in offset has no data "
775 DF = cast<MCDataFragment>(Fragment);
777 RelocOffset = Symbol.getOffset();
782 return std::make_pair(
false,
783 std::string(
"symbol in offset has no data "
785 DF = cast<MCDataFragment>(Fragment);
790std::optional<std::pair<bool, std::string>>
794 std::optional<MCFixupKind> MaybeKind =
797 return std::make_pair(
true, std::string(
"unknown relocation name"));
809 if (!
Offset.evaluateAsRelocatable(OffsetVal,
nullptr,
nullptr))
810 return std::make_pair(
false,
811 std::string(
".reloc offset is not relocatable"));
814 return std::make_pair(
false, std::string(
".reloc offset is negative"));
815 DF->getFixups().push_back(
820 return std::make_pair(
false,
821 std::string(
".reloc offset is not representable"));
825 if (Symbol.isDefined()) {
827 std::optional<std::pair<bool, std::string>>
Error =
830 if (
Error != std::nullopt)
833 DF->getFixups().push_back(
839 PendingFixups.emplace_back(
855 int64_t Expr,
SMLoc Loc) {
856 int64_t IntNumValues;
859 if (IntNumValues < 0) {
862 "'.fill' directive with negative repeat count has no effect");
866 int64_t NonZeroSize =
Size > 4 ? 4 :
Size;
867 Expr &= ~0ULL >> (64 - NonZeroSize * 8);
868 for (
uint64_t i = 0, e = IntNumValues; i != e; ++i) {
870 if (NonZeroSize <
Size)
931 resolvePendingFixups();
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")
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)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
void emitLineTableForFunction(MCObjectStreamer &OS, unsigned FuncId, const MCSymbol *FuncBegin, const MCSymbol *FuncEnd)
Emits a line table substream.
void emitFileChecksums(MCObjectStreamer &OS)
Emits the file checksum substream.
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.
void emitFileChecksumOffset(MCObjectStreamer &OS, unsigned FileNo)
Emits the offset into the checksum table of the given file number.
void emitInlineLineTableForFunction(MCObjectStreamer &OS, unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
void emitStringTable(MCObjectStreamer &OS)
Emits the string table substream.
MCFragment * emitDefRange(MCObjectStreamer &OS, ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
Lightweight error class with error context and mandatory checking.
Generic interface to target specific assembler backends.
virtual 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(const MCInst &Inst, const MCSubtargetInfo &STI) const
Check whether the given instruction may need relaxation.
virtual void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst)
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.
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...
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
void Finish()
Finish - Do final processing and write the object to the output stream.
bool isBundlingEnabled() const
MCObjectWriter & getWriter() const
MCCodeEmitter & getEmitter() const
void addFileName(StringRef FileName)
MCAsmBackend & getBackend() const
bool registerSection(MCSection &Section)
bool registerSymbol(const MCSymbol &Symbol)
MCDwarfLineTableParams getDWARFLinetableParams() const
static const MCBinaryExpr * create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
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.
const MCObjectFileInfo * getObjectFileInfo() const
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
CodeViewContext & getCVContext()
const SourceMgr * getSourceManager() const
const MCAsmInfo * getAsmInfo() const
void reportError(SMLoc L, const Twine &Msg)
Fragment for data and encoded instructions.
static void Emit(MCObjectStreamer &streamer, MCAsmBackend *MAB, bool isEH)
static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
static void make(MCStreamer *MCOS, MCSection *Section)
static void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
Base class for the full range of assembler expressions which are needed for parsing.
bool evaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
static MCFixupKind getKindForSize(unsigned Size, bool IsPCRel)
Return the generic fixup kind for a value with the given size.
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
FragmentType getKind() const
static void Emit(MCStreamer *MCOS)
Instances of this class represent a single low-level machine instruction.
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 emitAddrsig() override
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...
Instances of this class represent a uniqued identifier for a section in the current translation unit.
void addPendingLabel(MCSymbol *label, unsigned Subsection=0)
Add a pending label for the requested subsection.
virtual StringRef getVirtualSectionKind() const
void ensureMinAlignment(Align MinAlignment)
Makes sure that Alignment is at least MinAlignment.
void flushPendingLabels(MCFragment *F, uint64_t FOffset=0, unsigned Subsection=0)
Associate all pending labels in a subsection with a fragment.
bool hasInstructions() const
void setHasInstructions(bool Value)
virtual bool isVirtualSection() const =0
Check whether this section is "virtual", that is has no actual object file contents.
bool isBundleLocked() const
StringRef getName() const
FragmentListType::iterator iterator
Streaming machine code generation interface.
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.
virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo)
Emit the absolute difference between two symbols encoded with ULEB128.
bool getUseAssemblerInfoForParsing()
MCContext & getContext() const
bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
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)
virtual void reset()
State management.
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
virtual void emitCFISections(bool EH, bool Debug)
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()
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, 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.
MCSection * getCurrentSectionOnly() const
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...
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
bool isVariable() const
isVariable - Check if this is a variable symbol.
uint64_t getOffset() const
MCFragment * getFragment(bool SetUsed=true) const
This represents an "assembler immediate".
int64_t getConstant() const
const MCSymbolRefExpr * getSymB() const
const MCSymbolRefExpr * getSymA() const
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
Represents a location in source code.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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.
StringRef - Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
#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.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
MCFixupKind
Extensible enumeration to represent the type of a fixup.
@ FK_DTPRel_4
A four-byte dtp relative fixup.
@ FK_DTPRel_8
A eight-byte dtp relative fixup.
@ FK_TPRel_4
A four-byte tp relative fixup.
@ FK_GPRel_4
A four-byte gp relative fixup.
@ FK_TPRel_8
A eight-byte tp relative fixup.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.