62 #define DEBUG_TYPE "asm-printer" 72 AArch64AsmPrinter(
TargetMachine &
TM, std::unique_ptr<MCStreamer> Streamer)
73 :
AsmPrinter(TM, std::move(Streamer)), MCInstLowering(OutContext, *
this),
76 StringRef getPassName()
const override {
return "AArch64 Assembly Printer"; }
84 void EmitJumpTableInfo()
override;
95 void LowerPATCHABLE_FUNCTION_ENTER(
const MachineInstr &MI);
96 void LowerPATCHABLE_FUNCTION_EXIT(
const MachineInstr &MI);
103 bool emitPseudoExpansionLowering(
MCStreamer &OutStreamer,
117 SetupMachineFunction(MF);
119 if (STI->isTargetCOFF()) {
149 bool PrintAsmOperand(
const MachineInstr *MI,
unsigned OpNum,
150 unsigned AsmVariant,
const char *ExtraCode,
152 bool PrintAsmMemoryOperand(
const MachineInstr *MI,
unsigned OpNum,
153 unsigned AsmVariant,
const char *ExtraCode,
158 void EmitFunctionBodyEnd()
override;
160 MCSymbol *GetCPISymbol(
unsigned CPID)
const override;
161 void EmitEndOfAsmFile(
Module &M)
override;
171 using MInstToMCSymbol = std::map<const MachineInstr *, MCSymbol *>;
173 MInstToMCSymbol LOHInstToLabel;
178 void AArch64AsmPrinter::LowerPATCHABLE_FUNCTION_ENTER(
const MachineInstr &
MI)
180 EmitSled(MI, SledKind::FUNCTION_ENTER);
183 void AArch64AsmPrinter::LowerPATCHABLE_FUNCTION_EXIT(
const MachineInstr &MI)
185 EmitSled(MI, SledKind::FUNCTION_EXIT);
188 void AArch64AsmPrinter::LowerPATCHABLE_TAIL_CALL(
const MachineInstr &MI)
190 EmitSled(MI, SledKind::TAIL_CALL);
195 static const int8_t NoopsInSledCount = 7;
216 OutStreamer->EmitCodeAlignment(4);
217 auto CurSled = OutContext.createTempSymbol(
"xray_sled_",
true);
218 OutStreamer->EmitLabel(CurSled);
219 auto Target = OutContext.createTempSymbol();
226 for (int8_t
I = 0;
I < NoopsInSledCount;
I++)
227 EmitToStreamer(*OutStreamer,
MCInstBuilder(AArch64::HINT).addImm(0));
229 OutStreamer->EmitLabel(
Target);
230 recordSled(CurSled, MI, Kind);
233 void AArch64AsmPrinter::EmitEndOfAsmFile(
Module &M) {
234 const Triple &TT =
TM.getTargetTriple();
246 void AArch64AsmPrinter::EmitLOHs() {
249 for (
const auto &
D : AArch64FI->getLOHContainer()) {
251 MInstToMCSymbol::iterator LabelIt = LOHInstToLabel.find(MI);
252 assert(LabelIt != LOHInstToLabel.end() &&
253 "Label hasn't been inserted for LOH related instruction");
256 OutStreamer->EmitLOHDirective(
D.getKind(), MCArgs);
261 void AArch64AsmPrinter::EmitFunctionBodyEnd() {
262 if (!AArch64FI->getLOHRelated().empty())
267 MCSymbol *AArch64AsmPrinter::GetCPISymbol(
unsigned CPID)
const {
271 if (!getDataLayout().getLinkerPrivateGlobalPrefix().
empty())
272 return OutContext.getOrCreateSymbol(
273 Twine(getDataLayout().getLinkerPrivateGlobalPrefix()) +
"CPI" +
274 Twine(getFunctionNumber()) +
"_" +
Twine(CPID));
293 int64_t Imm = MO.
getImm();
337 bool AArch64AsmPrinter::printAsmRegInClass(
const MachineOperand &MO,
340 assert(MO.
isReg() &&
"Should only get here with a register!");
343 unsigned RegToPrint = RC->
getRegister(RI->getEncodingValue(Reg));
344 assert(RI->regsOverlap(RegToPrint, Reg));
346 RegToPrint, isVector ? AArch64::vreg : AArch64::NoRegAltName);
350 bool AArch64AsmPrinter::PrintAsmOperand(
const MachineInstr *MI,
unsigned OpNum,
360 if (ExtraCode && ExtraCode[0]) {
361 if (ExtraCode[1] != 0)
364 switch (ExtraCode[0]) {
368 PrintAsmMemoryOperand(MI, OpNum, AsmVariant, ExtraCode, O);
375 unsigned Reg = ExtraCode[0] ==
'w' ? AArch64::WZR : AArch64::XZR;
388 switch (ExtraCode[0]) {
390 RC = &AArch64::FPR8RegClass;
393 RC = &AArch64::FPR16RegClass;
396 RC = &AArch64::FPR32RegClass;
399 RC = &AArch64::FPR64RegClass;
402 RC = &AArch64::FPR128RegClass;
407 return printAsmRegInClass(MO, RC,
false , O);
420 if (AArch64::GPR32allRegClass.
contains(Reg) ||
421 AArch64::GPR64allRegClass.
contains(Reg))
425 return printAsmRegInClass(MO, &AArch64::FPR128RegClass,
true ,
433 bool AArch64AsmPrinter::PrintAsmMemoryOperand(
const MachineInstr *MI,
436 const char *ExtraCode,
438 if (ExtraCode && ExtraCode[0] && ExtraCode[0] !=
'a')
442 assert(MO.
isReg() &&
"unexpected inline asm memory operand");
447 void AArch64AsmPrinter::PrintDebugValueComment(
const MachineInstr *MI,
451 OS <<
'\t' << MAI->getCommentString() <<
"DEBUG_VALUE: ";
467 void AArch64AsmPrinter::EmitJumpTableInfo() {
472 if (JT.empty())
return;
476 bool JTInDiffSection =
477 !STI->isTargetCOFF() ||
481 if (JTInDiffSection) {
484 OutStreamer->SwitchSection(ReadOnlySec);
488 for (
unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
489 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
492 if (JTBBs.empty())
continue;
494 unsigned Size = AFI->getJumpTableEntrySize(JTI);
496 OutStreamer->EmitLabel(GetJTISymbol(JTI));
498 for (
auto *JTBB : JTBBs)
499 emitJumpTableEntry(MJTI, JTBB, JTI);
508 unsigned Size = AFI->getJumpTableEntrySize(JTI);
512 const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
517 const MCSymbol *BaseSym = AFI->getJumpTableEntryPCRelSymbol(JTI);
524 OutStreamer->EmitValue(Value, Size);
536 void AArch64AsmPrinter::LowerJumpTableDestSmall(
llvm::MCStreamer &OutStreamer,
540 unsigned ScratchRegW =
541 STI->getRegisterInfo()->getSubReg(ScratchReg, AArch64::sub_32);
545 bool IsByteEntry = MI.
getOpcode() == AArch64::JumpTableDest8;
554 Label, MF->getContext())));
557 unsigned LdrOpcode = IsByteEntry ? AArch64::LDRBBroX : AArch64::LDRHHroX;
563 .addImm(IsByteEntry ? 0 : 1));
579 assert(NumNOPBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
585 while (NumNOPBytes > 0) {
586 if (MII == MBB.
end() || MII->isCall() ||
587 MII->getOpcode() == AArch64::DBG_VALUE ||
588 MII->getOpcode() == TargetOpcode::PATCHPOINT ||
589 MII->getOpcode() == TargetOpcode::STACKMAP)
596 for (
unsigned i = 0; i < NumNOPBytes; i += 4)
609 unsigned EncodedBytes = 0;
611 assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget &&
612 "High 16 bits of call target should be zero.");
618 .addImm((CallTarget >> 32) & 0xFFFF)
623 .addImm((CallTarget >> 16) & 0xFFFF)
628 .addImm(CallTarget & 0xFFFF)
630 EmitToStreamer(OutStreamer,
MCInstBuilder(AArch64::BLR).addReg(ScratchReg));
634 assert(NumBytes >= EncodedBytes &&
635 "Patchpoint can't request size less than the length of a call.");
636 assert((NumBytes - EncodedBytes) % 4 == 0 &&
637 "Invalid number of NOP bytes requested!");
638 for (
unsigned i = EncodedBytes; i < NumBytes; i += 4)
639 EmitToStreamer(OutStreamer,
MCInstBuilder(AArch64::HINT).addImm(0));
642 void AArch64AsmPrinter::EmitFMov0(
const MachineInstr &MI) {
644 if (STI->hasZeroCycleZeroingFP() && !STI->hasZeroCycleZeroingFPWorkaround()) {
646 if (AArch64::H0 <= DestReg && DestReg <= AArch64::H31)
647 DestReg = AArch64::Q0 + (DestReg - AArch64::H0);
648 else if (AArch64::S0 <= DestReg && DestReg <= AArch64::S31)
649 DestReg = AArch64::Q0 + (DestReg - AArch64::S0);
651 assert(AArch64::D0 <= DestReg && DestReg <= AArch64::D31);
652 DestReg = AArch64::Q0 + (DestReg - AArch64::D0);
655 MOVI.setOpcode(AArch64::MOVIv2d_ns);
658 EmitToStreamer(*OutStreamer, MOVI);
663 case AArch64::FMOVH0:
668 case AArch64::FMOVS0:
673 case AArch64::FMOVD0:
679 EmitToStreamer(*OutStreamer, FMov);
685 #include "AArch64GenMCPseudoLowering.inc" 687 void AArch64AsmPrinter::EmitInstruction(
const MachineInstr *MI) {
689 if (emitPseudoExpansionLowering(*OutStreamer, MI))
692 if (AArch64FI->getLOHRelated().count(MI)) {
694 MCSymbol *LOHLabel = createTempSymbol(
"loh");
696 LOHInstToLabel[
MI] = LOHLabel;
706 case AArch64::MOVMCSym: {
715 MCInstLowering.lowerOperand(Hi_MOSym, Hi_MCSym);
716 MCInstLowering.lowerOperand(Lo_MOSym, Lo_MCSym);
723 EmitToStreamer(*OutStreamer, MovZ);
731 EmitToStreamer(*OutStreamer, MovK);
734 case AArch64::MOVIv2d_ns:
737 if (STI->hasZeroCycleZeroingFPWorkaround() &&
743 EmitToStreamer(*OutStreamer, TmpInst);
748 case AArch64::DBG_VALUE: {
752 PrintDebugValueComment(MI, OS);
757 case AArch64::EMITBKEY: {
763 if (needsCFIMoves() == CFI_M_None)
774 case AArch64::TCRETURNri:
775 case AArch64::TCRETURNriBTI:
776 case AArch64::TCRETURNriALL: {
780 EmitToStreamer(*OutStreamer, TmpInst);
783 case AArch64::TCRETURNdi: {
785 MCInstLowering.lowerOperand(MI->
getOperand(0), Dest);
789 EmitToStreamer(*OutStreamer, TmpInst);
802 MCOperand Sym, SymTLSDescLo12, SymTLSDesc;
805 MCInstLowering.lowerOperand(MO_Sym, Sym);
806 MCInstLowering.lowerOperand(MO_TLSDESC_LO12, SymTLSDescLo12);
807 MCInstLowering.lowerOperand(MO_TLSDESC, SymTLSDesc);
813 EmitToStreamer(*OutStreamer, Adrp);
821 EmitToStreamer(*OutStreamer, Ldr);
829 EmitToStreamer(*OutStreamer, Add);
834 TLSDescCall.
setOpcode(AArch64::TLSDESCCALL);
836 EmitToStreamer(*OutStreamer, TLSDescCall);
841 EmitToStreamer(*OutStreamer, Blr);
846 case AArch64::JumpTableDest32: {
854 EmitToStreamer(*OutStreamer,
MCInstBuilder(AArch64::LDRSWroX)
867 case AArch64::JumpTableDest16:
868 case AArch64::JumpTableDest8:
869 LowerJumpTableDestSmall(*OutStreamer, *MI);
872 case AArch64::FMOVH0:
873 case AArch64::FMOVS0:
874 case AArch64::FMOVD0:
878 case TargetOpcode::STACKMAP:
879 return LowerSTACKMAP(*OutStreamer, SM, *MI);
881 case TargetOpcode::PATCHPOINT:
882 return LowerPATCHPOINT(*OutStreamer, SM, *MI);
884 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
885 LowerPATCHABLE_FUNCTION_ENTER(*MI);
888 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
889 LowerPATCHABLE_FUNCTION_EXIT(*MI);
892 case TargetOpcode::PATCHABLE_TAIL_CALL:
893 LowerPATCHABLE_TAIL_CALL(*MI);
896 case AArch64::SEH_StackAlloc:
900 case AArch64::SEH_SaveFPLR:
904 case AArch64::SEH_SaveFPLR_X:
906 "Pre increment SEH opcode must have a negative offset");
910 case AArch64::SEH_SaveReg:
915 case AArch64::SEH_SaveReg_X:
917 "Pre increment SEH opcode must have a negative offset");
922 case AArch64::SEH_SaveRegP:
924 "Non-consecutive registers not allowed for save_regp");
929 case AArch64::SEH_SaveRegP_X:
931 "Non-consecutive registers not allowed for save_regp_x");
933 "Pre increment SEH opcode must have a negative offset");
938 case AArch64::SEH_SaveFReg:
943 case AArch64::SEH_SaveFReg_X:
945 "Pre increment SEH opcode must have a negative offset");
950 case AArch64::SEH_SaveFRegP:
952 "Non-consecutive registers not allowed for save_regp");
957 case AArch64::SEH_SaveFRegP_X:
959 "Non-consecutive registers not allowed for save_regp_x");
961 "Pre increment SEH opcode must have a negative offset");
966 case AArch64::SEH_SetFP:
970 case AArch64::SEH_AddFP:
974 case AArch64::SEH_Nop:
978 case AArch64::SEH_PrologEnd:
982 case AArch64::SEH_EpilogStart:
986 case AArch64::SEH_EpilogEnd:
993 MCInstLowering.Lower(MI, TmpInst);
994 EmitToStreamer(*OutStreamer, TmpInst);
unsigned getTargetFlags() const
virtual void EmitARM64WinCFIEpilogStart()
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Target & getTheAArch64beTarget()
static bool printAsmMRegister(X86AsmPrinter &P, const MachineOperand &MO, char Mode, raw_ostream &O)
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
const std::vector< MachineJumpTableEntry > & getJumpTables() const
unsigned getNextScratchIdx(unsigned StartIdx=0) const
Get the next scratch register operand index.
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
static const char * getRegisterName(unsigned RegNo, unsigned AltIdx=AArch64::NoRegAltName)
void EmitRawText(const Twine &String)
If this file is backed by a assembly streamer, this dumps the specified string in the output ...
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
This class represents lattice values for constants.
MO_PAGE - A symbol operand with this flag represents the pc-relative offset of the 4K page containing...
void setTargetFlags(unsigned F)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
A Module instance is used to store all the information related to an LLVM module. ...
virtual void EndCOFFSymbolDef()
Marks the end of the symbol definition.
virtual void EmitARM64WinCFIEpilogEnd()
Target & getTheAArch64leTarget()
unsigned getRegister(unsigned i) const
Return the specified register in the class.
void push_back(const T &Elt)
unsigned getReg() const
getReg - Returns the register number.
unsigned getSubReg() const
virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
A raw_ostream that writes to an SmallVector or SmallString.
static unsigned getXRegFromWReg(unsigned Reg)
MO_G0 - A symbol operand with this flag (granule 0) represents the bits 0-15 of a 64-bit address...
setjmp/longjmp based exceptions
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
virtual void EmitCOFFSymbolStorageClass(int StorageClass)
Emit the storage class of the symbol.
return AArch64::GPR64RegClass contains(Reg)
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
static MCOperand createReg(unsigned Reg)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
unsigned getNumOperands() const
Retuns the total number of operands.
virtual void EmitARM64WinCFISaveRegP(unsigned Reg, int Offset)
void LLVMInitializeAArch64AsmPrinter()
virtual void EmitCOFFSymbolType(int Type)
Emit the type of the symbol.
Base class for the full range of assembler expressions which are needed for parsing.
virtual void EmitARM64WinCFIPrologEnd()
virtual void EmitARM64WinCFISetFP()
static StringRef getName(Value *V)
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
Target & getTheARM64Target()
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
zlib-gnu style compression
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
virtual void EmitARM64WinCFIAddFP(unsigned Size)
virtual void EmitARM64WinCFIAllocStack(unsigned Size)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table...
RegisterAsmPrinter - Helper template for registering a target specific assembly printer, for use in the target machine initialization function.
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
virtual void EmitARM64WinCFISaveFRegP(unsigned Reg, int Offset)
Expected< const typename ELFT::Sym * > getSymbol(typename ELFT::SymRange Symbols, uint32_t Index)
Instances of this class represent a single low-level machine instruction.
virtual void EmitARM64WinCFISaveFRegX(unsigned Reg, int Offset)
static unsigned getWRegFromXReg(unsigned Reg)
virtual bool hasRawTextSupport() const
Return true if this asm streamer supports emitting unformatted text to the .s file with EmitRawText...
static unsigned getShiftValue(unsigned Imm)
getShiftValue - Extract the shift value.
Address of a global value.
Streaming machine code generation interface.
Control flow instructions. These all have token chains.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
MO_G1 - A symbol operand with this flag (granule 1) represents the bits 16-31 of a 64-bit address...
MCTargetStreamer * getTargetStreamer()
The instances of the Type class are immutable: once they are created, they are never changed...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
const GlobalValue * getGlobal() const
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant...
This class is intended to be used as a driving class for all asm writers.
Represent the analysis usage information of a pass.
bool hasInternalLinkage() const
Address of a basic block.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
virtual void EmitARM64WinCFISaveFPLRX(int Offset)
.subsections_via_symbols (MachO)
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
MI-level patchpoint operands.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
MO_TLS - Indicates that the operand being accessed is some kind of thread-local symbol.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
void recordPatchPoint(const MachineInstr &MI)
Generate a stackmap record for a patchpoint instruction.
static const MCBinaryExpr * createLShr(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Triple - Helper class for working with autoconf configuration names.
constexpr bool empty(const T &RangeOrContainer)
Test whether RangeOrContainer is empty. Similar to C++17 std::empty.
virtual void EmitARM64WinCFISaveReg(unsigned Reg, int Offset)
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given stackmap should emit.
void setOpcode(unsigned Op)
MachineOperand class - Representation of each machine instruction operand.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
bool isVector(MCInstrInfo const &MCII, MCInst const &MCI)
virtual void EmitARM64WinCFISaveRegPX(unsigned Reg, int Offset)
StringRef str()
Return a StringRef for the vector contents.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const
const Function & getFunction() const
Return the LLVM function that this machine code represents.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
SymbolStorageClass
Storage class tells where and what the symbol represents.
Target - Wrapper for Target specific information.
void recordStackMap(const MachineInstr &MI)
Generate a stackmap record for a stackmap instruction.
static unsigned getReg(const void *D, unsigned RC, unsigned RegNo)
void setPreservesAll()
Set by analyses that do not transform their input at all.
MO_S - Indicates that the bits of the symbol operand represented by MO_G0 etc are signed...
const MachineBasicBlock * getParent() const
Representation of each machine instruction.
static bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
static bool printOperand(raw_ostream &OS, const SelectionDAG *G, const SDValue Value)
virtual void EmitARM64WinCFISaveFPLR(int Offset)
AArch64MCInstLower - This class is used to lower an MachineInstr into an MCInst.
virtual void EmitARM64WinCFINop()
MI-level stackmap operands.
virtual void EmitARM64WinCFISaveFRegPX(unsigned Reg, int Offset)
int64_t getOffset() const
Return the offset from the symbol in this operand.
const BlockAddress * getBlockAddress() const
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
MO_PAGEOFF - A symbol operand with this flag represents the offset of that symbol within a 4K page...
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given patchpoint should emit.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
JTEntryKind getEntryKind() const
virtual void EmitCFIBKeyFrame()
virtual void EmitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
This class implements an extremely fast bulk output stream that can only output to a stream...
Primary interface to the complete machine description for the target machine.
virtual MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const
const MachineOperand & getCallTarget() const
Returns the target of the underlying call.
void addOperand(const MCOperand &Op)
StringRef - Represent a constant reference to a string, i.e.
MO_NC - Indicates whether the linker is expected to check the symbol reference for overflow...
virtual void EmitARM64WinCFISaveFReg(unsigned Reg, int Offset)
const MachineOperand & getOperand(unsigned i) const
Instances of this class represent operands of the MCInst class.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
static MCOperand createImm(int64_t Val)
virtual void EmitARM64WinCFISaveRegX(unsigned Reg, int Offset)
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase, but as an MCExpr.
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx)
const MDNode * getMetadata() const
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
A function that returns a base type.