57 std::unique_ptr<PerTargetMIParsingState> Target;
61 bool NoLLVMIR =
false;
64 bool NoMIRDocuments =
false;
66 std::function<void(
Function &)> ProcessIRFunction;
71 std::function<
void(
Function &)> ProcessIRFunction);
95 std::unique_ptr<Module>
136 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
140 std::vector<CalleeSavedInfo> &CSIInfo,
142 bool IsRestored,
int FrameIdx);
154 template <
typename T>
203 reinterpret_cast<MIRParserImpl *
>(Context)->reportDiagnostic(Diag);
208 std::function<
void(
Function &)> Callback)
210 In(SM.getMemoryBuffer(SM.AddNewSourceBuffer(
std::
move(Contents),
SMLoc()))
213 Filename(Filename), ProcessIRFunction(Callback) {
254std::unique_ptr<Module>
256 if (!In.setCurrentDocument()) {
260 NoMIRDocuments =
true;
261 auto M = std::make_unique<Module>(Filename, Context);
262 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
263 M->getDataLayoutStr()))
264 M->setDataLayout(*LayoutOverride);
268 std::unique_ptr<Module> M;
271 if (
const auto *BSN =
275 Context, &IRSlots, DataLayoutCallback);
281 if (!In.setCurrentDocument())
282 NoMIRDocuments =
true;
285 M = std::make_unique<Module>(Filename, Context);
286 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
287 M->getDataLayoutStr()))
288 M->setDataLayout(*LayoutOverride);
300 auto FirstUnvisitedFunction = M.begin();
305 }
while (In.setCurrentDocument());
318 if (ProcessIRFunction)
319 ProcessIRFunction(*
F);
327 for (; FirstUnvisitedFunction != M.end(); ++FirstUnvisitedFunction)
328 if (!FirstUnvisitedFunction->hasName())
329 return &*FirstUnvisitedFunction++;
351 Function *
F = M.getFunction(FunctionName);
355 }
else if (!FunctionName.
empty() ||
357 return error(
Twine(
"function '") + FunctionName +
358 "' isn't defined in the provided LLVM IR");
364 return error(
Twine(
"redefinition of machine function '") + FunctionName +
375 return error(
Twine(
"redefinition of machine function '") + FunctionName +
402bool MIRParserImpl::computeFunctionProperties(
407 bool HasInlineAsm =
false;
408 bool HasFakeUses =
false;
409 bool AllTiedOpsRewritten =
true, HasTiedOps =
false;
410 for (
const MachineBasicBlock &
MBB : MF) {
411 for (
const MachineInstr &
MI :
MBB) {
414 if (
MI.isInlineAsm())
418 for (
unsigned I = 0;
I <
MI.getNumOperands(); ++
I) {
419 const MachineOperand &MO =
MI.getOperand(
I);
423 if (MO.
isUse() &&
MI.isRegTiedToDefOperand(
I, &DefIdx)) {
425 if (MO.
getReg() !=
MI.getOperand(DefIdx).getReg())
426 AllTiedOpsRewritten =
false;
434 auto ComputedPropertyHelper =
435 [&
Properties](std::optional<bool> ExplicitProp,
bool ComputedProp,
438 if (ExplicitProp.value_or(ComputedProp))
444 return ExplicitProp && *ExplicitProp && !ComputedProp;
447 if (ComputedPropertyHelper(YamlMF.
NoPHIs, !HasPHI,
449 return error(MF.getName() +
450 " has explicit property NoPhi, but contains at least one PHI");
453 MF.setHasInlineAsm(HasInlineAsm);
455 if (HasTiedOps && AllTiedOpsRewritten)
458 if (ComputedPropertyHelper(YamlMF.
IsSSA,
isSSA(MF),
460 return error(MF.getName() +
461 " has explicit property IsSSA, but is not valid SSA");
464 const MachineRegisterInfo &MRI = MF.getRegInfo();
469 " has explicit property NoVRegs, but contains virtual registers");
479 " has explicit property hasFakeUses=false, but contains fake uses");
480 MF.setHasFakeUses(YamlMF.
HasFakeUses.value_or(HasFakeUses));
490 Twine(
" instruction block out of range.") +
491 " Unable to reference bb:" + Twine(MILoc.
BlockNum));
494 if (MILoc.
Offset >= BB->size())
496 Twine(MF.
getName()) + Twine(
" instruction offset out of range.") +
497 " Unable to reference instruction at bb: " + Twine(MILoc.
BlockNum) +
498 " at offset:" + Twine(MILoc.
Offset));
499 MI = &*std::next(BB->instr_begin(), MILoc.
Offset);
511 if (parseMachineInst(MF, MILoc, CallI))
515 Twine(
" call site info should reference call "
516 "instruction. Instruction at bb:") +
518 " is not a call instruction");
520 for (
auto ArgRegPair : YamlCSInfo.ArgForwardingRegs) {
523 return error(
Error, ArgRegPair.Reg.SourceRange);
524 CSInfo.
ArgRegPairs.emplace_back(Reg, ArgRegPair.ArgNo);
526 if (!YamlCSInfo.CalleeTypeIds.empty()) {
527 for (
auto CalleeTypeId : YamlCSInfo.CalleeTypeIds) {
529 CSInfo.
CalleeTypeIds.push_back(ConstantInt::get(Int64Ty, CalleeTypeId,
540 return error(
"call site info provided but not used");
544void MIRParserImpl::setupDebugValueTracking(
548 unsigned MaxInstrNum = 0;
551 MaxInstrNum = std::max(
MI.peekDebugInstrNum(), MaxInstrNum);
552 MF.setDebugInstrNumberingCount(MaxInstrNum);
556 MF.makeDebugValueSubstitution({
Sub.SrcInst,
Sub.SrcOp},
588 Props.setLegalized();
590 Props.setRegBankSelected();
594 Props.setFailedISel();
596 Props.setFailsVerification();
598 Props.setTracksDebugUserValues();
681 if (computeFunctionProperties(MF, YamlMF))
693 setupDebugValueTracking(MF, PFS, YamlMF);
710 Targets[Target.BBID].push_back(Target.CallsiteIndex);
720 assert(RegInfo.tracksLiveness());
722 RegInfo.invalidateLiveness();
729 return error(VReg.ID.SourceRange.Start,
730 Twine(
"redefinition of virtual register '%") +
731 Twine(VReg.ID.Value) +
"'");
732 Info.Explicit =
true;
734 if (VReg.Class.Value ==
"_") {
736 Info.D.RegBank =
nullptr;
738 const auto *RC = Target->getRegClass(VReg.Class.Value);
743 const RegisterBank *RegBank = Target->getRegBank(VReg.Class.Value);
746 VReg.Class.SourceRange.Start,
747 Twine(
"use of undefined register class or register bank '") +
748 VReg.Class.Value +
"'");
750 Info.D.RegBank = RegBank;
754 if (!VReg.PreferredRegister.Value.empty()) {
756 return error(VReg.Class.SourceRange.Start,
757 Twine(
"preferred register can only be set for normal vregs"));
760 VReg.PreferredRegister.Value,
Error))
761 return error(
Error, VReg.PreferredRegister.SourceRange);
764 for (
const auto &FlagStringValue : VReg.RegisterFlags) {
766 if (Target->getVRegFlagValue(FlagStringValue.Value, FlagValue))
767 return error(FlagStringValue.SourceRange.Start,
768 Twine(
"use of undefined register flag '") +
769 FlagStringValue.Value +
"'");
770 Info.Flags |= FlagValue;
773 return error(VReg.AntiHints.front().SourceRange.Start,
774 "anti-hints can only be set for normal vregs");
776 for (
const auto &AntiHintValue : VReg.AntiHints) {
779 return error(
Error, AntiHintValue.SourceRange);
782 return error(AntiHintValue.SourceRange.Start,
783 "anti-hint '" +
Twine(AntiHintValue.Value) +
784 "' must be a virtual register");
787 Info.AntiHints.push_back(AntiHintReg);
789 RegInfo.noteNewVirtualRegister(Info.VReg);
793 for (
const auto &LiveIn : YamlMF.
LiveIns) {
796 return error(
Error, LiveIn.Register.SourceRange);
798 if (!LiveIn.VirtualRegister.Value.empty()) {
802 return error(
Error, LiveIn.VirtualRegister.SourceRange);
805 RegInfo.addLiveIn(Reg, VReg);
816 CalleeSavedRegisters.
push_back(Reg.id());
818 RegInfo.setCalleeSavedRegs(CalleeSavedRegisters);
825 if (VReg.SplitFrom.Value.empty() && VReg.AssignedPhys.Value.empty())
828 auto It = PFS.
VRegInfos.find(VReg.ID.Value);
831 Register ChildReg = It->second->VReg;
834 Pending.
VReg = ChildReg;
836 if (!VReg.SplitFrom.Value.empty()) {
840 return error(
Error, VReg.SplitFrom.SourceRange);
841 if (Parent->
VReg == ChildReg)
842 return error(VReg.SplitFrom.SourceRange.Start,
843 Twine(
"'split-from' references the same vreg as 'id' (%") +
844 Twine(VReg.ID.Value) +
")");
847 if (!VReg.AssignedPhys.Value.empty()) {
850 return error(
Error, VReg.AssignedPhys.SourceRange);
853 VReg.AssignedPhys.SourceRange.Start,
854 Twine(
"'assigned-phys' must be a physical register, got '") +
855 VReg.AssignedPhys.Value +
"'");
858 RegInfo.addPendingVirtRegMapEntry(Pending);
873 auto populateVRegInfo = [&](
const VRegInfo &Info,
const Twine &Name) {
878 (
Twine(
"Cannot determine class/bank of virtual register ") + Name +
879 " in function '" + MF.
getName() +
"'")
883 if (!Info.D.RC->isAllocatable()) {
885 TRI->getRegClassName(Info.D.RC) +
886 "' for virtual register " + Name +
" in function '" +
893 if (Info.PreferredReg != 0)
895 if (!Info.AntiHints.empty())
908 populateVRegInfo(Info,
Twine(
P.first()));
913 populateVRegInfo(Info,
Twine(
P.first.id()));
920 if (
auto *RegMask =
TRI->getCustomEHPadPreservedMask(MF))
937 for (
auto &E : Errors)
979 std::vector<CalleeSavedInfo> CSIInfo;
985 Object.IsImmutable, Object.IsAliased);
990 return error(Object.ID.SourceRange.Start,
991 Twine(
"StackID is not supported by target"));
997 return error(Object.ID.SourceRange.Start,
998 Twine(
"redefinition of fixed stack object '%fixed-stack.") +
999 Twine(Object.ID.Value) +
"'");
1001 Object.CalleeSavedRestored, ObjectIdx))
1012 return error(
Error, Object.EntryValueRegister.SourceRange);
1013 if (!Reg.isPhysical())
1014 return error(Object.EntryValueRegister.SourceRange.Start,
1015 "Expected physical register for entry value field");
1017 PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1020 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1022 Reg.asMCReg(), MaybeInfo->DILoc);
1030 if (!Name.Value.empty()) {
1032 F.getValueSymbolTable()->lookup(Name.Value));
1034 return error(Name.SourceRange.Start,
1035 "alloca instruction named '" + Name.Value +
1036 "' isn't defined in the function '" +
F.getName() +
1040 return error(Object.ID.SourceRange.Start,
1041 Twine(
"StackID is not supported by target"));
1047 Object.Size, Object.Alignment.valueOrOne(),
1054 return error(Object.ID.SourceRange.Start,
1055 Twine(
"redefinition of stack object '%stack.") +
1056 Twine(Object.ID.Value) +
"'");
1058 Object.CalleeSavedRestored, ObjectIdx))
1060 if (Object.LocalOffset)
1066 if (!CSIInfo.empty())
1091 std::vector<CalleeSavedInfo> &CSIInfo,
1093 if (RegisterSource.
Value.empty())
1101 CSIInfo.push_back(CSI);
1106template <
typename T>
1114 return Parser.
error(Source.SourceRange.Start,
1115 "expected a reference to a '" + TypeString +
1126 if (parseMDNode(PFS, Var, VarStr) || parseMDNode(PFS, Expr, ExprStr) ||
1127 parseMDNode(PFS,
Loc, LocStr))
1128 return std::nullopt;
1135 return std::nullopt;
1139template <
typename T>
1141 const T &Object,
int FrameIdx) {
1142 std::optional<VarExprLoc> MaybeInfo =
1143 parseVarExprLoc(PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1148 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1156 if (Source.Value.empty())
1170 for (
const auto &YamlConstant : YamlMF.
Constants) {
1171 if (YamlConstant.IsTargetSpecific)
1173 return error(YamlConstant.Value.SourceRange.Start,
1174 "Can't parse target-specific constant pool entries yet");
1178 return error(
Error, YamlConstant.Value.SourceRange);
1179 const Align PrefTypeAlign =
1181 const Align Alignment = YamlConstant.Alignment.value_or(PrefTypeAlign);
1183 if (!ConstantPoolSlots.
insert(std::make_pair(YamlConstant.ID.Value, Index))
1185 return error(YamlConstant.ID.SourceRange.Start,
1186 Twine(
"redefinition of constant pool item '%const.") +
1187 Twine(YamlConstant.ID.Value) +
"'");
1195 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
1200 if (parseMBBReference(PFS,
MBB, Entry.Point.Value))
1204 for (
auto &RegStr : Entry.Registers) {
1218 for (
const auto &Entry : YamlJTI.
Entries) {
1219 std::vector<MachineBasicBlock *> Blocks;
1220 for (
const auto &MBBSource : Entry.Blocks) {
1222 if (parseMBBReference(PFS,
MBB, MBBSource.Value))
1224 Blocks.push_back(
MBB);
1229 return error(Entry.ID.SourceRange.Start,
1230 Twine(
"redefinition of jump table entry '%jump-table.") +
1231 Twine(Entry.ID.Value) +
"'");
1254 unsigned ErrorDefinitionIndex = 0;
1257 ErrorDefinitionIndex)) {
1280 if (parseMachineInst(MF, MILoc, CallI))
1284 Twine(
" called global should reference call "
1285 "instruction. Instruction at bb:") +
1287 " is not a call instruction");
1290 F.getParent()->getValueSymbolTable().lookup(YamlCG.Callee.Value);
1292 return error(YamlCG.Callee.SourceRange.Start,
1293 "use of undefined global '" + YamlCG.Callee.Value +
"'");
1295 return error(YamlCG.Callee.SourceRange.Start,
1296 "use of non-global value '" + YamlCG.Callee.Value +
"'");
1309 *
Loc.getPointer() ==
'\'';
1312 Loc =
Loc.getFromPointer(
Loc.getPointer() +
Error.getColumnNo() +
1313 (HasQuote ? 1 : 0));
1327 unsigned Line = LineAndColumn.first +
Error.getLineNo() - 1;
1328 unsigned Column =
Error.getColumnNo();
1336 if (L.line_number() == Line) {
1339 auto Indent = LineStr.
find(
Error.getLineContents());
1346 return SMDiagnostic(SM, Loc, Filename, Line, Column,
Error.getKind(),
1347 Error.getMessage(), LineStr,
Error.getRanges(),
1356std::unique_ptr<Module>
1358 return Impl->parseIRModule(DataLayoutCallback);
1362 return Impl->parseMachineFunctions(M, MMI);
1367 return Impl->parseMachineFunctions(M, MMI, &
MAM);
1372 std::function<
void(
Function &)> ProcessIRFunction) {
1374 if (std::error_code EC = FileOrErr.getError()) {
1376 "could not open input file: " + EC.message());
1383std::unique_ptr<MIRParser>
1386 std::function<
void(
Function &)> ProcessIRFunction) {
1387 auto Filename = Contents->getBufferIdentifier();
1388 if (Context.shouldDiscardValueNames()) {
1393 "cannot read MIR with a Context that discards named Values")));
1396 return std::make_unique<MIRParser>(std::make_unique<MIRParserImpl>(
1397 std::move(Contents),
Filename, Context, ProcessIRFunction));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Reserve WWM Registers
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
static bool isSSA(const MachineFunction &MF)
static void handleYAMLDiag(const SMDiagnostic &Diag, void *Context)
static bool typecheckMDNode(T *&Result, MDNode *Node, const yaml::StringValue &Source, StringRef TypeString, MIRParserImpl &Parser)
Verify that given node is of a certain type. Return true on error.
static Function * getNextUnusedUnnamedFunction(const Module &M, Module::iterator &FirstUnvisitedFunction)
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
static constexpr StringLiteral Filename
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
an instruction to allocate memory on the stack
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
This is an important base class in LLVM.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Diagnostic information for machine IR parser.
Lightweight error class with error context and mandatory checking.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Module * getParent()
Get the module that this global value is contained inside of...
@ ExternalLinkage
Externally visible function.
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
This class implements the parsing of LLVM IR that's embedded inside a MIR file.
bool error(const Twine &Message)
Report an error with the given message at unknown location.
void reportDiagnostic(const SMDiagnostic &Diag)
bool setupRegisterInfo(const PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool parseRegisterInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeFrameInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool parseMachineFunction(Module &M, MachineModuleInfo &MMI, ModuleAnalysisManager *FAM, Module::iterator &FirstUnvisitedFunction)
Parse the machine function in the current YAML document.
Function * createDummyFunction(StringRef Name, Module &M)
Create an empty function with the given name.
bool parseStackObjectsDebugInfo(PerFunctionMIParsingState &PFS, const T &Object, int FrameIdx)
bool initializeMachineFunction(const yaml::MachineFunction &YamlMF, MachineFunction &MF)
Initialize the machine function to the state that's described in the MIR file.
std::unique_ptr< Module > parseIRModule(DataLayoutCallbackTy DataLayoutCallback)
Try to parse the optional LLVM module and the machine functions in the MIR file.
bool initializePrefetchTargets(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeJumpTableInfo(PerFunctionMIParsingState &PFS, const yaml::MachineJumpTable &YamlJTI)
bool initializeConstantPool(PerFunctionMIParsingState &PFS, MachineConstantPool &ConstantPool, const yaml::MachineFunction &YamlMF)
MIRParserImpl(std::unique_ptr< MemoryBuffer > Contents, StringRef Filename, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction)
std::optional< VarExprLoc > parseVarExprLoc(PerFunctionMIParsingState &PFS, const yaml::StringValue &VarStr, const yaml::StringValue &ExprStr, const yaml::StringValue &LocStr)
bool parseCalledGlobals(PerFunctionMIParsingState &PFS, MachineFunction &MF, const yaml::MachineFunction &YMF)
bool parseCalleeSavedRegister(PerFunctionMIParsingState &PFS, std::vector< CalleeSavedInfo > &CSIInfo, const yaml::StringValue &RegisterSource, bool IsRestored, int FrameIdx)
bool parseMachineMetadataNodes(PerFunctionMIParsingState &PFS, MachineFunction &MF, const yaml::MachineFunction &YMF)
bool initializeCallSiteInfo(PerFunctionMIParsingState &PFS, const yaml::MachineFunction &YamlMF)
bool initializeSaveRestorePoints(PerFunctionMIParsingState &PFS, const std::vector< yaml::SaveRestorePointEntry > &YamlSRPoints, llvm::SaveRestorePoints &SaveRestorePoints)
bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI, ModuleAnalysisManager *FAM=nullptr)
LLVM_ABI MIRParser(std::unique_ptr< MIRParserImpl > Impl)
LLVM_ABI std::unique_ptr< Module > parseIRModule(DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;})
Parses the optional LLVM IR module in the MIR file.
LLVM_ABI bool parseMachineFunctions(Module &M, MachineModuleInfo &MMI)
Parses MachineFunctions in the MIR file and add them to the given MachineModuleInfo MMI.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void setMaxCallFrameSize(uint64_t S)
LLVM_ABI int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable, bool isAliased=false)
Create a new object at a fixed location on the stack.
void setAdjustsStack(bool V)
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
LLVM_ABI void ensureMaxAlignment(Align Alignment)
Make sure the function's frame is at least Align bytes aligned.
void setHasPatchPoint(bool s=true)
void setLocalFrameSize(int64_t sz)
Set the size of the local object blob.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
Set the stack frame offset of the specified object.
void setFrameAddressIsTaken(bool T)
void setHasStackMap(bool s=true)
void setSavePoints(SaveRestorePoints NewSavePoints)
void setFramePointerPolicy(FramePointerKind Kind)
void setCVBytesOfCalleeSavedRegisters(unsigned S)
void setStackID(int ObjectIdx, uint8_t ID)
void setHasTailCall(bool V=true)
void setStackProtectorIndex(int I)
void setCalleeSavedInfoValid(bool v)
void setReturnAddressIsTaken(bool s)
void mapLocalFrameObject(int ObjectIndex, int64_t Offset)
Map a frame index into the local object block.
void setHasOpaqueSPAdjustment(bool B)
void setCalleeSavedInfo(std::vector< CalleeSavedInfo > CSI)
Used by prolog/epilog inserter to set the function's callee saved information.
LLVM_ABI int CreateVariableSizedObject(Align Alignment, const AllocaInst *Alloca)
Notify the MachineFrameInfo object that a variable sized object has been created.
void setRestorePoints(SaveRestorePoints NewRestorePoints)
LLVM_ABI int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset, bool IsImmutable=false)
Create a spill slot at a fixed location on the stack.
void setStackSize(uint64_t Size)
Set the size of the stack.
void setHasVAStart(bool B)
void setHasMustTailInVarArgFunc(bool B)
void setObjectAlignment(int ObjectIdx, Align Alignment)
setObjectAlignment - Change the alignment of the specified stack object.
void setOffsetAdjustment(int64_t Adj)
Set the correction for frame offsets.
void setFunctionContextIndex(int I)
This analysis create MachineFunction for given Function.
Properties which a MachineFunction may have at a given point in time.
void setCallsUnwindInit(bool b)
void setHasEHFunclets(bool V)
void setExposesReturnsTwice(bool B)
setCallsSetJmp - Set a flag that indicates if there's a call to a "returns twice" function.
void setHasWinCFI(bool v)
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.
void setCallsEHReturn(bool b)
void setAlignment(Align A)
setAlignment - Set the alignment of the function.
void setPrefetchTargets(const DenseMap< UniqueBBID, SmallVector< unsigned > > &V)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
bool verify(Pass *p=nullptr, const char *Banner=nullptr, raw_ostream *OS=nullptr, bool AbortOnError=true) const
Run the current MachineFunction through the machine code verifier, useful for debugger use.
Function & getFunction()
Return the LLVM function that this machine code represents.
void setIsOutlined(bool V)
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
void addCallSiteInfo(const MachineInstr *CallI, CallSiteInfo &&CallInfo)
Start tracking the arguments passed to the call CallI.
const MachineFunctionProperties & getProperties() const
Get the function properties.
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, int Slot, const DILocation *Loc)
Collect information used to emit debugging information of a variable in a stack slot.
void setHasEHScopes(bool V)
void setHasEHContTarget(bool V)
void addCalledGlobal(const MachineInstr *MI, CalledGlobalInfo Details)
Notes the global and target flags for a call site.
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
Representation of each machine instruction.
bool isCall(QueryType Type=AnyInBundle) const
LLVM_ABI unsigned createJumpTableIndex(const std::vector< MachineBasicBlock * > &DestBBs)
createJumpTableIndex - Create a new jump table.
An analysis that produces MachineModuleInfo for a module.
This class contains meta information specific to a module.
LLVM_ABI MachineFunction & getOrCreateMachineFunction(Function &F)
Returns the MachineFunction constructed for the IR function F.
const TargetMachine & getTarget() const
LLVM_ABI MachineFunction * getMachineFunction(const Function &F) const
Returns the MachineFunction associated to IR function F if there is one, otherwise nullptr.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isRegMask() const
isRegMask - Tests if this is a MO_RegisterMask operand.
Register getReg() const
getReg - Returns the register number.
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI void freezeReservedRegs()
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
void addRegAllocationAntiHints(Register VReg, ArrayRef< Register > AntiHintVRegs)
Add multiple anti-hints at once.
MachineOperand * getOneDef(Register Reg) const
Returns the defining operand if there is exactly one operand defining the specified register,...
bool def_empty(Register RegNo) const
def_empty - Return true if there are no instructions defining the specified register (it may be live-...
LLVM_ABI void setRegBank(Register Reg, const RegisterBank &RegBank)
Set the register bank to RegBank for Reg.
bool hasOneDef(Register RegNo) const
Return true if there is exactly one operand defining the specified register.
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
void setSimpleHint(Register VReg, Register PrefReg)
Specify the preferred (target independent) register allocation hint for the specified virtual registe...
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
static std::unique_ptr< MemoryBuffer > getMemBuffer(StringRef InputData, StringRef BufferName="", bool RequiresNullTerminator=true)
Open the specified memory range as a MemoryBuffer.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
A Module instance is used to store all the information related to an LLVM module.
FunctionListType::iterator iterator
The Function iterators.
This class implements the register bank concept.
Wrapper class representing virtual and physical registers.
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
SourceMgr::DiagKind getKind() const
Represents a location in source code.
static SMLoc getFromPointer(const char *Ptr)
constexpr const char * getPointer() const
Represents a range in source code.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This owns the files read by a parser, handles include stacks, and handles diagnostic wrangling.
unsigned getMainFileID() const
LLVM_ABI std::pair< unsigned, unsigned > getLineAndColumn(SMLoc Loc, unsigned BufferID=0) const
Find the line and column number for the specified location in the specified file.
const MemoryBuffer * getMemoryBuffer(unsigned i) const
LLVM_ABI SMDiagnostic GetMessage(SMLoc Loc, DiagKind Kind, const Twine &Msg, ArrayRef< SMRange > Ranges={}, ArrayRef< SMFixIt > FixIts={}) const
Return an SMDiagnostic at the specified location with the specified string.
unsigned AddNewSourceBuffer(std::unique_ptr< MemoryBuffer > F, SMLoc IncludeLoc)
Add a new source buffer to this source manager.
Represent a constant reference to a string, i.e.
static constexpr size_t npos
constexpr bool empty() const
Check if the string is empty.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Information about stack frame layout on the target.
virtual bool isSupportedStackID(TargetStackID::Value ID) const
Primary interface to the complete machine description for the target machine.
virtual yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
virtual bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual void mirFileLoaded(MachineFunction &MF) const
This is called after a .mir file was loaded.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
This function has undefined behavior.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
A forward iterator which reads text lines from a buffer.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
EnumSet< Property, Property_enumSize > Properties
std::enable_if_t< has_ScalarEnumerationTraits< T >::value, void > yamlize(IO &io, T &Val, bool, EmptyContext &Ctx)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool parseStackObjectReference(PerFunctionMIParsingState &PFS, int &FI, StringRef Src, SMDiagnostic &Error)
LLVM_ABI bool parseMDNode(PerFunctionMIParsingState &PFS, MDNode *&Node, StringRef Src, SMDiagnostic &Error)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::unique_ptr< Module > parseAssembly(MemoryBufferRef F, SMDiagnostic &Err, LLVMContext &Context, SlotMapping *Slots=nullptr, DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;}, AsmParserContext *ParserContext=nullptr)
parseAssemblyFile and parseAssemblyString are wrappers around this function.
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI bool parseMachineBasicBlockDefinitions(PerFunctionMIParsingState &PFS, StringRef Src, SMDiagnostic &Error)
Parse the machine basic block definitions, and skip the machine instructions.
LLVM_ABI bool parsePrefetchTarget(PerFunctionMIParsingState &PFS, CallsiteID &Target, StringRef Src, SMDiagnostic &Error)
LLVM_ABI bool parseMBBReference(PerFunctionMIParsingState &PFS, MachineBasicBlock *&MBB, StringRef Src, SMDiagnostic &Error)
LLVM_ABI bool parseMetadataDefinitions(ArrayRef< StringRef > Definitions, SMDiagnostic &Err, const Module &M, SlotMapping &Slots, unsigned &ErrorDefinitionIndex)
Parse standalone metadata definitions using and updating the supplied slot mapping.
auto dyn_cast_or_null(const Y &Val)
DenseMap< MachineBasicBlock *, std::vector< CalleeSavedInfo > > SaveRestorePoints
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI std::unique_ptr< MIRParser > createMIRParserFromFile(StringRef Filename, SMDiagnostic &Error, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction=nullptr)
This function is the main interface to the MIR serialization format parser.
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.
LLVM_ABI std::unique_ptr< MIRParser > createMIRParser(std::unique_ptr< MemoryBuffer > Contents, LLVMContext &Context, std::function< void(Function &)> ProcessIRFunction=nullptr)
This function is another interface to the MIR serialization format parser.
llvm::function_ref< std::optional< std::string >(StringRef, StringRef)> DataLayoutCallbackTy
@ Sub
Subtraction of integers.
LLVM_ABI bool parseMachineInstructions(PerFunctionMIParsingState &PFS, StringRef Src, SMDiagnostic &Error)
Parse the machine instructions.
LLVM_ABI bool parseRegisterReference(PerFunctionMIParsingState &PFS, Register &Reg, StringRef Src, SMDiagnostic &Error)
LLVM_ABI Constant * parseConstantValue(StringRef Asm, SMDiagnostic &Err, const Module &M, const SlotMapping *Slots=nullptr)
Parse a type and a constant value in the given string.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool parseVirtualRegisterReference(PerFunctionMIParsingState &PFS, VRegInfo *&Info, StringRef Src, SMDiagnostic &Error)
LLVM_ABI bool parseNamedRegisterReference(PerFunctionMIParsingState &PFS, Register &Reg, StringRef Src, SMDiagnostic &Error)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
SmallVector< ConstantInt *, 4 > CalleeTypeIds
Callee type ids.
SmallVector< ArgRegPair, 1 > ArgRegPairs
Vector of call argument and its forwarding register.
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
DenseMap< unsigned, unsigned > JumpTableSlots
LLVM_ABI VRegInfo & getVRegInfo(Register Num)
DenseMap< unsigned, int > FixedStackObjectSlots
const SlotMapping & IRSlots
DenseMap< unsigned, unsigned > ConstantPoolSlots
StringMap< VRegInfo * > VRegInfosNamed
std::map< unsigned, TrackingMDNodeRef > MachineMetadataNodes
DenseMap< unsigned, int > StackObjectSlots
DenseMap< Register, VRegInfo * > VRegInfos
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
std::map< unsigned, TrackingMDNodeRef > MetadataNodes
constexpr EnumSet & set(Enum E)
constexpr EnumSet & reset(Enum E)
Serializable representation of MachineFrameInfo.
std::vector< SaveRestorePointEntry > RestorePoints
bool IsCalleeSavedInfoValid
unsigned MaxCallFrameSize
~0u means: not computed yet.
FramePointerKind FramePointerPolicy
StringValue StackProtector
std::vector< SaveRestorePointEntry > SavePoints
bool HasMustTailInVarArgFunc
unsigned CVBytesOfCalleeSavedRegisters
bool HasOpaqueSPAdjustment
bool IsReturnAddressTaken
StringValue FunctionContext
std::vector< MachineStackObject > StackObjects
std::vector< StringValue > MachineMetadataNodes
std::optional< std::vector< FlowStringValue > > CalleeSavedRegisters
std::vector< CalledGlobal > CalledGlobals
std::optional< bool > HasFakeUses
std::vector< EntryValueObject > EntryValueObjects
std::optional< bool > NoPHIs
std::vector< FlowStringValue > PrefetchTargets
bool TracksDebugUserValues
std::vector< MachineConstantPoolValue > Constants
std::optional< bool > NoVRegs
std::vector< CallSiteInfo > CallSitesInfo
std::vector< MachineFunctionLiveIn > LiveIns
std::vector< VirtualRegisterDefinition > VirtualRegisters
std::vector< FixedMachineStackObject > FixedStackObjects
std::optional< bool > IsSSA
std::vector< DebugValueSubstitution > DebugValueSubstitutions
std::unique_ptr< MachineFunctionInfo > MachineFuncInfo
Constant pool.
MachineJumpTable JumpTableInfo
MachineFrameInfo FrameInfo
Identifies call instruction location in machine function.
std::vector< Entry > Entries
MachineJumpTableInfo::JTEntryKind Kind
A wrapper around std::string which contains a source range that's being set during parsing.