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>
204 reinterpret_cast<MIRParserImpl *
>(Context)->reportDiagnostic(Diag);
209 std::function<
void(
Function &)> Callback)
211 In(SM.getMemoryBuffer(SM.AddNewSourceBuffer(
std::
move(Contents),
SMLoc()))
214 Filename(Filename), ProcessIRFunction(Callback) {
255std::unique_ptr<Module>
257 if (!In.setCurrentDocument()) {
261 NoMIRDocuments =
true;
262 auto M = std::make_unique<Module>(Filename, Context);
263 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
264 M->getDataLayoutStr()))
265 M->setDataLayout(*LayoutOverride);
269 std::unique_ptr<Module> M;
272 if (
const auto *BSN =
276 Context, &IRSlots, DataLayoutCallback);
282 if (!In.setCurrentDocument())
283 NoMIRDocuments =
true;
286 M = std::make_unique<Module>(Filename, Context);
287 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
288 M->getDataLayoutStr()))
289 M->setDataLayout(*LayoutOverride);
301 auto FirstUnvisitedFunction = M.begin();
306 }
while (In.setCurrentDocument());
319 if (ProcessIRFunction)
320 ProcessIRFunction(*
F);
328 for (; FirstUnvisitedFunction != M.end(); ++FirstUnvisitedFunction)
329 if (!FirstUnvisitedFunction->hasName())
330 return &*FirstUnvisitedFunction++;
352 Function *
F = M.getFunction(FunctionName);
356 }
else if (!FunctionName.
empty() ||
358 return error(
Twine(
"function '") + FunctionName +
359 "' isn't defined in the provided LLVM IR");
365 return error(
Twine(
"redefinition of machine function '") + FunctionName +
376 return error(
Twine(
"redefinition of machine function '") + FunctionName +
403bool MIRParserImpl::computeFunctionProperties(
408 bool HasInlineAsm =
false;
409 bool HasFakeUses =
false;
410 bool AllTiedOpsRewritten =
true, HasTiedOps =
false;
411 for (
const MachineBasicBlock &
MBB : MF) {
412 for (
const MachineInstr &
MI :
MBB) {
415 if (
MI.isInlineAsm())
419 for (
unsigned I = 0;
I <
MI.getNumOperands(); ++
I) {
420 const MachineOperand &MO =
MI.getOperand(
I);
424 if (MO.
isUse() &&
MI.isRegTiedToDefOperand(
I, &DefIdx)) {
426 if (MO.
getReg() !=
MI.getOperand(DefIdx).getReg())
427 AllTiedOpsRewritten =
false;
435 auto ComputedPropertyHelper =
436 [&
Properties](std::optional<bool> ExplicitProp,
bool ComputedProp,
439 if (ExplicitProp.value_or(ComputedProp))
445 return ExplicitProp && *ExplicitProp && !ComputedProp;
448 if (ComputedPropertyHelper(YamlMF.
NoPHIs, !HasPHI,
450 return error(MF.getName() +
451 " has explicit property NoPhi, but contains at least one PHI");
454 MF.setHasInlineAsm(HasInlineAsm);
456 if (HasTiedOps && AllTiedOpsRewritten)
459 if (ComputedPropertyHelper(YamlMF.
IsSSA,
isSSA(MF),
461 return error(MF.getName() +
462 " has explicit property IsSSA, but is not valid SSA");
465 const MachineRegisterInfo &MRI = MF.getRegInfo();
470 " has explicit property NoVRegs, but contains virtual registers");
480 " has explicit property hasFakeUses=false, but contains fake uses");
481 MF.setHasFakeUses(YamlMF.
HasFakeUses.value_or(HasFakeUses));
490 MachineBasicBlock *BB;
491 if (parseMBBReference(PFS, BB, MILoc.
Block))
495 Twine(
" instruction offset out of range.") +
496 " Unable to reference instruction at " + MILoc.
Block.
Value +
497 " at offset:" + Twine(MILoc.
Offset));
510 if (parseMachineInst(PFS, MILoc, CallI))
514 Twine(
" call site info should reference call "
515 "instruction. Instruction at ") +
517 " is not a call instruction");
519 for (
auto ArgRegPair : YamlCSInfo.ArgForwardingRegs) {
522 return error(
Error, ArgRegPair.Reg.SourceRange);
523 CSInfo.
ArgRegPairs.emplace_back(Reg, ArgRegPair.ArgNo);
525 if (!YamlCSInfo.CalleeTypeIds.empty()) {
526 for (
auto CalleeTypeId : YamlCSInfo.CalleeTypeIds) {
528 CSInfo.
CalleeTypeIds.push_back(ConstantInt::get(Int64Ty, CalleeTypeId,
539 return error(
"call site info provided but not used");
543void MIRParserImpl::setupDebugValueTracking(
547 unsigned MaxInstrNum = 0;
550 MaxInstrNum = std::max(
MI.peekDebugInstrNum(), MaxInstrNum);
551 MF.setDebugInstrNumberingCount(MaxInstrNum);
555 MF.makeDebugValueSubstitution({
Sub.SrcInst,
Sub.SrcOp},
587 Props.setLegalized();
589 Props.setRegBankSelected();
593 Props.setFailedISel();
595 Props.setFailsVerification();
597 Props.setTracksDebugUserValues();
680 if (computeFunctionProperties(MF, YamlMF))
692 setupDebugValueTracking(MF, PFS, YamlMF);
709 Targets[Target.BBID].push_back(Target.CallsiteIndex);
719 assert(RegInfo.tracksLiveness());
721 RegInfo.invalidateLiveness();
728 return error(VReg.ID.SourceRange.Start,
729 Twine(
"redefinition of virtual register '%") +
730 Twine(VReg.ID.Value) +
"'");
731 Info.Explicit =
true;
733 if (VReg.Class.Value ==
"_") {
735 Info.D.RegBank =
nullptr;
737 const auto *RC = Target->getRegClass(VReg.Class.Value);
742 const RegisterBank *RegBank = Target->getRegBank(VReg.Class.Value);
745 VReg.Class.SourceRange.Start,
746 Twine(
"use of undefined register class or register bank '") +
747 VReg.Class.Value +
"'");
749 Info.D.RegBank = RegBank;
753 if (!VReg.PreferredRegister.Value.empty()) {
755 return error(VReg.Class.SourceRange.Start,
756 Twine(
"preferred register can only be set for normal vregs"));
759 VReg.PreferredRegister.Value,
Error))
760 return error(
Error, VReg.PreferredRegister.SourceRange);
763 for (
const auto &FlagStringValue : VReg.RegisterFlags) {
765 if (Target->getVRegFlagValue(FlagStringValue.Value, FlagValue))
766 return error(FlagStringValue.SourceRange.Start,
767 Twine(
"use of undefined register flag '") +
768 FlagStringValue.Value +
"'");
769 Info.Flags |= FlagValue;
772 return error(VReg.AntiHints.front().SourceRange.Start,
773 "anti-hints can only be set for normal vregs");
775 for (
const auto &AntiHintValue : VReg.AntiHints) {
778 return error(
Error, AntiHintValue.SourceRange);
781 return error(AntiHintValue.SourceRange.Start,
782 "anti-hint '" +
Twine(AntiHintValue.Value) +
783 "' must be a virtual register");
786 Info.AntiHints.push_back(AntiHintReg);
788 RegInfo.noteNewVirtualRegister(Info.VReg);
792 for (
const auto &LiveIn : YamlMF.
LiveIns) {
795 return error(
Error, LiveIn.Register.SourceRange);
797 if (!LiveIn.VirtualRegister.Value.empty()) {
801 return error(
Error, LiveIn.VirtualRegister.SourceRange);
804 RegInfo.addLiveIn(Reg, VReg);
815 CalleeSavedRegisters.
push_back(Reg.id());
817 RegInfo.setCalleeSavedRegs(CalleeSavedRegisters);
824 if (VReg.SplitFrom.Value.empty() && VReg.AssignedPhys.Value.empty())
827 auto It = PFS.
VRegInfos.find(VReg.ID.Value);
830 Register ChildReg = It->second->VReg;
833 Pending.
VReg = ChildReg;
835 if (!VReg.SplitFrom.Value.empty()) {
839 return error(
Error, VReg.SplitFrom.SourceRange);
840 if (Parent->
VReg == ChildReg)
841 return error(VReg.SplitFrom.SourceRange.Start,
842 Twine(
"'split-from' references the same vreg as 'id' (%") +
843 Twine(VReg.ID.Value) +
")");
846 if (!VReg.AssignedPhys.Value.empty()) {
849 return error(
Error, VReg.AssignedPhys.SourceRange);
852 VReg.AssignedPhys.SourceRange.Start,
853 Twine(
"'assigned-phys' must be a physical register, got '") +
854 VReg.AssignedPhys.Value +
"'");
857 RegInfo.addPendingVirtRegMapEntry(Pending);
872 auto populateVRegInfo = [&](
const VRegInfo &Info,
const Twine &Name) {
877 (
Twine(
"Cannot determine class/bank of virtual register ") + Name +
878 " in function '" + MF.
getName() +
"'")
882 if (!Info.D.RC->isAllocatable()) {
884 TRI->getRegClassName(Info.D.RC) +
885 "' for virtual register " + Name +
" in function '" +
892 if (Info.PreferredReg != 0)
894 if (!Info.AntiHints.empty())
907 populateVRegInfo(Info,
Twine(
P.first()));
912 populateVRegInfo(Info,
Twine(
P.first.id()));
919 if (
auto *RegMask =
TRI->getCustomEHPadPreservedMask(MF))
936 for (
auto &E : Errors)
978 std::vector<CalleeSavedInfo> CSIInfo;
984 Object.IsImmutable, Object.IsAliased);
989 return error(Object.ID.SourceRange.Start,
990 Twine(
"StackID is not supported by target"));
996 return error(Object.ID.SourceRange.Start,
997 Twine(
"redefinition of fixed stack object '%fixed-stack.") +
998 Twine(Object.ID.Value) +
"'");
1000 Object.CalleeSavedRestored, ObjectIdx))
1011 return error(
Error, Object.EntryValueRegister.SourceRange);
1012 if (!Reg.isPhysical())
1013 return error(Object.EntryValueRegister.SourceRange.Start,
1014 "Expected physical register for entry value field");
1016 PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1019 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1021 Reg.asMCReg(), MaybeInfo->DILoc);
1029 if (!Name.Value.empty()) {
1031 F.getValueSymbolTable()->lookup(Name.Value));
1033 return error(Name.SourceRange.Start,
1034 "alloca instruction named '" + Name.Value +
1035 "' isn't defined in the function '" +
F.getName() +
1039 return error(Object.ID.SourceRange.Start,
1040 Twine(
"StackID is not supported by target"));
1046 Object.Size, Object.Alignment.valueOrOne(),
1053 return error(Object.ID.SourceRange.Start,
1054 Twine(
"redefinition of stack object '%stack.") +
1055 Twine(Object.ID.Value) +
"'");
1057 Object.CalleeSavedRestored, ObjectIdx))
1059 if (Object.LocalOffset)
1065 if (!CSIInfo.empty())
1090 std::vector<CalleeSavedInfo> &CSIInfo,
1092 if (RegisterSource.
Value.empty())
1100 CSIInfo.push_back(CSI);
1105template <
typename T>
1113 return Parser.
error(Source.SourceRange.Start,
1114 "expected a reference to a '" + TypeString +
1125 if (parseMDNode(PFS, Var, VarStr) || parseMDNode(PFS, Expr, ExprStr) ||
1126 parseMDNode(PFS,
Loc, LocStr))
1127 return std::nullopt;
1134 return std::nullopt;
1138template <
typename T>
1140 const T &Object,
int FrameIdx) {
1141 std::optional<VarExprLoc> MaybeInfo =
1142 parseVarExprLoc(PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1147 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1155 if (Source.Value.empty())
1169 for (
const auto &YamlConstant : YamlMF.
Constants) {
1170 if (YamlConstant.IsTargetSpecific)
1172 return error(YamlConstant.Value.SourceRange.Start,
1173 "Can't parse target-specific constant pool entries yet");
1177 return error(
Error, YamlConstant.Value.SourceRange);
1178 const Align PrefTypeAlign =
1180 const Align Alignment = YamlConstant.Alignment.value_or(PrefTypeAlign);
1182 if (!ConstantPoolSlots.
insert(std::make_pair(YamlConstant.ID.Value, Index))
1184 return error(YamlConstant.ID.SourceRange.Start,
1185 Twine(
"redefinition of constant pool item '%const.") +
1186 Twine(YamlConstant.ID.Value) +
"'");
1194 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
1199 if (parseMBBReference(PFS,
MBB, Entry.Point.Value))
1203 for (
auto &RegStr : Entry.Registers) {
1217 for (
const auto &Entry : YamlJTI.
Entries) {
1218 std::vector<MachineBasicBlock *> Blocks;
1219 for (
const auto &MBBSource : Entry.Blocks) {
1221 if (parseMBBReference(PFS,
MBB, MBBSource.Value))
1223 Blocks.push_back(
MBB);
1228 return error(Entry.ID.SourceRange.Start,
1229 Twine(
"redefinition of jump table entry '%jump-table.") +
1230 Twine(Entry.ID.Value) +
"'");
1253 unsigned ErrorDefinitionIndex = 0;
1256 ErrorDefinitionIndex)) {
1279 if (parseMachineInst(PFS, MILoc, CallI))
1283 Twine(
" called global should reference call "
1284 "instruction. Instruction at ") +
1286 " is not a call instruction");
1289 F.getParent()->getValueSymbolTable().lookup(YamlCG.Callee.Value);
1291 return error(YamlCG.Callee.SourceRange.Start,
1292 "use of undefined global '" + YamlCG.Callee.Value +
"'");
1294 return error(YamlCG.Callee.SourceRange.Start,
1295 "use of non-global value '" + YamlCG.Callee.Value +
"'");
1308 *
Loc.getPointer() ==
'\'';
1311 Loc =
Loc.getFromPointer(
Loc.getPointer() +
Error.getColumnNo() +
1312 (HasQuote ? 1 : 0));
1326 unsigned Line = LineAndColumn.first +
Error.getLineNo() - 1;
1327 unsigned Column =
Error.getColumnNo();
1335 if (L.line_number() == Line) {
1338 auto Indent = LineStr.
find(
Error.getLineContents());
1345 return SMDiagnostic(SM, Loc, Filename, Line, Column,
Error.getKind(),
1346 Error.getMessage(), LineStr,
Error.getRanges(),
1355std::unique_ptr<Module>
1357 return Impl->parseIRModule(DataLayoutCallback);
1361 return Impl->parseMachineFunctions(M, MMI);
1366 return Impl->parseMachineFunctions(M, MMI, &
MAM);
1371 std::function<
void(
Function &)> ProcessIRFunction) {
1373 if (std::error_code EC = FileOrErr.getError()) {
1375 "could not open input file: " + EC.message());
1382std::unique_ptr<MIRParser>
1385 std::function<
void(
Function &)> ProcessIRFunction) {
1386 auto Filename = Contents->getBufferIdentifier();
1387 if (Context.shouldDiscardValueNames()) {
1392 "cannot read MIR with a Context that discards named Values")));
1395 return std::make_unique<MIRParser>(std::make_unique<MIRParserImpl>(
1396 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.
instr_iterator instr_begin()
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 > 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.