41#include "llvm/Config/llvm-config.h"
81#define DEBUG_TYPE "codegen"
84 "align-all-functions",
85 cl::desc(
"Force the alignment of all functions in log2 format (e.g. 4 "
86 "means align on 16B boundaries)."),
94 case P::FailedISel:
return "FailedISel";
95 case P::IsSSA:
return "IsSSA";
96 case P::Legalized:
return "Legalized";
97 case P::NoPHIs:
return "NoPHIs";
98 case P::NoVRegs:
return "NoVRegs";
99 case P::RegBankSelected:
return "RegBankSelected";
100 case P::Selected:
return "Selected";
101 case P::TracksLiveness:
return "TracksLiveness";
102 case P::TiedOpsRewritten:
return "TiedOpsRewritten";
103 case P::FailsVerification:
return "FailsVerification";
104 case P::TracksDebugUserValues:
return "TracksDebugUserValues";
111 if (!
F.hasFnAttribute(Attribute::SafeStack))
115 dyn_cast_or_null<MDTuple>(
F.getMetadata(LLVMContext::MD_annotation));
117 if (!Existing || Existing->getNumOperands() != 2)
120 auto *MetadataName =
"unsafe-stack-size";
121 if (
auto &
N = Existing->getOperand(0)) {
122 if (
N.equalsStr(MetadataName)) {
123 if (
auto &Op = Existing->getOperand(1)) {
124 auto Val = mdconst::extract<ConstantInt>(Op)->getZExtValue();
132void MachineFunction::Delegate::anchor() {}
135 const char *Separator =
"";
139 OS << Separator << getPropertyName(static_cast<Property>(
I));
157 if (
auto MA =
F.getFnStackAlign())
166 FunctionNumber = FunctionNum;
180void MachineFunction::init() {
211 Alignment = std::max(Alignment,
217 JumpTableInfo =
nullptr;
230 "Can't create a MachineFunction using a Module with a "
231 "Target-incompatible DataLayout attached\n");
233 PSVManager = std::make_unique<PseudoSourceValueManager>(
getTarget());
238 assert(!MFInfo &&
"MachineFunctionInfo already set");
239 MFInfo =
Target.createMachineFunctionInfo(Allocator, F, &STI);
246void MachineFunction::clear() {
253 I->Insts.clearAndLeakNodesUnsafely();
254 MBBNumbering.clear();
256 InstructionRecycler.clear(Allocator);
257 OperandRecycler.
clear(Allocator);
258 BasicBlockRecycler.clear(Allocator);
259 CodeViewAnnotations.clear();
262 RegInfo->~MachineRegisterInfo();
270 FrameInfo->~MachineFrameInfo();
277 JumpTableInfo->~MachineJumpTableInfo();
282 WinEHInfo->~WinEHFuncInfo();
287 WasmEHInfo->~WasmEHFuncInfo();
300 if (JumpTableInfo)
return JumpTableInfo;
302 JumpTableInfo =
new (Allocator)
304 return JumpTableInfo;
316[[nodiscard]]
unsigned
318 FrameInstructions.push_back(Inst);
319 return FrameInstructions.size() - 1;
327 if (
empty()) { MBBNumbering.clear();
return; }
335 unsigned BlockNo = 0;
337 BlockNo = std::prev(
MBBI)->getNumber() + 1;
344 "MBB number mismatch!");
349 if (MBBNumbering[BlockNo])
350 MBBNumbering[BlockNo]->setNumber(-1);
352 MBBNumbering[BlockNo] = &*
MBBI;
359 assert(BlockNo <= MBBNumbering.size() &&
"Mismatch!");
360 MBBNumbering.resize(BlockNo);
373 std::prev(
MBBI)->setIsEndSection();
383 return new (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
391 return new (InstructionRecycler.Allocate<
MachineInstr>(Allocator))
403 if (FirstClone ==
nullptr) {
409 if (!
I->isBundledWithSucc())
431 "Call site info was not updated!");
439 InstructionRecycler.Deallocate(Allocator,
MI);
464 MBB->~MachineBasicBlock();
465 BasicBlockRecycler.Deallocate(Allocator,
MBB);
473 return new (Allocator)
475 SSID, Ordering, FailureOrdering);
483 return new (Allocator)
485 Ordering, FailureOrdering);
490 return new (Allocator)
498 return new (Allocator)
549 return MachineInstr::ExtraInfo::create(Allocator, MMOs, PreInstrSymbol,
550 PostInstrSymbol, HeapAllocMarker,
551 PCSections, CFIType);
557 Dest[
Name.size()] = 0;
565 memset(Mask, 0,
Size *
sizeof(Mask[0]));
570 int* AllocMask = Allocator.
Allocate<
int>(Mask.size());
571 copy(Mask, AllocMask);
572 return {AllocMask, Mask.size()};
575#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
586 OS <<
"# Machine code for function " <<
getName() <<
": ";
603 OS <<
"Function Live Ins: ";
609 if (std::next(
I) !=
E)
617 for (
const auto &BB : *
this) {
620 BB.print(
OS, MST, Indexes,
true);
623 OS <<
"\n# End machine code for function " <<
getName() <<
".\n\n";
640 return (
"CFG for '" +
F->getName() +
"' function").str();
651 if (
const BasicBlock *BB = Node->getBasicBlock())
652 OSS <<
": " << BB->getName();
657 if (OutStr[0] ==
'\n') OutStr.erase(OutStr.begin());
660 for (
unsigned i = 0; i != OutStr.length(); ++i)
661 if (OutStr[i] ==
'\n') {
663 OutStr.insert(OutStr.begin()+i+1,
'l');
676 errs() <<
"MachineFunction::viewCFG is only available in debug builds on "
677 <<
"systems with Graphviz or gv!\n";
686 errs() <<
"MachineFunction::viewCFGOnly is only available in debug builds on "
687 <<
"systems with Graphviz or gv!\n";
707 "Register class mismatch!");
710 VReg =
MRI.createVirtualRegister(RC);
711 MRI.addLiveIn(PReg, VReg);
719 bool isLinkerPrivate)
const {
721 assert(JumpTableInfo &&
"No jump tables");
722 assert(JTI < JumpTableInfo->getJumpTables().
size() &&
"Invalid JTI!");
724 StringRef Prefix = isLinkerPrivate ?
DL.getLinkerPrivateGlobalPrefix()
725 :
DL.getPrivateGlobalPrefix();
744 unsigned N = LandingPads.size();
745 for (
unsigned i = 0; i <
N; ++i) {
752 return LandingPads[
N];
768 if (
const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) {
771 if (LPI->isCleanup() && LPI->getNumClauses() != 0)
777 for (
unsigned I = LPI->getNumClauses();
I != 0; --
I) {
778 Value *Val = LPI->getClause(
I - 1);
779 if (LPI->isCatch(
I - 1)) {
784 auto *CVal = cast<Constant>(Val);
786 for (
const Use &U : CVal->operands())
788 getTypeIDFor(cast<GlobalValue>(U->stripPointerCasts())));
794 }
else if (
const auto *CPI = dyn_cast<CatchPadInst>(FirstI)) {
795 for (
unsigned I = CPI->arg_size();
I != 0; --
I) {
797 dyn_cast<GlobalValue>(CPI->getArgOperand(
I - 1)->stripPointerCasts());
802 assert(isa<CleanupPadInst>(FirstI) &&
"Invalid landingpad!");
805 return LandingPadLabel;
810 LPadToCallSiteMap[
Sym].append(Sites.
begin(), Sites.
end());
814 for (
unsigned i = 0,
N = TypeInfos.size(); i !=
N; ++i)
815 if (TypeInfos[i] == TI)
return i + 1;
817 TypeInfos.push_back(TI);
818 return TypeInfos.size();
825 for (
unsigned i : FilterEnds) {
826 unsigned j = TyIds.
size();
829 if (FilterIds[--i] != TyIds[--j])
840 int FilterID = -(1 + FilterIds.size());
841 FilterIds.reserve(FilterIds.size() + TyIds.
size() + 1);
843 FilterEnds.push_back(FilterIds.size());
844 FilterIds.push_back(0);
850 assert(
MI->isCandidateForCallSiteEntry() &&
851 "Call site info refers only to call (MI) candidates");
853 if (!
Target.Options.EmitCallSiteInfo)
854 return CallSitesInfo.
end();
855 return CallSitesInfo.
find(
MI);
865 if (BMI.isCandidateForCallSiteEntry())
872 assert(
MI->shouldUpdateCallSiteInfo() &&
873 "Call site info refers only to call (MI) candidates or "
874 "candidates inside bundles");
878 if (CSIt == CallSitesInfo.
end())
880 CallSitesInfo.
erase(CSIt);
886 "Call site info refers only to call (MI) candidates or "
887 "candidates inside bundles");
889 if (!New->isCandidateForCallSiteEntry())
894 if (CSIt == CallSitesInfo.
end())
898 CallSitesInfo[New] = CSInfo;
904 "Call site info refers only to call (MI) candidates or "
905 "candidates inside bundles");
907 if (!New->isCandidateForCallSiteEntry())
912 if (CSIt == CallSitesInfo.
end())
916 CallSitesInfo.
erase(CSIt);
917 CallSitesInfo[New] = CSInfo;
937 unsigned MaxOperand) {
949 for (
unsigned int I = 0;
I < MaxOperand; ++
I) {
951 auto &NewMO = New.getOperand(
I);
954 if (!OldMO.isReg() || !OldMO.isDef())
958 unsigned NewInstrNum = New.getDebugInstrNum();
960 std::make_pair(NewInstrNum,
I));
972 if (
auto CopyDstSrc =
TII.isCopyInstr(
MI)) {
973 Dest = CopyDstSrc->Destination->getReg();
976 Dest =
MI.getOperand(0).getReg();
979 auto CacheIt = DbgPHICache.find(Dest);
980 if (CacheIt != DbgPHICache.end())
981 return CacheIt->second;
984 auto OperandPair = salvageCopySSAImpl(
MI);
985 DbgPHICache.insert({Dest, OperandPair});
1011 auto GetRegAndSubreg =
1012 [&](
const MachineInstr &Cpy) -> std::pair<Register, unsigned> {
1016 OldReg = Cpy.getOperand(0).getReg();
1017 NewReg = Cpy.getOperand(1).getReg();
1018 SubReg = Cpy.getOperand(1).getSubReg();
1019 }
else if (Cpy.isSubregToReg()) {
1020 OldReg = Cpy.getOperand(0).getReg();
1021 NewReg = Cpy.getOperand(2).getReg();
1022 SubReg = Cpy.getOperand(3).getImm();
1024 auto CopyDetails = *
TII.isCopyInstr(Cpy);
1028 NewReg = Src.getReg();
1029 SubReg = Src.getSubReg();
1039 auto State = GetRegAndSubreg(
MI);
1040 auto CurInst =
MI.getIterator();
1044 if (!State.first.isVirtual())
1058 State = GetRegAndSubreg(Inst);
1065 auto ApplySubregisters =
1067 for (
unsigned Subreg :
reverse(SubregsSeen)) {
1069 unsigned NewInstrNumber = getNewDebugInstrNum();
1072 makeDebugValueSubstitution({NewInstrNumber, 0},
P, Subreg);
1075 P = {NewInstrNumber, 0};
1082 if (State.first.isVirtual()) {
1085 for (
auto &MO : Inst->
operands()) {
1086 if (!MO.isReg() || !MO.isDef() || MO.getReg() != State.first)
1096 assert(CurInst->isCopyLike() ||
TII.isCopyInstr(*CurInst));
1097 State = GetRegAndSubreg(*CurInst);
1100 auto RMII = CurInst->getReverseIterator();
1101 auto PrevInstrs =
make_range(RMII, CurInst->getParent()->instr_rend());
1102 for (
auto &ToExamine : PrevInstrs) {
1103 for (
auto &MO : ToExamine.operands()) {
1105 if (!MO.isReg() || !MO.isDef() ||
1106 !
TRI.regsOverlap(RegToSeek, MO.getReg()))
1109 return ApplySubregisters(
1110 {ToExamine.getDebugInstrNum(), MO.getOperandNo()});
1127 TII.get(TargetOpcode::DBG_PHI));
1129 unsigned NewNum = getNewDebugInstrNum();
1131 return ApplySubregisters({NewNum, 0u});
1138 const MCInstrDesc &RefII =
TII->get(TargetOpcode::DBG_VALUE_LIST);
1140 MI.setDebugValueUndef();
1144 for (
auto &
MBB : *
this) {
1145 for (
auto &
MI :
MBB) {
1146 if (!
MI.isDebugRef())
1149 bool IsValidRef =
true;
1173 MO.ChangeToDbgInstrRef(Result.first, Result.second);
1176 unsigned OperandIdx = 0;
1177 for (
const auto &DefMO :
DefMI.operands()) {
1178 if (DefMO.isReg() && DefMO.isDef() && DefMO.getReg() ==
Reg)
1185 unsigned ID =
DefMI.getDebugInstrNum();
1186 MO.ChangeToDbgInstrRef(
ID, OperandIdx);
1191 MakeUndefDbgValue(
MI);
1205 if (
F.hasFnAttribute(Attribute::OptimizeNone))
1272 const std::vector<MachineBasicBlock*> &DestBBs) {
1273 assert(!DestBBs.empty() &&
"Cannot create an empty jump table!");
1275 return JumpTables.size()-1;
1282 assert(Old != New &&
"Not making a change?");
1283 bool MadeChange =
false;
1284 for (
size_t i = 0, e = JumpTables.size(); i != e; ++i)
1291 bool MadeChange =
false;
1293 auto removeBeginItr = std::remove(JTE.MBBs.begin(), JTE.MBBs.end(),
MBB);
1294 MadeChange |= (removeBeginItr != JTE.MBBs.end());
1295 JTE.MBBs.erase(removeBeginItr, JTE.MBBs.end());
1305 assert(Old != New &&
"Not making a change?");
1306 bool MadeChange =
false;
1317 if (JumpTables.empty())
return;
1319 OS <<
"Jump Tables:\n";
1321 for (
unsigned i = 0, e = JumpTables.size(); i != e; ++i) {
1332#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
1344void MachineConstantPoolValue::anchor() {}
1347 return DL.getTypeAllocSize(Ty);
1352 return Val.MachineCPVal->getSizeInBytes(
DL);
1353 return DL.getTypeAllocSize(
Val.ConstVal->getType());
1359 return Val.ConstVal->needsDynamicRelocation();
1385 if (
C.isMachineConstantPoolEntry()) {
1386 Deleted.insert(
C.Val.MachineCPVal);
1387 delete C.Val.MachineCPVal;
1400 if (
A ==
B)
return true;
1404 if (
A->getType() ==
B->getType())
return false;
1407 if (isa<StructType>(
A->getType()) || isa<ArrayType>(
A->getType()) ||
1408 isa<StructType>(
B->getType()) || isa<ArrayType>(
B->getType()))
1412 uint64_t StoreSize =
DL.getTypeStoreSize(
A->getType());
1413 if (StoreSize !=
DL.getTypeStoreSize(
B->getType()) || StoreSize > 128)
1422 if (isa<PointerType>(
A->getType()))
1425 else if (
A->getType() != IntTy)
1428 if (isa<PointerType>(
B->getType()))
1431 else if (
B->getType() != IntTy)
1442 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1447 for (
unsigned i = 0, e =
Constants.size(); i != e; ++i)
1448 if (!
Constants[i].isMachineConstantPoolEntry() &&
1461 if (Alignment > PoolAlignment) PoolAlignment = Alignment;
1466 int Idx = V->getExistingMachineCPValue(
this, Alignment);
1468 MachineCPVsSharingEntries.insert(V);
1469 return (
unsigned)
Idx;
1479 OS <<
"Constant Pool:\n";
1480 for (
unsigned i = 0, e =
Constants.size(); i != e; ++i) {
1481 OS <<
" cp#" << i <<
": ";
1482 if (
Constants[i].isMachineConstantPoolEntry())
1485 Constants[i].Val.ConstVal->printAsOperand(
OS,
false);
1486 OS <<
", align=" <<
Constants[i].getAlign().value();
1491#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder MachineInstrBuilder & DefMI
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< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
const HexagonInstrInfo * TII
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static Align getFnStackAlignment(const TargetSubtargetInfo *STI, 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 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.
void setUnsafeStackSize(const Function &F, MachineFrameInfo &FrameInfo)
static const char * getPropertyName(MachineFunctionProperties::Property Prop)
unsigned const TargetRegisterInfo * TRI
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isSimple(Instruction *I)
This file defines the SmallString class.
This file defines the SmallVector class.
This file describes how to lower LLVM code to machine code.
void clear(AllocatorType &Allocator)
Release all the tracked allocations to the allocator.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
LLVM Basic Block Representation.
const Instruction * getFirstNonPHI() const
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
LLVM_ATTRIBUTE_RETURNS_NONNULL void * Allocate(size_t Size, Align Alignment)
Allocate space at the specified alignment.
void Deallocate(const void *Ptr, size_t Size, size_t)
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.
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size in bytes, rounded up to a whole number of bytes.
Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Implements a dense probed hash-table based set.
MaybeAlign getFnStackAlign() const
Return the stack alignment for the function.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
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.
Module * getParent()
Get the module that this global value is contained inside of...
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
This class describes a target machine that is implemented with the LLVM target-independent code gener...
Context object for machine code objects.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Describe properties that are true of each instruction in the target description file.
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 ...
void setIsEndSection(bool V=true)
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
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.
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setBBID(unsigned V)
Sets the fixed BBID of this basic block.
void setIsBeginSection(bool V=true)
This class is a data container for one entry in a MachineConstantPool.
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 ...
union llvm::MachineConstantPoolEntry::@193 Val
The constant itself.
unsigned getSizeInBytes(const DataLayout &DL) const
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...
void dump() const
dump - Call print(cerr) to be called from the debugger.
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about constant pool objects.
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.
void ensureMaxAlignment(Align Alignment)
Make sure the function is at least Align bytes aligned.
void print(const MachineFunction &MF, raw_ostream &OS) const
Used by the MachineFunction printer to print information about stack objects.
void setUnsafeStackSize(uint64_t Size)
void print(raw_ostream &OS) const
Print the MachineFunctionProperties in human-readable form.
MachineFunctionProperties & set(Property P)
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.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, Align 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.
int getFilterIDFor(ArrayRef< unsigned > TyIds)
Return the id of the filter encoded by TyIds. This is function wide.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *bb=nullptr)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
bool UseDebugInstrRef
Flag for whether this function contains DBG_VALUEs (false) or DBG_INSTR_REF (true).
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.
MachineInstr & cloneMachineInstrBundle(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig)
Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.
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.
void dump() const
dump - Print the current MachineFunction to cerr, useful for debugger use.
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, bool NoImplicit=false)
CreateMachineInstr - Allocate a new MachineInstr.
void makeDebugValueSubstitution(DebugInstrOperandPair, DebugInstrOperandPair, unsigned SubReg=0)
Create a substitution between one <instr,operand> value to a different, new value.
bool needsFrameMoves() const
True if this function needs frame moves for debug or exceptions.
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 copyCallSiteInfo(const MachineInstr *Old, const MachineInstr *New)
Copy the call site info from Old to \ New.
void deleteMachineInstr(MachineInstr *MI)
DeleteMachineInstr - Delete the given MachineInstr.
void initTargetMachineFunctionInfo(const TargetSubtargetInfo &STI)
Initialize the target specific MachineFunctionInfo.
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.
MCContext & getContext() const
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.
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
Function & getFunction()
Return the LLVM function that this machine code represents.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
DebugInstrOperandPair salvageCopySSAImpl(MachineInstr &MI)
const MachineBasicBlock & back() const
MachineModuleInfo & getMMI() const
BasicBlockListType::iterator iterator
void setDebugInstrNumberingCount(unsigned Num)
Set value of DebugInstrNumberingCount field.
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.
MachineInstr * CloneMachineInstr(const MachineInstr *Orig)
Create a new MachineInstr which is a copy of Orig, identical in all ways except the instruction has n...
void eraseCallSiteInfo(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...
void moveCallSiteInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
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...
MachineInstr::ExtraInfo * createMIExtraInfo(ArrayRef< MachineMemOperand * > MMOs, MCSymbol *PreInstrSymbol=nullptr, MCSymbol *PostInstrSymbol=nullptr, MDNode *HeapAllocMarker=nullptr, MDNode *PCSections=nullptr, uint32_t CFIType=0)
Allocate and construct an extra info structure for a MachineInstr.
VariableDbgInfoMapTy VariableDbgInfos
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
MachineFunction(Function &F, const LLVMTargetMachine &Target, const TargetSubtargetInfo &STI, unsigned FunctionNum, MachineModuleInfo &MMI)
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.
void bundleWithPred()
Bundle this instruction with its predecessor.
bool isCopyLike() const
Return true if the instruction behaves like a copy.
unsigned getNumOperands() const
Retuns the total number of operands.
unsigned peekDebugInstrNum() const
Examine the instruction number of this MachineInstr.
bool shouldUpdateCallSiteInfo() const
Return true if copying, moving, or erasing this instruction requires updating Call Site Info (see cop...
iterator_range< mop_iterator > operands()
unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
bool RemoveMBBFromJumpTables(MachineBasicBlock *MBB)
RemoveMBBFromJumpTables - If MBB is present in any jump tables, remove it.
bool ReplaceMBBInJumpTables(MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTables - If Old is the target of any jump tables, update the jump tables to branch to...
void print(raw_ostream &OS) const
print - Used by the MachineFunction printer to print information about jump tables.
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
void dump() const
dump - Call to stderr.
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...
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_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,...
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.
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.
uint64_t getSize() const
Return the size in bytes of 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.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
This class contains meta information specific to a module.
bool hasDebugInfo() const
Returns true if valid debug info is present.
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,...
bool livein_empty() const
def_instr_iterator def_instr_begin(Register RegNo) const
std::vector< std::pair< MCRegister, Register > >::const_iterator livein_iterator
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
livein_iterator livein_end() const
livein_iterator livein_begin() const
Manage lifetime of a slot tracker for printing IR.
void incorporateFunction(const Function &F)
Incorporate the given function.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
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.
StringRef - Represent a constant reference to a string, i.e.
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 getPrefFunctionAlignment() const
Return the preferred function alignment.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
bool hasSubClassEq(const TargetRegisterClass *RC) const
Returns true if RC is a sub-class of or equal to this class.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
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.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
StringRef getName() const
Return a constant reference to the value's name.
Iterator for intrusive lists based on ilist_node.
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.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
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.
bool getAlign(const Function &F, unsigned index, unsigned &align)
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 a range to a container.
Printable printJumpTableEntryReference(unsigned Idx)
Prints a jump table entry reference.
bool isScopedEHPersonality(EHPersonality Pers)
Returns true if this personality uses scope-style EH IR instructions: catchswitch,...
auto reverse(ContainerTy &&C)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
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...
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)
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
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.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
bool debuginfoShouldUseDebugInstrRef(const Triple &T)
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.
uint64_t value() const
This is a hole in the type system and should not be abused.
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 - This class provides the default implementations of all of the DOTGraphTraits ...
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
virtual ~MachineFunctionInfo()
MachineJumpTableEntry - One jump table in the jump table info.
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
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
static void deleteNode(NodeTy *V)