43#include "llvm/Config/llvm-config.h"
84#define DEBUG_TYPE "codegen"
87 "align-all-functions",
88 cl::desc(
"Force the alignment of all functions in log2 format (e.g. 4 "
89 "means align on 16B boundaries)."),
97 case P::FailedISel:
return "FailedISel";
98 case P::IsSSA:
return "IsSSA";
99 case P::Legalized:
return "Legalized";
100 case P::NoPHIs:
return "NoPHIs";
101 case P::NoVRegs:
return "NoVRegs";
102 case P::RegBankSelected:
return "RegBankSelected";
103 case P::Selected:
return "Selected";
104 case P::TracksLiveness:
return "TracksLiveness";
105 case P::TiedOpsRewritten:
return "TiedOpsRewritten";
106 case P::FailsVerification:
return "FailsVerification";
107 case P::FailedRegAlloc:
return "FailedRegAlloc";
108 case P::TracksDebugUserValues:
return "TracksDebugUserValues";
115 if (!
F.hasFnAttribute(Attribute::SafeStack))
121 if (!Existing || Existing->getNumOperands() != 2)
124 auto *MetadataName =
"unsafe-stack-size";
125 if (
auto &
N = Existing->getOperand(0)) {
126 if (
N.equalsStr(MetadataName)) {
127 if (
auto &
Op = Existing->getOperand(1)) {
129 FrameInfo.setUnsafeStackSize(Val);
136void MachineFunction::Delegate::anchor() {}
139 const char *Separator =
"";
143 OS << Separator << getPropertyName(static_cast<Property>(
I));
156 MBB->getParent()->deleteMachineBasicBlock(
MBB);
161 if (
auto MA =
F.getFnStackAlign())
167 Attribute FPAttr =
F.getFnAttribute(
"frame-pointer");
183 unsigned FunctionNum)
184 : F(F), Target(Target), STI(STI), Ctx(Ctx) {
185 FunctionNumber = FunctionNum;
202 TheDelegate->MF_HandleChangeDesc(
MI, TID);
205void MachineFunction::init() {
207 Properties.setIsSSA();
208 Properties.setTracksLiveness();
216 !
F.hasFnAttribute(
"no-realign-stack");
217 bool ForceRealignSP =
F.hasFnAttribute(Attribute::StackAlignment) ||
218 F.hasFnAttribute(
"stackrealign");
221 ForceRealignSP && CanRealignSP);
226 if (
F.hasFnAttribute(Attribute::StackAlignment))
227 FrameInfo->ensureMaxAlignment(*
F.getFnStackAlign());
236 if (
F.hasMetadata(LLVMContext::MD_func_sanitize) ||
237 F.getMetadata(LLVMContext::MD_kcfi_type))
238 Alignment = std::max(Alignment,
Align(4));
243 JumpTableInfo =
nullptr;
246 F.hasPersonalityFn() ?
F.getPersonalityFn() :
nullptr))) {
252 formatv(
"Can't create a MachineFunction using a Module with a "
253 "Target-incompatible DataLayout attached\n Target "
254 "DataLayout: {0}\n Module DataLayout: {1}\n",
255 Target.createDataLayout().getStringRepresentation(),
259 PSVManager = std::make_unique<PseudoSourceValueManager>(
getTarget());
264 assert(!MFInfo &&
"MachineFunctionInfo already set");
265 MFInfo = Target.createMachineFunctionInfo(Allocator, F, &STI);
271 assert(!MFInfo &&
"new function already has MachineFunctionInfo");
276 OrigMF.MFInfo->
clone(Allocator, *
this, Src2DstMBB);
280 RegInfo->copyPendingVirtRegMapEntriesFrom(OrigMF.
getRegInfo());
288void MachineFunction::clear() {
294 JumpTableInfo->~MachineJumpTableInfo();
295 Allocator.Deallocate(JumpTableInfo);
296 JumpTableInfo =
nullptr;
304 I->Insts.clearAndLeakNodesUnsafely();
305 MBBNumbering.clear();
310 CodeViewAnnotations.clear();
312 CallSitesInfo.
clear();
313 CalledGlobalsInfo.
clear();
315 RegInfo->~MachineRegisterInfo();
319 MFInfo->~MachineFunctionInfo();
320 Allocator.Deallocate(MFInfo);
323 FrameInfo->~MachineFrameInfo();
324 Allocator.Deallocate(FrameInfo);
326 ConstantPool->~MachineConstantPool();
327 Allocator.Deallocate(ConstantPool);
330 WinEHInfo->~WinEHFuncInfo();
331 Allocator.Deallocate(WinEHInfo);
336 return F.getDataLayout();
343 if (JumpTableInfo)
return JumpTableInfo;
345 JumpTableInfo =
new (Allocator)
347 return JumpTableInfo;
351 return F.getDenormalMode(FPType);
364 else if (!F.hasOptSize())
365 PrefAlignment = STI.getTargetLowering()->getPrefFunctionAlignment();
367 PrefAlignment =
Align(1);
372[[nodiscard]]
unsigned
374 FrameInstructions.push_back(Inst);
375 return FrameInstructions.size() - 1;
385 Inst.replaceRegister(DwarfFromReg, DwarfToReg);
393 if (
empty()) { MBBNumbering.clear();
return; }
401 unsigned BlockNo = 0;
403 BlockNo = std::prev(
MBBI)->getNumber() + 1;
405 for (;
MBBI != E; ++
MBBI, ++BlockNo) {
406 if (
MBBI->getNumber() != (
int)BlockNo) {
408 if (
MBBI->getNumber() != -1) {
410 "MBB number mismatch!");
411 MBBNumbering[
MBBI->getNumber()] =
nullptr;
415 if (MBBNumbering[BlockNo])
416 MBBNumbering[BlockNo]->setNumber(-1);
418 MBBNumbering[BlockNo] = &*
MBBI;
419 MBBI->setNumber(BlockNo);
425 assert(BlockNo <= MBBNumbering.size() &&
"Mismatch!");
426 MBBNumbering.resize(BlockNo);
438 const Align Alignment =
MBBI->getAlignment();
446 if (Alignment <= FunctionAlignment) {
452 FunctionAlignment.
value();
467 if (
MBBI->getSectionID() == CurrentSectionID)
469 MBBI->setIsBeginSection();
470 std::prev(
MBBI)->setIsEndSection();
471 CurrentSectionID =
MBBI->getSectionID();
480 return new (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
487MachineFunction::CloneMachineInstr(
const MachineInstr *Orig) {
495 MachineInstr *FirstClone =
nullptr;
498 MachineInstr *Cloned = CloneMachineInstr(&*
I);
500 if (FirstClone ==
nullptr) {
506 if (!
I->isBundledWithSucc())
527 assert((!
MI->isCandidateForAdditionalCallInfo() ||
528 !CallSitesInfo.contains(
MI)) &&
529 "Call site info was not updated!");
531 assert((!
MI->isCandidateForAdditionalCallInfo() ||
532 !CalledGlobalsInfo.contains(
MI)) &&
533 "Called globals info was not updated!");
541 InstructionRecycler.Deallocate(Allocator,
MI);
548 std::optional<UniqueBBID> BBID) {
554 if (Target.Options.BBAddrMap ||
556 MBB->setBBID(BBID.has_value() ? *BBID :
UniqueBBID{NextBBID++, 0});
562 assert(
MBB->getParent() ==
this &&
"MBB parent mismatch!");
565 JumpTableInfo->RemoveMBBFromJumpTables(
MBB);
566 MBB->~MachineBasicBlock();
567 BasicBlockRecycler.Deallocate(Allocator,
MBB);
575 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
576 "Unexpected an unknown size to be represented using "
577 "LocationSize::beforeOrAfter()");
578 return new (Allocator)
580 Ordering, FailureOrdering);
587 return new (Allocator)
589 Ordering, FailureOrdering);
597 Size.getValue().getKnownMinValue() != ~UINT64_C(0)) &&
598 "Unexpected an unknown size to be represented using "
599 "LocationSize::beforeOrAfter()");
664 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
665 PostInstrSymbol, HeapAllocMarker,
666 PCSections, CFIType, MMRAs, DS);
670 char *Dest = Allocator.Allocate<
char>(Name.size() + 1);
672 Dest[Name.size()] = 0;
680 memset(Mask, 0,
Size *
sizeof(Mask[0]));
685 int* AllocMask = Allocator.Allocate<
int>(Mask.size());
686 copy(Mask, AllocMask);
687 return {AllocMask, Mask.size()};
690#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
701 OS <<
"# Machine code for function " <<
getName() <<
": ";
706 FrameInfo->print(*
this, OS);
710 JumpTableInfo->print(OS);
713 ConstantPool->print(OS);
717 if (RegInfo && !RegInfo->livein_empty()) {
718 OS <<
"Function Live Ins: ";
720 I = RegInfo->livein_begin(), E = RegInfo->livein_end();
I != E; ++
I) {
724 if (std::next(
I) != E)
732 for (
const auto &BB : *
this) {
735 BB.print(OS, MST, Indexes,
true);
738 OS <<
"\n# End machine code for function " <<
getName() <<
".\n\n";
749 F.needsUnwindTableEntry() ||
750 !F.getParent()->debug_compile_units().empty();
811 ConstantInt::get(Int64Ty, TypeIdVal,
false));
821 return (
"CFG for '" +
F->getName() +
"' function").str();
833 OSS <<
": " << BB->getName();
838 if (OutStr[0] ==
'\n')
839 OutStr.erase(OutStr.begin());
842 for (
unsigned i = 0; i != OutStr.length(); ++i)
843 if (OutStr[i] ==
'\n') {
845 OutStr.insert(OutStr.begin() + i + 1,
'l');
856 errs() <<
"MachineFunction::viewCFG is only available in debug builds on "
857 <<
"systems with Graphviz or gv!\n";
866 errs() <<
"MachineFunction::viewCFGOnly is only available in debug builds on "
867 <<
"systems with Graphviz or gv!\n";
887 "Register class mismatch!");
899 bool isLinkerPrivate)
const {
901 assert(JumpTableInfo &&
"No jump tables");
902 assert(JTI < JumpTableInfo->getJumpTables().
size() &&
"Invalid JTI!");
904 StringRef Prefix = isLinkerPrivate ?
DL.getLinkerPrivateGlobalPrefix()
905 :
DL.getInternalSymbolPrefix();
909 return Ctx.getOrCreateSymbol(Name);
915 return Ctx.getOrCreateSymbol(
Twine(
DL.getInternalSymbolPrefix()) +
924 unsigned N = LandingPads.size();
925 for (
unsigned i = 0; i <
N; ++i) {
932 return LandingPads[
N];
943 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
952 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
958 for (
unsigned I = LPI->getNumClauses();
I != 0; --
I) {
959 Value *Val = LPI->getClause(
I - 1);
960 if (LPI->isCatch(
I - 1)) {
967 for (
const Use &U : CVal->operands())
976 for (
unsigned I = CPI->arg_size();
I != 0; --
I) {
986 return LandingPadLabel;
991 LPadToCallSiteMap[Sym].append(Sites.
begin(), Sites.
end());
995 for (
unsigned i = 0,
N = TypeInfos.size(); i !=
N; ++i)
996 if (TypeInfos[i] == TI)
return i + 1;
998 TypeInfos.push_back(TI);
999 return TypeInfos.size();
1006 for (
unsigned i : FilterEnds) {
1007 unsigned j = TyIds.
size();
1010 if (FilterIds[--i] != TyIds[--j])
1021 int FilterID = -(1 + FilterIds.size());
1022 FilterIds.reserve(FilterIds.size() + TyIds.
size() + 1);
1024 FilterEnds.push_back(FilterIds.size());
1025 FilterIds.push_back(0);
1031 assert(
MI->isCandidateForAdditionalCallInfo() &&
1032 "Call site info refers only to call (MI) candidates");
1034 if (!
Target.Options.EmitCallSiteInfo && !
Target.Options.EmitCallGraphSection)
1035 return CallSitesInfo.
end();
1036 return CallSitesInfo.
find(
MI);
1041 if (!
MI->isBundle())
1046 if (BMI.isCandidateForAdditionalCallInfo())
1053 assert(
MI->shouldUpdateAdditionalCallInfo() &&
1054 "Call info refers only to call (MI) candidates or "
1055 "candidates inside bundles");
1060 if (CSIt != CallSitesInfo.end())
1061 CallSitesInfo.erase(CSIt);
1063 CalledGlobalsInfo.erase(CallMI);
1069 "Call info refers only to call (MI) candidates or "
1070 "candidates inside bundles");
1072 if (!New->isCandidateForAdditionalCallInfo())
1077 if (CSIt != CallSitesInfo.end()) {
1079 CallSitesInfo[New] = std::move(CSInfo);
1083 if (CGIt != CalledGlobalsInfo.end()) {
1085 CalledGlobalsInfo[New] = std::move(CGInfo);
1092 "Call info refers only to call (MI) candidates or "
1093 "candidates inside bundles");
1095 if (!New->isCandidateForAdditionalCallInfo())
1100 if (CSIt != CallSitesInfo.end()) {
1102 CallSitesInfo.erase(CSIt);
1103 CallSitesInfo[New] = std::move(CSInfo);
1107 if (CGIt != CalledGlobalsInfo.end()) {
1109 CalledGlobalsInfo.erase(CGIt);
1110 CalledGlobalsInfo[New] = std::move(CGInfo);
1131 unsigned MaxOperand) {
1143 for (
unsigned int I = 0;
I < MaxOperand; ++
I) {
1145 auto &NewMO = New.getOperand(
I);
1148 if (!OldMO.isReg() || !OldMO.isDef())
1152 unsigned NewInstrNum = New.getDebugInstrNum();
1154 std::make_pair(NewInstrNum,
I));
1166 if (
auto CopyDstSrc =
TII.isCopyLikeInstr(
MI)) {
1167 Dest = CopyDstSrc->Destination->getReg();
1170 Dest =
MI.getOperand(0).getReg();
1173 auto CacheIt = DbgPHICache.find(Dest);
1174 if (CacheIt != DbgPHICache.end())
1175 return CacheIt->second;
1179 DbgPHICache.insert({Dest, OperandPair});
1205 auto GetRegAndSubreg =
1206 [&](
const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1210 OldReg = Cpy.getOperand(0).getReg();
1211 NewReg = Cpy.getOperand(1).getReg();
1212 SubReg = Cpy.getOperand(1).getSubReg();
1213 }
else if (Cpy.isSubregToReg()) {
1214 OldReg = Cpy.getOperand(0).getReg();
1215 NewReg = Cpy.getOperand(1).getReg();
1216 SubReg = Cpy.getOperand(2).getImm();
1218 auto CopyDetails = *
TII.isCopyInstr(Cpy);
1222 NewReg = Src.getReg();
1223 SubReg = Src.getSubReg();
1226 return {NewReg, SubReg};
1233 auto State = GetRegAndSubreg(
MI);
1234 auto CurInst =
MI.getIterator();
1238 if (!State.first.isVirtual())
1246 assert(Inst &&
"Virtual register has no def");
1252 State = GetRegAndSubreg(*Inst);
1259 auto ApplySubregisters =
1261 for (
unsigned Subreg :
reverse(SubregsSeen)) {
1269 P = {NewInstrNumber, 0};
1276 if (State.first.isVirtual()) {
1279 for (
auto &MO : Inst->
all_defs()) {
1280 if (MO.getReg() != State.first)
1290 assert(CurInst->isCopyLike() ||
TII.isCopyInstr(*CurInst));
1291 State = GetRegAndSubreg(*CurInst);
1294 auto RMII = CurInst->getReverseIterator();
1295 auto PrevInstrs =
make_range(RMII, CurInst->getParent()->instr_rend());
1296 for (
auto &ToExamine : PrevInstrs) {
1297 for (
auto &MO : ToExamine.all_defs()) {
1299 if (!
TRI.regsOverlap(RegToSeek, MO.getReg()))
1302 return ApplySubregisters(
1303 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1320 TII.get(TargetOpcode::DBG_PHI));
1321 Builder.addReg(State.first);
1323 Builder.addImm(NewNum);
1324 return ApplySubregisters({NewNum, 0u});
1331 const MCInstrDesc &RefII =
TII->get(TargetOpcode::DBG_VALUE_LIST);
1333 MI.setDebugValueUndef();
1337 for (
auto &
MBB : *
this) {
1338 for (
auto &
MI :
MBB) {
1339 if (!
MI.isDebugRef())
1342 bool IsValidRef =
true;
1353 if (Reg == 0 || !RegInfo->hasOneDef(Reg)) {
1366 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1369 unsigned OperandIdx = 0;
1370 for (
const auto &DefMO :
DefMI.operands()) {
1371 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() == Reg)
1378 unsigned ID =
DefMI.getDebugInstrNum();
1379 MO.ChangeToDbgInstrRef(ID, OperandIdx);
1384 MakeUndefDbgValue(
MI);
1398 if (F.hasFnAttribute(Attribute::OptimizeNone))
1425 const std::vector<MachineBasicBlock *> &
MBBs)
1471 const std::vector<MachineBasicBlock*> &DestBBs) {
1472 assert(!DestBBs.empty() &&
"Cannot create an empty jump table!");
1474 return JumpTables.size()-1;
1479 assert(JTI < JumpTables.size() &&
"Invalid JTI!");
1481 if (Hotness <= JumpTables[JTI].Hotness)
1484 JumpTables[JTI].Hotness = Hotness;
1492 assert(Old != New &&
"Not making a change?");
1493 bool MadeChange =
false;
1494 for (
size_t i = 0, e = JumpTables.size(); i != e; ++i)
1501 bool MadeChange =
false;
1503 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(),
MBB);
1504 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1505 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1515 assert(Old != New &&
"Not making a change?");
1516 bool MadeChange =
false;
1527 if (JumpTables.empty())
return;
1529 OS <<
"Jump Tables:\n";
1531 for (
unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1541#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1553void MachineConstantPoolValue::anchor() {}
1556 return DL.getTypeAllocSize(Ty);
1561 return Val.MachineCPVal->getSizeInBytes(
DL);
1562 return DL.getTypeAllocSize(
Val.ConstVal->getType());
1568 return Val.ConstVal->needsDynamicRelocation();
1594 if (
C.isMachineConstantPoolEntry()) {
1595 Deleted.insert(
C.Val.MachineCPVal);
1596 delete C.Val.MachineCPVal;
1609 if (
A ==
B)
return true;
1613 if (
A->getType() ==
B->getType())
return false;
1621 uint64_t StoreSize =
DL.getTypeStoreSize(
A->getType());
1622 if (StoreSize !=
DL.getTypeStoreSize(
B->getType()) || StoreSize > 128)
1625 bool ContainsUndefOrPoisonA =
A->containsUndefOrPoisonElement();
1636 else if (
A->getType() != IntTy)
1642 else if (
B->getType() != IntTy)
1653 return !ContainsUndefOrPoisonA;
1660 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1665 for (
unsigned i = 0, e = Constants.size(); i != e; ++i)
1666 if (!Constants[i].isMachineConstantPoolEntry() &&
1668 if (Constants[i].
getAlign() < Alignment)
1669 Constants[i].Alignment = Alignment;
1674 return Constants.size()-1;
1679 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1684 int Idx = V->getExistingMachineCPValue(
this, Alignment);
1686 MachineCPVsSharingEntries.insert(V);
1687 return (
unsigned)Idx;
1691 return Constants.size()-1;
1695 if (Constants.empty())
return;
1697 OS <<
"Constant Pool:\n";
1698 for (
unsigned i = 0, e = Constants.size(); i != e; ++i) {
1699 OS <<
" cp#" << i <<
": ";
1700 if (Constants[i].isMachineConstantPoolEntry())
1701 Constants[i].Val.MachineCPVal->print(OS);
1703 Constants[i].Val.ConstVal->printAsOperand(OS);
1704 OS <<
", align=" << Constants[i].getAlign().value();
1714std::optional<uint64_t>
1715ProfileSummaryInfo::getEntryCount<llvm::MachineFunction>(
1717 return F->getFunction().getEntryCount();
1721bool ProfileSummaryInfo::hasHotAttr<llvm::MachineFunction>(
1723 return F->getFunction().hasFnAttribute(Attribute::Hot);
1726#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static FramePointerKind getFramePointerPolicy(const Function &F)
static cl::opt< unsigned > AlignAllFunctions("align-all-functions", cl::desc("Force the alignment of all functions in log2 format (e.g. 4 " "means align on 16B boundaries)."), cl::init(0), cl::Hidden)
static const MachineInstr * getCallInstr(const MachineInstr *MI)
Return the call machine instruction or find a call within bundle.
static Align getFnStackAlignment(const TargetSubtargetInfo &STI, const Function &F)
static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, const DataLayout &DL)
Test whether the given two constants can be allocated the same constant pool entry referenced by.
void setUnsafeStackSize(const Function &F, MachineFrameInfo &FrameInfo)
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
Register const TargetRegisterInfo * TRI
This file defines the SmallString class.
This file defines the SmallVector class.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static const int BlockSize
This file describes how to lower LLVM code to machine code.
void print(OutputBuffer &OB) const
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM Basic Block Representation.
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
InstListType::const_iterator const_iterator
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
This is an important base class in LLVM.
A parsed version of the target data layout string in and methods for querying it.
Align getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Implements a dense probed hash-table based set.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
bool usesWindowsCFI() const
Returns true if the object format describes unwind information with Windows SEH unwind opcodes (....
Context object for machine code objects.
Describe properties that are true of each instruction in the target description file.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
bool hasSubClassEq(const MCRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
Wrapper class representing physical registers. Should be passed by value.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
const MDOperand & getOperand(unsigned I) const
ArrayRef< MDOperand > operands() const
Tracking metadata reference owned by Metadata.
LLVM_ABI StringRef getString() const
void setIsEndSection(bool V=true)
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
Instructions::const_iterator const_instr_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@004270020304201266316354007027341142157160323045 Val
The constant itself.
LLVM_ABI bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
LLVM_ABI unsigned getSizeInBytes(const DataLayout &DL) const
LLVM_ABI SectionKind getSectionKind(const DataLayout *DL) const
Abstract base class for all machine specific constantpool value subclasses.
virtual unsigned getSizeInBytes(const DataLayout &DL) const
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
LLVM_ABI void dump() const
dump - Call print(cerr) to be called from the debugger.
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
LLVM_ABI ~MachineConstantPool()
LLVM_ABI unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasCalls() const
Return true if the current function has any function calls.
FramePointerKind getFramePointerPolicy() const
void setFramePointerPolicy(FramePointerKind Kind)
LLVM_ABI void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & reset(Property P)
virtual void MF_HandleRemoval(MachineInstr &MI)=0
Callback before a removal. This should not modify the MI directly.
virtual void MF_HandleInsertion(MachineInstr &MI)=0
Callback after an insertion. This should not modify the MI directly.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
std::pair< unsigned, unsigned > DebugInstrOperandPair
Pair of instruction number and operand number.
unsigned addFrameInst(const MCCFIInstruction &Inst)
bool useDebugInstrRef() const
Returns true if the function's variable locations are tracked with instruction referencing.
SmallVector< DebugSubstitution, 8 > DebugValueSubstitutions
Debug value substitutions: a collection of DebugSubstitution objects, recording changes in where a va...
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
void substituteDebugValuesForInst(const MachineInstr &Old, MachineInstr &New, unsigned MaxOperand=UINT_MAX)
Create substitutions for any tracked values in Old, to point at New.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist,...
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
unsigned getNewDebugInstrNum()
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
MachineFunction(Function &F, const TargetMachine &Target, const TargetSubtargetInfo &STI, MCContext &Ctx, unsigned FunctionNum)
bool framePointerIsReserved() const
Returns true if the frame pointer must always either point to a new frame record or be un-modified in...
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0, MDNode *MMRAs=nullptr, Value *DS=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void finalizeDebugInstrRefs()
Finalise any partially emitted debug instructions.
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI)
Initialize the target specific MachineFunctionInfo.
void replaceFrameInstRegister(MCRegister From, MCRegister To)
Replace all references to register.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
void setUseDebugInstrRef(bool UseInstrRef)
Set whether this function will use instruction referencing or not.
LandingPadInfo & getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad)
Find or create an LandingPadInfo for the specified MachineBasicBlock.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
unsigned DebugInstrNumberingCount
A count of how many instructions in the function have had numbers assigned to them.
void deleteMachineBasicBlock(MachineBasicBlock *MBB)
DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
Align getAlignment() const
getAlignment - Return the alignment of the function.
void handleChangeDesc(MachineInstr &MI, const MCInstrDesc &TID)
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
bool needsWinCFI() const
True if this function uses SEH unwind opcodes and needs an unwind table entry.
Function & getFunction()
Return the LLVM function that this machine code represents.
Align getPreferredAlignment() const
Returns the preferred alignment which comes from the function attributes (optsize,...
bool usesWindowsUnwindInfo() const
True if this function describes its unwind information with Windows SEH unwind opcodes (....
MachineFunctionInfo * cloneInfoFrom(const MachineFunction &OrigMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB)
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
BasicBlockListType::iterator iterator
void setDebugInstrNumberingCount(unsigned Num)
Set value of DebugInstrNumberingCount field.
bool disableFramePointerElim() const
Returns true if frame pointer elimination should be disabled for this function.
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
void viewCFG() const
viewCFG - This function is meant for use from the debugger.
bool shouldUseDebugInstrRef() const
Determine whether, in the current machine configuration, we should use instruction referencing or not...
const MachineFunctionProperties & getProperties() const
Get the function properties.
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineBasicBlock & front() const
Register addLiveIn(MCRegister PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags F, LLT MemTy, Align BaseAlignment, const MMOMetadata &Metadata=MMOMetadata(), SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
int64_t estimateFunctionSizeInBytes()
Return an estimate of the function's code size, taking into account block and function alignment.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void copyAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Copy the call site info from Old to \ New.
VariableDbgInfoMapTy VariableDbgInfos
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
DebugInstrOperandPair salvageCopySSA(MachineInstr &MI, DenseMap< Register, DebugInstrOperandPair > &DbgPHICache)
Find the underlying defining instruction / operand for a COPY instruction while in SSA form.
Representation of each machine instruction.
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
filtered_mop_range all_defs()
Returns an iterator range over all operands that are (explicit or implicit) register defs.
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI bool shouldUpdateAdditionalCallInfo() const
Return true if copying, moving, or erasing this instruction requires updating additional call info (s...
LLVM_ABI bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
LLVM_ABI bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
LLVM_ABI void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
LLVM_ABI unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
LLVM_ABI unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
LLVM_ABI void dump() const
dump - Call to stderr.
LLVM_ABI bool ReplaceMBBInJumpTable(unsigned Idx, MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTable - If Old is a target of the jump tables, update the jump table to branch to New...
LLVM_ABI bool updateJumpTableEntryHotness(size_t JTI, MachineFunctionDataHotness Hotness)
JTEntryKind
JTEntryKind - This enum indicates how each entry of the jump table is represented and emitted.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
LLVM_ABI unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
JTEntryKind getEntryKind() const
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur.
const PseudoSourceValue * getPseudoValue() const
const MDNode * getRanges() const
Return the range tag for the memory reference.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
Flags
Flags values. These may be or'd together.
AtomicOrdering getSuccessOrdering() const
Return the atomic ordering requirements for this memory operation.
const MachinePointerInfo & getPointerInfo() const
Flags getFlags() const
Return the raw flags of the source value,.
AAMDNodes getAAInfo() const
Return the AA tags for the memory reference.
const Value * getValue() const
Return the base address of the memory access.
Align getBaseAlign() const
Return the minimum known alignment in bytes of the base address, without the offset.
const MDNode * getMemCacheHint() const
Return the cache hint metadata for the memory reference.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI LLVM_READONLY MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
std::vector< std::pair< MCRegister, Register > >::const_iterator livein_iterator
LLVM_ABI Register getLiveInVirtReg(MCRegister PReg) const
getLiveInVirtReg - If PReg is a live-in physical register, return the corresponding live-in virtual r...
const TargetRegisterInfo * getTargetRegisterInfo() const
void addLiveIn(MCRegister Reg, Register vreg=Register())
addLiveIn - Add the specified register as a live-in.
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
Simple wrapper around std::function<void(raw_ostream&)>.
Wrapper class representing virtual and physical registers.
SectionKind - This is a simple POD value that classifies the properties of a section.
static SectionKind getMergeableConst4()
static SectionKind getReadOnlyWithRel()
static SectionKind getMergeableConst8()
static SectionKind getMergeableConst16()
static SectionKind getReadOnly()
static SectionKind getMergeableConst32()
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
Primary interface to the complete machine description for the target machine.
const MCAsmInfo & getMCAsmInfo() const
Return target specific asm information.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
self_iterator getIterator()
iterator erase(iterator where)
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
uint64_t MD5Hash(const FunctionId &Obj)
This is an optimization pass for GlobalISel generic memory operations.
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Unknown
Not known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
MachineFunctionDataHotness
auto dyn_cast_or_null(const Y &Val)
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
AtomicOrdering
Atomic ordering for LLVM's memory model.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
DWARFExpression::Operation Op
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
OutputIt copy(R &&Range, OutputIt Out)
@ WinEH
Windows Exception Handling.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
MCRegisterClass TargetRegisterClass
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
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.
static constexpr Align fromLog2(unsigned Log2Value)
Returns an alignment of 1 << Log2Value bytes.
std::string getNodeLabel(const MachineBasicBlock *Node, const MachineFunction *Graph)
DOTGraphTraits(bool isSimple=false)
static std::string getGraphName(const MachineFunction *F)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
DefaultDOTGraphTraits(bool simple=false)
Represent subnormal handling kind for floating point instruction inputs and outputs.
This structure is used to retain landing pad info for the current function.
SmallVector< MCSymbol *, 1 > EndLabels
MCSymbol * LandingPadLabel
MachineBasicBlock * LandingPadBlock
SmallVector< MCSymbol *, 1 > BeginLabels
std::vector< int > TypeIds
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
virtual ~MachineFunctionInfo()
virtual MachineFunctionInfo * clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, const DenseMap< MachineBasicBlock *, MachineBasicBlock * > &Src2DstMBB) const
Make a functionally equivalent copy of this MachineFunctionInfo in MF.
SmallVector< ConstantInt *, 4 > CalleeTypeIds
Callee type ids.
MDNode * CallTarget
'call_target' metadata for the DISubprogram.
MachineJumpTableEntry - One jump table in the jump table info.
LLVM_ABI MachineJumpTableEntry(const std::vector< MachineBasicBlock * > &M)
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
MachineFunctionDataHotness Hotness
The hotness of MJTE is inferred from the hotness of the source basic block(s) that reference it.
This class contains a discriminated union of information about pointers in memory operands,...
PointerUnion< const Value *, const PseudoSourceValue * > V
This is the IR pointer value for the access, or it is null if unknown.
MachinePointerInfo getWithOffset(int64_t O) const
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
static void deleteNode(NodeTy *V)