23#define DEBUG_TYPE "m68k-asm-parser"
29 cl::desc(
"Enable specifying registers without the % prefix"),
39#define GET_ASSEMBLER_HEADER
40#include "M68kGenAsmMatcher.inc"
63 MRI = getContext().getRegisterInfo();
65 setAvailableFeatures(ComputeAvailableFeatures(STI.
getFeatureBits()));
68 unsigned validateTargetOperandClass(MCParsedAsmOperand &
Op,
69 unsigned Kind)
override;
70 bool parseRegister(MCRegister &
Reg, SMLoc &StartLoc, SMLoc &EndLoc)
override;
71 ParseStatus tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
72 SMLoc &EndLoc)
override;
73 bool parseInstruction(ParseInstructionInfo &
Info, StringRef Name,
75 bool matchAndEmitInstruction(SMLoc IDLoc,
unsigned &Opcode,
78 bool MatchingInlineAsm)
override;
89 RegIndirectDisplacement,
90 RegIndirectDisplacementIndex,
107 const MCExpr *OuterDisp;
108 const MCExpr *InnerDisp;
115 M68kMemOp(Kind Op) : Op(Op) {}
117 void print(raw_ostream &OS)
const;
122 typedef MCParsedAsmOperand Base;
139 template <
unsigned N>
bool isAddrN()
const;
142 M68kOperand(KindTy Kind, SMLoc Start, SMLoc End)
143 : Base(), Kind(Kind), Start(Start), End(End) {}
145 SMLoc getStartLoc()
const override {
return Start; }
146 SMLoc getEndLoc()
const override {
return End; }
148 void print(raw_ostream &OS,
const MCAsmInfo &MAI)
const override;
150 bool isMem()
const override {
return false; }
151 bool isMemOp()
const {
return Kind == KindTy::MemOp; }
153 static void addExpr(MCInst &Inst,
const MCExpr *Expr);
156 bool isReg()
const override;
159 bool isFPDReg()
const;
160 bool isFPCReg()
const;
161 MCRegister
getReg()
const override;
162 void addRegOperands(MCInst &Inst,
unsigned N)
const;
164 static std::unique_ptr<M68kOperand> createMemOp(M68kMemOp MemOp, SMLoc Start,
168 bool isToken()
const override;
170 static std::unique_ptr<M68kOperand> createToken(StringRef Token, SMLoc Start,
174 bool isImm()
const override;
175 void addImmOperands(MCInst &Inst,
unsigned N)
const;
177 static std::unique_ptr<M68kOperand> createImm(
const MCExpr *Expr, SMLoc Start,
181 bool isTrapImm()
const;
183 bool isBkptImm()
const;
186 bool isMoveMask()
const;
187 void addMoveMaskOperands(MCInst &Inst,
unsigned N)
const;
191 bool isAddr8()
const {
return isAddrN<8>(); }
192 bool isAddr16()
const {
return isAddrN<16>(); }
193 bool isAddr32()
const {
return isAddrN<32>(); }
194 void addAddrOperands(MCInst &Inst,
unsigned N)
const;
198 void addARIOperands(MCInst &Inst,
unsigned N)
const;
202 void addARIDOperands(MCInst &Inst,
unsigned N)
const;
206 void addARIIOperands(MCInst &Inst,
unsigned N)
const;
209 bool isARIPD()
const;
210 void addARIPDOperands(MCInst &Inst,
unsigned N)
const;
213 bool isARIPI()
const;
214 void addARIPIOperands(MCInst &Inst,
unsigned N)
const;
218 void addPCDOperands(MCInst &Inst,
unsigned N)
const;
222 void addPCIOperands(MCInst &Inst,
unsigned N)
const;
231#define GET_REGISTER_MATCHER
232#define GET_MATCHER_IMPLEMENTATION
233#include "M68kGenAsmMatcher.inc"
236 static unsigned RegistersByIndex[] = {
237 M68k::D0, M68k::D1, M68k::D2, M68k::D3, M68k::D4, M68k::D5,
238 M68k::D6, M68k::D7, M68k::A0, M68k::A1, M68k::A2, M68k::A3,
239 M68k::A4, M68k::A5, M68k::A6, M68k::SP, M68k::FP0, M68k::FP1,
240 M68k::FP2, M68k::FP3, M68k::FP4, M68k::FP5, M68k::FP6, M68k::FP7};
242 sizeof(RegistersByIndex) /
sizeof(RegistersByIndex[0]));
243 return RegistersByIndex[RegisterIndex];
279 OS <<
"RegMask(" <<
format(
"%04x", RegMask) <<
")";
282 OS <<
'%' << OuterReg;
284 case Kind::RegIndirect:
285 OS <<
"(%" << OuterReg <<
')';
287 case Kind::RegPostIncrement:
288 OS <<
"(%" << OuterReg <<
")+";
290 case Kind::RegPreDecrement:
291 OS <<
"-(%" << OuterReg <<
")";
293 case Kind::RegIndirectDisplacement:
294 OS << OuterDisp <<
"(%" << OuterReg <<
")";
296 case Kind::RegIndirectDisplacementIndex:
297 OS << OuterDisp <<
"(%" << OuterReg <<
", " << InnerReg <<
"." <<
Size
298 <<
", " << InnerDisp <<
")";
303void M68kOperand::addExpr(MCInst &Inst,
const MCExpr *Expr) {
313bool M68kOperand::isReg()
const {
314 return Kind == KindTy::MemOp && MemOp.Op == M68kMemOp::Kind::Reg;
317MCRegister M68kOperand::getReg()
const {
319 return MemOp.OuterReg;
322void M68kOperand::addRegOperands(MCInst &Inst,
unsigned N)
const {
324 assert((
N == 1) &&
"can only handle one register operand");
329std::unique_ptr<M68kOperand> M68kOperand::createMemOp(M68kMemOp MemOp,
330 SMLoc Start, SMLoc End) {
331 auto Op = std::make_unique<M68kOperand>(KindTy::MemOp, Start, End);
337bool M68kOperand::isToken()
const {
return Kind == KindTy::Token; }
338StringRef M68kOperand::getToken()
const {
343std::unique_ptr<M68kOperand> M68kOperand::createToken(StringRef Token,
344 SMLoc Start, SMLoc End) {
345 auto Op = std::make_unique<M68kOperand>(KindTy::Token, Start, End);
351bool M68kOperand::isImm()
const {
return Kind == KindTy::Imm; }
352void M68kOperand::addImmOperands(MCInst &Inst,
unsigned N)
const {
353 assert(isImm() &&
"wrong operand kind");
354 assert((
N == 1) &&
"can only handle one register operand");
356 M68kOperand::addExpr(Inst, Expr);
359std::unique_ptr<M68kOperand> M68kOperand::createImm(
const MCExpr *Expr,
360 SMLoc Start, SMLoc End) {
361 auto Op = std::make_unique<M68kOperand>(KindTy::Imm, Start, End);
366bool M68kOperand::isTrapImm()
const {
368 if (!isImm() || !Expr->evaluateAsAbsolute(
Value))
374bool M68kOperand::isBkptImm()
const {
376 if (!isImm() || !Expr->evaluateAsAbsolute(
Value))
383bool M68kOperand::isMoveMask()
const {
387 if (MemOp.Op == M68kMemOp::Kind::RegMask)
390 if (MemOp.Op != M68kMemOp::Kind::Reg)
398void M68kOperand::addMoveMaskOperands(MCInst &Inst,
unsigned N)
const {
399 assert(isMoveMask() &&
"wrong operand kind");
400 assert((
N == 1) &&
"can only handle one immediate operand");
402 uint16_t MoveMask = MemOp.RegMask;
403 if (MemOp.Op == M68kMemOp::Kind::Reg)
410bool M68kOperand::isAddr()
const {
411 return isMemOp() && MemOp.Op == M68kMemOp::Kind::Addr;
415template <
unsigned N>
bool M68kOperand::isAddrN()
const {
418 if (MemOp.OuterDisp->evaluateAsAbsolute(Res))
424void M68kOperand::addAddrOperands(MCInst &Inst,
unsigned N)
const {
425 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
429bool M68kOperand::isARI()
const {
430 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirect &&
431 M68k::AR32RegClass.contains(MemOp.OuterReg);
433void M68kOperand::addARIOperands(MCInst &Inst,
unsigned N)
const {
438bool M68kOperand::isARID()
const {
439 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacement &&
440 M68k::AR32RegClass.contains(MemOp.OuterReg);
442void M68kOperand::addARIDOperands(MCInst &Inst,
unsigned N)
const {
443 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
448bool M68kOperand::isARII()
const {
450 MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacementIndex &&
451 M68k::AR32RegClass.contains(MemOp.OuterReg);
453void M68kOperand::addARIIOperands(MCInst &Inst,
unsigned N)
const {
454 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
460bool M68kOperand::isARIPD()
const {
461 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegPreDecrement &&
462 M68k::AR32RegClass.contains(MemOp.OuterReg);
464void M68kOperand::addARIPDOperands(MCInst &Inst,
unsigned N)
const {
469bool M68kOperand::isARIPI()
const {
470 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegPostIncrement &&
471 M68k::AR32RegClass.contains(MemOp.OuterReg);
473void M68kOperand::addARIPIOperands(MCInst &Inst,
unsigned N)
const {
478bool M68kOperand::isPCD()
const {
479 return isMemOp() && MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacement &&
480 MemOp.OuterReg == M68k::PC;
482void M68kOperand::addPCDOperands(MCInst &Inst,
unsigned N)
const {
483 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
487bool M68kOperand::isPCI()
const {
489 MemOp.Op == M68kMemOp::Kind::RegIndirectDisplacementIndex &&
490 MemOp.OuterReg == M68k::PC;
492void M68kOperand::addPCIOperands(MCInst &Inst,
unsigned N)
const {
493 M68kOperand::addExpr(Inst, MemOp.OuterDisp);
498 bool SP,
bool FPDR =
false,
548bool M68kOperand::isAReg()
const {
554bool M68kOperand::isDReg()
const {
560bool M68kOperand::isFPDReg()
const {
567bool M68kOperand::isFPCReg()
const {
574unsigned M68kAsmParser::validateTargetOperandClass(MCParsedAsmOperand &
Op,
576 M68kOperand &Operand = (M68kOperand &)
Op;
581 if (Operand.isReg() &&
583 return Match_Success;
589 if (Operand.isReg() &&
591 return Match_Success;
596 if (Operand.isReg() &&
598 return Match_Success;
605 if (Operand.isReg() &&
607 return Match_Success;
612 if (Operand.isReg() &&
613 ((Operand.getReg() == M68k::A0) || (Operand.getReg() == M68k::A1))) {
614 return Match_Success;
619 if (Operand.isReg() &&
620 ((Operand.getReg() == M68k::D0) || (Operand.getReg() == M68k::D1))) {
621 return Match_Success;
626 if (Operand.isReg() &&
627 ((Operand.getReg() == M68k::D0) || (Operand.getReg() == M68k::D1) ||
628 (Operand.getReg() == M68k::A0) || (Operand.getReg() == M68k::A1))) {
629 return Match_Success;
634 return Match_InvalidOperand;
637bool M68kAsmParser::parseRegisterName(MCRegister &RegNo, SMLoc Loc,
638 StringRef RegisterName) {
639 auto RegisterNameLower = RegisterName.
lower();
642 if (RegisterNameLower ==
"ccr") {
645 }
else if (RegisterNameLower ==
"sr") {
651 if (RegisterNameLower.size() == 2) {
653 switch (RegisterNameLower[0]) {
656 if (isdigit(RegisterNameLower[1])) {
657 unsigned IndexOffset = (RegisterNameLower[0] ==
'a') ? 8 : 0;
658 unsigned RegIndex = (unsigned)(RegisterNameLower[1] -
'0');
668 if (RegisterNameLower[1] ==
'p') {
671 }
else if (RegisterNameLower[1] ==
'r') {
678 if (RegisterNameLower[1] ==
'c') {
684 }
else if (StringRef(RegisterNameLower).
starts_with(
"fp") &&
685 RegisterNameLower.size() > 2) {
686 auto RegIndex = unsigned(RegisterNameLower[2] -
'0');
687 if (RegIndex < 8 && RegisterNameLower.size() == 3) {
693 RegNo = StringSwitch<unsigned>(RegisterNameLower)
694 .Cases(
"fpc",
"fpcr", M68k::FPC)
695 .Cases(
"fps",
"fpsr", M68k::FPS)
696 .Cases(
"fpi",
"fpiar", M68k::FPIAR)
697 .Default(M68k::NoRegister);
698 assert(RegNo != M68k::NoRegister &&
699 "Unrecognized FP control register name");
707ParseStatus M68kAsmParser::parseRegister(MCRegister &RegNo) {
708 bool HasPercent =
false;
709 AsmToken PercentToken;
715 PercentToken = Lex();
722 getLexer().UnLex(PercentToken);
728 if (!parseRegisterName(RegNo, Parser.
getLexer().
getLoc(), RegisterName)) {
730 getLexer().UnLex(PercentToken);
739bool M68kAsmParser::parseRegister(MCRegister &
Reg, SMLoc &StartLoc,
741 ParseStatus
Result = tryParseRegister(
Reg, StartLoc, EndLoc);
743 return Error(StartLoc,
"expected register");
748ParseStatus M68kAsmParser::tryParseRegister(MCRegister &
Reg, SMLoc &StartLoc,
750 StartLoc = getLexer().getLoc();
752 EndLoc = getLexer().getLoc();
756bool M68kAsmParser::isExpr() {
772 SMLoc
Start = getLexer().getLoc();
778 if (getParser().parseExpression(Expr, End))
781 Operands.push_back(M68kOperand::createImm(Expr, Start, End));
786 SMLoc
Start = getLexer().getLoc();
796 bool HasDisplacement =
false;
800 }
else if (isExpr()) {
803 HasDisplacement =
true;
807 if (HasDisplacement) {
808 MemOp.Op = M68kMemOp::Kind::Addr;
810 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
814 return Error(getLexer().getLoc(),
"expected (");
821 if (!HasDisplacement && isExpr()) {
824 HasDisplacement =
true;
828 MemOp.Op = M68kMemOp::Kind::Addr;
830 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
837 Result = parseRegister(MemOp.OuterReg);
842 return Error(getLexer().getLoc(),
"expected register");
849 Result = parseRegister(MemOp.InnerReg);
854 return Error(getLexer().getLoc(),
"expected register");
864 return Error(getLexer().getLoc(),
"expected )");
873 SMLoc End = getLexer().getLoc();
875 unsigned OpCount = IsPD + IsPI + (
HasIndex || HasDisplacement);
877 return Error(Start,
"only one of post-increment, pre-decrement or "
878 "displacement can be used");
881 MemOp.Op = M68kMemOp::Kind::RegPreDecrement;
883 MemOp.Op = M68kMemOp::Kind::RegPostIncrement;
884 }
else if (HasIndex) {
885 MemOp.Op = M68kMemOp::Kind::RegIndirectDisplacementIndex;
886 }
else if (HasDisplacement) {
887 MemOp.Op = M68kMemOp::Kind::RegIndirectDisplacement;
889 MemOp.Op = M68kMemOp::Kind::RegIndirect;
892 Operands.push_back(M68kOperand::createMemOp(MemOp, Start, End));
897 SMLoc
Start = getLexer().getLoc();
898 M68kMemOp MemOp(M68kMemOp::Kind::RegMask);
902 bool IsFirstRegister =
903 (MemOp.Op == M68kMemOp::Kind::RegMask) && (MemOp.RegMask == 0);
905 MCRegister FirstRegister;
906 ParseStatus
Result = parseRegister(FirstRegister);
907 if (IsFirstRegister &&
Result.isNoMatch())
910 return Error(getLexer().getLoc(),
"expected start register");
912 MCRegister LastRegister = FirstRegister;
914 Result = parseRegister(LastRegister);
916 return Error(getLexer().getLoc(),
"expected end register");
922 uint16_t NumNewBits = LastRegisterIndex - FirstRegisterIndex + 1;
923 uint16_t NewMaskBits = ((1 << NumNewBits) - 1) << FirstRegisterIndex;
925 if (IsFirstRegister && (FirstRegister == LastRegister)) {
928 MemOp.Op = M68kMemOp::Kind::Reg;
929 MemOp.OuterReg = FirstRegister;
931 if (MemOp.Op == M68kMemOp::Kind::Reg) {
934 MemOp.Op = M68kMemOp::Kind::RegMask;
937 if (MemOp.RegMask == 0)
938 return Error(getLexer().getLoc(),
939 "special registers cannot be used in register masks");
942 if ((FirstRegisterIndex >= 16) || (LastRegisterIndex >= 16))
943 return Error(getLexer().getLoc(),
944 "special registers cannot be used in register masks");
946 if (NewMaskBits & MemOp.RegMask)
947 return Error(getLexer().getLoc(),
"conflicting masked registers");
949 MemOp.RegMask |= NewMaskBits;
957 M68kOperand::createMemOp(MemOp, Start, getLexer().getLoc()));
961void M68kAsmParser::eatComma() {
967bool M68kAsmParser::parseInstruction(ParseInstructionInfo &
Info, StringRef Name,
969 SMLoc
Start = getLexer().getLoc();
970 Operands.push_back(M68kOperand::createToken(Name, Start, Start));
980 ParseStatus MatchResult = MatchOperandParserImpl(
Operands, Name);
985 SMLoc Loc = getLexer().getLoc();
987 return Error(Loc,
"unexpected token parsing operands");
995bool M68kAsmParser::invalidOperand(SMLoc
const &Loc,
997 uint64_t
const &ErrorInfo) {
998 SMLoc ErrorLoc = Loc;
999 char const *Diag = 0;
1001 if (ErrorInfo != ~0U) {
1002 if (ErrorInfo >=
Operands.size()) {
1003 Diag =
"too few operands for instruction.";
1005 auto const &
Op = (M68kOperand
const &)*
Operands[ErrorInfo];
1006 if (
Op.getStartLoc() != SMLoc()) {
1007 ErrorLoc =
Op.getStartLoc();
1013 Diag =
"invalid operand for instruction";
1016 return Error(ErrorLoc, Diag);
1019bool M68kAsmParser::missingFeature(llvm::SMLoc
const &Loc,
1020 uint64_t
const &ErrorInfo) {
1021 return Error(Loc,
"instruction requires a CPU feature not currently enabled");
1024bool M68kAsmParser::emit(MCInst &Inst, SMLoc
const &Loc,
1025 MCStreamer &Out)
const {
1032bool M68kAsmParser::matchAndEmitInstruction(SMLoc Loc,
unsigned &Opcode,
1035 uint64_t &ErrorInfo,
1036 bool MatchingInlineAsm) {
1038 unsigned MatchResult =
1039 MatchInstructionImpl(
Operands, Inst, ErrorInfo, MatchingInlineAsm);
1041 switch (MatchResult) {
1043 return emit(Inst, Loc, Out);
1044 case Match_MissingFeature:
1045 return missingFeature(Loc, ErrorInfo);
1046 case Match_InvalidOperand:
1047 return invalidOperand(Loc,
Operands, ErrorInfo);
1048 case Match_MnemonicFail:
1049 return Error(Loc,
"invalid instruction");
1055void M68kOperand::print(raw_ostream &OS,
const MCAsmInfo &MAI)
const {
1057 case KindTy::Invalid:
1062 OS <<
"token '" << Token <<
"'";
1067 Expr->evaluateAsAbsolute(
Value);
1068 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,...