47#define DEBUG_TYPE "assembler"
52STATISTIC(EmittedFragments,
"Number of emitted assembler fragments - total");
54 "Number of emitted assembler fragments - relaxable");
56 "Number of emitted assembler fragments - data");
58 "Number of emitted assembler fragments - align");
60 "Number of emitted assembler fragments - fill");
61STATISTIC(EmittedNopsFragments,
"Number of emitted assembler fragments - nops");
62STATISTIC(EmittedOrgFragments,
"Number of emitted assembler fragments - org");
64STATISTIC(FixupEvalForRelax,
"Number of fixup evaluations for relaxation");
65STATISTIC(ObjectBytes,
"Number of emitted object file bytes");
66STATISTIC(RelaxationSteps,
"Number of assembler layout and relaxation steps");
67STATISTIC(RelaxedInstructions,
"Number of relaxed instructions");
80 std::unique_ptr<MCAsmBackend> Backend,
81 std::unique_ptr<MCCodeEmitter> Emitter,
82 std::unique_ptr<MCObjectWriter> Writer)
83 : Context(Context), Backend(
std::
move(Backend)),
86 this->Backend->setAssembler(
this);
88 this->Writer->setAssembler(
this);
93 HasFinalLayout =
false;
109 if (Section.isRegistered())
111 Sections.push_back(&Section);
112 Section.setIsRegistered(
true);
117 if (ThumbFuncs.count(Symbol))
120 if (!Symbol->isVariable())
123 const MCExpr *Expr = Symbol->getVariableValue();
129 if (V.getSubSym() || V.getSpecifier())
133 if (!Sym || V.getSpecifier())
139 ThumbFuncs.insert(Symbol);
162 bool IsResolved =
false;
169 if (
Add &&
Add->isDefined())
171 if (
Sub &&
Sub->isDefined())
174 if (
Fixup.isPCRel()) {
181 "Stretch should only be applied during relaxation");
182 MCFragment *AF =
Add ?
Add->getFragment() :
nullptr;
185 MCFragment *SF =
Sub ?
Sub->getFragment() :
nullptr;
189 if (
Add && !
Sub && !
Add->isUndefined() && !
Add->isAbsolute()) {
191 *
Add,
F,
false,
true);
194 IsResolved =
Target.isAbsolute();
209 switch (
F.getKind()) {
222 int64_t NumValues = 0;
223 if (!FF.getNumValues().evaluateKnownAbsolute(NumValues, *
this)) {
224 recordError(FF.getLoc(),
"expected assembly-time absolute expression");
227 int64_t
Size = NumValues * FF.getValueSize();
229 recordError(FF.getLoc(),
"invalid number of bytes");
250 if (!OF.getOffset().evaluateAsValue(
Value, *
this)) {
251 recordError(OF.getLoc(),
"expected assembly-time absolute expression");
256 int64_t TargetLocation =
Value.getConstant();
257 if (
const auto *SA =
Value.getAddSym()) {
260 recordError(OF.getLoc(),
"expected absolute expression");
263 TargetLocation += Val;
265 int64_t
Size = TargetLocation - FragmentOffset;
268 "' (at offset '" +
Twine(FragmentOffset) +
341 if (!Symbol.isVariable())
344 const MCExpr *Expr = Symbol.getVariableValue();
355 "' could not be evaluated in a subtraction expression");
366 "' cannot be used in assignment expr");
387 bool Changed = !Symbol.isRegistered();
389 Symbol.setIsRegistered(
true);
390 Symbols.push_back(&Symbol);
396 relocDirectives.push_back(RD);
403 uint64_t FragmentSize = Asm.computeFragmentSize(
F);
412 ++stats::EmittedFragments;
414 switch (
F.getKind()) {
424 ++stats::EmittedDataFragments;
426 ++stats::EmittedRelaxableFragments;
428 OS <<
StringRef(EF.getContents().data(), EF.getContents().size());
429 OS <<
StringRef(EF.getVarContents().data(), EF.getVarContents().size());
433 ++stats::EmittedAlignFragments;
434 OS <<
StringRef(
F.getContents().data(),
F.getContents().size());
436 "Invalid virtual align in concrete fragment!");
438 uint64_t Count = (FragmentSize -
F.getFixedSize()) /
F.getAlignFillLen();
439 assert((FragmentSize -
F.getFixedSize()) %
F.getAlignFillLen() == 0 &&
440 "computeFragmentSize computed size is incorrect");
443 if (
F.hasAlignEmitNops()) {
444 if (!Asm.getBackend().writeNopData(OS,
Count,
F.getSubtargetInfo()))
450 switch (
F.getAlignFillLen()) {
454 OS <<
char(
F.getAlignFill());
471 OS <<
StringRef(
F.getContents().data(),
F.getContents().size());
472 uint64_t PadSize = FragmentSize -
F.getContents().size();
473 if (
F.getPrefAlignEmitNops()) {
474 if (!Asm.getBackend().writeNopData(OS, PadSize,
F.getSubtargetInfo()))
476 Twine(PadSize) +
" bytes");
477 }
else if (
F.getPrefAlignFill() == 0) {
480 char B =
char(
F.getPrefAlignFill());
488 ++stats::EmittedFillFragments;
492 const unsigned MaxChunkSize = 16;
493 char Data[MaxChunkSize];
494 assert(0 < VSize && VSize <= MaxChunkSize &&
"Illegal fragment fill size");
497 for (
unsigned I = 0;
I != VSize; ++
I) {
501 for (
unsigned I = VSize;
I < MaxChunkSize; ++
I)
505 const unsigned NumPerChunk = MaxChunkSize / VSize;
507 const unsigned ChunkSize = VSize * NumPerChunk;
511 for (
uint64_t I = 0,
E = FragmentSize / ChunkSize;
I !=
E; ++
I)
515 unsigned TrailingCount = FragmentSize % ChunkSize;
522 ++stats::EmittedNopsFragments;
527 int64_t MaximumNopLength =
530 assert(NumBytes > 0 &&
"Expected positive NOPs fragment size");
531 assert(ControlledNopLength >= 0 &&
"Expected non-negative NOP size");
533 if (ControlledNopLength > MaximumNopLength) {
534 Asm.reportError(NF.
getLoc(),
"illegal NOP size " +
535 std::to_string(ControlledNopLength) +
536 ". (expected within [0, " +
537 std::to_string(MaximumNopLength) +
"])");
540 ControlledNopLength = MaximumNopLength;
544 if (!ControlledNopLength)
545 ControlledNopLength = MaximumNopLength;
549 (
uint64_t)std::min(NumBytes, ControlledNopLength);
550 assert(NumBytesToEmit &&
"try to emit empty NOP instruction");
551 if (!Asm.getBackend().writeNopData(OS, NumBytesToEmit,
554 Twine(NumBytesToEmit) +
" bytes");
557 NumBytes -= NumBytesToEmit;
564 if (!Asm.getBackend().writeNopData(OS, FragmentSize, BF.
getSubtargetInfo()))
566 Twine(FragmentSize) +
" bytes");
577 ++stats::EmittedOrgFragments;
580 for (
uint64_t i = 0, e = FragmentSize; i != e; ++i)
581 OS <<
char(OF.getValue());
589 "The stream should advance by fragment size");
602 auto Fn = [](
char c) {
return c != 0; };
604 bool HasNonZero =
false;
605 switch (
F.getKind()) {
608 "' contains invalid fragment");
618 assert(
F.getAlignFill() == 0 &&
"Invalid align in virtual section!");
621 assert(!
F.getPrefAlignEmitNops() &&
F.getPrefAlignFill() == 0 &&
622 "Invalid align in BSS");
633 "' cannot have non-zero bytes");
636 if (
F.getFixups().size() ||
F.getVarFixups().size()) {
638 "BSS section '" + Sec->getName() +
"' cannot have fixups");
660 errs() <<
"assembler backend - pre-layout\n--\n";
665 unsigned SectionIndex = 0;
670 if (Sec.Subsections.size() > 1) {
673 for (
auto &[
_,
List] : Sec.Subsections) {
678 Sec.Subsections.clear();
679 Sec.Subsections.push_back({0u, {Dummy.
getNext(),
Tail}});
680 Sec.CurFragList = &Sec.Subsections[0].second;
682 unsigned FragmentIndex = 0;
684 Frag.setLayoutOrder(FragmentIndex++);
689 this->HasLayout =
true;
692 unsigned FirstStable = Sections.size();
693 while ((FirstStable = relaxOnce(FirstStable)) > 0)
706 errs() <<
"assembler backend - final-layout\n--\n";
715 this->HasFinalLayout =
true;
725 auto DrainRelocGroup = [](
MCFragment *
F, std::vector<MCFixup> &Group) {
726 F->insertRelocFixups(Group);
731 for (
auto &PF : relocDirectives) {
734 if (!O.evaluateAsValue(Res, *
this)) {
739 auto *
F = Sym ? Sym->getFragment() :
nullptr;
740 auto *Sec =
F ?
F->getParent() :
nullptr;
743 ".reloc offset is not relative to a section");
749 auto &Group = RelocGroups[
F];
750 if (!Group.empty() && Group[0].getOffset() <
Offset)
751 DrainRelocGroup(
F, Group);
752 Group.push_back(
Fixup);
755 for (
auto &[
F, Group] : RelocGroups)
756 DrainRelocGroup(
F, Group);
762 auto Contents =
F.getContents();
767 Fixup.getOffset() <=
F.getFixedSize());
769 reinterpret_cast<uint8_t *
>(Contents.data() +
Fixup.getOffset());
779 (
Fixup.getOffset() >=
F.getFixedSize() &&
780 Fixup.getOffset() <=
F.getSize()));
782 F.getVarContents().
data() + (
Fixup.getOffset() -
F.getFixedSize()));
800 assert(PendingErrors.empty());
806 bool AlignFixup =
false;
807 if (
F.hasAlignEmitNops()) {
811 Size +=
F.getAlignment().value();
813 if (!AlignFixup &&
Size >
F.getAlignMaxBytesToEmit())
815 F.VarContentStart =
F.getFixedSize();
816 F.VarContentEnd =
F.VarContentStart +
Size;
817 if (
F.VarContentEnd >
F.getParent()->ContentStorage.size())
818 F.getParent()->ContentStorage.resize(
F.VarContentEnd);
824 uint64_t RawStart =
F.Offset +
F.getFixedSize();
825 const MCSymbol &End =
F.getPrefAlignEnd();
828 "' must be in the current section");
835 for (
auto *Cur =
F.getNext(); Cur != EndFrag; Cur = Cur->getNext())
842 NewAlign = std::max(NewAlign,
F.getPrefAlignComputed());
843 F.setPrefAlignComputed(NewAlign);
845 F.VarContentStart =
F.getFixedSize();
846 F.VarContentEnd =
F.VarContentStart + NewPadSize;
847 if (
F.VarContentEnd >
F.getParent()->ContentStorage.size())
848 F.getParent()->ContentStorage.resize(
F.VarContentEnd);
851 F.getParent()->ensureMinAlignment(NewAlign);
854bool MCAssembler::fixupNeedsRelaxation(
const MCFragment &
F,
856 ++stats::FixupEvalForRelax;
867 "Expected CodeEmitter defined for relaxInstruction");
871 if (!
getBackend().mayNeedRelaxation(
F.getOpcode(),
F.getOperands(),
872 *
F.getSubtargetInfo()))
875 bool DoRelax =
false;
876 for (
const MCFixup &
Fixup :
F.getVarFixups())
877 if ((DoRelax = fixupNeedsRelaxation(
F,
Fixup)))
882 ++stats::RelaxedInstructions;
894 F.setVarContents(
Data);
895 F.setVarFixups(Fixups);
899 unsigned PadTo =
F.getVarSize();
906 ?
F.getLEBValue().evaluateKnownAbsolute(
Value, *
this)
907 :
F.getLEBValue().evaluateAsAbsolute(
Value, *
this);
913 Twine(
F.isLEBSigned() ?
".s" :
".u") +
914 "leb128 expression is not absolute");
932 F.setVarContents({
reinterpret_cast<char *
>(
Data),
Size});
942 Align BoundaryAlignment) {
944 return (StartAddr >>
Log2(BoundaryAlignment)) !=
945 ((EndAddr - 1) >>
Log2(BoundaryAlignment));
955 Align BoundaryAlignment) {
957 return (EndAddr & (BoundaryAlignment.
value() - 1)) == 0;
967 Align BoundaryAlignment) {
979 uint64_t AlignedSize = 0;
987 uint64_t NewSize =
needPadding(AlignedOffset, AlignedSize, BoundaryAlignment)
995void MCAssembler::relaxDwarfLineAddr(
MCFragment &
F) {
1001 bool Abs =
F.getDwarfAddrDelta().evaluateKnownAbsolute(AddrDelta, *
this);
1002 assert(Abs &&
"We created a line delta with an invalid expression");
1004 SmallVector<char, 8>
Data;
1006 F.getDwarfLineDelta(), AddrDelta,
Data);
1007 F.setVarContents(
Data);
1011void MCAssembler::relaxDwarfCallFrameFragment(
MCFragment &
F) {
1017 bool Abs =
F.getDwarfAddrDelta().evaluateAsAbsolute(
Value, *
this);
1020 "invalid CFI advance_loc expression");
1025 SmallVector<char, 8>
Data;
1027 F.setVarContents(
Data);
1031void MCAssembler::relaxSFrameFragment(
MCFragment &
F) {
1035 bool Abs =
F.getSFrameAddrDelta().evaluateAsAbsolute(
Value, *
this);
1037 C.reportError(
F.getSFrameAddrDelta().getLoc(),
1038 "invalid CFI advance_loc expression in sframe");
1045 F.setVarContents(
Data);
1050 switch (
F.getKind()) {
1058 relaxInstruction(
F);
1064 relaxDwarfLineAddr(
F);
1067 relaxDwarfCallFrameFragment(
F);
1070 relaxSFrameFragment(
F);
1073 relaxBoundaryAlign(
static_cast<MCBoundaryAlignFragment &
>(
F));
1080 *
this,
static_cast<MCCVInlineLineTableFragment &
>(
F));
1084 *
this,
static_cast<MCCVDefRangeFragment &
>(
F));
1089void MCAssembler::layoutSection(
MCSection &Sec) {
1091 for (MCFragment &
F : Sec) {
1102unsigned MCAssembler::relaxOnce(
unsigned FirstStable) {
1103 uint64_t MaxIterations = 0;
1104 PendingErrors.clear();
1106 for (
unsigned I = 0;
I != FirstStable; ++
I) {
1107 auto &Sec = *Sections[
I];
1112 for (MCFragment &
F : Sec) {
1127 FirstStable = Sections.size();
1131 if (Iters > Sec.curFragList()->Tail->getLayoutOrder())
1134 MaxIterations = std::max(MaxIterations, Iters);
1136 stats::RelaxationSteps += MaxIterations;
1148 PendingErrors.emplace_back(
Loc, Msg.
str());
1152 for (
auto &Err : PendingErrors)
1154 PendingErrors.clear();
1157#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1165 if (!Sym.isVariable())
1166 if (
auto *
F = Sym.getFragment())
1167 FragToSyms.
try_emplace(
F).first->second.push_back(&Sym);
1172 Sec.
dump(&FragToSyms);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static bool getSymbolOffsetImpl(const MCAssembler &Asm, const MCSymbol &S, bool ReportError, uint64_t &Val)
static bool needPadding(uint64_t StartAddr, uint64_t Size, Align BoundaryAlignment)
Check if the branch needs padding.
static void writeFragment(raw_ostream &OS, const MCAssembler &Asm, const MCFragment &F)
Write the fragment F to the output file.
static bool mayCrossBoundary(uint64_t StartAddr, uint64_t Size, Align BoundaryAlignment)
Check if the branch crosses the boundary.
static bool isAgainstBoundary(uint64_t StartAddr, uint64_t Size, Align BoundaryAlignment)
Check if the branch is against the boundary.
static bool getLabelOffset(const MCAssembler &Asm, const MCSymbol &S, bool ReportError, uint64_t &Val)
PowerPC TLS Dynamic Call Fixup
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
void encodeInlineLineTable(const MCAssembler &Asm, MCCVInlineLineTableFragment &F)
Encodes the binary annotations once we have a layout.
void encodeDefRange(const MCAssembler &Asm, MCCVDefRangeFragment &F)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
virtual void relaxInstruction(MCInst &Inst, const MCSubtargetInfo &STI) const
Relax the instruction in the given fragment to the next wider instruction.
virtual bool relaxAlign(MCFragment &F, unsigned &Size)
virtual std::pair< bool, bool > relaxLEB128(MCFragment &, int64_t &Value) const
virtual bool fixupNeedsRelaxationAdvanced(const MCFragment &, const MCFixup &, const MCValue &, uint64_t, bool Resolved) const
Target specific predicate for whether a given fixup requires the associated instruction to be relaxed...
virtual void reset()
lifetime management
virtual void applyFixup(const MCFragment &, const MCFixup &, const MCValue &Target, uint8_t *Data, uint64_t Value, bool IsResolved)=0
MCContext & getContext() const
LLVM_ABI bool getSymbolOffset(const MCSymbol &S, uint64_t &Val) const
LLVM_ABI uint64_t getSectionAddressSize(const MCSection &Sec) const
LLVM_ABI void Finish()
Finish - Do final processing and write the object to the output stream.
LLVM_ABI void reportError(SMLoc L, const Twine &Msg) const
LLVM_ABI void writeSectionData(raw_ostream &OS, const MCSection *Section) const
Emit the section contents to OS.
iterator_range< pointee_iterator< SmallVector< const MCSymbol *, 0 >::const_iterator > > symbols() const
LLVM_ABI void dump() const
MCObjectWriter & getWriter() const
MCCodeEmitter * getEmitterPtr() const
LLVM_ABI void addRelocDirective(RelocDirective RD)
MCCodeEmitter & getEmitter() const
LLVM_ABI void recordError(SMLoc L, const Twine &Msg) const
LLVM_ABI MCAssembler(MCContext &Context, std::unique_ptr< MCAsmBackend > Backend, std::unique_ptr< MCCodeEmitter > Emitter, std::unique_ptr< MCObjectWriter > Writer)
Construct a new assembler instance.
LLVM_ABI bool isThumbFunc(const MCSymbol *Func) const
Check whether a given symbol has been flagged with .thumb_func.
MCAsmBackend & getBackend() const
LLVM_ABI bool registerSection(MCSection &Section)
LLVM_ABI void flushPendingErrors() const
LLVM_ABI uint64_t computeFragmentSize(const MCFragment &F) const
Compute the effective fragment size.
LLVM_ABI const MCSymbol * getBaseSymbol(const MCSymbol &Symbol) const
MCAsmBackend * getBackendPtr() const
LLVM_ABI uint64_t getSectionFileSize(const MCSection &Sec) const
LLVM_ABI void reset()
Reuse an assembler instance.
LLVM_ABI bool registerSymbol(const MCSymbol &Symbol)
uint64_t getFragmentOffset(const MCFragment &F) const
MCDwarfLineTableParams getDWARFLinetableParams() const
Represents required padding such that a particular other set of fragments does not cross a particular...
void setSize(uint64_t Value)
const MCFragment * getLastFragment() const
Align getAlignment() const
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.
virtual void reset()
Lifetime management.
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
LLVM_ABI CodeViewContext & getCVContext()
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
static LLVM_ABI void encodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta, SmallVectorImpl< char > &OS)
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.
Base class for the full range of assembler expressions which are needed for parsing.
LLVM_ABI bool evaluateAsValue(MCValue &Res, const MCAssembler &Asm) const
Try to evaluate the expression to the form (a - b + constant) where neither a nor b are variables.
LLVM_ABI bool evaluateAsRelocatable(MCValue &Res, const MCAssembler *Asm) const
Try to evaluate the expression to a relocatable value, i.e.
uint8_t getValueSize() const
uint64_t getValue() const
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
const MCExpr * getValue() const
LLVM_ABI SMLoc getLoc() const
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, bool PCRel=false)
Consider bit fields if we need more flags.
unsigned getLayoutOrder() const
MCSection * getParent() const
MCFragment * getNext() const
const MCSubtargetInfo * getSubtargetInfo() const
Retrieve the MCSubTargetInfo in effect when the instruction was encoded.
int64_t getControlledNopLength() const
int64_t getNumBytes() const
virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCSymbol &SymA, const MCFragment &FB, bool InSet, bool IsPCRel) const
bool getSubsectionsViaSymbols() const
virtual void executePostLayoutBinding()
Perform any late binding of symbols (for example, to assign symbol indices for use when generating re...
virtual uint64_t writeObject()=0
Write the object file and returns the number of bytes written.
static void encodeFuncOffset(MCContext &C, uint64_t Offset, SmallVectorImpl< char > &Out, MCFragment *FDEFrag)
Instances of this class represent a uniqued identifier for a section in the current translation unit.
bool isBssSection() const
Check whether this section is "virtual", that is has no actual object file contents.
void dump(DenseMap< const MCFragment *, SmallVector< const MCSymbol *, 0 > > *FragToSyms=nullptr) const
void setOrdinal(unsigned Value)
FragList * curFragList() const
Generic base class for all target subtargets.
Represents a symbol table index fragment.
const MCSymbol * getSymbol() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isCommon() const
Is this a 'common' symbol.
StringRef getName() const
getName - Get the symbol name.
bool isVariable() const
isVariable - Check if this is a variable symbol.
uint32_t getIndex() const
Get the (implementation defined) index.
const MCExpr * getVariableValue() const
Get the expression of the variable symbol.
MCFragment * getFragment() const
uint64_t getOffset() const
const MCSymbol * getAddSym() const
int64_t getConstant() const
const MCSymbol * getSubSym() const
Represents a location in source code.
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_ABI std::string str() const
Return the twine contents as a std::string.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_zeros(unsigned NumZeros)
write_zeros - Insert 'NumZeros' nulls.
uint64_t tell() const
tell - Return the current offset with the file.
raw_ostream & write(unsigned char C)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ C
The default llvm calling convention, compatible with C.
bool isRelocRelocation(MCFixupKind FixupKind)
@ Resolved
Queried, materialization begun.
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
uint64_t offsetToAlignment(uint64_t Value, Align Alignment)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Ref
The access may reference the value stored in memory.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
@ Sub
Subtraction of integers.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
unsigned Log2(Align A)
Returns the log2 of the alignment.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
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.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.