42 #include "llvm/Config/llvm-config.h" 79 #define DEBUG_TYPE "codegen" 83 cl::desc(
"Force the alignment of all functions."),
90 case P::FailedISel:
return "FailedISel";
91 case P::IsSSA:
return "IsSSA";
92 case P::Legalized:
return "Legalized";
93 case P::NoPHIs:
return "NoPHIs";
94 case P::NoVRegs:
return "NoVRegs";
95 case P::RegBankSelected:
return "RegBankSelected";
96 case P::Selected:
return "Selected";
97 case P::TracksLiveness:
return "TracksLiveness";
103 void MachineFunction::Delegate::anchor() {}
106 const char *Separator =
"";
110 OS << Separator << getPropertyName(static_cast<Property>(
I));
137 : F(F), Target(Target), STI(&STI), Ctx(mmi.
getContext()), MMI(mmi) {
138 FunctionNumber = FunctionNum;
152 void MachineFunction::init() {
186 JumpTableInfo =
nullptr;
199 "Can't create a MachineFunction using a Module with a " 200 "Target-incompatible DataLayout attached\n");
203 llvm::make_unique<PseudoSourceValueManager>(*(
getSubtarget().
211 void MachineFunction::clear() {
218 I->Insts.clearAndLeakNodesUnsafely();
219 MBBNumbering.clear();
221 InstructionRecycler.clear(Allocator);
222 OperandRecycler.
clear(Allocator);
223 BasicBlockRecycler.clear(Allocator);
224 CodeViewAnnotations.clear();
227 RegInfo->~MachineRegisterInfo();
235 FrameInfo->~MachineFrameInfo();
242 JumpTableInfo->~MachineJumpTableInfo();
247 WinEHInfo->~WinEHFuncInfo();
252 WasmEHInfo->~WasmEHFuncInfo();
265 if (JumpTableInfo)
return JumpTableInfo;
267 JumpTableInfo =
new (Allocator)
269 return JumpTableInfo;
282 if (
empty()) { MBBNumbering.clear();
return; }
290 unsigned BlockNo = 0;
292 BlockNo = std::prev(MBBI)->getNumber() + 1;
294 for (; MBBI !=
E; ++MBBI, ++BlockNo) {
295 if (MBBI->getNumber() != (int)BlockNo) {
297 if (MBBI->getNumber() != -1) {
298 assert(MBBNumbering[MBBI->getNumber()] == &*MBBI &&
299 "MBB number mismatch!");
300 MBBNumbering[MBBI->getNumber()] =
nullptr;
304 if (MBBNumbering[BlockNo])
305 MBBNumbering[BlockNo]->setNumber(-1);
307 MBBNumbering[BlockNo] = &*MBBI;
308 MBBI->setNumber(BlockNo);
314 assert(BlockNo <= MBBNumbering.size() &&
"Mismatch!");
315 MBBNumbering.resize(BlockNo);
322 return new (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
330 return new (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
340 MBB.
insert(InsertBefore, Cloned);
341 if (FirstClone ==
nullptr) {
347 if (!I->isBundledWithSucc())
367 InstructionRecycler.Deallocate(Allocator, MI);
382 MBB->~MachineBasicBlock();
383 BasicBlockRecycler.Deallocate(Allocator, MBB);
388 unsigned base_alignment,
const AAMDNodes &AAInfo,
const MDNode *Ranges,
391 return new (Allocator)
393 SSID, Ordering, FailureOrdering);
400 return new (Allocator)
406 return new (Allocator)
421 return new (Allocator)
428 MachineInstr::ExtraInfo *
432 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
439 Dest[Name.
size()] = 0;
447 memset(Mask, 0, Size *
sizeof(Mask[0]));
451 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 462 OS <<
"# Machine code for function " <<
getName() <<
": ";
467 FrameInfo->
print(*
this, OS);
471 JumpTableInfo->
print(OS);
479 OS <<
"Function Live Ins: ";
484 OS <<
" in " <<
printReg(
I->second, TRI);
485 if (std::next(
I) !=
E)
493 for (
const auto &BB : *
this) {
496 BB.print(OS, MST, Indexes,
true);
499 OS <<
"\n# End machine code for function " <<
getName() <<
".\n\n";
509 return (
"CFG for '" + F->
getName() +
"' function").str();
521 OSS <<
": " << BB->getName();
526 if (OutStr[0] ==
'\n') OutStr.erase(OutStr.begin());
529 for (
unsigned i = 0; i != OutStr.length(); ++i)
530 if (OutStr[i] ==
'\n') {
532 OutStr.insert(OutStr.begin()+i+1,
'l');
545 errs() <<
"MachineFunction::viewCFG is only available in debug builds on " 546 <<
"systems with Graphviz or gv!\n";
555 errs() <<
"MachineFunction::viewCFGOnly is only available in debug builds on " 556 <<
"systems with Graphviz or gv!\n";
576 "Register class mismatch!");
588 bool isLinkerPrivate)
const {
590 assert(JumpTableInfo &&
"No jump tables");
591 assert(JTI < JumpTableInfo->getJumpTables().
size() &&
"Invalid JTI!");
613 unsigned N = LandingPads.size();
614 for (
unsigned i = 0; i <
N; ++i) {
621 return LandingPads[
N];
632 MCSymbol *LandingPadLabel = Ctx.createTempSymbol();
637 if (
const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
639 dyn_cast<Function>(
F.getPersonalityFn()->stripPointerCasts()))
642 if (LPI->isCleanup())
648 for (
unsigned I = LPI->getNumClauses();
I != 0; --
I) {
649 Value *Val = LPI->getClause(
I - 1);
650 if (LPI->isCatch(
I - 1)) {
655 auto *CVal = cast<Constant>(Val);
659 FilterList.
push_back(cast<GlobalValue>((*II)->stripPointerCasts()));
665 }
else if (
const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
666 for (
unsigned I = CPI->getNumArgOperands();
I != 0; --
I) {
672 assert(isa<CleanupPadInst>(FirstI) &&
"Invalid landingpad!");
675 return LandingPadLabel;
681 for (
unsigned N = TyInfo.
size();
N; --
N)
688 std::vector<unsigned> IdsInFilter(TyInfo.
size());
689 for (
unsigned I = 0,
E = TyInfo.
size();
I !=
E; ++
I)
695 bool TidyIfNoBeginLabels) {
696 for (
unsigned i = 0; i != LandingPads.size(); ) {
706 LandingPads.erase(LandingPads.begin() + i);
710 if (TidyIfNoBeginLabels) {
711 for (
unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) {
714 if ((BeginLabel->
isDefined() || (LPMap && (*LPMap)[BeginLabel] != 0)) &&
715 (EndLabel->
isDefined() || (LPMap && (*LPMap)[EndLabel] != 0)))
725 if (LandingPads[i].BeginLabels.empty()) {
726 LandingPads.erase(LandingPads.begin() + i);
766 LPadToCallSiteMap[Sym].append(Sites.
begin(), Sites.
end());
770 for (
unsigned i = 0,
N = TypeInfos.size(); i !=
N; ++i)
771 if (TypeInfos[i] == TI)
return i + 1;
773 TypeInfos.push_back(TI);
774 return TypeInfos.size();
781 for (std::vector<unsigned>::iterator
I = FilterEnds.begin(),
782 E = FilterEnds.end();
I !=
E; ++
I) {
783 unsigned i = *
I, j = TyIds.size();
786 if (FilterIds[--i] != TyIds[--j])
797 int FilterID = -(1 + FilterIds.size());
798 FilterIds.reserve(FilterIds.size() + TyIds.size() + 1);
799 FilterIds.insert(FilterIds.end(), TyIds.begin(), TyIds.end());
800 FilterEnds.push_back(FilterIds.size());
801 FilterIds.push_back(0);
815 switch (getEntryKind()) {
835 switch (getEntryKind()) {
852 const std::vector<MachineBasicBlock*> &DestBBs) {
853 assert(!DestBBs.empty() &&
"Cannot create an empty jump table!");
855 return JumpTables.size()-1;
862 assert(Old != New &&
"Not making a change?");
863 bool MadeChange =
false;
864 for (
size_t i = 0, e = JumpTables.size(); i != e; ++i)
865 ReplaceMBBInJumpTable(i, Old, New);
874 assert(Old != New &&
"Not making a change?");
875 bool MadeChange =
false;
877 for (
size_t j = 0, e = JTE.
MBBs.size(); j != e; ++j)
878 if (JTE.
MBBs[j] == Old) {
886 if (JumpTables.empty())
return;
888 OS <<
"Jump Tables:\n";
890 for (
unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
892 for (
unsigned j = 0, f = JumpTables[i].MBBs.size(); j != f; ++j)
899 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 911 void MachineConstantPoolValue::anchor() {}
914 if (isMachineConstantPoolEntry())
915 return Val.MachineCPVal->getType();
916 return Val.ConstVal->getType();
920 if (isMachineConstantPoolEntry())
922 return Val.ConstVal->needsRelocation();
927 if (needsRelocation())
947 for (
unsigned i = 0, e =
Constants.size(); i != e; ++i)
948 if (
Constants[i].isMachineConstantPoolEntry()) {
953 MachineCPVsSharingEntries.begin(),
E = MachineCPVsSharingEntries.end();
955 if (Deleted.
count(*
I) == 0)
965 if (A == B)
return true;
972 if (isa<StructType>(A->
getType()) || isa<ArrayType>(A->
getType()) ||
987 if (isa<PointerType>(A->
getType()))
989 const_cast<Constant *>(A), IntTy, DL);
990 else if (A->
getType() != IntTy)
993 if (isa<PointerType>(B->
getType()))
995 const_cast<Constant *>(B), IntTy, DL);
996 else if (B->
getType() != IntTy)
1006 unsigned Alignment) {
1007 assert(Alignment &&
"Alignment must be specified!");
1008 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1013 for (
unsigned i = 0, e =
Constants.size(); i != e; ++i)
1014 if (!
Constants[i].isMachineConstantPoolEntry() &&
1016 if ((
unsigned)
Constants[i].getAlignment() < Alignment)
1026 unsigned Alignment) {
1027 assert(Alignment &&
"Alignment must be specified!");
1028 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1035 MachineCPVsSharingEntries.insert(V);
1036 return (
unsigned)Idx;
1046 OS <<
"Constant Pool:\n";
1047 for (
unsigned i = 0, e =
Constants.size(); i != e; ++i) {
1048 OS <<
" cp#" << i <<
": ";
1049 if (
Constants[i].isMachineConstantPoolEntry())
1050 Constants[i].Val.MachineCPVal->print(OS);
1052 Constants[i].Val.ConstVal->printAsOperand(OS,
false);
1053 OS <<
", align=" <<
Constants[i].getAlignment();
1058 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
void print(raw_ostream &OS, const SlotIndexes *=nullptr, bool IsStandalone=true) const
void bundleWithPred()
Bundle this instruction with its predecessor.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
A parsed version of the target data layout string in and methods for querying it. ...
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
unsigned getFnStackAlignment() const
Return the stack alignment for the function.
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
bool contains(unsigned Reg) const
Return true if the specified register is included in this register class.
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
livein_iterator livein_begin() const
bool livein_empty() const
static SectionKind getMergeableConst32()
iterator erase(iterator where)
This class represents lattice values for constants.
MachineFunctionProperties & reset(Property P)
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them...
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
StringRef getPrivateGlobalPrefix() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
void addLiveIn(unsigned Reg, unsigned vreg=0)
addLiveIn - Add the specified register as a live-in.
const Function * FilterOrFinally
Filter or finally function. Null indicates a catch-all.
const MachineFunctionProperties & getProperties() const
Get the function properties.
Implements a dense probed hash-table based set.
AtomicOrdering getFailureOrdering() const
For cmpxchg atomic operations, return the atomic ordering requirements when store does not occur...
void push_back(const T &Elt)
unsigned addLiveIn(unsigned PReg, const TargetRegisterClass *RC)
addLiveIn - Add the specified physical register as a live-in value and create a corresponding virtual...
Describe properties that are true of each instruction in the target description file.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
EK_Inline - Jump table entries are emitted inline at their point of use.
std::string getNodeLabel(const MachineBasicBlock *Node, const MachineFunction *Graph)
void viewCFG() const
viewCFG - This function is meant for use from the debugger.
virtual const TargetLowering * getTargetLowering() const
uint64_t getSize() const
Return the size in bytes of the memory reference.
static SectionKind getMergeableConst8()
LLVMContext & getContext() const
All values hold a context through their type.
static SectionKind getMergeableConst16()
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
A raw_ostream that writes to an SmallVector or SmallString.
unsigned const TargetRegisterInfo * TRI
MachineModuleInfo & getMMI() const
MCSymbol * LandingPadLabel
Manage lifetime of a slot tracker for printing IR.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
uint64_t getBaseAlignment() const
Return the minimum known alignment in bytes of the base address, without the offset.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, const DebugLoc &DL, bool NoImp=false)
CreateMachineInstr - Allocate a new MachineInstr.
void DeleteMachineBasicBlock(MachineBasicBlock *MBB)
DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
unsigned getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
StringRef getLinkerPrivateGlobalPrefix() const
static SectionKind getMergeableConst4()
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...
MachineJumpTableInfo * getOrCreateJumpTableInfo(unsigned JTEntryKind)
getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it does already exist...
*ViewGraph Emit a dot run run gv on the postscript *then cleanup For use from the debugger *void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
void addSEHCatchHandler(MachineBasicBlock *LandingPad, const Function *Filter, const BlockAddress *RecoverBA)
JTEntryKind
JTEntryKind - This enum indicates how each entry of the jump table is represented and emitted...
The address of a basic block.
DOTGraphTraits(bool isSimple=false)
void addSEHCleanupHandler(MachineBasicBlock *LandingPad, const Function *Cleanup)
void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
A description of a memory reference used in the backend.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
SmallVector< MCSymbol *, 1 > EndLabels
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
Printable printReg(unsigned Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
const MDNode * getRanges() const
Return the range tag for the memory reference.
A Use represents the edge between a Value definition and its users.
SmallVector< SEHHandler, 1 > SEHHandlers
MachineInstr & CloneMachineInstrBundle(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig)
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore...
This file contains the simple types necessary to represent the attributes associated with functions a...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
int getFilterIDFor(std::vector< unsigned > &TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
void Deallocate(const void *Ptr, size_t Size)
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, unsigned base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand *> MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr)
Allocate and construct an extra info structure for a MachineInstr.
AtomicOrdering
Atomic ordering for LLVM's memory model.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch, catchpad/ret, and cleanuppad/ret.
static bool isSimple(Instruction *I)
Context object for machine code objects.
unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
This structure is used to retain landing pad info for the current function.
AtomicOrdering getOrdering() const
Return the atomic ordering requirements for this memory operation.
Type * getType() const
All values are typed, get the type of this value.
void tidyLandingPads(DenseMap< MCSymbol *, uintptr_t > *LPMap=nullptr, bool TidyIfNoBeginLabels=true)
Remap landing pad labels and remove any deleted landing pads.
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table...
livein_iterator livein_end() const
virtual int getExistingMachineCPValue(MachineConstantPool *CP, unsigned Alignment)=0
static std::string getGraphName(const MachineFunction *F)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
EK_BlockAddress - Each entry is a plain address of block, e.g.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
unsigned getPrefFunctionAlignment() const
Return the preferred function alignment.
bool hasPersonalityFn() const
Check whether this function has a personality function.
This class is a data container for one entry in a MachineConstantPool.
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *bb=nullptr)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
const Value * getValue() const
Return the base address of the memory access.
MCContext & getContext() const
unsigned getNumRegs() const
Return the number of registers this target has (useful for sizing arrays holding per register informa...
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative...
initializer< Ty > init(const Ty &Val)
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects...
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
unsigned const MachineRegisterInfo * MRI
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
LLVM Basic Block Representation.
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...
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.
static unsigned getFnStackAlignment(const TargetSubtargetInfo *STI, const Function &F)
static cl::opt< unsigned > AlignAllFunctions("align-all-functions", cl::desc("Force the alignment of all functions."), cl::init(0), cl::Hidden)
size_t size() const
size - Get the array size.
void addPersonality(const Function *Personality)
Provide the personality function for the exception information.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This is an important base class in LLVM.
SmallVector< MCSymbol *, 1 > BeginLabels
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size FIXME: The defaults need to be removed once all of the backends/clients are updat...
LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void * Allocate(size_t Size, size_t Alignment)
Allocate space at the specified alignment.
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.
std::pair< iterator, bool > insert(const ValueT &V)
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
virtual ~MachineFunctionInfo()
std::vector< int > TypeIds
const PseudoSourceValue * getPseudoValue() const
This class describes a target machine that is implemented with the LLVM target-independent code gener...
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
SectionKind - This is a simple POD value that classifies the properties of a section.
self_iterator getIterator()
Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
void incorporateFunction(const Function &F)
Incorporate the given function.
void DeleteMachineInstr(MachineInstr *MI)
DeleteMachineInstr - Delete the given MachineInstr.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs, and aliases.
virtual void MF_HandleInsertion(MachineInstr &MI)=0
Callback after an insertion. This should not modify the MI directly.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Abstract base class for all machine specific constantpool value subclasses.
static wasm::ValType getType(const TargetRegisterClass *RC)
This class contains a discriminated union of information about pointers in memory operands...
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream...
unsigned getStackAlignment() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool hasSubClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
void addCleanup(MachineBasicBlock *LandingPad)
Add a cleanup action for a landing pad.
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Iterator for intrusive lists based on ilist_node.
bool isFuncletEHPersonality(EHPersonality Pers)
Returns true if this is a personality function that invokes handler funclets (which must return to it...
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Module.h This file contains the declarations for the Module class.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
static SectionKind getReadOnlyWithRel()
unsigned getABIIntegerTypeAlignment(unsigned BitWidth) const
Returns the minimum ABI-required alignment for an integer type of the specified bitwidth.
void addCatchTypeInfo(MachineBasicBlock *LandingPad, ArrayRef< const GlobalValue *> TyInfo)
Provide the catch typeinfo for a landing pad.
uint32_t * allocateRegMask()
Allocate and initialize a register mask with NumRegister bits.
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
virtual void MF_HandleRemoval(MachineInstr &MI)=0
Callback before a removal. This should not modify the MI directly.
static void deleteNode(NodeTy *V)
const Function & getFunction() const
Return the LLVM function that this machine code represents.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef< unsigned > Sites)
Map the landing pad's EH symbol to the call site indexes.
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Target - Wrapper for Target specific information.
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
MachineJumpTableEntry - One jump table in the jump table info.
MachineBasicBlock * LandingPadBlock
Flags
Flags values. These may be or'd together.
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
MachineFunctionProperties & set(Property P)
TargetSubtargetInfo - Generic base class for all target subtargets.
uint64_t getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
Representation of each machine instruction.
std::vector< std::pair< unsigned, unsigned > >::const_iterator livein_iterator
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void ensureMaxAlignment(unsigned Align)
Make sure the function is at least Align bytes aligned.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
StringRef getName() const
Return a constant reference to the value's name.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Flags getFlags() const
Return the raw flags of the source value,.
virtual const TargetFrameLowering * getFrameLowering() const
SectionKind getSectionKind(const DataLayout *DL) const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
void viewCFGOnly() const
viewCFGOnly - This function is meant for use from the debugger.
void dump() const
dump - Call print(cerr) to be called from the debugger.
bool isStackRealignable() const
isStackRealignable - This method returns whether the stack can be realigned.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned getMinFunctionAlignment() const
Return the minimum function alignment.
A raw_ostream that writes to an std::string.
LandingPadInfo & getOrCreateLandingPadInfo(MachineBasicBlock *LandingPad)
Find or create an LandingPadInfo for the specified MachineBasicBlock.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
Module * getParent()
Get the module that this global value is contained inside of...
LLVM Value Representation.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
MachineFunction(const Function &F, const LLVMTargetMachine &Target, const TargetSubtargetInfo &STI, unsigned FunctionNum, MachineModuleInfo &MMI)
void deallocateOperandArray(OperandCapacity Cap, MachineOperand *Array)
Dellocate an array of MachineOperands and recycle the memory.
uint64_t getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type...
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID for this memory operation.
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
const BlockAddress * RecoverBA
Address of block to recover at. Null for a finally handler.
std::underlying_type< E >::type Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
static const Function * getParent(const Value *V)
This class implements an extremely fast bulk output stream that can only output to a stream...
DefaultDOTGraphTraits - This class provides the default implementations of all of the DOTGraphTraits ...
unsigned createJumpTableIndex(const std::vector< MachineBasicBlock *> &DestBBs)
createJumpTableIndex - Create a new jump table.
void dump() const
dump - Call to stderr.
StringRef - Represent a constant reference to a string, i.e.
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative...
Simple wrapper around std::function<void(raw_ostream&)>.
unsigned getLiveInVirtReg(unsigned PReg) const
getLiveInVirtReg - If PReg is a live-in physical register, return the corresponding live-in physical ...
OutputIt copy(R &&Range, OutputIt Out)
VariableDbgInfoMapTy VariableDbgInfos
static SectionKind getReadOnly()
unsigned getConstantPoolIndex(const Constant *C, unsigned Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one...
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
bool needsRelocation() const
This method classifies the entry according to whether or not it may generate a relocation entry...
This class contains meta information specific to a module.
This file describes how to lower LLVM code to machine code.
void addFilterTypeInfo(MachineBasicBlock *LandingPad, ArrayRef< const GlobalValue *> TyInfo)
Provide the filter typeinfo for a landing pad.