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()) {
 
  176      if (
Add && !
Sub && !
Add->isUndefined() && !
Add->isAbsolute()) {
 
  178            *
Add, 
F, 
false, 
true);
 
  181      IsResolved = 
Target.isAbsolute();
 
  196  switch (
F.getKind()) {
 
  209    int64_t NumValues = 0;
 
  210    if (!FF.getNumValues().evaluateKnownAbsolute(NumValues, *
this)) {
 
  211      recordError(FF.getLoc(), 
"expected assembly-time absolute expression");
 
  214    int64_t 
Size = NumValues * FF.getValueSize();
 
  216      recordError(FF.getLoc(), 
"invalid number of bytes");
 
  234    if (!OF.getOffset().evaluateAsValue(
Value, *
this)) {
 
  235      recordError(OF.getLoc(), 
"expected assembly-time absolute expression");
 
  240    int64_t TargetLocation = 
Value.getConstant();
 
  241    if (
const auto *SA = 
Value.getAddSym()) {
 
  244        recordError(OF.getLoc(), 
"expected absolute expression");
 
  247      TargetLocation += Val;
 
  249    int64_t 
Size = TargetLocation - FragmentOffset;
 
  252                                   "' (at offset '" + 
Twine(FragmentOffset) +
 
 
  325  if (!Symbol.isVariable())
 
  328  const MCExpr *Expr = Symbol.getVariableValue();
 
  339                    "' could not be evaluated in a subtraction expression");
 
  350                                    "' cannot be used in assignment expr");
 
 
  371  bool Changed = !Symbol.isRegistered();
 
  373    Symbol.setIsRegistered(
true);
 
  374    Symbols.push_back(&Symbol);
 
 
  380  relocDirectives.push_back(RD);
 
 
  387  uint64_t FragmentSize = Asm.computeFragmentSize(
F);
 
  396  ++stats::EmittedFragments;
 
  398  switch (
F.getKind()) {
 
  408      ++stats::EmittedDataFragments;
 
  410      ++stats::EmittedRelaxableFragments;
 
  412    OS << 
StringRef(EF.getContents().data(), EF.getContents().size());
 
  413    OS << 
StringRef(EF.getVarContents().data(), EF.getVarContents().size());
 
  417    ++stats::EmittedAlignFragments;
 
  418    OS << 
StringRef(
F.getContents().data(), 
F.getContents().size());
 
  420           "Invalid virtual align in concrete fragment!");
 
  422    uint64_t Count = (FragmentSize - 
F.getFixedSize()) / 
F.getAlignFillLen();
 
  423    assert((FragmentSize - 
F.getFixedSize()) % 
F.getAlignFillLen() == 0 &&
 
  424           "computeFragmentSize computed size is incorrect");
 
  427    if (
F.hasAlignEmitNops()) {
 
  428      if (!Asm.getBackend().writeNopData(OS, 
Count, 
F.getSubtargetInfo()))
 
  434        switch (
F.getAlignFillLen()) {
 
  438          OS << 
char(
F.getAlignFill());
 
  455    ++stats::EmittedFillFragments;
 
  459    const unsigned MaxChunkSize = 16;
 
  460    char Data[MaxChunkSize];
 
  461    assert(0 < VSize && VSize <= MaxChunkSize && 
"Illegal fragment fill size");
 
  464    for (
unsigned I = 0; 
I != VSize; ++
I) {
 
  468    for (
unsigned I = VSize; 
I < MaxChunkSize; ++
I)
 
  472    const unsigned NumPerChunk = MaxChunkSize / VSize;
 
  474    const unsigned ChunkSize = VSize * NumPerChunk;
 
  478    for (
uint64_t I = 0, 
E = FragmentSize / ChunkSize; 
I != 
E; ++
I)
 
  482    unsigned TrailingCount = FragmentSize % ChunkSize;
 
  489    ++stats::EmittedNopsFragments;
 
  494    int64_t MaximumNopLength =
 
  497    assert(NumBytes > 0 && 
"Expected positive NOPs fragment size");
 
  498    assert(ControlledNopLength >= 0 && 
"Expected non-negative NOP size");
 
  500    if (ControlledNopLength > MaximumNopLength) {
 
  501      Asm.reportError(NF.
getLoc(), 
"illegal NOP size " +
 
  502                                       std::to_string(ControlledNopLength) +
 
  503                                       ". (expected within [0, " +
 
  504                                       std::to_string(MaximumNopLength) + 
"])");
 
  507      ControlledNopLength = MaximumNopLength;
 
  511    if (!ControlledNopLength)
 
  512      ControlledNopLength = MaximumNopLength;
 
  516          (
uint64_t)std::min(NumBytes, ControlledNopLength);
 
  517      assert(NumBytesToEmit && 
"try to emit empty NOP instruction");
 
  518      if (!Asm.getBackend().writeNopData(OS, NumBytesToEmit,
 
  521                           Twine(NumBytesToEmit) + 
" bytes");
 
  524      NumBytes -= NumBytesToEmit;
 
  531    if (!Asm.getBackend().writeNopData(OS, FragmentSize, BF.
getSubtargetInfo()))
 
  533                         Twine(FragmentSize) + 
" bytes");
 
  544    ++stats::EmittedOrgFragments;
 
  547    for (
uint64_t i = 0, e = FragmentSize; i != e; ++i)
 
  548      OS << 
char(OF.getValue());
 
  556         "The stream should advance by fragment size");
 
 
  569    auto Fn = [](
char c) { 
return c != 0; };
 
  571      bool HasNonZero = 
false;
 
  572      switch (
F.getKind()) {
 
  575                                 "' contains invalid fragment");
 
  585        assert(
F.getAlignFill() == 0 && 
"Invalid align in virtual section!");
 
  596                                 "' cannot have non-zero bytes");
 
  599      if (
F.getFixups().size() || 
F.getVarFixups().size()) {
 
  601                    "BSS section '" + Sec->getName() + 
"' cannot have fixups");
 
 
  623    errs() << 
"assembler backend - pre-layout\n--\n";
 
  628  unsigned SectionIndex = 0;
 
  633    if (Sec.Subsections.size() > 1) {
 
  636      for (
auto &[
_, 
List] : Sec.Subsections) {
 
  641      Sec.Subsections.clear();
 
  642      Sec.Subsections.push_back({0u, {Dummy.
getNext(), 
Tail}});
 
  643      Sec.CurFragList = &Sec.Subsections[0].second;
 
  645      unsigned FragmentIndex = 0;
 
  647        Frag.setLayoutOrder(FragmentIndex++);
 
  652  this->HasLayout = 
true;
 
  655  unsigned FirstStable = Sections.size();
 
  656  while ((FirstStable = relaxOnce(FirstStable)) > 0)
 
  669      errs() << 
"assembler backend - final-layout\n--\n";
 
  678  this->HasFinalLayout = 
true;
 
  681  for (
auto &PF : relocDirectives) {
 
  684    if (!O.evaluateAsValue(Res, *
this)) {
 
  689    auto *
F = Sym ? Sym->getFragment() : 
nullptr;
 
  690    auto *Sec = 
F ? 
F->getParent() : 
nullptr;
 
  693                               ".reloc offset is not relative to a section");
 
  705      auto Contents = 
F.getContents();
 
  710               Fixup.getOffset() <= 
F.getFixedSize());
 
  712            reinterpret_cast<uint8_t *
>(Contents.data() + 
Fixup.getOffset());
 
  722               (
Fixup.getOffset() >= 
F.getFixedSize() &&
 
  723                Fixup.getOffset() <= 
F.getSize()));
 
  725            F.getVarContents().
data() + (
Fixup.getOffset() - 
F.getFixedSize()));
 
 
  740  assert(PendingErrors.empty());
 
 
  743bool MCAssembler::fixupNeedsRelaxation(
const MCFragment &
F,
 
  745  ++stats::FixupEvalForRelax;
 
  756         "Expected CodeEmitter defined for relaxInstruction");
 
  760  if (!
getBackend().mayNeedRelaxation(
F.getOpcode(), 
F.getOperands(),
 
  761                                      *
F.getSubtargetInfo()))
 
  764  bool DoRelax = 
false;
 
  765  for (
const MCFixup &
Fixup : 
F.getVarFixups())
 
  766    if ((DoRelax = fixupNeedsRelaxation(
F, 
Fixup)))
 
  771  ++stats::RelaxedInstructions;
 
  783  F.setVarContents(
Data);
 
  784  F.setVarFixups(Fixups);
 
  788  unsigned PadTo = 
F.getVarSize();
 
  795                 ? 
F.getLEBValue().evaluateKnownAbsolute(
Value, *
this)
 
  796                 : 
F.getLEBValue().evaluateAsAbsolute(
Value, *
this);
 
  802                  Twine(
F.isLEBSigned() ? 
".s" : 
".u") +
 
  803                      "leb128 expression is not absolute");
 
  821  F.setVarContents({
reinterpret_cast<char *
>(
Data), 
Size});
 
  831                             Align BoundaryAlignment) {
 
  833  return (StartAddr >> 
Log2(BoundaryAlignment)) !=
 
  834         ((EndAddr - 1) >> 
Log2(BoundaryAlignment));
 
 
  844                              Align BoundaryAlignment) {
 
  846  return (EndAddr & (BoundaryAlignment.
value() - 1)) == 0;
 
 
  856                        Align BoundaryAlignment) {
 
 
  868  uint64_t AlignedSize = 0;
 
  876  uint64_t NewSize = 
needPadding(AlignedOffset, AlignedSize, BoundaryAlignment)
 
  884void MCAssembler::relaxDwarfLineAddr(
MCFragment &
F) {
 
  890  bool Abs = 
F.getDwarfAddrDelta().evaluateKnownAbsolute(AddrDelta, *
this);
 
  891  assert(Abs && 
"We created a line delta with an invalid expression");
 
  893  SmallVector<char, 8> 
Data;
 
  895                          F.getDwarfLineDelta(), AddrDelta, 
Data);
 
  896  F.setVarContents(
Data);
 
  900void MCAssembler::relaxDwarfCallFrameFragment(
MCFragment &
F) {
 
  906  bool Abs = 
F.getDwarfAddrDelta().evaluateAsAbsolute(
Value, *
this);
 
  909                "invalid CFI advance_loc expression");
 
  914  SmallVector<char, 8> 
Data;
 
  916  F.setVarContents(
Data);
 
  920void MCAssembler::relaxSFrameFragment(
MCFragment &
F) {
 
  924  bool Abs = 
F.getSFrameAddrDelta().evaluateAsAbsolute(
Value, *
this);
 
  926    C.reportError(
F.getSFrameAddrDelta().getLoc(),
 
  927                  "invalid CFI advance_loc expression in sframe");
 
  934  F.setVarContents(
Data);
 
  940  switch (
F.getKind()) {
 
  951    relaxDwarfLineAddr(
F);
 
  954    relaxDwarfCallFrameFragment(
F);
 
  957    relaxSFrameFragment(
F);
 
  960    relaxBoundaryAlign(
static_cast<MCBoundaryAlignFragment &
>(
F));
 
  964        *
this, 
static_cast<MCCVInlineLineTableFragment &
>(
F));
 
  968        *
this, 
static_cast<MCCVDefRangeFragment &
>(
F));
 
  972    return F.getNext()->Offset - 
F.Offset != 
Size;
 
  977void MCAssembler::layoutSection(
MCSection &Sec) {
 
  979  for (MCFragment &
F : Sec) {
 
  986      bool AlignFixup = 
false;
 
  987      if (
F.hasAlignEmitNops()) {
 
  993            Size += 
F.getAlignment().value();
 
  995      if (!AlignFixup && 
Size > 
F.getAlignMaxBytesToEmit())
 
  999      F.VarContentStart = 
F.getFixedSize();
 
 1000      F.VarContentEnd = 
F.VarContentStart + 
Size;
 
 1001      if (
F.VarContentEnd > 
F.getParent()->ContentStorage.size())
 
 1002        F.getParent()->ContentStorage.resize(
F.VarContentEnd);
 
 1010unsigned MCAssembler::relaxOnce(
unsigned FirstStable) {
 
 1011  ++stats::RelaxationSteps;
 
 1012  PendingErrors.clear();
 
 1015  for (
unsigned I = 0; 
I != FirstStable; ++
I) {
 
 1018    auto &Sec = *Sections[
I];
 
 1019    auto MaxIter = Sec.curFragList()->Tail->getLayoutOrder() + 1;
 
 1022      for (MCFragment &
F : Sec)
 
 1030      FirstStable = Sections.size();
 
 1047  PendingErrors.emplace_back(
Loc, Msg.
str());
 
 
 1051  for (
auto &Err : PendingErrors)
 
 1053  PendingErrors.clear();
 
 
 1056#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
 1064    if (!Sym.isVariable())
 
 1065      if (
auto *
F = Sym.getFragment())
 
 1066        FragToSyms.
try_emplace(
F).first->second.push_back(&Sym);
 
 1071    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
 
const MCSubtargetInfo * getSubtargetInfo() 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.
 
MCFragment * getNext() const
 
int64_t getControlledNopLength() const
 
int64_t getNumBytes() const
 
const MCSubtargetInfo * getSubtargetInfo() 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()
 
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.
 
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)
 
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
 
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.