23#define DEBUG_TYPE "m68k-asm-parser"
29 cl::desc(
"Enable specifying registers without the % prefix"),
38#define GET_ASSEMBLER_HEADER
39#include "M68kGenAsmMatcher.inc"
62 MRI = getContext().getRegisterInfo();
64 setAvailableFeatures(ComputeAvailableFeatures(STI.
getFeatureBits()));
67 unsigned validateTargetOperandClass(MCParsedAsmOperand &
Op,
68 unsigned Kind)
override;
69 bool parseRegister(MCRegister &
Reg, SMLoc &StartLoc, SMLoc &EndLoc)
override;
70 ParseStatus tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
71 SMLoc &EndLoc)
override;
72 bool parseInstruction(ParseInstructionInfo &
Info, StringRef Name,
74 bool matchAndEmitInstruction(SMLoc IDLoc,
unsigned &Opcode,
77 bool MatchingInlineAsm)
override;
88 RegIndirectDisplacement,
89 RegIndirectDisplacementIndex,
106 const MCExpr *OuterDisp;
107 const MCExpr *InnerDisp;
114 M68kMemOp(Kind Op) : Op(Op) {}
116 void print(raw_ostream &OS)
const;
121 typedef MCParsedAsmOperand Base;
138 template <
unsigned N>
bool isAddrN()
const;
141 M68kOperand(KindTy Kind, SMLoc Start, SMLoc End)
142 : Base(), Kind(Kind), Start(Start), End(End) {}
144 SMLoc getStartLoc()
const override {
return Start; }
145 SMLoc getEndLoc()
const override {
return End; }
147 void print(raw_ostream &OS,
const MCAsmInfo &MAI)
const override;
149 bool isMem()
const override {
return false; }
150 bool isMemOp()
const {
return Kind == KindTy::MemOp; }
152 static void addExpr(MCInst &Inst,
const MCExpr *Expr);
155 bool isReg()
const override;
158 bool isFPDReg()
const;
159 bool isFPCReg()
const;
160 MCRegister
getReg()
const override;
161 void addRegOperands(MCInst &Inst,
unsigned N)
const;
163 static std::unique_ptr<M68kOperand> createMemOp(M68kMemOp MemOp, SMLoc Start,
167 bool isToken()
const override;
169 static std::unique_ptr<M68kOperand> createToken(StringRef Token, SMLoc Start,
173 bool isImm()
const override;
174 void addImmOperands(MCInst &Inst,
unsigned N)
const;
176 static std::unique_ptr<M68kOperand> createImm(
const MCExpr *Expr, SMLoc Start,
180 bool isTrapImm()
const;
182 bool isBkptImm()
const;
185 bool isMoveMask()
const;
186 void addMoveMaskOperands(MCInst &Inst,
unsigned N)
const;
190 bool isAddr8()
const {
return isAddrN<8>(); }
191 bool isAddr16()
const {
return isAddrN<16>(); }
192 bool isAddr32()
const {
return isAddrN<32>(); }
193 void addAddrOperands(MCInst &Inst,
unsigned N)
const;
197 void addARIOperands(MCInst &Inst,
unsigned N)
const;
201 void addARIDOperands(MCInst &Inst,
unsigned N)
const;
205 void addARIIOperands(MCInst &Inst,
unsigned N)
const;
208 bool isARIPD()
const;
209 void addARIPDOperands(MCInst &Inst,
unsigned N)
const;
212 bool isARIPI()
const;
213 void addARIPIOperands(MCInst &Inst,
unsigned N)
const;
217 void addPCDOperands(MCInst &Inst,
unsigned N)
const;
221 void addPCIOperands(MCInst &Inst,
unsigned N)
const;
230#define GET_REGISTER_MATCHER
231#define GET_MATCHER_IMPLEMENTATION
232#include "M68kGenAsmMatcher.inc"
235 static unsigned RegistersByIndex[] = {
236 M68k::D0, M68k::D1, M68k::D2, M68k::D3, M68k::D4, M68k::D5,
237 M68k::D6, M68k::D7, M68k::A0, M68k::A1, M68k::A2, M68k::A3,
238 M68k::A4, M68k::A5, M68k::A6, M68k::SP, M68k::FP0, M68k::FP1,
239 M68k::FP2, M68k::FP3, M68k::FP4, M68k::FP5, M68k::FP6, M68k::FP7};
241 sizeof(RegistersByIndex) /
sizeof(RegistersByIndex[0]));
242 return RegistersByIndex[RegisterIndex];
278 OS <<
"RegMask(" <<
format(
"%04x", RegMask) <<
")";
281 OS <<
'%' << OuterReg;
283 case Kind::RegIndirect:
284 OS <<
"(%" << OuterReg <<
')';
286 case Kind::RegPostIncrement:
287 OS <<
"(%" << OuterReg <<
")+";
289 case Kind::RegPreDecrement:
290 OS <<
"-(%" << OuterReg <<
")";
292 case Kind::RegIndirectDisplacement:
293 OS << OuterDisp <<
"(%" << OuterReg <<
")";
295 case Kind::RegIndirectDisplacementIndex:
296 OS << OuterDisp <<
"(%" << OuterReg <<
", " << InnerReg <<
"." <<
Size
297 <<
", " << InnerDisp <<
")";
302void M68kOperand::addExpr(MCInst &Inst,
const MCExpr *Expr) {
312bool M68kOperand::isReg()
const {
313 return Kind == KindTy::MemOp && MemOp.Op == M68kMemOp::Kind::Reg;
316MCRegister M68kOperand::getReg()
const {
318 return MemOp.OuterReg;
321void M68kOperand::addRegOperands(MCInst &Inst,
unsigned N)
const {
323 assert((
N == 1) &&
"can only handle one register operand");
328std::unique_ptr<M68kOperand> M68kOperand::createMemOp(M68kMemOp MemOp,
329 SMLoc Start, SMLoc End) {
330 auto Op = std::make_unique<M68kOperand>(KindTy::MemOp, Start, End);
336bool M68kOperand::isToken()
const {
return Kind == KindTy::Token; }
337StringRef M68kOperand::getToken()
const {
342std::unique_ptr<M68kOperand> M68kOperand::createToken(StringRef Token,
343 SMLoc Start, SMLoc End) {
344 auto Op = std::make_unique<M68kOperand>(KindTy::Token, Start, End);
350bool M68kOperand::isImm()
const {
return Kind == KindTy::Imm; }
351void M68kOperand::addImmOperands(MCInst &Inst,
unsigned N)
const {
352 assert(isImm() &&
"wrong operand kind");
353 assert((
N == 1) &&
"can only handle one register operand");
355 M68kOperand::addExpr(Inst, Expr);
358std::unique_ptr<M68kOperand> M68kOperand::createImm(
const MCExpr *Expr,
359 SMLoc Start, SMLoc End) {
360 auto Op = std::make_unique<M68kOperand>(KindTy::Imm, Start, End);
365bool M68kOperand::isTrapImm()
const {
367 if (!isImm() || !Expr->evaluateAsAbsolute(
Value))
373bool M68kOperand::isBkptImm()
const {
375 if (!isImm() || !Expr->evaluateAsAbsolute(
Value))
382bool M68kOperand::isMoveMask()
const {
386 if (MemOp.Op == M68kMemOp::Kind::RegMask)
389 if (MemOp.Op != M68kMemOp::Kind::Reg)
397void M68kOperand::addMoveMaskOperands(MCInst &Inst,
unsigned N)
const {
398 assert(isMoveMask() &&
"wrong operand kind");
399 assert((
N == 1) &&
"can only handle one immediate operand");
401 uint16_t MoveMask = MemOp.RegMask;
402 if (MemOp.Op == M68kMemOp::Kind::Reg)
409bool M68kOperand::isAddr()
const {
410 return isMemOp() && MemOp.Op == M68kMemOp::Kind::Addr;
414template <
unsigned N>
bool M68kOperand::isAddrN()
const {
417 if (MemOp.OuterDisp->evaluateAsAbsolute(Res))
423void M68kOperand::addAddrOperands(MCInst &Inst,
unsigned N)
const {
424 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
428bool M68kOperand::isARI()
const {
429 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirect &&
430 M68k::AR32RegClass.contains(MemOp.OuterReg);
432void M68kOperand::addARIOperands(MCInst &Inst,
unsigned N)
const {
437bool M68kOperand::isARID()
const {
438 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacement &&
439 M68k::AR32RegClass.contains(MemOp.OuterReg);
441void M68kOperand::addARIDOperands(MCInst &Inst,
unsigned N)
const {
442 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
447bool M68kOperand::isARII()
const {
449 MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacementIndex &&
450 M68k::AR32RegClass.contains(MemOp.OuterReg);
452void M68kOperand::addARIIOperands(MCInst &Inst,
unsigned N)
const {
453 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
459bool M68kOperand::isARIPD()
const {
460 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegPreDecrement &&
461 M68k::AR32RegClass.contains(MemOp.OuterReg);
463void M68kOperand::addARIPDOperands(MCInst &Inst,
unsigned N)
const {
468bool M68kOperand::isARIPI()
const {
469 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegPostIncrement &&
470 M68k::AR32RegClass.contains(MemOp.OuterReg);
472void M68kOperand::addARIPIOperands(MCInst &Inst,
unsigned N)
const {
477bool M68kOperand::isPCD()
const {
478 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacement &&
479 MemOp.OuterReg == M68k::PC;
481void M68kOperand::addPCDOperands(MCInst &Inst,
unsigned N)
const {
482 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
486bool M68kOperand::isPCI()
const {
488 MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacementIndex &&
489 MemOp.OuterReg == M68k::PC;
491void M68kOperand::addPCIOperands(MCInst &Inst,
unsigned N)
const {
492 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
497 bool SP,
bool FPDR =
false,
547bool M68kOperand::isAReg()
const {
553bool M68kOperand::isDReg()
const {
559bool M68kOperand::isFPDReg()
const {
566bool M68kOperand::isFPCReg()
const {
573unsigned M68kAsmParser::validateTargetOperandClass(MCParsedAsmOperand &
Op,
575 M68kOperand &Operand = (M68kOperand &)
Op;
580 if (Operand.isReg() &&
582 return Match_Success;
588 if (Operand.isReg() &&
590 return Match_Success;
595 if (Operand.isReg() &&
597 return Match_Success;
604 if (Operand.isReg() &&
606 return Match_Success;
611 if (Operand.isReg() &&
612 ((Operand.getReg() == M68k::A0) || (Operand.getReg() == M68k::A1))) {
613 return Match_Success;
618 if (Operand.isReg() &&
619 ((Operand.getReg() == M68k::D0) || (Operand.getReg() == M68k::D1))) {
620 return Match_Success;
625 if (Operand.isReg() &&
626 ((Operand.getReg() == M68k::D0) || (Operand.getReg() == M68k::D1) ||
627 (Operand.getReg() == M68k::A0) || (Operand.getReg() == M68k::A1))) {
628 return Match_Success;
633 return Match_InvalidOperand;
636bool M68kAsmParser::parseRegisterName(MCRegister &RegNo, SMLoc Loc,
637 StringRef RegisterName) {
638 auto RegisterNameLower = RegisterName.
lower();
641 if (RegisterNameLower ==
"ccr") {
644 }
else if (RegisterNameLower ==
"sr") {
650 if (RegisterNameLower.size() == 2) {
652 switch (RegisterNameLower[0]) {
655 if (isdigit(RegisterNameLower[1])) {
656 unsigned IndexOffset = (RegisterNameLower[0] ==
'a') ? 8 : 0;
657 unsigned RegIndex = (unsigned)(RegisterNameLower[1] -
'0');
667 if (RegisterNameLower[1] ==
'p') {
670 }
else if (RegisterNameLower[1] ==
'r') {
677 if (RegisterNameLower[1] ==
'c') {
683 }
else if (StringRef(RegisterNameLower).
starts_with(
"fp") &&
684 RegisterNameLower.size() > 2) {
685 auto RegIndex = unsigned(RegisterNameLower[2] -
'0');
686 if (RegIndex < 8 && RegisterNameLower.size() == 3) {
692 RegNo = StringSwitch<unsigned>(RegisterNameLower)
693 .Cases(
"fpc",
"fpcr", M68k::FPC)
694 .Cases(
"fps",
"fpsr", M68k::FPS)
695 .Cases(
"fpi",
"fpiar", M68k::FPIAR)
696 .Default(M68k::NoRegister);
697 assert(RegNo != M68k::NoRegister &&
698 "Unrecognized FP control register name");
706ParseStatus M68kAsmParser::parseRegister(MCRegister &RegNo) {
707 bool HasPercent =
false;
708 AsmToken PercentToken;
714 PercentToken = Lex();
721 getLexer().UnLex(PercentToken);
727 if (!parseRegisterName(RegNo, Parser.
getLexer().
getLoc(), RegisterName)) {
729 getLexer().UnLex(PercentToken);
738bool M68kAsmParser::parseRegister(MCRegister &
Reg, SMLoc &StartLoc,
740 ParseStatus
Result = tryParseRegister(
Reg, StartLoc, EndLoc);
742 return Error(StartLoc,
"expected register");
747ParseStatus M68kAsmParser::tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
749 StartLoc = getLexer().getLoc();
751 EndLoc = getLexer().getLoc();
755bool M68kAsmParser::isExpr() {
771 SMLoc
Start = getLexer().getLoc();
777 if (getParser().parseExpression(Expr, End))
780 Operands.push_back(M68kOperand::createImm(Expr, Start, End));
785 SMLoc
Start = getLexer().getLoc();
795 bool HasDisplacement =
false;
799 }
else if (isExpr()) {
802 HasDisplacement =
true;
806 if (HasDisplacement) {
807 MemOp.Op = M68kMemOp::Kind::Addr;
809 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
813 return Error(getLexer().getLoc(),
"expected (");
820 if (!HasDisplacement && isExpr()) {
823 HasDisplacement =
true;
827 MemOp.Op = M68kMemOp::Kind::Addr;
829 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
836 Result = parseRegister(MemOp.OuterReg);
841 return Error(getLexer().getLoc(),
"expected register");
848 Result = parseRegister(MemOp.InnerReg);
853 return Error(getLexer().getLoc(),
"expected register");
863 return Error(getLexer().getLoc(),
"expected )");
872 SMLoc End = getLexer().getLoc();
874 unsigned OpCount = IsPD + IsPI + (
HasIndex || HasDisplacement);
876 return Error(Start,
"only one of post-increment, pre-decrement or "
877 "displacement can be used");
880 MemOp.Op = M68kMemOp::Kind::RegPreDecrement;
882 MemOp.Op = M68kMemOp::Kind::RegPostIncrement;
883 }
else if (HasIndex) {
884 MemOp.Op = M68kMemOp::Kind::RegIndirectDisplacementIndex;
885 }
else if (HasDisplacement) {
886 MemOp.Op = M68kMemOp::Kind::RegIndirectDisplacement;
888 MemOp.Op = M68kMemOp::Kind::RegIndirect;
891 Operands.push_back(M68kOperand::createMemOp(MemOp, Start, End));
896 SMLoc
Start = getLexer().getLoc();
897 M68kMemOp MemOp(M68kMemOp::Kind::RegMask);
901 bool IsFirstRegister =
902 (MemOp.Op == M68kMemOp::Kind::RegMask) && (MemOp.RegMask == 0);
904 MCRegister FirstRegister;
905 ParseStatus
Result = parseRegister(FirstRegister);
906 if (IsFirstRegister &&
Result.isNoMatch())
909 return Error(getLexer().getLoc(),
"expected start register");
911 MCRegister LastRegister = FirstRegister;
913 Result = parseRegister(LastRegister);
915 return Error(getLexer().getLoc(),
"expected end register");
921 uint16_t NumNewBits = LastRegisterIndex - FirstRegisterIndex + 1;
922 uint16_t NewMaskBits = ((1 << NumNewBits) - 1) << FirstRegisterIndex;
924 if (IsFirstRegister && (FirstRegister == LastRegister)) {
927 MemOp.Op = M68kMemOp::Kind::Reg;
928 MemOp.OuterReg = FirstRegister;
930 if (MemOp.Op == M68kMemOp::Kind::Reg) {
933 MemOp.Op = M68kMemOp::Kind::RegMask;
936 if (MemOp.RegMask == 0)
937 return Error(getLexer().getLoc(),
938 "special registers cannot be used in register masks");
941 if ((FirstRegisterIndex >= 16) || (LastRegisterIndex >= 16))
942 return Error(getLexer().getLoc(),
943 "special registers cannot be used in register masks");
945 if (NewMaskBits & MemOp.RegMask)
946 return Error(getLexer().getLoc(),
"conflicting masked registers");
948 MemOp.RegMask |= NewMaskBits;
956 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
960void M68kAsmParser::eatComma() {
966bool M68kAsmParser::parseInstruction(ParseInstructionInfo &
Info, StringRef Name,
968 SMLoc
Start = getLexer().getLoc();
969 Operands.push_back(M68kOperand::createToken(Name, Start, Start));
979 ParseStatus MatchResult = MatchOperandParserImpl(
Operands, Name);
984 SMLoc Loc = getLexer().getLoc();
986 return Error(Loc,
"unexpected token parsing operands");
994bool M68kAsmParser::invalidOperand(SMLoc
const &Loc,
996 uint64_t
const &ErrorInfo) {
997 SMLoc ErrorLoc = Loc;
998 char const *Diag = 0;
1000 if (ErrorInfo != ~0U) {
1001 if (ErrorInfo >=
Operands.size()) {
1002 Diag =
"too few operands for instruction.";
1004 auto const &
Op = (M68kOperand
const &)*
Operands[ErrorInfo];
1005 if (
Op.getStartLoc() != SMLoc()) {
1006 ErrorLoc =
Op.getStartLoc();
1012 Diag =
"invalid operand for instruction";
1015 return Error(ErrorLoc, Diag);
1018bool M68kAsmParser::missingFeature(llvm::SMLoc
const &Loc,
1019 uint64_t
const &ErrorInfo) {
1020 return Error(Loc,
"instruction requires a CPU feature not currently enabled");
1023bool M68kAsmParser::emit(MCInst &Inst, SMLoc
const &Loc,
1024 MCStreamer &Out)
const {
1031bool M68kAsmParser::matchAndEmitInstruction(SMLoc Loc,
unsigned &Opcode,
1034 uint64_t &ErrorInfo,
1035 bool MatchingInlineAsm) {
1037 unsigned MatchResult =
1038 MatchInstructionImpl(
Operands, Inst, ErrorInfo, MatchingInlineAsm);
1040 switch (MatchResult) {
1042 return emit(Inst, Loc, Out);
1043 case Match_MissingFeature:
1044 return missingFeature(Loc, ErrorInfo);
1045 case Match_InvalidOperand:
1046 return invalidOperand(Loc,
Operands, ErrorInfo);
1047 case Match_MnemonicFail:
1048 return Error(Loc,
"invalid instruction");
1054void M68kOperand::print(raw_ostream &OS,
const MCAsmInfo &MAI)
const {
1056 case KindTy::Invalid:
1061 OS <<
"token '" << Token <<
"'";
1066 Expr->evaluateAsAbsolute(
Value);
1067 OS <<
"immediate " <<
Value;
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isNot(const MachineRegisterInfo &MRI, const MachineInstr &MI)
Analysis containing CSE Info
#define LLVM_EXTERNAL_VISIBILITY
static bool checkRegisterClass(unsigned RegNo, bool Data, bool Address, bool SP, bool FPDR=false, bool FPCR=false)
static cl::opt< bool > RegisterPrefixOptional("m68k-register-prefix-optional", cl::Hidden, cl::desc("Enable specifying registers without the % prefix"), cl::init(false))
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kAsmParser()
static unsigned getRegisterByIndex(unsigned RegisterIndex)
static unsigned getRegisterIndex(unsigned Register)
This file contains the M68k implementation of the TargetInstrInfo class.
This file contains the declarations of the M68k MCAsmInfo properties.
This file contains the M68k implementation of the TargetRegisterInfo class.
mir Rename Register Operands
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
static bool isReg(const MCInst &MI, unsigned OpNo)
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
SMLoc getLoc() const
Get the current source location.
bool isNot(TokenKind K) const
StringRef getString() const
Get the string for the current token, this includes all characters (for example, the quotes on string...
bool is(TokenKind K) const
TokenKind getKind() const
Base class for user error types.
virtual void Initialize(MCAsmParser &Parser)
Initialize the extension for parsing using the given Parser.
Generic assembler parser interface, for use by target specific assembly parsers.
virtual void eatToEndOfStatement()=0
Skip to the end of the current statement, for error recovery.
virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc)=0
Parse an arbitrary expression.
const AsmToken & getTok() const
Get the current AsmToken from the stream.
virtual const AsmToken & Lex()=0
Get the next AsmToken in the stream, possibly handling file inclusion first.
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Instances of this class represent a single low-level machine instruction.
void addOperand(const MCOperand Op)
Interface to description of machine instruction set.
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
MCParsedAsmOperand - This abstract class represents a source-level assembly instruction operand.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
Generic base class for all target subtargets.
const FeatureBitset & getFeatureBits() const
MCTargetAsmParser - Generic interface to target specific assembly parsers.
Ternary parse status returned by various parse* methods.
static constexpr StatusTy Failure
constexpr bool isSuccess() const
static constexpr StatusTy Success
static constexpr StatusTy NoMatch
Wrapper class representing virtual and physical registers.
Represents a location in source code.
StringRef - Represent a constant reference to a string, i.e.
LLVM_ABI std::string lower() const
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
static bool isMem(const MachineInstr &MI, unsigned Op)
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
SmallVectorImpl< std::unique_ptr< MCParsedAsmOperand > > OperandVector
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
DWARFExpression::Operation Op
Target & getTheM68kTarget()
RegisterMCAsmParser - Helper template for registering a target specific assembly parser,...