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>
206 reinterpret_cast<MIRParserImpl *
>(Context)->reportDiagnostic(Diag);
211 std::function<
void(
Function &)> Callback)
213 In(SM.getMemoryBuffer(SM.AddNewSourceBuffer(
std::
move(Contents),
SMLoc()))
216 Filename(Filename), ProcessIRFunction(Callback) {
257std::unique_ptr<Module>
259 if (!In.setCurrentDocument()) {
263 NoMIRDocuments =
true;
264 auto M = std::make_unique<Module>(Filename, Context);
265 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
266 M->getDataLayoutStr()))
267 M->setDataLayout(*LayoutOverride);
271 std::unique_ptr<Module> M;
274 if (
const auto *BSN =
278 Context, &IRSlots, DataLayoutCallback);
284 if (!In.setCurrentDocument())
285 NoMIRDocuments =
true;
288 M = std::make_unique<Module>(Filename, Context);
289 if (
auto LayoutOverride = DataLayoutCallback(M->getTargetTriple().str(),
290 M->getDataLayoutStr()))
291 M->setDataLayout(*LayoutOverride);
303 auto FirstUnvisitedFunction = M.begin();
308 }
while (In.setCurrentDocument());
321 if (ProcessIRFunction)
322 ProcessIRFunction(*
F);
330 for (; FirstUnvisitedFunction != M.end(); ++FirstUnvisitedFunction)
331 if (!FirstUnvisitedFunction->hasName())
332 return &*FirstUnvisitedFunction++;
354 Function *
F = M.getFunction(FunctionName);
358 }
else if (!FunctionName.
empty() ||
360 return error(
Twine(
"function '") + FunctionName +
361 "' isn't defined in the provided LLVM IR");
367 return error(
Twine(
"redefinition of machine function '") + FunctionName +
378 return error(
Twine(
"redefinition of machine function '") + FunctionName +
405bool MIRParserImpl::computeFunctionProperties(
410 bool HasInlineAsm =
false;
411 bool HasFakeUses =
false;
412 bool AllTiedOpsRewritten =
true, HasTiedOps =
false;
413 for (
const MachineBasicBlock &
MBB : MF) {
414 for (
const MachineInstr &
MI :
MBB) {
417 if (
MI.isInlineAsm())
421 for (
unsigned I = 0;
I <
MI.getNumOperands(); ++
I) {
422 const MachineOperand &MO =
MI.getOperand(
I);
426 if (MO.
isUse() &&
MI.isRegTiedToDefOperand(
I, &DefIdx)) {
428 if (MO.
getReg() !=
MI.getOperand(DefIdx).getReg())
429 AllTiedOpsRewritten =
false;
437 auto ComputedPropertyHelper =
438 [&Properties](std::optional<bool> ExplicitProp,
bool ComputedProp,
441 if (ExplicitProp.value_or(ComputedProp))
447 return ExplicitProp && *ExplicitProp && !ComputedProp;
450 if (ComputedPropertyHelper(YamlMF.
NoPHIs, !HasPHI,
452 return error(MF.getName() +
453 " has explicit property NoPhi, but contains at least one PHI");
456 MF.setHasInlineAsm(HasInlineAsm);
458 if (HasTiedOps && AllTiedOpsRewritten)
459 Properties.setTiedOpsRewritten();
461 if (ComputedPropertyHelper(YamlMF.
IsSSA,
isSSA(MF),
463 return error(MF.getName() +
464 " has explicit property IsSSA, but is not valid SSA");
467 const MachineRegisterInfo &MRI = MF.getRegInfo();
472 " has explicit property NoVRegs, but contains virtual registers");
482 " has explicit property hasFakeUses=false, but contains fake uses");
483 MF.setHasFakeUses(YamlMF.
HasFakeUses.value_or(HasFakeUses));
493 Twine(
" instruction block out of range.") +
494 " Unable to reference bb:" + Twine(MILoc.
BlockNum));
497 if (MILoc.
Offset >= BB->size())
499 Twine(MF.
getName()) + Twine(
" instruction offset out of range.") +
500 " Unable to reference instruction at bb: " + Twine(MILoc.
BlockNum) +
501 " at offset:" + Twine(MILoc.
Offset));
502 MI = &*std::next(BB->instr_begin(), MILoc.
Offset);
514 if (parseMachineInst(MF, MILoc, CallI))
518 Twine(
" call site info should reference call "
519 "instruction. Instruction at bb:") +
521 " is not a call instruction");
523 for (
auto ArgRegPair : YamlCSInfo.ArgForwardingRegs) {
526 return error(
Error, ArgRegPair.Reg.SourceRange);
527 CSInfo.
ArgRegPairs.emplace_back(Reg, ArgRegPair.ArgNo);
529 if (!YamlCSInfo.CalleeTypeIds.empty()) {
530 for (
auto CalleeTypeId : YamlCSInfo.CalleeTypeIds) {
532 CSInfo.
CalleeTypeIds.push_back(ConstantInt::get(Int64Ty, CalleeTypeId,
543 return error(
"call site info provided but not used");
547void MIRParserImpl::setupDebugValueTracking(
551 unsigned MaxInstrNum = 0;
554 MaxInstrNum = std::max(
MI.peekDebugInstrNum(), MaxInstrNum);
555 MF.setDebugInstrNumberingCount(MaxInstrNum);
559 MF.makeDebugValueSubstitution({
Sub.SrcInst,
Sub.SrcOp},
591 Props.setLegalized();
593 Props.setRegBankSelected();
597 Props.setFailedISel();
599 Props.setFailsVerification();
601 Props.setTracksDebugUserValues();
684 if (computeFunctionProperties(MF, YamlMF))
696 setupDebugValueTracking(MF, PFS, YamlMF);
713 Targets[Target.BBID].push_back(Target.CallsiteIndex);
723 assert(RegInfo.tracksLiveness());
725 RegInfo.invalidateLiveness();
732 return error(VReg.ID.SourceRange.Start,
733 Twine(
"redefinition of virtual register '%") +
734 Twine(VReg.ID.Value) +
"'");
735 Info.Explicit =
true;
737 if (VReg.Class.Value ==
"_") {
739 Info.D.RegBank =
nullptr;
741 const auto *RC = Target->getRegClass(VReg.Class.Value);
746 const RegisterBank *RegBank = Target->getRegBank(VReg.Class.Value);
749 VReg.Class.SourceRange.Start,
750 Twine(
"use of undefined register class or register bank '") +
751 VReg.Class.Value +
"'");
753 Info.D.RegBank = RegBank;
757 if (!VReg.PreferredRegister.Value.empty()) {
759 return error(VReg.Class.SourceRange.Start,
760 Twine(
"preferred register can only be set for normal vregs"));
763 VReg.PreferredRegister.Value,
Error))
764 return error(
Error, VReg.PreferredRegister.SourceRange);
767 for (
const auto &FlagStringValue : VReg.RegisterFlags) {
769 if (Target->getVRegFlagValue(FlagStringValue.Value, FlagValue))
770 return error(FlagStringValue.SourceRange.Start,
771 Twine(
"use of undefined register flag '") +
772 FlagStringValue.Value +
"'");
773 Info.Flags |= FlagValue;
775 RegInfo.noteNewVirtualRegister(Info.VReg);
779 for (
const auto &LiveIn : YamlMF.
LiveIns) {
782 return error(
Error, LiveIn.Register.SourceRange);
784 if (!LiveIn.VirtualRegister.Value.empty()) {
788 return error(
Error, LiveIn.VirtualRegister.SourceRange);
791 RegInfo.addLiveIn(Reg, VReg);
802 CalleeSavedRegisters.
push_back(Reg.id());
804 RegInfo.setCalleeSavedRegs(CalleeSavedRegisters);
811 if (VReg.SplitFrom.Value.empty() && VReg.AssignedPhys.Value.empty())
814 auto It = PFS.
VRegInfos.find(VReg.ID.Value);
817 Register ChildReg = It->second->VReg;
820 Pending.
VReg = ChildReg;
822 if (!VReg.SplitFrom.Value.empty()) {
826 return error(
Error, VReg.SplitFrom.SourceRange);
827 if (Parent->
VReg == ChildReg)
828 return error(VReg.SplitFrom.SourceRange.Start,
829 Twine(
"'split-from' references the same vreg as 'id' (%") +
830 Twine(VReg.ID.Value) +
")");
833 if (!VReg.AssignedPhys.Value.empty()) {
836 return error(
Error, VReg.AssignedPhys.SourceRange);
839 VReg.AssignedPhys.SourceRange.Start,
840 Twine(
"'assigned-phys' must be a physical register, got '") +
841 VReg.AssignedPhys.Value +
"'");
844 RegInfo.addPendingVirtRegMapEntry(Pending);
859 auto populateVRegInfo = [&](
const VRegInfo &Info,
const Twine &Name) {
864 (
Twine(
"Cannot determine class/bank of virtual register ") + Name +
865 " in function '" + MF.
getName() +
"'")
869 if (!Info.D.RC->isAllocatable()) {
871 TRI->getRegClassName(Info.D.RC) +
872 "' for virtual register " + Name +
" in function '" +
879 if (Info.PreferredReg != 0)
892 populateVRegInfo(Info,
Twine(
P.first()));
897 populateVRegInfo(Info,
Twine(
P.first.id()));
904 if (
auto *RegMask =
TRI->getCustomEHPadPreservedMask(MF))
921 for (
auto &E : Errors)
963 std::vector<CalleeSavedInfo> CSIInfo;
969 Object.IsImmutable, Object.IsAliased);
974 return error(Object.ID.SourceRange.Start,
975 Twine(
"StackID is not supported by target"));
981 return error(Object.ID.SourceRange.Start,
982 Twine(
"redefinition of fixed stack object '%fixed-stack.") +
983 Twine(Object.ID.Value) +
"'");
985 Object.CalleeSavedRestored, ObjectIdx))
996 return error(
Error, Object.EntryValueRegister.SourceRange);
997 if (!Reg.isPhysical())
998 return error(Object.EntryValueRegister.SourceRange.Start,
999 "Expected physical register for entry value field");
1001 PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1004 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1006 Reg.asMCReg(), MaybeInfo->DILoc);
1014 if (!Name.Value.empty()) {
1016 F.getValueSymbolTable()->lookup(Name.Value));
1018 return error(Name.SourceRange.Start,
1019 "alloca instruction named '" + Name.Value +
1020 "' isn't defined in the function '" +
F.getName() +
1024 return error(Object.ID.SourceRange.Start,
1025 Twine(
"StackID is not supported by target"));
1031 Object.Size, Object.Alignment.valueOrOne(),
1038 return error(Object.ID.SourceRange.Start,
1039 Twine(
"redefinition of stack object '%stack.") +
1040 Twine(Object.ID.Value) +
"'");
1042 Object.CalleeSavedRestored, ObjectIdx))
1044 if (Object.LocalOffset)
1050 if (!CSIInfo.empty())
1075 std::vector<CalleeSavedInfo> &CSIInfo,
1077 if (RegisterSource.
Value.empty())
1085 CSIInfo.push_back(CSI);
1090template <
typename T>
1098 return Parser.
error(Source.SourceRange.Start,
1099 "expected a reference to a '" + TypeString +
1110 if (parseMDNode(PFS, Var, VarStr) || parseMDNode(PFS, Expr, ExprStr) ||
1111 parseMDNode(PFS,
Loc, LocStr))
1112 return std::nullopt;
1119 return std::nullopt;
1123template <
typename T>
1125 const T &Object,
int FrameIdx) {
1126 std::optional<VarExprLoc> MaybeInfo =
1127 parseVarExprLoc(PFS, Object.DebugVar, Object.DebugExpr, Object.DebugLoc);
1132 if (MaybeInfo->DIVar || MaybeInfo->DIExpr || MaybeInfo->DILoc)
1140 if (Source.Value.empty())
1154 for (
const auto &YamlConstant : YamlMF.
Constants) {
1155 if (YamlConstant.IsTargetSpecific)
1157 return error(YamlConstant.Value.SourceRange.Start,
1158 "Can't parse target-specific constant pool entries yet");
1162 return error(
Error, YamlConstant.Value.SourceRange);
1163 const Align PrefTypeAlign =
1165 const Align Alignment = YamlConstant.Alignment.value_or(PrefTypeAlign);
1167 if (!ConstantPoolSlots.
insert(std::make_pair(YamlConstant.ID.Value, Index))
1169 return error(YamlConstant.ID.SourceRange.Start,
1170 Twine(
"redefinition of constant pool item '%const.") +
1171 Twine(YamlConstant.ID.Value) +
"'");
1179 const std::vector<yaml::SaveRestorePointEntry> &YamlSRPoints,
1184 if (parseMBBReference(PFS,
MBB, Entry.Point.Value))
1188 for (
auto &RegStr : Entry.Registers) {
1202 for (
const auto &Entry : YamlJTI.
Entries) {
1203 std::vector<MachineBasicBlock *> Blocks;
1204 for (
const auto &MBBSource : Entry.Blocks) {
1206 if (parseMBBReference(PFS,
MBB, MBBSource.Value))
1208 Blocks.push_back(
MBB);
1213 return error(Entry.ID.SourceRange.Start,
1214 Twine(
"redefinition of jump table entry '%jump-table.") +
1215 Twine(Entry.ID.Value) +
"'");
1241 if (parseMachineMetadata(PFS, MDS))
1247 "use of undefined metadata '!" +
1259 if (parseMachineInst(MF, MILoc, CallI))
1263 Twine(
" called global should reference call "
1264 "instruction. Instruction at bb:") +
1266 " is not a call instruction");
1269 F.getParent()->getValueSymbolTable().lookup(YamlCG.Callee.Value);
1271 return error(YamlCG.Callee.SourceRange.Start,
1272 "use of undefined global '" + YamlCG.Callee.Value +
"'");
1274 return error(YamlCG.Callee.SourceRange.Start,
1275 "use of non-global value '" + YamlCG.Callee.Value +
"'");
1288 *
Loc.getPointer() ==
'\'';
1291 Loc =
Loc.getFromPointer(
Loc.getPointer() +
Error.getColumnNo() +
1292 (HasQuote ? 1 : 0));
1305 auto LineAndColumn =
SM.getLineAndColumn(SourceRange.
Start);
1306 unsigned Line = LineAndColumn.first +
Error.getLineNo() - 1;
1307 unsigned Column =
Error.getColumnNo();
1315 if (L.line_number() == Line) {
1318 auto Indent = LineStr.
find(
Error.getLineContents());
1325 return SMDiagnostic(SM, Loc, Filename, Line, Column,
Error.getKind(),
1326 Error.getMessage(), LineStr,
Error.getRanges(),
1335std::unique_ptr<Module>
1337 return Impl->parseIRModule(DataLayoutCallback);
1341 return Impl->parseMachineFunctions(M, MMI);
1346 return Impl->parseMachineFunctions(M, MMI, &
MAM);
1351 std::function<
void(
Function &)> ProcessIRFunction) {
1353 if (std::error_code EC = FileOrErr.getError()) {
1355 "could not open input file: " + EC.message());
1362std::unique_ptr<MIRParser>
1365 std::function<
void(
Function &)> ProcessIRFunction) {
1366 auto Filename = Contents->getBufferIdentifier();
1367 if (Context.shouldDiscardValueNames()) {
1372 "cannot read MIR with a Context that discards named Values")));
1375 return std::make_unique<MIRParser>(std::make_unique<MIRParserImpl>(
1376 std::move(Contents),
Filename, Context, ProcessIRFunction));
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 unsigned SM(unsigned Version)
static constexpr StringLiteral Filename
FunctionAnalysisManager FAM
ModuleAnalysisManager MAM
SI Pre allocate WWM Registers
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 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.
MachineFunctionProperties & set(Property P)
MachineFunctionProperties & reset(Property P)
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 ...
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 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 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).
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.
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)
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 parseMachineMetadata(PerFunctionMIParsingState &PFS, StringRef Src, SMRange SourceRange, SMDiagnostic &Error)
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
DenseMap< unsigned, unsigned > ConstantPoolSlots
StringMap< VRegInfo * > VRegInfosNamed
DenseMap< unsigned, int > StackObjectSlots
std::map< unsigned, std::pair< TempMDTuple, SMLoc > > MachineForwardRefMDNodes
DenseMap< Register, VRegInfo * > VRegInfos
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
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.